Appy 0.9.2

Milestone information

Gaëtan Delannay
Release registered:
No. Drivers cannot target bugs and blueprints to this milestone.  

Download RDF metadata


Assigned to you:
No blueprints or bugs assigned to you.
4 Gaëtan Delannay
No blueprints are targeted to this milestone.
4 Fix Released

Download files for this release

After you've downloaded a file, you can verify its authenticity using its MD5 sum or signature. (How do I verify a download?)

File Description Downloads
download icon (md5) Appy 0.9.2 292
last downloaded 20 weeks ago
Total downloads: 292

Release notes 

Appy 0.9.2 includes some significant changes, bugfixes and improvements, in the appy.pod as well as in the appy.gen parts.
Appy 0.9.2 corresponds to revision 32 on


View the full changelog

[pod, px]
- In an ods template, you can now define a variable 'columnsRepeated' that specifies, for every column of the table representing a spreadsheet, how much times it will be repeated by subsequent 'for... cell' statements. For example, if you have a spreadsheet with 2 columns, and you will need to repeat the second one 100 times, define a statement 'do table with columnsRepeated=(1,100)'. If you don't do that, pod will be unable to guess what column must be repeated and how, will consider your table has having 2 columns and will produce a resulting table spreading the cells within a 2-columns wide table.
- If you define a variable named 'tableName' inside a table, it will be used to name the table. For information, with Calc, every spreadsheet is represented as a table; the table name is the name that appears in the corresponding tab, in the bottom of the screen.
- Bugfix: complete tracebacks when errors within Python expressions and within 'for' actions.
- added param '-t' allowing to specify a LibreOffice file whose styles will be imported in the pod result (works only for odt files). Thanks to IMIO.
- Pod expressions can now be defined in fields of type 'text-input' (in addition to existing fields 'conditional-text' and track-changed text). Thanks to IMIO.
- Added parameter 'stylesTemplate' to the Renderer, allowing to specify a LibreOffice file whose styles will be imported in the pod result. Thanks to IMIO.
- Take into account tag 's'. Thanks to IMIO.
- xhtml2odt: removal of unnecessary spaces.
- xhtml2odt: better handling for column sizes.
- xhtml2odt: take into account widths of td and th tags, from 'width' attributes or from the corresponding CSS property within 'style' attributes.
- xhtml2odt: take into account width of tables (style='width:' or width='', in px or %) and table alignment (left, rigt, center) if the table does not span the whole document width.
- xhtml2odt: take into account table widths (percentages or pixels) and added, via style mappings, the possibility to change the default behaviour. For tables that do not span the whole page width, take alignment into account.
- xhtml2odt: implemented styled 'span' tags.
- xhtml2odt: manage 'ol' tags with attribute 'start'.
- When an EvaluationError is raised, the original error is kept in evalError.originalError.
- 'from' clause: one can now write 'from+', which means that the root tag of the target element will be kept: the content of the 'from expression' will be dumped into it instead of completely replacing it.
- Refactoring: generate list styles in content.xml from new Python classes styles_manager::BulletedProperties and styles_manager::NumberedProperties.
- Added the possibility to define custom list styles; support of ol->type attribute and of CSS list-style-type attribute for ol and ul tags.
- Removed RTF support. Reimplemented the pod test system with an ODT test plan. appy/shared/ has been replaced with appy/shared/, the tables parser now based on ODT.

