Documentation » Changelog
NEW: Object indexing support including unique indexes per container.
Currently, the indexes are used for common database usage
patterns such as getting the children of a container, but not yet
fully leveraged by OQL.
NEW: Added multi-processing support for the asynchrounous TCP-IP
services (requires Python 2.6).
NEW: Added conditional Etag support by using the provided
"porcupine.filters.etag" decorator or the
"porcupine.filters.caching.Etag" pre-processing filter.
NEW: New database and cookie based session managers.
NEW: Added support for shortcuts by using the new
"porcupine.systemObjects.Shortcut" content type.
NEW: Cascade deletes for Relator1 and RelatorN data types.
NEW: QuiX now includes a lightweight rich text editor based on
Cameron Adams' work (http://www.themaninblue.com/).
NEW: QuiX now supports auto sized labels, icons, buttons and boxes. The
dimensions of these kind of widgets are automatically adjusted based
on their contents.
NEW: Added themes support for QuiX.
NEW: New "QuiX.queryString" function for getting query string parameters.
NEW: New "QuiX.baseUrl" setting that contains the toolkit's root folder.
NEW: QuiX now includes a JSON parser. See "QuiX.parsers.JSON".
NEW: QuiX now has a client side persistence module based on PersistJS
NEW: New "QuiX.utils.hashlib" module.
NEW: Ability for having persistent datasets on the client side by using
smart conditional Etags.
NEW: QuiX now supports IE 8, Safari 4 and Opera 9.
NEW: New method "setValue" for QuiX select lists.
NEW: New "hbox" and "vbox" shortcuts for horixontal and vertical boxes.
OPT: QuiX now has namespaces (i.e XButton is now QuiX.ui.Button).
The old naming convention is kept for backwards compatibility.
OPT: "db.getItem" no longer raises an ObjectNotFound exception. Instead
None is returned.
OPT: "relCc" attribute of relators and references now accepts base classes.
OPT: server side XMLRPC encoding speed improvements.
OPT: Porcupine OQL is now using PLY 2.5.
OPT: New implementation of "QuiX.innerText" function.
OPT: The "setExpiration" method of the HttpResponse class now accepts a
"cache_type" optional argument. The default value is "private".
OPT: New refactored transactions. Transactions are now non-blocking by using
the DB_TXN_NOWAIT flag.
OPT: Otimized session management.
OPT: Optimized asyncore loop by using longer timeouts.
OPT: Do not retrieve session info for static files.
OPT: Ability to set widget overflow values per axis i.e "auto hidden".
OPT: "porcupineadmin.py -c" now performs disaster recovery.
OPT: The "_safetype" class attribute of data type classes now accepts a list
of the allowed Python types.
OPT: If the bsddb module is not present then try to import bsddb3,
since bsddb is removed from the latest Python versions.
OPT: The "@db.transactional" decorator now accepts an optional "nosync"
argument for having faster but non durable transactions.
OPT: Ability to have the data and log files in different locations by using
the "bdb_log_dir" setting in the porcupine configuration file.
OPT: QuiX now includes a universal base Widget script.
FIX: Fixed QuiX's "onunload" event (it was fired only when the destroy
method of a widget was explicitly called)
FIX: Fixed __props__ generation when using codegen.
FIX: Fixed internal redirection.
FIX: "padding" is now a valid parameter for QuiX windows.
FIX: Fixed hidden buttons.
DEP: "HttpContext.current()" is deprecated. Use
"from porcupine import context" instead.
DEP: Containers no longer have the "_subfolders" and "_items" attributes.
This kind of info is now derived from indexes allowing hundrends of
thousands descendants with no perfomance penalty.
DEP: Most of the API methods are deprecrated due to PEP8 alignment. Check
the server's log for deprecated calls.
DEP: Removed all __slots__ attributes from all schema related classes.
DEP: "porcupine.core.servicetypes.asyncBaseServer.BaseRequest" is now
DEP: "porcupine.security.objectAccess.getAccess" is deprecated.
Use "porcupine.utils.permsresolver.get_access" instead.
DEP: QuiX boxes are no longer redrawn when removing a child widget.
The developer should take care of this.
DEP: "QuiX.getOS" is deprecated use "QuiX.utils.BrowserInfo.OS" instead.
NEW: New method "clearOptions" for QuiX combos.
NEW: Added support for date picker UTC dates by using utc="true".
NEW: New mandatory "@porcupine.db.transactional" decorator for
transactional web methods.
NEW: New "getattr" and "getparent" OQL functions.
NEW: New "query" method of QuiX base widget.
NEW: New "getWidgetByClassName" of QuiX base widget.
NEW: New "AutoComplete" widget contributed by Thomas Bellos.
NEW: New "onunload" custom event of QuiX base widget.
NEW: Added support for Safari, Firefox3 and Google Chrome.
NEW: New "effects" QuiX module.
NEW: New "maxfilesize" parameter for QuiX upload controls.
NEW: New "focus" method of QuiX combos.
NEW: New "onrowprerender" custom event of QuiX list views.
NEW: New "onrendercomplete" custom event of QuiX list views.
NEW: New "cellThreshold" attribute of QuiX list views. If the cells
to be rendered exceed this number the the list view is rendered
asynchronously (default value is 2000).
NEW: Added mandatory data types of all data types to avoid heavy
NEW: New "ondocumentload" custom event and "getDocument" method
for QuiX IFrame widgets.
OPT: Fixed list view headers wobbling.
OPT: Enhanced prioritization and activation of web methods based on the
OPT: New redesigned transactions.
OPT: Optimized calculation of proportional widths of list view cells.
OPT: Interactive column resizing of list views.
OPT: Added optional transaction argument to "getAllParents" method
of content classes.
OPT: When attempting to append an item having the same displayName with
a pre-existing item the exception raised contains the name of the
container in which the insertion was attempted.
OPT: Do not match IE mobile for QuiX based UIs.
OPT: Ability not to duplicate external files when cloning objects.
OPT: "getWidgetsByType", "getWidgetsByAttribute" and
"getWidgetsByAttributeValue" Widget methods are based on "query".
OPT: The Porcupine db is opened without the db.DB_RECOVER flag to allow
access from multiple processes (database recovery is done using
OPT: New type of progress indication (busy) while QuiX is
loading external resources.
OPT: The "redraw" method of QuiX boxes can now be overridden.
OPT: Ability to render borderless fields by using border="0".
OPT: Slices of resolved object sets (those returned by OQL queries)
now return an array of objects instead of a new object set.
OPT: Don not fire the "onchange" event when a Combo is first loaded.
OPT: While editing a data grid the changes are reflected immediately.
OPT: While editing data grids you can navigate between cells by using
the TAB and SHIFT-TAB keys.
OPT: Moved the object security check inside the web method wrapper
in order to be able to access objects with no read permissions
with "runas" impersonation filter.
OPT: Modified the desktop schema in order to use the out of the box
mandatory data types instead of the custom ones.
OPT: codegen now generates code for event handlers.
OPT: Ability to replace a data type with another for as long they have
the same safe type by using "setProperty" (codegen).
OPT: New "generate_code" optional argument to "commitChanges" method
of "porcupine.administration.codegen.ItemEditor" class. If set to
False the database is updated but the item's class is not.
OPT: The security context is now re-evaluated for evety new request
without having to initiate a new session thanks to Thomas Bellos.
OPT: Session objects now hold the user's ID instead of the user object
consuming less memory resources.
OPT: New "porcupine.filters.authorization.RunAs" pre-processing filter.
FIX: Do not keep a cached copy for non-existent published directories.
FIX: Fixed property dialogs when properties contain special
characters such as ",<,> etc.
FIX: Fixed duplicate files inside packaged directories when using
FIX: Fixed list view dimensions when exploring folders.
FIX: Fixed cellpadding setting of QuiX list views.
FIX: Fixed cells with proportional width when having a hidden
list view header.
FIX: Item updates that occur inside "onupdate" event handlers are
FIX: Clear tree selection when destroying a tree node that contains
a selected sub node.
FIX: Fixed trans_max_retries setting in the Porcupine database
FIX: Fixed "activeTab" value when destroying the first tab of
QuiX tab panes.
FIX: First tab's onactivate handler is now called.
FIX: Fixed multiple file upload on IE.
FIX: Fixed "imgWidth" and "imgHeight" QuiX Icon parameters when
FIX: Fixed "nextSibling" and "previousSibling" QuiX base widget
FIX: Fixed imports generation bug when a module contains "import ..."
FIX: Fixed "getSecurity" desktop remote method when an assigned
user or group no longer exists.
FIX: Fixed days locale enumeration for "porcupine.utils.date.Date"
FIX: Fixed data types validation when __debug__ is set to False.
FIX: Preserve radio buttons state between redraws on IE.
FIX: Fixed "parseFromUrl" on IE when template contains numerous
DEP: "HttpContext.current().session.user" is no longer valid. Use
DEP: "db_backup.py" script is renamed to "porcupineadmin.py"
DEP: The "sort" method of QuiX list views now accepts the column
name and the sort order ("ASC" or "DESC").
DEP: Removed object cache as objects copying was quite expensive.
Future releases will use shared cache allowing multi process
DEP: The "orderBy" and "sortOrder" properties of QuiX list views
are now private.
DEP: The arguments passed to the sortfunc function of list views
are the list view, the order by field and the sort order.
DEP: The "porcupine.core.eventHandlers" is now "porcupine.events".
DEP: The "displayName" attribute is now of type
DEP: The "addProperty" method of
"porcupine.administration.codegen.ItemEditor" class is
deprecated. Use "setProperty" instead.
NEW: Ability to define image dimensions explicitily for Icon and
TreeNode widgets using the "imgwidth" and "imgheight" attributes.
Accepted values are integers or percentages.
NEW: Added "onmousedown" to the list of supported QuiX events.
NEW: Added "focus" method to Field widgets.
NEW: Added "maxlength" and "textalign" attributes to fields.
NEW: Added "getFile" method to the internal file data type.
NEW: Support for pre-processing filters.
NEW: New pre-processing filter
"porcupine.filters.requires_login" decorator for web methods.
As the name denotes this filter protects assets from non
authenticated users. Ability to redirect such users to a
predefined url if the optional "redirect" argument is used.
NEW: Added new "QuiX.getTargetWidget" function.
NEW: New "QuiX.getOS" function.
NEW: QuiX context menus now have a new "target" attribute which contains
the target widget.
NEW: Added new "getWidgetsByAttributeValue" method applying to all widgets.
NEW: POQL now has two new functions "upper" and "lower". Useful when
performing case-insensitive searches on string attributes.
NEW: QuiX now has a universal mouse button detection method
NEW: Added "deletePermanent" remote method applying to all content classes.
NEW: ListView widgets now have a "select" method that selects items by
NEW: New "rowheight" parameter for ListView widgets.
NEW: Ability to specify which splitter pane collapses by using the
"_collapse" custom attribute.
NEW: New "editundef" attribute for data grids. If set to "false" then the
dataset's undefined values are not editable.
NEW: New "List" data type.
NEW: New "onclose" custom event for ContextMenu widgets.
OPT: Service oriented architecture. Currently, the supported services
include an asynchronous network server and a scheduler used for
executing Python code at fixed intervals.
OPT: Data types are now type safe.
OPT: The porcupine database singleton is now accessible from everywhere
by using "from porcupine import db".
OPT: The main Porcupine configuration file is now a Python dict.
OPT: The "config.xml" configuration files can now contain smart
registrations with regular expressions matching providing
with a powerful rewriting engine.
OPT: QuiX is now using a pooled set of XmlHttp objects for better resource
usage on the client side.
OPT: Enhanced detection method for droppables.
OPT: Using the standard "mimetypes" Python module for guessing
response content types.
OPT: Changed the default mode of the "getFile" method of the
external files datatypes to 'rb'.
OPT: Session objects are now using __slots__ for more efficient memory
OPT: Added the required hooks that allow the integration of other
popular Python template engines easily.
OPT: The cookie detect page is removed. The code is transferred inside
the "porcupine.webmethods.quixui" decorator when this is defined
as a page (by using the isPage=True directive).
OPT: The Porcupine exceptions module has been greatly simplified. The error
codes have become equivalent to those of the HTTP protocol.
OPT: Object sets have become far more memory efficient.
OPT: The date locales are transfered inside the "porcupine.utils.date"
OPT: Ability to define custom attributes to tree nodes of FolderTree
widgets if and only when the remote call returns an
"attributes" parameter for each tree node.
OPT: Allow more than one non-nested transactions per request.
OPT: Fixed scroll bars bleed through on MacOS Firefox.
OPT: QuiX FlowBox now supports multiple selection by using
OPT: Allow alternate row colors for ListView widgets by using the
"altcolors" attribute. Ability to define highlight colors by
using the "hightlightcolors" attribute.
OPT: Added the missing email field on the user's form.
OPT: Ability to define accepted file types for each QuiX file control
by using the "filetypes" attribute.
OPT: File controls now have an "oncomplete" event which is fired when
upload is finished.
OPT: Removed limitation that required file controls to be placed inside
a QuiX window.
OPT: New "reset" method for MultiFile widgets.
OPT: The main widget for all QuiX Window is now a vertical Box in order
to support themes in a simpler way.
OPT: Enhanced resolution of QuiX modules' dependencies.
OPT: The object cache returns deep copies of objects, so that each request
is accessing its own copies.
OPT: The "Composition" data type now accepts subclasses of the
OPT: TabPane's "activateTab" now accepts both an integer or a tab widget as
OPT: Wrapped tooltips.
OPT: Automatically generated forms now support date data types.
OPT: The "create" and "update" remote methods handle integer data types.
OPT: The remote method "update" now handles date data types.
FIX: The XML-RPC module now encodes unicode keys of dict types
using the appropriate encoding.
FIX: Fixed the "Content-Disposition" header when the filename contains
FIX: Fixed the "getCaption" method of QuiX Labels when these contain
special characters such as &,<,>.
FIX: Remove the active editing widget when refreshing a Datagrid.
FIX: Fixed the "getImageURL" and "setImageURL" methods for icons that
do not have initially an image set.
FIX: Fixed error when packaging directories with unicode paths using the
FIX: Fixed row dragging of list views on IE.
FIX: Added missing "__slots__" class attribure to ExternalFile data type
and PersonalFolder content class.
FIX: Tree widget's "getSelection" now returns null if no tree node is
FIX: Fixed list view's header placement when padding top is other than 0.
FIX: No more orphaned context menus.
FIX: Fixed length distribution after removing a child of a Box.
FIX: Boxes now display correctly if the first child is hidden.
FIX: Fixed filenames for duplicated external files when cloning an object.
FIX: Fixed date formatting when using the "yy" parameter on the server side.
FIX: Fixed the "iconpadding" parameter for QuiX buttons.
FIX: Fixed possible transaction deadlock when moving or copying
FIX: Fixed selection of "Reference1" data types with POQL.
FIX: The server side XML-RPC module serializes composites.
FIX: Content classes' event handlers are called before datatype event
handlers to reflect any possible data type updates.
FIX: Do not update the object cache if a transaction handle is given on read
FIX: The "onchange" event for date pickers is now fired.
DEP: The servlets are completely replaced by smart decorators. These
decorators can be found inside the "porcupine.webmethods" module.
This means the the "HTTPServlet", "XULServlet" and "XMLRPCServlet"
classes no longer exist.
DEP: You cannot bind Python Server Pages to objects but you can still use
them stand alone.
DEP: All system objects inside a PSP page now begin with a capital letter;
i.e. Response instead of response, Item instead of item etc.
DEP: The store.xml configuration file no longer exists.
DEP: The @policymethod descriptor is now implemented as a pre-processing
filter ("porcupine.filters.authorization.RequiresPolicy" for
"config.xml" files or "porcuine.filters.requires_policy" when
used as a descriptor).
DEP: The Gzip post processing filter is now referenced as
"porcupine.filters.output.Gzip" when used inside "config.xml"
configuration files or "porcupine.filters.gzip" when used as a
DEP: The Multilingual post processing filter is now referenced as
"porcupine.filters.output.I18n" for "config.xml" files or
"porcupine.filters.i18n" when used as a descriptor.
DEP: The "porcupine.utils.xmlUtils" module is renamed to
"porcupine.utils.xml". The "XMLEncode" function is renamed
DEP: The "porcupine.serverExceptions" module is renamed to