Appy stand for Applications in Python and it's a bunch of tools distributed under the GPL license for developing applications in the Python programming language.
Developers, too, have the right to (h)appyness !
Developers are often guys that live on another planet. Some think this is because software development is so exciting that everything else is poorly considered. At Null-IT software, we are deeply convinced that most developers do not enjoy themselves. They spend their lives together with complex problems that never go away from their minds. Nobody understands them. Their family? Their managers? Their clients? Their friends? No. Nobody. Nobody is able to imagine how huge and complex their tasks are. Consequently, what they do is underestimated. Worst: they can't communicate. Don't believe this is due to some intrinseque geek attitude. Their geekness results from the global incapacity to apprehend the very nature of their abilities. So they are forced to work harder while experiencing the true impossibility to share their permanent software experience. Of course, it may lead to social disasters.
By publishing this high-level, easy-to-use software construction kit, itself based on the tremendously productivity-boosting Python programming language, our crazy hope is to empower developers in such a way that they can leave more often their software prison and spend more time to discover real life.
But (h)appyness has a price. Appy developers themselves accepted to pay. They have dealed their social life for one of the highest forms of social denial (sorry we can't reveal their working conditions), hoping their sacrifice will free the users of their work. So if one day you meet one of them, please be gentle and patient. But they will probably not discuss with you.
The null-IT principle
Our action is guided by the following principle:
Information Technology (IT) should be as transparent and invisible as possible.
While this may seem obvious, this principle is largely ridiculed by a great number of widespread technologies. I will mention here JEE and XSL-FO which were taken as counter-examples while developing pod. In the Python world, Zope 3, by trying to mimick the ridiculous JEE component-model where code is viciously chopped into undersized chunks interconnected by obscure XML declarations, falls unfortunately into this category as well. This is a pity seeing Zope guys trying to abandon the elegant, simple, powerful (in a word: Pythonic) design of Zope 2. But don't be scared! Many people think that Zope 2 will last for many years... Null-IT, with others, is working hard to fight against the generalized Balkanization attitude that undermine IT innovation. If you believe there is still place for hope, you came at the right site. It is time to discover gen!
What's New in This Release: [ read full changelog ]
· Added the possibility to define several variables, in 'with' statements, separated by ';'.
· Added the possibility, for function 'document', to import, into an ODT result, external documents of various formats: doc, xls, ppt, etc. This new 'ConvertImporter' uses LibreOffice to first convert the doc into PDF, and then uses the PdfImporter to split the PDF into images (one image per page) and include in in the pod result.
· Allowed to call a pod template within another pod template via new POD function 'pod'.
· Improved error handling.
· Bugfix: error when a pod template does not have a 'mimetype' file inside (https://bugs.launchpad.net/bugs/1173009)
· Bugfix: error when parsing some ods pod templates: some cells do not have attribute 'office:value-type' (see bug https://bugs.launchpad.net/bugs/1173301).
· An expression that begins with char ':' is considered XML code that will come into the result unescaped.
· Within the context of a 'for' statement, loop objects now have additional boolean attributes named 'first' and 'last' that allow to know if the currently walked element is, respectively, the first of the last element of the whole list.
· Added params 'pageBreakBefore' and 'pageBreakAfter' to OdtImporter and PodImporter.
· Updated 'print' statements throughout Appy code, in order to be Python3x as well as Python2x-compliant. But Python3x support is not yet complete.
· Added new method 'pageBreak' allowing to insert a page break via a note 'do xxx from pageBreak()'
· Line breaks which are found within pod expression results are converted to odf line-breaks into the pod result.
· gen now integrates ckeditor 4.1.
· Integrated ckeditor inline editing via boolean parameter field.inlineEdit.
· icons.pt can now be configured even for anonymous users.
· Added tool.sendMail as an easy access method for function appy.gen.mail.sendMail.
· A Page instance that does not have sub-pages does not show the portlet.
· Added field appyclass.breadcrumb, allowing to show/hide the breadcrumb when displaying instances of this class
· Added field appyclass.resultMode, allowing to choose between 'list' or 'grid' mode (previously, only list mode was enabled) when showing instances of this class as a result of some query.
· appyclass.getIcons now receives the nav param, in case one wants to reproduce, on an icon or a picture, the link to the element. For example, on a artist's site that presents its artworks, getIcons can be used to create a clickable link to a small version of the artwork, that leads to the full-size picture.
· Bugfix: sort references.
· Allow to show transitions on 'view' and/or 'result' layout types.
· UI improvements.
· Added the possibility to define dict someClass.styles (with, currently, a single entry 'title'), allowing to specify alternative CSS classes for class-related elements (here, 'title' allows to define an alternative CSS class for the link allowing to click on some instance of the class on a query or ref.
· Added a basic integration of gen applications with Google Analytics.
· Bugfix in the query engine.
· Bugfix: do not show the Calendar widget (search and edit layouts) if field.calendar is False.
· Bugfix in the start and end dates for the Calendar widget.
· Added Config.discreetLogin allowing to put a discreet link on the main page for logging in, instead of the login form in the central strip, for sites where logged users do not represent the majority of visitors (only some admins).
· Corrected Zope index type for Date fields.
· wrapper.appyUser returns the admin if the user is 'System Processes', the virtual user that runs when Zope is starting.
· Added the possibility, for an admin, to unlock a page that was locked for too long by some user.
· Improvement in the management of Unauthorized exceptions.
· Added attributes 'created' and 'modified', now accessible on Appy wrappers.
· Added method AbstractWrapper.countRef that allows to count the number of objects tied to a given object via a Ref field whose name is given as method param.
· Replaced attributes tool.enableAdvancedSearchForX by klass.searchAdvanced.show. Obsolete fields 'enableAdvancedSearchX' are not generated anymore on the tool.
· Added a mechanism for caching method calls that are performed several times for displaying a single ui page (ie: field.show methods).
· Bugfix in the way to index text fields containing line breaks.
· Added a new script odfGrep.py that allows to search for some pattern within odt and ods files.
· Added script bin/checklo.py to check connection to LibreOffice.
· First version of a new template engine Python-XML, sharing the pod roots.