[pod]
- Added a styles generator that is able to generate on-the-fly ODF styles based on CSS attributes. Currently works for CSS attributes 'margin-x' on paragraphs.
- xhtml2odt: take into account text alignment (left, center, right) within table cells.
- xhtml2odt: support 'text-align' CSS properties on 'p' and 'div' tags.
- xhtml2odt: support CSS attribute 'background-color' for table cells.
- xhtml2odt: ensure support for non-breaking hyphens (dashes).
- xhtml2odt: manage rowspans in table cells.
- xhtml2odt: added the 'keeWithNext' functionality.
- xhtml2odt: CSS properties: parse float as well as int values. For determining table column widths, only units '%' and 'px' are supported. Units 'pt' and 'cm' are ignored: for columns whose widths are specified with those units, we simply deduce the column width from the cell content.
- xhtml2odt: render p tags inside li tags.
- xhtml2odt: managed 'div' and 'p' tags into 'li' tags.
- xhtml2odt: test 'xhtmlPIntoLis': more complete test with inner lists.
- xhtml2odt: within XHTML tables, compute the longest word within every column. We plan to integrate this information for computing the relative width of every column (to do).
- xhtml2odt: computing table widths and table column widths: improvements.
- xhtml2odt: determine base styles for cells: bugfix.
- xhtml2odt: Compute cell styles: bugfix.
- xhtml2odt: ignore paragraphs defined into tds.
- xhtml2odt: support table widths defined in cm.
- xhtml2odt: parse colors expressed as rgb expressions to convert them in hexadecimal (rgb expressions not being supported by LibreOffice / ODF).
- xhtml2odt: convert CSS attr 'vertical-align' to ODF equivalent.
- xhtml2odt: convert CSS 'text-align' attributes into ODF.
- xhtml2odt: support css attribute font-variant:small-caps.
- xhtml2odt: added attribute TableProperties.minColumnWidth allowing to customize the minimum default column width for table colummns.
- xhtml2odt: bugfix: when 2 inner tags surrounded exactly the same portion of text, one of the tags was ignored.
- xhtml2odt: support css property 'color' and support (background-)color values expressed as HTML color names.
- xhtml2odt: included 6 default heading styles in any pod template.
- xhtml2odt: support CSS attribute 'font-size'.
- xhtml2odt: allow to generate text paragraphs (span).
- xhtml2odt: parse negatie values for CSS properties.
- xhtml2odt: support table attr 'cellspacing' and CSS equivalent 'border-spacing' (1 value only).
- xhtml2odt: support table attribute 'border'.
- Added variables PIPE and SEMICOLON for using those pod-reserved chars within pod expressions.
- do ... from document(): new parameter 'convertOptions' allowing to perform some transformation with imagemagick (convert) before inserting an image into a pod result.
- do ... from document(): if the image type cannot be deduced from the file name, set format='image' and pod will guess the image type for you.
- Bugfix following problematic changes in content.xmlt and styles.xmlt.
- styles.xmlt: all paragraph Appy styles inherit from style AppyStandard.
- Tester.py: added options to run a single test (-t [testName]) or a single test suite (-s [testSuite]).
- Renderer: before calling the xhtml2odt converter, remove special chars '\v' and '\f' that produce SAX parser errors.
- Stop using popen3, os.system... Every call to another process is now done via function appy.shared.utils::executeCommand that calls subprocess.Popen.
- Added function 'columnBreak' available in the pod context for dumping a paragraph that forces a column break.
- Function 'xhtml': manage unicode strings.
- Added param 'space' to BulletedProperties / NumberedProperties instances, to determine the space between the bullet / number and the text.
- Importing images: allow to keep image ratio.
- PdfImporter: prepared to configure Ghostscript to raster a PDF into images using various devices: jpeg, jpeggray, png16m, pnggray. Currently, png16m is activated.
[gen]
- Ref field: bugfix: checking the presence of the request value when editing a ref with link=True.
- Ref field: added the possibility to show a confirm popup when unlinking an object (param unlinkConfirm, True by default).
- Ref field: bugfix: function 'goto tied object' within a popup.
- Ref field: added param 'links' allowing to enable/disable links to tied objects.
- Ref field: added parameter Ref.menuCss allowing,when render is 'menus', to specify a CSS class to apply to menu titles.
- Ref field: added param Ref.renderMinimalSep allowing to customize the separator used when rendering tied objects with the 'minimal' render mode.
- Ref field: allow to define forward Refs having no back Ref.
- Ref field: added param 'emptyIndexValue' allowing to perform queries matching patterns like 'someValue OR empty' (not possible to represent 'empty' with the standard index).
- List field: allow to have (forward-only) Ref field as sub-fields.
- Dict field: added a parameter allowing to overwrite the existing value instead of updating it (which is the default behaviour).
- Pod field: added param 'forceOoCall' (similar to the same parameter in appy.pod.Renderer's constructor.
- Pod field: added param 'downloadDisposition'.
- Pod field: added parameter 'confirm' allowing to get a confirmation popup before generating a pod result.
- Action field: do not unindex object if the action deleted it (obj.delete does it). By the way this code did not work.
- File field: added parameter File.downloadAction, allowing to specify a custom method that will be executed every time a file is downloaded.
- File objects: disable byte serving (at least for now);.
- File field: added method FileInfo::getBase64 to produce de base64 version of a file (in one chunk, which is different from what the XML marshaller does: it separates it into several XML sub-tags.
- Calendar field: allow to configure how the legend is rendered.
- Calendar field: added the possibility to send emails when validation of events is triggered.
- Calendar field: allow to navigate easier from one month to another.
- Calendar field: prevent browsing to months being outside [startDate, endDate].
- Calendar field: calendar::createEvent: added a param allowing to delete any existing event before creating the new event.
- Calendar: added a parameter 'selectableMonths' to the Calendar. This param determines, in a calendar monthly view, the number of months in the past or in the future, relative to the currently shown one, that will be accessible by simply selecting them in a list.
- Computed field: added the possibility to freeze/unfreeze those fields.
- Computed field: now that Computed fields can be frozen, added attribute 'unfreezable' allowing to prevent freezing those fields. This is useful if a Computed field is used to implement a custom widget with storage.
- Date field: allow to specify custom date and hour formats; added parameter 'showDay' allowing to hide the 'day' selection list.
- Static attribute Class.listCss allows to change the CSS class applied to tables of Class instances. Defaults to 'list compact'. If a lot of information is shown (in getSubTitle), value 'list' is more appropriate.
- More translations in german.
- New param Config.forcedLanguage allowing to force the UI to be in a given language.
- If you want to raise an exception that leads to a nice error page with a translated message, in your code, raise an instance of appy.gen.MessageException.
- CSS and graphical improvements
- ToolMixin::getObject is able to find a temp object.
- Removed the anti-double-click system on list links (Refs, queries): when opening the link in a new tab the source tab is left with the animation.
- Added param 'test' allowing to show a warning on every page if we are on a test system.
- Allow to enter a comment for the initial transition when creating an object.
- mail.py: bugfix when sending mail to several recipients.
- mail.py: bugfix (date sometimes not correctly set when sending emails).
- If an 'advancedSearch' exists, use its parameters to search 'allSearch'.
- Exceptions raised by workflow.py are inow instances of a new class WorkflowException.
- Class::sendMailIf: added an 'exclude expression' allowing to remove some user from the list of recipients based on any Python expression.
- Added the possibility to add custom entries in dicts of history events. While those additional keys will not be shown in the user interface, they will be marshalled in the object's XML version.
- Allow to create instances from templates (klass.create = Search).
- Icon for accessing the tool is given to anyone having 'write' permission on the tool. This can represent more people than Managers.
- Prepared to define non-Managers to manipulate the tool and its sub-objects.
- Allow to define Appy-not-detectable roles in Config.additionalRoles.
- Class.create can now be a statis method receiving the tool as single arg.
- unoEnabledPython and libreOfficePort are now in the RAM Config and not stored on the tool (DB) anymore. Note that param openOfficePort has been renamed to libreOfficePort.
- Improved manipulation of local roles. Added methods AbstractWrapper.addLocalRole and AbstractWrapper.deleteLocalRole.
- Bugfix: redirect after authentication (click on a URL from a link from an email).
- Code analyser: added analysis of CSS and JS files.
- Bugfix in master/slave relationships.
- Take into account User.getSupTitle.
- Better condition for showing/hiding field User.email.
- Added index 'Container' allowing to query all objects contained within another one via a Ref field with composite=True. This implements UML-like object composition and will be the way to replace Zope folders once Zope will be dismissed.
- Icon for 'back' transitions, which are found in many workflows.
- workflow.py::Transition: added parameter 'redirect' allowing (when value is 'page') to force to refresh the whole page after a transition has been triggered, even if the action is triggered from within a list of objects. By default, in the case, Appy normally only ajax-refreshes the table row corresponding to the object.
- Added a new type of group, with style='grid', allowing to display in a standardized way a series of fields in a tabular way. Also: added the possibility to make a field belong to a different group on different layouts: field=String(group={'edit': someGroup, 'view': anotherGroup}).
- Bugfix: take favicon.ico into account.
- Ensure special users 'anon' and 'system' do not have an email.
- Added a button allowing Managers to reset any internal user's password.
- Table of connected users: bugfix in the display of the last access date.
- Completed historization on Ref fields: added the possibility to historize object creation (via Refs with add=True) and object deletions from a Ref field.
- Added a third authentication mechanism, for authenticating users from HTTP headers sent by a single-sign-on (SSO) reverse proxy.
- SSO plug-in: allow to force encoding.
- Lists of users: icon 'external user' has now a tooltip containing the user source (LDAP or SSO) and the last time the local User instance has been synchronized with the source.
- Allow to easily modify master/slave relationships on fields via method Field.setMaster.
- When changing workflow definitions, produce a warning when some object is in a state that does not exist anymore instead of crashing.
- Added static attribute klass.uniqueLinks allowing to always generate different URLs for instances of this class when shown on lists (queries or refs).
- Standardized the use of Mixin.getListTitle even with Ref.menuUrlMethod.
- One may now define a method Class.onView that will be called every time an object is accessed via its 'view' layout type.
- Group.users has now link='popup'.
- Groups with style='grid' can now have a label, description and/or help icon.
- User and Group's main groups are now with style='grid'.
- Method AnyClass.sort: parameter 'sortKey' can now be a method.
- Group: allow groups with style='grid' to have several couples of columns (label, field).
- Correct default layouts for fields in grid groups.
- Added more standard layouts for strings and boolean fields.
- Performance improvement: on all Ref PXs, remove a superfluous call to Ref.getValue that constructed the whole list of tied objects.
- Performance improvement: cache, on the request object, results of 'show' attributes from Page instances.
- i18n labels for base classes (Tool, Group, User, ... defined in appy/gen/model.py) are now defined in Appy.pot.
- CSS class 'grid' for tables render nicely even when incorporated into the message dialog.
- pxHistory: allow to disable 'collapsibility' and to customise batch size.
- Method sendMailIf: several roles or permissions may be specified.
- Added a method for getting the page referer, taking into account reverse proxy specificities.
- Implemented a monitoring URL at <app>/config/check (for a status code) and <app>/config/check?all for more verbose information.
- Bugfix: prevent filtering on less than 3 chars.
- Allow to ajax-edit integers within table cells.
- Less HTML tables in the main Appy PX template.
- Workflow actions and button 'delete' now appear only on an object's main page.
[shared]
- ldap_connector: allow to specify protocol (ldap or ldaps).
- ldap_connector: ignore invalid entries retrieved via LDAP queries.
- xml_parser::XhtmlCleaner cleans less styles because pod::xhtml2odt supports more styles.
- XML unmarshaller: unmarshall datetime.datetime instances. dav.py::Resource: support https resources. dav.py::get: follow redirect responses (302).
- xml_parser::XhtmlCleaner: Allow to configure the list of tags to ignore, with or wihout its content.
- Added appy.shared.utils::getStringList for producing a string version of a list (that I use for producing Javascript arrays for example), similar to getStringDict (usable for dumping Javascript associative arrys as well).
[bin]
- backup.py: remove management of rtf files.