- Added boolean param Config.userLink allowing to show/hide (show by default) the link, in the user strip, to go to the user page. When Config.userLink is False, still display the user name, but as non-clickable text.
- bugfix (management of recipients).
- String field: bugfixes: show differences in multilingual fields.
- String field: bugfix when ajax-editing an empty multilingual field.
- appy.Object: allow to get object attributes like accessing dict keys, ie object[attr]
- appy.object: added method 'clone'.
- Wrapper.getLastEvent can now work on some history given as parameter instead of object.history. Moreover, parameter 'not before' can also hold a list of transitions.
- appy.Hack: added method 'inject' that injects from some class all static attributes and method to another one.
- appy.Hack: bugfix (patch of static methods).
- On a gen class, one can define static attribute 'showHistory', being a method or a boolean value. It indicates if the history is visible or not.
- On the User class, added passwords fields on the main page. This way, when creating a user, those fields are used. But when the user wants to change it own password, passwords on the 'passwords' page are then used.
- Bugfix while creating default users.
- Bugfix: do not perform LDAP authentication when ldapConfig.enabled is False.
- Class.listColumns can now be a static method (accepting the tool as single arg).
- Indexed Ref fields are now sortable. For every such field, 2 indexes are created: a list index for searching, and a standard index for sorting (by their title).
- Boolean field: bugfix (default layouts).
- Bugfix: for showing a field on layout buttons, the buttons layout must explicitly be returned by the show method.
- added param 'icon' allowing to specify a specific icon.
- Added attribute 'xml' on every field allowing to customize the XML marshalling process.
- Added new layout 'xml', now different from the 'view' layout, allowing to define which fields are to be dumped in the XML version of some object.
- Security fix in ToolMixin::getUser.
- Bugfix in Mixin::getUrl.
- Ref field: param 'shownInfo' can now be a method.
- Ref field: Removed pxViewPickList, replaced by a recursive call pxView->pxView.
- Ref field: bugfix: add a tied object with noForm=True
- Ref field: added param link='popupRef'.
- Bugfix: the mime type received by Zope in FileUpload instances seems to be wrong under some unknown circumstances.
- Added attribute Field.view allowing to specify, for any field, an alternative pxView.
- Mixin.xml: if an error occurs, log it before xml-marshalling it to the caller app.
- Added the possiblity to synchronize external users from a LDAP.
- Added method UserWrapper.addRole (add a role programmatically).
- Added to the LDAP config, a user map allowing to automatically assign roles and groups to ldap-imported users.
- Added the possibility to display the content of indexes for a given object on its view layout (param 'indexed' in the request).
- Indexer: textual content of indexes now keep only words of more than 2 chars and other improvements.
- Authorize anyone to get static content (images, css, js...) from any Appy app.
- Added param Field.mustIndex, that, for indexed fields, defines (via a method) when indexation must occur or not. Indeed, in some cases, an index is required on some field but we don't want all objects to have an index value for this field at any time.
- Implemented live search on any root gen-class.
- Highlight keywords in query results.
- Display action fields with layout 'buttons' in query results and tied objects for refs, besides transitions.
- Show delete button when allowed on the view layout.
- Improved method AbstractWrapper::createFrom.
- Executng actions from list of tied objects (ref field): bugfix.
- Ensure the tool can't be deleted.
- Wrapper.sort can now sort according to param field.insert if sortKey is None.
- Table of indexed fields: for managers only; added local roles in it.
- appy/fields/ added missing i18n labels.
- Added css style for rendering nice tables within the message popup.
- Improvements in the rendering of buttons throughout the web UI.
- Ref field and Search: added param 'showActions' allowing to show or not the range of icons and buttons below or besides every tied or queried object.
- Allow Refs with render='menus' to appear in layout 'buttons'.
- Stop caching methods used as default values for gen field: it can lead to headaches.
- ToolMixin::getHomePage: removed unneeded calls to m_goto.
- Table of indexes: indexed date values are now correctly displayed as DateTime instances.
- More translations in German.
- Bug and performance fixes in the authentication mechanism.
- Added parameter Ref.collapsible allowing to show/hide (via a cookie in the UI, similar to object history) available or tied items.
- Bugfix: remove carriage returns when normalizing strings intended to be used as filenames.
- String.inlineEdit can now be a method.
- more log info when something is wrong.
- Pod field: bugfix (download name of pod template being links to other pod templates + UI bug)
- Pod field: Manager does not have all output formats anymore, because in some situations, generating a doc in some formats does make sense (ie for frozen docs)
- Pod field: added param 'downloadName' allowing to speficy a method producing a custom name for the pod result file that will be downloaded by the browser.
- Pod field: bugfix (send by email).
- Pod field: added param 'useTemplateName'.
- Changes in the way binary files are downloaded.
- Modified Ajax system to be able to ajax-refresh a single row within query results or ref tied object.
- appy.js: closing the confirm popup via button 'no' cleans field 'comment'.
- Implemented an anti-double-click system.
- List field: bugfix with empty-like values (integer 0 for example).
- Calendar field: added param 'delete' allowing to define who can delete what event type in the calendar.
- Calendar field: added a 'timeline' calendar view.
- Calendar field: allow to have several events at the same day via the concept of timeslots.
- Calendar field: added a validation mechanism that converts 'request' event types to 'final' event types.
- Calendar field: the timeline can now accept multiple events in a single cell.
- Calendar field: allow automatic check/uncheck of validation checkboxes within calendars (month and timeline views).
- Calendar field: added the possibility, in a timeline, to define total rows and columns.
- Calendar field: one may now specify a method in param validator for validating the creation of an event.
- Calendar field: added params 'topPx' and 'bottomPx' allowing to define custom content before and after rendering the calendar view.
- Calendar field: added the notion of layer.
- Calendar field: added the possibility to define the part of the legend that is specific to every layer.
- Calendar field: Validation.removeDiscarded can now be a method.
- Calendar field: added the possibility to define custom actions on calendars via class Calendar.Action.
- Appy is now integrated to ckeditor 4.4.7 via CDN (check
- Bugfix: automatic search screens contained SearchableText twice.
- Bugfix: getFormattedValue must produce a different value for strings with format=TEXT depending on the layout type.
- Nice rendering of popups within popups.
- Search: bugfix in filtered unnamed searches.
- Bugfix: name clash when a transition is named 'comment'.
- Added AbstractWrapper::getHistoryComments allowing to collect comments of all history events of some type.
- Added field dict, similar to List but that stores dicts in the database, with a set of keys given in method field.keys.
- Bugfix: ckeditor with ie8.
- Static param SomeClass.resultModes replaces 'resultMode' and allows to define the way instances of this class are shown on query results: as a 'list' (the default), a 'grid' or using a custom px that must be defined on SomeClass.
- CSS class 'noStyle' renamed to 'no'.
- Dict field: when storing new values, not-impacted existing values are kept.
- Added pages px404, px403, px500 to manage all kinds of errors. When an anonymous user tries to get a URL that requires to be authenticated, he is redirected to the login screen, and, on successfull login, is then redirected to the given URL.
- Added a i18n label for the footer text

[shared, bin]
- List of MIME types completed.
- method 'get' can now accept parameters.
- changes to the XmlMarshaller (due to XML-related changes).
- improvements to the XmlMarshaller and bugfix: Mixin.xml returns appy.Object instances correctly marshalled.
- LinesCounter now counts lines of XML code.
- Added utils::flipDict allowing to flip keys<->values of a dict.
- Added script appy/bin/ allowing to modify or consult the content of odf files in a folder hierarchy (the script manages the unzip and re-zip of odf files and let a caller script access the unzipped content).

0 blueprints and 4 bugs targeted

Bug report Importance Assignee Status
394267 #394267 Error while rendering an error in a for loop 4 Medium Gaëtan Delannay  10 Fix Released
1244738 #1244738 Exceptions do not always have __module__ attribute 4 Medium Gaëtan Delannay  10 Fix Released
1088409 #1088409 not well-formed xml files 1 Undecided Gaëtan Delannay  10 Fix Released
1101237 #1101237 Generated files are not recognized by libmagic 1 Undecided Gaëtan Delannay  10 Fix Released
This milestone contains Public information
Everyone can see this information.