February 22nd, 2013pod:
· Added the possibility to use POD with ODS (Calc) templates. Integration with gen (Pod field).
· Bugfix for https://bugs.launchpad.net/appy/+bug/1083533 (thanks Gauthier): management of HTML entities with the standard Python SAX parser expatreader.
· Bugfix while generating filenames for files included into pod results.
· Changed the way pod results are re-zipped, in order to be compliant with section 17.4 of the OpenDocument format specification (bug https://bugs.launchpad.net/appy/+bug/1101237).
· Use, when available, Python's uuid module to generate images and file names to be included in pod results.
· Performance improvement: stop computing tag names, create a dict of precomputed tags before starting parsing.
· Bugfix: import several times an image from the same URL.
· Bugfix: it is now possible to generate indexes on back references.
· Added the possibility to span widgets on several columns on the search screen (param Field.scolspan).
· Added config param 'enableSessionTimeout' for enabling/disabling session timeout (disabled by default).
· Bugfix: generate i18n label even for transitions for which show is False, because the label will be used within object's history.
· Allow to display, in history, differences between successive versions of XHTML fields via appy.shared.diff.HtmlDiff (which was not integrated to appy.gen until now). Improved rendering of XHTML fields.
· Allow to show the cumulative differences performed on historized String fields with format=String.XHTML.
· One can now specify a different source language for every translation.
· field.history can now be a method. This way, historization can be enabled/disabled, field by field, according to any custom condition.
· Bugfixes in cleaning of XHTML fields.
· Allow Managers to delete data change events if things go wrong.
· Bugfix in generation of back reference for predefined Refs from model.py
· Bugfix while editing XHTML fields from class model.py::Page
· Added a system for locking pages when editing it.
· Added, on edit.pt (the unique Appy HTML form) a handler window.onbeforeunload to warn the user that data can be lost or a lock can stay on the object.
· Stop using param 'cmp' in method .sort (deprecated in Python3). Used para 'key' instead.
· Wrapper.reindex: allow to specify attribute 'fields' containing the list of fields that must be reindexed. If not given, all object fields are reindexed.
· Improved search abilities.
· Added params Type.swidth and Type.sheight to allow for different sizes for the search widgets.
· Bugfix while generating the Translation class (page 'main' was not viewable because of field 'trToTool' for which page.show was False for an unknown reason).
· Added a link to the home page for anonymous users; resized fields 'login' and 'password'.
· Bugfixes with IE8 and JS function 'getElementsByName'.
· Converted files with country codes to UTF-8.
· Added appy.shared.data.vatEuroCountries, which is the list of countries of the euro zone.
· utils.py.FileWrapper: added method 'copy' to get a copy of a file.
· Added a script for creating a local Debian repository (yes I know this is a bit far from the core Appy business)
August 16th, 2012appy.pod:
· xhtml2odt: ability to include images from img tags (anonymously). Non-anonymous solution for a Appy/Zope server only.
· xhtml2odt: bugfix in management of styles applied to inner p tags added within li tags.
· xhtml2odt: generate ODT tables from XHTML tables, taking into account variable column sizes.
· xhtml2odt: bugfix: apply styles mapping to 'p' tags that are added automatically by xhtml2odt (was only implemented for p tags inside li tags).
· Function 'document': allow to specify size of images in cm or px, or via a 'style' tag.
· Improved styles mapping system: one may now express things like: 'p[text-align=center]':'StandardCentered' (ie, map an HTML tag having some CSS attributes to a specific ODT style). See verbose docstrings in styles_manager.py.
· Allow to import SVG files (requires installing imagemagick).
· Bugfix while including a PDF file into a document
· Ease the inclusion of Plone images from a Plone/Zope DB through 'do text from document' statements.
· Variable named 'loop' is now available in the POD context of any section within a 'for' statement, with attributes like loop.[iterVariableName].length (=total number of looped elements) and loop.[iterVariableName].nb (=index of currently looped element)
· Added some default appy-related table styles for producing cells with text in bold/normal, aligned right/left, etc.
· Bugfix while dumping large size images into pod templates from appy.gen FileWrapper instances.
· Added a default POD style 'podPageBreak' allowing to include page breaks via do... from... statements.
· Replaced tiny_mce with ckeditor (in-line editor), version 3.6.3.
· Allow to upload images in ckeditor fields.
· Improved error management.
· Added params String.allowImageUpload and String.styles for tuning the in-line editor corresponding to a String instance with format=XHTML
· Manage borders of images uploaded in such a field
· First draft of a migration script that allows to migrate data from Plone-dependent Appy apps (= 0.8.0.
· Added method wrapper.search1 that returns a single result (which is the only difference with wrapper.search).
· Bugfix while getting objects from the catalog (bypass security when called from code).
· Added new format 'captcha' for a String, allowing to generate a captcha-like widget.
· Allow to define a method Tool.getHomePage that returns the URL of the home page for any user (authenticated, anonymous, manager, or any other code-based distinction)
· Allow an app to define a 'ui' folder for storing new UI-related elements (pages, images, etc) or overriding standard Appy UI elements
· logo.jpg is replaced with banner.jpg (size 900 x 75px)
· Improvements in user management.
· Added obj.mayAct method that allows to display conditionnally the column 'Actions' when an object is shown in a list (query or ref)
· Improved navigation from sub-objects to parent objects
· Improved layout.
· bugfixes in the List field.
· Allow to define several layoutTypes (ie: ('edit', 'result')) as a tuple/list in 'show' attributes of fields.
· Removed fields Tool.showWorkflowCommentFieldForxx (workflow comment may not be entered into the confirm popup).
· Security-related bugfixes.
· Added the possibility to create and manage web pages into an app.
· Every class can now define a method showPortlet. If the class does not define it or if it returns False, the portlet won't be shown when showing/editing instances of this class.
· Added Ref.navigable: if True, referenced objects can appear within the portlet.
· Bugfix while using Zope behind Apache and using the VHM.
· Ref.view macro is not called via Ajax anymore for single-valued Refs (when displaying lists containing single-valued Ref fields, it produces too many ajax requests, leading to ConflictErrors in the ZODB).
· Bugfix while searching the catalog based on object state.
· Added XHTML cleanup code.
· Added String.generatePassword.
· Bugfix: mising HTTP header while sending some responses back to Apache (caused a bug in ckeditor image upload).
· Bugfix while importing images via an image resolver (Zope behind a reverse proxy).
· Improved mail notification mechanism.
· Optimized performance (methods defined in 'show' attrs were called twice on edit.pt and view.pt).
· Added String.richText allowing to have ckeditor with more text-formatting icons.
· Added ckeditor 'show source' button by default (impossible to live without that).
· Solved security-related problems.
· .mail: allow to send mail as authenticated user.
· Bugfixes in pages when rendered by IE.
· Improved cleaning and formatting of XHTML content.
· XhtmlCleaner now only keeps useful CSS attributes within XHTML style attributes.
· Added the possibility to define a sortOrder of a Search class.
· Bugfix while managing languages, ui improvements.
· CSS improvements.
· Bugfix: parsing now works even if encoding is declared at the beginning of the Python file.
· A default layout for Boolean fields, including a description, is now available in Boolean.dLayouts.
· Added obj.mayEdit, an additional condition for editing an object (similar to mayDelete).
· Bugfix: specifying a workflow for a User class crashed because, in installer.py, Appy took into account the standard workflow on this Class instead of the custom one.
· Security: added missing checks at the code level, ensuring that a user can create instances of a given class (root classes, or instances created via an initiator field)
· Bugfixes in the test system, which works again (was broken after deplonization).
· Possibility to define, programmatically, for a given class, the default view and edit pages, by defining, respectively, methods getDefaultViewPage and getDefaultEditPage.
· Bugfix in attribute Field.focus.
· Bugfix in UserWrapper password management.
· Finalized pending i18n (added some missing labels).
· Added boolean Tool.loadTranslationsAtStartup that, if False, prevents to overwrite, on a production site, translations edited through-the-web by users. If True, at every Zope startup, Translation objects are overwritten by the content of their corresponding po files on disk.
· Added method Wrapper.isEmpty(name) that checks if the content of some field is empty or not on a given object.
· Simpler result.pt.
· When raising Unauthorized, gen gives more explanations.
· Added support for right-to-left (RTL) languages.
· Implemented a mechanism 'forgot password?'.
· Allow Managers to change the login of a user.
· Bugfix in the 'change user id' function. Now, the method browses every object in the database and updates local roles where the old ID was potentially mentioned.
· Added UserWrapper.checkPassword allowing to check if a password is the right one for a user.
· Field.indexed, instead of being a Boolean, can be a str, to represent the name of a Zope Index. This way, it is possible to bypass the standard Appy choice for index types, ie for Computed fields whose content may produce any type of value.
· Added missing translation labels in the macro displaying object's history.
· Added default fields Tool.dateFormat and Tool.hourFormat that give application-wide default formats for dates with/without hour.
· Added a table in Config->Users that shows the connected users and the date/time of their last access to the app.
· Added the missing search macro for a Computed field.
· Method Wrapper.do: added param 'noSecurity' allowing to bypass check of roles mentioned as conditions for triggering worfklow actions.
· First version of a Ogone Appy plug-in.
· Add param Config.activateForgotPassword to allow to disable this functionality for sites where the email of users may be unknown.
· More accurate error reporting for Action fields.
· Do not generate base label for a workflow transition if transition.show is False.
· Added an alternative predefined layout for pages (including summary, which is absent by default).
· publish.py is now able to generate a Debian package for Appy, working with Python 2.6 and Python 2.7; new.py contains optimized code for generating a non-buildout Zope 2.13/Plone4 instance.
· generate.py: one less arg: outputFolder has been removed (the script now generates the Zope product in /zope)
· generate.py: new option '-d', for generating a Debian package from the Python (Appy) app.
· new.py is now able to create a pure Zope instance on its own (without mkzopeinstance) from a Zope install made with Debian zope2.12 package.
· Adapted job.py for Appy >0.8.
· backup.py: added field 'To' to mails sent by the backup procedure (so it not less directly considered as junk mail)
· Bugfix for https://bugs.launchpad.net/appy/+bug/913171 (appy.shared.dav)
· Improved Debianizer (launches Zope and OO automatically)
· Improved deployment of a Appy app (creation of a Zope instance is no more required; corresponding folders are created in standard unix locations: /etc for the config file, /var/log for logs, /var/lib for the database, /usr/bin for scripts that start and stop the instance).
· Improvements in Debianizing an Appy app: the Debian install creates now scripts for starting the Zope/Appy/app instance and OpenOffice in server mode at boot time.
· Allow to marshall Plone/Zope LazyMap instances.
· Added the possibility to generate a Cortex/Comodit (see www.guardis.com) application definition for an Appy application.
· .packaging: added the possibility to sign the generated Debian packages.
· .diff: bugfix: work internally on unicode representations of strings to diff: this way, we are sure every char is one char length.
· .diff: bugfix (avoid infinite loop between m_getHtmlDiff and m_getReplacement) and better recovery when the Merger fails to manage overlaps (the whole line is then considered as having been deleted and replaced by something completely different, which is not really the case but at least is shows a simplified diff instead of crashing.
· Bugfix in the XhtmlCleaner that now returns result as a str and not a unicode.
· XmlUnmarshaller can now be ran in 'non utf-8' mode: if enabled, any marshalled string will no be Python unicode, but simple str.
December 16th, 2011appy.pod:
· Added class appy.pod.parts.OdtTable that allows to create a complex (ie, with a dynamic number of columns) table programmatically (to be imported with a statement 'do ... from'). This class allows to generate HTML tables as well (qui peut le plus peut le moins)
· Bugfix while generating tracebacks within odt results (unicode-related)
· When using function 'document' in 'from' statements, first arg can now be a appy.shared.utils.FileWrapper instance.
· First pure Zope version of Appy. Plone has been completely removed.
· Brand new web interface for appy.gen applications
· Integrated tinyMCE
· Ref.shownInfo can now specify column widths (ie, 'title*70%')
· Updated default page and field layouts
· Stop generating a label for back references it not needed.
· Ugly Zope acquisition-related bugfix
· Bugfix while rendering file widgets
· Added a widget 'List' for rendering grids of data.
· Generalized use of appy.Object
· Existence of a field value (that triggers search for a default value) is now based on Type.isEmptyValue, and not '==None'
· Bugfix with default values for List fields
· Prevent search icon to be shown for a Ref when there is no linked object
· Use appy.shared.utils.formatNumber function
· Visual bugfix while displaying boolean fields
· Type 'float': added the possibility to define a separator for thousands
· Permission-related bugfix while creating objects through AbstractWrapper.create
· Bugfix in group widget 'tabs'
· Improved layout of grid widgets in view mode
· Use of .pyt extensions for template Python classes in appy.gen.templates in order to avoid byte-compilation errors when distutils installs Appy
· Updated publish.py, that is now able to generate a DistUtils tar.gz for Appy
· Publish.py can now be called with option '-s' (silent): in this mode no question is asked to the user, default values are used
· Updated new.py that generates a better Plone4-ready simple Zope instance;
· Added new class appy.shared.diff.HtmlDiff for computing differences between 2 chunks of HTML code.
· xml_parser.XmlMarshaller: support for default namespaces and 'any' tags.
· dav: bugfix in error handling
· utils: added french-accents-aware functions lower and upper
· utils: improved functions normalizeString and formatNumber
December 16th, 2011appy.pod:
· bugfix when importing images under Windows (https://answers.launchpad.net/appy/+question/171611)
· added the possibility to specify size of images to import (see https://answers.launchpad.net/appy/+question/171846)
· bugfix while validating file fields which are mandatory
· stopped using uid_catalog and added index 'UID' in portal_catalog
· bugfix while searching objects in the limits of a Ref field
· display user info in the main template (name, id, roles)
· when creating an object from a reference, after creation, appy brings the user back to the view page where the Ref field was
· reworked management of Ref fields, that do not use Archetypes and reference catalog anymore.
· added a mechanism for migrating from one Appy version to another, automatically, when reinstalling an Appy application.
· backup.py: added the possibility to define login and password for SMTP authentication (the script allows to send mail)
September 16th, 2011appy.pod:
· Optimized image importing: when an image is imported several times in a pod template through a call to 'do ... from document(at=path)', pod inserts only one copy of the file into the ODT result;
· xhtml2odt bugfix: when a was contained in or , the whole function ouput was an empty string.
· bugfix in html2odt: in some situations, while using stylesMappings, some empty tags were present in the result, producing a superflous empty paragraph;
· bugfix while importing PNG files under Windows.
· In the default context of any pod field, added function '_' corresponding to obj.translate;
· workflows are now implemented as full Appy worlflows. Plone (DC) workflow are not generated anymore. From the Appy user point of view (=developer), no change has occurred: it is a pure implementation concern;
· began to implement a new global Appy-specific page template and styles;
· added, for every Type, param 'label' allowing to specify an existing i18n label (the one from another field for instance), thus avoiding to generate i18n labels for this Type;
· optimized generation of appyWrappers.py (more than twice less code);
· stopped generating properties on wrapppers by setting AbstractWrapper as new-style class and using __getattribute__;
· removed from some pages superfluous translations of inexistent labels;
· implemented a variant of Zope's 'has_permission' in method called 'mixin.allows', which does not make some assumptions, like the fact that an admin is Owner of any object or the fact that an Authenticated user has also role Anonymous;
· added button 'refresh security' for refreshing security information on every database object (it is needed because Zope requires us to duplicate security info on every object);
· do not generate "_action_ok" and "action_ko" i18n messages anymore;
· added param Group.label, similar to Type.label;
· allowed to specify in param Group.wide any table width;
· use new index 'getState' for indexing object states;
· reduced size of generated file config.py;
· optimized debug mode: class reload is not done automatically: a 'refresh' icon is available on view and edit views.
· Python dicts can now be marshalled/unmarshalled.
June 28th, 2011
· bugfix in xhtml2odt conversion (algorithm for checking ODT-invalid subtag hierarchies);
· xhtml2odt conversion: force continue-numbering to 'false' for every numbered list.
· solved bug https://bugs.launchpad.net/appy/+bug/740290 (concurrent work on the same POD template), also tied to question https://answers.launchpad.net/appy/+question/149443.
· xhtml2odt: better management of 'div' tag (considered exactly like a 'p' tag).
· bugfix for encoding of XML attributes (see https://bugs.launchpad.net/appy/+bug/779448).
· bugfix for https://bugs.launchpad.net/appy/+bug/778728 (function 'text').
· bugfix in buffers.write: if content is already utf-8-encoded it crashed.
· added param 'maxChars' for any Type, allowing to limit the amount of data in user input fields. Wherever possible, it is implemented using HTML attribute 'maxlength'; on server-side, content that is bigger than specified by maxChars is truncated (ie, it is not possible to force a maxlength for html textareas);
· added a session invalidation mechanism: authenticated users will be automatically logged out when their Zope session will expire.
· improvements in the CodeAnalysis system: more Zope-related extensions are recognized: .vpy, .cpy for Python files, .cpt for Zope Page Templates.
· method "translate": added the possibility to escape XML special chars in translations;
· added a script for checking a LDAP connection
· job.py: allow to specify several commands to execute (to separate with semicolons).
March 23rd, 2011Changed in appy.pod:
· Added default function 'text' that allows to dump a string containing carriage returns into the ODT, with statements like 'do... from text(someStringContainingCarriageReturns)'
· Bugfix in the management of conflictual inner-tags in the odt2html conversion: in some cases (when style mappings are applied), empty tags that needed to be removed were not removed because of the presence of tag attributes.
Changed in appy.gen:
· Bugfix while displaying content of textarea-entered text (Strings with format=String.TEXT): for displaying again textarea content, I replaced 'backslash n' with html br tags, but in some cases carriage returns are stored as a sequence of 'backslah r' and 'backslah n' chars. In this case, 'backslash r' chars were left alone in the HTML page, producing sometimes strange behaviour within the browser.
· Stop storing workflow task attribute '_v_appy_do' as a volatile attr in ZODB (renamed it '_appy_do'). Sometimes it is removed by a sub-transaction during a long transition.
· Registration of the default Zope profile does not seem to work anymore. It is probably due to Plone hot fix from 2011-02-08. Here we have implemented an alternative way to register the profile, which works even with the hotfix.
· every field can now define a dict of i18n mappings that will be used for translating their label and/or description and/or help message(s).
· Bugfix in the validator for the default field 'UNO-enabled Python interpreter'.
· Bugfix while comparing values for historization purposes
February 22nd, 2011ppy.pod:
· Added Renderer param "overwriteExisting" allowing to overwrite existing POD result instead of raising an exception (defaults to False)
· Bugfix in cell repetition that does not start in the first cell of a table
· Added conversion to more Microsoft formats (docx, xlsx)
· Bugfix: style_manager crashed on empty outlineLevelKey
· bugfix in Date intervals coming from search.pt.
· implemented ToolMixin.performLogin (inspired from Plone authentication)
· minor bugfix while redirecting user to a page that must display a global status message
· logged every translation deletion.
· when redisplaying the 'edit' view, empty any password field.
· added the possibility to freeze, within Pod fields, documents that are normally generated with appy.pod.
· Minor changes in the test system
· XmlUnmarshaller can unmarshall XML content from a string, file handler of file path
· any Appy object now has a method 'getField(name)' that returns a given field (=Appy type)
· bugfix while counting number of tests found in a gen-application.
· bugfix while indexing empty string values: bugfix while accessing object from a query without security enabled.
February 15th, 2011Changed in appy.pod:
· improved html2odt conversion (management of XHTML tag hierarchies like p->div->p)
· bullets for default list styles in any ODT file generated through pod are now smaller.
Changed in appy.gen:
· added CSS tooltips and bugfix while querying several content type at once.
· added default validation for wrong dates
· for Action fields, added value 'filetmp' for param 'result' for removing temp files that are returned as the result of an action
· values entered by the user in the search screens are not stripped
· wrapper method 'export' can now export an object in a CSV file
· Added the possibility to customize the global message when validation fails.
· Added the concept of 'fake' workflow transitions: when a user can't trigger a transition but needs an explanation about why he can't, a fake button is shown, with a explanation.
· Added the possibility to give a custom context to the macro specified for a Computed field
· added param 'confirm' to a workflow transition, allowing to show a confirm popup before triggering it
· added param 'format' for translate method, allowing to produce strings that conform to HTML or JS.
· Added the possibility to define POD templates for any search result (Pod field with param view='search')
· bugfix while getting default value for a Ref field
· added Computed fields that computes a ZPT macro given as a string to param 'method'
· added the possibility to define a global style mapping for every Pod field
· stopped to generate a field-specific set of i18n labels for pod output formats
· carry portal_status_message even through page redirections
· added 'deprecatedAddRemove' tags in generated configure.zcml
· onEdit can now return a customized message
· added possibility to normalize strings for other usages than 'fileName' in appy.shared.utils.normalizeString (for alpha and alphanum usages)
· Added method 'unlink' on any appy class, for unlinking objects from references
· Bugfixes in display of workflow state in columns.
January 19th, 2011Changed in appy.pod:
· converter.py can convert docx and xlsx formats
· xhtml function manages strike and underline styles
· XHTML entities can now be managed with the standard expat parser (works for Python2.4, but not yet for >=2.5)
Changed in appy.gen:
· Added a translation system in replacement of Zope one, that allows, within the configuration, to edit every translation label through-the-web in any of the languages supported by the gen-application.
November 24th, 2010
· Insert POD expressions in fields instead of track-changed text: they will then be copy/pastable, which is not the case for track-changed ones. Drawback: inserting such expressions may be a bit less easy than track-changed text