- Fixed handling of
Control.base_mode(since it already is a string in the UL4ON dump).
- Added the appparameter types
JSONandCODE.
- Added the
Controlattributesbase_modeandin_sum.
- Update internal version number of the LivingAPI to 139.
- Made the attribute
StringControl.placeholdersettable and mirror the attribute inStringField(where the attribute is settable too and inherits the controls value). - Renamed the grammatical UL4 field names to
typename_grammatical_gender,typename_nominative_singular,typename_genitive_singular,typename_dative_singular,typename_accusative_singular,typename_nominative_plural,typename_genitive_plural,typename_dative_pluralandtypename_accusative_plural.
- Update internal version number of the LivingAPI to 138.
- Added the
Controlattributesin_structured_search,in_fulltext_searchandin_expert_search.
- Update version number of the LivingAPI to 137.
- Update to XIST 5.82.1 and use the vSQL defined there (instead of our own).
- Add the method
App.aggregate_records.
- Fixed member templates for
Geoobjects.
- Fixed logic for determining whether a template is a bound member templates
for templates that are bound to a specific
FieldorControlinstance.
- Added methods
AppGroup.count_records,AppGroup.fetch_recordsandAppGroup.fetch_recordpage. - Added support for
AppGroupmember templates. - Changed the way internal and library templates are fetched and cached: Now they will be fetched and cached for each supported LivingAPI type independently instead of all in one dictionary.
- Update version number in
setup.py.
DatasourceChildren.filteris alistnow.
- Python 3.14 is required now, since we're using type hints that only work with deferred annotations.
- Added class
Permissionsand attributeApp.permissions. - Added attribute
App.recordpage. - Added attribute
Globals.user_record. - Added attributes
App.filter_default,App.sort_defaultandApp.filter_owndata. - Added methods
Record.fetch_child_records,Record.count_child_recordsandRecord.fetch_child_recordpage.
- Fixed attribute name in
AppLookupControl.vsqlfield - Remove debug
prints.
- Fixed join condition in
App.vsqlfield_appandApp.vsqlfield_recordsto use an inner join instead of an outer join.
- Added a vSQL method
vsql.Query.register_vsqlto force the table referenced by a vSQL variable to be included in the "from" list. - Added UL4 attribute
App.internal_id,Globals.free,DataSource.filter,DataSource.sort,DataSourceChildren.filterandDataSourceChildren.sort. - Added methods
App.count_records(),App.delete_records()andApp.fetch_records()that use dynamic vSQL queries to count, delete and fetch records of an app. - Added support for "offset" and "limit" clauses to vSQL queries.
- Add additional vSQL methods for request parameters and other global information.
- Fix :meth:`ll.la.Record.send_mail`.
- Always use the
{a}table alias in vSQL expressions for fields. - Java source code for vSQL expressions now also knows the Oracle source code.
- Add the attributes
App.ai_generated,AppGroup.descriptionandAppGroup.image.
- Parameters of an app group now inherit the library parameters too. However for parameters of an app the library parameters will be ignored during traversal of the app group. The library parameters will only be used as the ultimate fallback.
AppParameterobjects now support member templates.Control.modeis now settable.- Add support for custom attributes to
AppParameter. - Update name of
AppParametertypestrtostring. - The attribute
App.recordcounthas been renamed torecord_total. Attributesrecord_startandrecord_counthave been added that contain paging information (when paging parameters are in use or vSQL expressions for paging have been configured). - Similar attributes (
record_total,record_startandrecord_count) have been added toRecordChildren.
- Added support for :class:`ll.la.AppParameter`s attached to :class:`ll.la.AppGroup`s.
- Added method :meth:`ll.la.AppGroup.add_param`.
- The signature of :meth:`ll.la.App.add_param` has changed to
(self, identifier, *, type=None, description=None, value=None). - Removed unused class :class:`ll.la.TemplateLibrary`.
- The methods :meth:`ll.la.Record.save` and :meth:`ll.la.AppParameter.save` will do nothing when the record or parameter have been deleted before.
- Fixed wrong variable name in :meth:`ll.la.vsql.VSQLUnknownFieldError.detail`.
- Fixed wrong variable name in :meth:`ll.la.vsql.VSQLUnknownNameError.detail`.
- Methods of :meth:`ll.la.vsql.Query` that take vSQL expressions as an argument,
now have the suffix
_vsqlin their name. Versions that take "raw" SQL have been added with the name suffix_sql. - It is no longer possible to pass multiple expressions to :meth:`ll.la.vsql.Query.select` or :meth:`ll.la.vsql.Query.where`.
- It is now possible to add field aliases for the selected fields in :meth:`ll.la.vsql.Query.select`.
- It is now possible to pass additional expressions to :meth:`ll.la.vsql.Query.sqlsource` for the list of tables to select from.
- The
fieldsqlattribute of :class:`ll.la.vsql.Field` objects now should contain the placeholder{a}for the table alias. - :meth:`ll.la.Globals.scaled_url` now complains if the
imageargument isn't of type :class:`~ll.la.File` or :class:`str`. - A method :meth:`ll.la.vsql.AST.walknodes` has been added that recursively iterates through all children.
- A method :meth:`ll.la.vsql.AST.check_valid` has been added. It does nothing if the AST node is valid, and raises an appropriate exception otherwise.
- Modernize type hints (This means that Python 3.10 is required now).
- Updated internal LivingAPI version number to 133.
- Added method
Control.save()that saves the user settable attributes to the database. - Made the
Appattributesname,description,image,favorite,gramgen,typename_nom_sin,typename_gen_sin,typename_dat_sin,typename_acc_sin,typename_nom_plu,typename_gen_plu,typename_dat_pluandtypename_acc_plusettable and add a methodApp.save()that saves those attributes to the database. - Added attribute
Globals.groups,AppGroup.main_appandApp.main. - Added class
ViewTemplateInfoand attributeApp.viewtemplates. Renamed the old attributeviewtemplatestoviewtemplatesconfig.
- Remove debug logging statement.
- Reverted dependencies.
- Use fixed version numbers.
- Don't depend on XIST 5.77 since this requires Python 3.10.
Fixed handling of the "required" info. Before the following could happen:
There is a first view A that has a field F that is required in view A and a second view B that doesn't include field F. The configuration of the
ControlC for this field is the default value of "the first view decides" which in this case meansC.requiredisTrrue. Now if view B is the active view callingControl.requiredreturnedTrue, which is wrong, since a field that is not in a view shouldn't be required. The reason for the wrong result was, that the return value ofControl._get_viewcontrol()couldn't distinguish between "there is no active view" (in which case "the first view decides" is the correct approach) an "there is an active view, but it doesn't contain the control in question" (in which case the control should never be required).This has been fixed now by using a new method that can distinguish those two cases.
- If a
Recordhasn't been saved yet callingdeletejust records the fact that the record has been deleted without calling any database procedures. TheRecordsidattribute will be set toNone. - Calling
saveafter a record has been deleted now doesn nothing.
- Added the class
AppGroupand theAppattributegroup. - Member templates now work for
MenuItemandPanel. - This version requires the API version 132.
- Added
Controlattributesdescription,in_mobile_listandin_text. - Added
Control.in_listas an alias forControl.priority. Control.requirednow works independent of an active view. However when a view is active it mirrors the view fields "required" status.- Added
Fieldattributesdescription,in_mobile_list,in_textthat mirror theControls attributes.
- Fixed the value of
Field.modewhen accessed via UL4.
- Fixed the implementation of the attribute
App.templates(andGlobals.templates).
- Setting a
BoolFieldto"false","no","0"or"off"now sets the value toFalse. This is checked in a case insensitive way. - Setting a
BoolFieldto an empty string now sets the value toNone. template_url()and related methods now support sets as keyword argument values. They will be handled like lists producing multiple parameters.- :class:`Control.Mode` gained three new values:
READONLY,HIDDENandABSENT. Field.modeinheritsControl.modebut can be overwritten.- :class:`App` has gained new attributes:
gramgen: The grammatical gender of the label of things in this app.typename_nom_sin: A label for things in this app (nominative singular).typename_gen_sin: A label for things in this app (genitive singular).typename_dat_sin: A label for things in this app (dative singular).typename_acc_sin: A label for things in this app (accusative singular).typename_nom_plu: A label for things in this app (nominative plural).typename_gen_plu: A label for things in this app (genitive plural).typename_dat_plu: A label for things in this app (dative plural).typename_acc_plu: A label for things in this app (accusative plural).
- Added
Globals.form. - Detail records for a master record are now stored in a new :class:`RecordChildren` object. Creating a new empty :class:`Record` automatically attaches the appropriate :class:`RecordChildren` objects to it.
- Added
MenuItem.on_view_template.
- Setting a
BoolFieldto an empty string now sets the value toFalse.
- Add new UL4 attribute
recordedatin classFilewhich holds the point in time when the file was recorded.
- Add new UL4 attributes
search_url,search_param_nameandtarget_param_nameinAppLookupChoiceControlandAppLookupChoiceField.
- Fix version number.
- Fixed type of
AppParameter.owner. - Bump API version to 131.
- Now each vSQL rule stores the specification it was generated from. A string version of that can be retrieved via the method :meth:`str_vsqlsource`.
- Added the methods :meth:`App.send_mail` and :meth:`Record.send_mail`.
- Add field
requiredin classField. - Move
_set_valuemethod intoFieldsubclasses.
- Bump required serverside LivingAPI version to 130.
- Added
Recordmethodsdisplay_embedded_url(),display_standalone_url()anddisplay_url(). - Renamed database procedure parameter
p_requestidtop_reqid.
- Removed inheritance of internal templates from the base app.
- Added method
User.change().
- Added method
Globals.qrcode_url(). - Updated documentation theme.
Globals.versionis now checked against the expected version when loading an UL4ON dump.
Usernow has an attributeglobalsand supports "member templates" (i.e. bound templates that can be called and rendered like normal methods).
- All URLs that the LivingAPI now uses are always absolute (i.e. the
return values of
Globals.scaled_url(),App.template_url(),Record.edit_url(), etc. and the attributesFile.urlandFile.archive_url).
AppLookupField.lookupdatanow returns fake data with error hints in case of missing target app or target app records.
- Fixed parameter inheritance via the parameter
la.
- Fixed template inheritance via the parameter
la.
- Fixed saving files via the :class:`HTTPHandler`.
- Fixed invalid uses of
File.internal_id.
- Merged attributes
iconsmallandiconlargeofAppobjects intoimage. - Merged attributes
avatarsmallandavatarlargeofUserobjects intoimage. - Merged attributes
originalandscaledofImageLayoutControlobjects intoimage. - Added attribute
z_indextoControl,ViewControlandLayoutControl. - Added attribute
MenuItem.accessible. - Update upload handling to support a world without
uploadref. - Add methods
home_url(),datamanagement_url(),import_url(),tasks_url(),datamanagement_config_url(),permissions_url()anddatamanageview_url()to class :class:`App` which return the relative URLs for the respective menus. - Add methods
my_apps_url(),my_tasks_url(),catalog_url(),chats_url(),profile_url(),account_url()andlogout_url()to classGlobalswhich return the relative URLs for the respective menus. - Added attribute
View.focus_controland methodView.focus_first_control(). - Added method
Control.is_focused(). - Add field errors to the record if we have an active view and the field is not in the active view. This avoids problems with invisible errors in the form.
Control.in_active_view()is a method now.- Added method
App.seq(). - Added
Fieldsubclasses (one for each control type). - Allow setting the attributes
Globals.pv_*andApp.pv_*.
- Removed shortcut attributes from :class:`DataSource`.
- Added
APPSTARTto :class:`MenuItem.Type`.
- Added the new :class:`Panel` attributes to
Panel.ul4_attrsto make them accessible for UL4.
- Added :class:`Panel` attributes :attr:`header_type`, :attr:`header_background`, :attr:`text_color`, :attr:`background_color1` and :attr:`background_color2`.
- :class:`Link`s have been split into :class:`MenuItem` and :class:`Panel` objects.
- Fixed version number in
setup.py.
- Added incremental loading of layout controls.
- Added
App.child_controls(This contains allapplookupandmultipleapplookupcontrols in other apps that point to this app). - Internal templates are now stored in the Postgres database.
- Add shortcut attributes
p_*,pv_*,cl_*andt_*to :class:`DataSource`. These atttributes forward to the app. - When a record gets saved it's state is now set to
SAVED. - Added the class :class:`Link` and added the attribute
App.linkscontaining all currently active links in this app that are accessible to the current user. - Fixed transaction handling for postgres.
- Skip transaction handling when no connections are given for :class:`DBHandler`.
- Implemented deleting of parameters.
- Fixed parameter save logic to use the WAF procedures.
- Added :meth:`Field.set_error`.
- Added
LayoutControl.visible.
- Fixed :meth:`ul4_getattr` implementation to honor UL4 logic in descriptors.
- The Postgres database connection is now optional.
- Add missing
ul4onidproperty to :class:`Installation`.
- :meth:`DBHandler.reset` now calls
LIVINGAPI_PKG.CLEAR_ALL()instead ofLIVINGAPI_PKG.CLEAR_OUTPUTANDBACKREFS()to completely reset the server side state.
- Fixed optional dependency on :mod:`psycopg`.
- Updated required XIST version.
- Added optional dependencies to :mod:`cx_Oracle` and :mod:`psycopg` (required when :class:`DBHandler` is used).
Add support for hierarchical parameters and parameters attached to view and email templates.
Add the following methods to :class:`App`:
and the following methods to :class:`Record`:
Add support for automatic resynchronization of the UL4ON codec state between the database and the :class:`DBHandler`.
- Add support for template library parameters.
- Add support for external data sources.
- Ensure that our internal Postgres queries use
tuple_rowas therow_factory. This makes us independent from the Postgres connection we might have been given in the call to theDBHandlerconstructor.
- Add support for template libraries and template library chains.
- Add support for custom attributes (whose name starts with
x_). - Added
Fileattributes:duration,geo,storagefilename,archiveandarchive_url. - Added new values for
Globals.mode:form/new/input,form/new/geo,form/edit/inputandform/edit/geo. - Added shortcut attributes to
Globals:p_*for app parameters,pv_*for app parameter values. - Added shortcut attributes to
App:lc_*for layout controls, andpv_*for app parameter values. - Added shortcut attributes to
Veiw:c_*for controls andlc_*for layout controls. - The following attributes are now fetched from the database incrementally,
if they haven't been part of the UL4ON dump:
App.params,App.viewsandRecord.attachments. - Added attributes to
NumberControl:precision,minimumandmaximum. - When setting values of date fields, now the language specific format
(from
globals.lang) will be considered. - Added new values to
ViewTemplateConfig.Type:LISTDATAMANAGEMENTandDETAILDATAMANAGEMENT. - Added
ButtonLayoutControl. - Added
Viewattributes:login_required,result_pageanduse_geo. - Make
DBHandlerusable as a context manager (leaving the context manager commits or rolls back the connection and reset the UL4ON decoder). - Rename classes:
ViewTemplatetoViewTemplateConfig,DataSourcetoDataSourceConfig,DataSourceDatatoDataSource.
- Use :meth:`object_named` in :class:`DBHandler._getproc` instead of the deprecated (and broken) :meth:`getobject`.
- Make :class:`KeyView` objects persistent.
- Fixed setting a value for
Fieldss ofIntControlandNumberControlobjects.
- Renamed
AppLookupControl.lookupapptolookup_appandAppLookupControl.lookupcontrolstolookup_controls. - Added the following attributes to
AppLookupControl:local_master_control,local_detail_controls,remote_master_control.
- Added the attribute
favoritetoAppand expose it to UL4. Exposesuperidto UL4ON. - Renamed
App.languagetoApp.lang. - Fixed
DatetimeSecondControl._asjson()to treatdatetime.datetimevalues correctly. - Updated
DatetimeControl,DatetimeMinuteControlandDatetimeSecondControlto support setting values to strings (when they have the correct format). - Added an UL4 attribute
formattoDatetimeControl,DatetimeMinuteControlandDatetimeSecondControlthat gives the appropriate UL4 format string for formatting a value for this control (depending onglobals.lang). - Added
Globals.modewhich is the template mode we're running in. Valid values are"form/new/init","form/new/search","form/new/failed","form/new/presave","form/new/postsave","form/edit/init","form/edit/search","form/edit/failed","form/edit/presave,"form/edit/postsave","view/list","view/detail","view/support","email/textandemail/html". - Most LivingAPI objects are now persistent objects.
- Implement
Globals.scaled_url(). - Added the classes
ViewControl,HTMLLayoutControlandImageLayoutControland attributesView.controlsandApp.active_view. - Setting
App.active_viewto aViewobjects makesControlattributes honor the additional information defined in theView. - Added
Viewattributeslang,controlsandlayout_controls. - Added
Appattributelayout_controls. - Added various
Controlattributes that are used inView``s: ``top,left,width,height,default,tabindex,minlength,maxlength,required,placeholder,mode,labelpos,autoalignandlabelwidth. - Added attribute
formattoDateControl. - Added attributes
none_keyandnone_labeltoLookupControl,MultipleLookupControl,AppLookupControlandMultipleAppLookupControl. - Implemented field value validation and support for field default values.
- Add support for "deferred" types in :class:`Attr`. This makes it possible to have cyclic references in attribute "declarations".
- Add the attributes
appandrecordto :class:`Globals`. - Accessing
globals.templatesorapp.templatesnow fetches the templates via the handlers :meth:`fetch_templates` method (which only does something in :class:`DBHandler`). - :class:`DBHandler` now accepts either the
accountor theide_idargument. - Added :class:`FileSignatureControl` and :class:`HTMLControl`.
- Fixed order of type checks in :meth:`DatetimeSecondControl._asjson`.
- Remove debug prints.
- Pass the handler to the fields when creating JSON for the
:class:`HTTPHandler` or procedure arguments for the :class:`DBHandler`.
This is used so that the correct
VARCHARStype from the target database can be used when saving a record via a :class:`DBHandler`. - Fixed procedure argument handling for :class:`MultipleLookupControl` (the
list value has to be wrapped in a
VARCHARSobject).
- Fixed field validation for multiple lookup fields.
- Removed debug code from
DBHandler.meta_data. - Add support for sets in vSQL.
- When creating vSQL constants :class:`datetime` objects are no longer converted to vSQL date objects when the time portion of the :class:`datetime` object is zero.
- Properly mark a record as deleted when it gets deleted via the :class:`DBHandler`.
- View templates and internal templates can now be deleted via the :class:`DBHandler`.
- Fixed handling of vSQL slices with missing start or stop indexes.
- Add dependency on :mod:`Pillow`.
- Allow communication with the :class:`HTTPHandler` with an existing authentication token.
- Add proper handling of database exceptions to :meth:`DBHandler.save_record`.
- Add more tests.
- Handle recursion in :meth:`Record.__repr__`.
- Its now possible to pass more than one error to :meth:`Record.add_error` and :meth:`Field.add_error`.
- When uploading files via the :class:`HTTPHandler` pass along the MIME type.
- The
HTTPHandlernow delays logging into LivingApps until the first real request. Furthermore it automatically appendsgateway/to the base URL and omits that part when constructing request URLs. The result of that it that it's possible to replace the base URL with something else after theHTTPHandlerhas been created and before the first request is made. (This makes it possible to talk to the gateway host directly on custom LivingApps installations.) - Added a
forceargument to the methodRecord.save(). Withforce=False(the default) any errors on the record or any of the fields will raise an exception. Theforce=Truethe record will be saved anyway. The return value indicated whether the record was really saved or the database or gateway returned an error. Referencing unsaved records or files are now handled in a similar way:force=Falsewill raise an exception andforce=Truewill replace those references withNoneand add an error messsage to the field. - It is now possible to create a
Fileobject and pass the content to the constructor. This is useful when a file has to be uploaded but none of the supported methods for creating one viaHandler.file()do the right thing. If content is passed, the mime type isimageand the argumentswidthandheightareNonethe image size will be calculated automatically from the data (using :mod:`Pillow`).
- Added support for saving uploads via the
HTTPHandler. - Added support for the attribute
Globals.hostname.
- Fixed shortcut attributes for the
Globalsobject. - First Cheeseshop release.
- Expose the method
Field.is_empty()to UL4.