Metadata-Version: 2.4
Name: ll-la
Version: 0.62.0
Summary: Python API for LivingApps
Home-page: http://github.com/LivingLogic/LivingApps.Python.LivingAPI
Author: Walter Doerwald
Author-email: walter@livinglogic.de
License: MIT
Keywords: LivingApps
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.14
License-File: LICENSE.txt
Requires-Dist: ll-xist>=5.89
Requires-Dist: requests>=2.21.0
Requires-Dist: geocoder>=1.30.1
Requires-Dist: Pillow>=6.1.0
Requires-Dist: validators>=0.18.2
Provides-Extra: db
Requires-Dist: oracledb>=4.0.1; extra == "db"
Requires-Dist: psycopg[binary]>=3.0.5; extra == "db"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

``ll.la`` provides a Python API for the LivingApps system
(see http://www.living-apps.de/ or http://www.living-apps.com/ for more info).

``ll.la`` allows you to fetch the configured data sources from a template,
create new records, and update and delete existing records all from your Python
prompt (or script).

For more info about LivingApps and this Python SDK, see
https://my.living-apps.de/docs/PythonSDK.html (in german).


0.62.0 (2026-08-19)
-------------------

* Update to XIST 5.89 (which added Postgres support for vSQL).

* Fixed the dynamic vSQL queries which were broken by the changed vSQL API
  in XIST 5.89 (``vsql.Group`` now takes ``vsql.Field`` objects,
  ``vsql.Query.sqlsource()`` and ``vsql.sql()`` now return t-strings):
  ``DBHandler.count_records()``, ``DBHandler.fetch_records()``,
  ``DBHandler.delete_records()``, ``DBHandler.aggregate_records()``,
  ``DBHandler.count_records_from_apps()`` and
  ``DBHandler.fetch_records_from_apps()`` (i.e. the methods behind
  ``App.count_records()``, ``App.fetch_records()``, ``App.delete_records()``,
  ``App.aggregate_records()``, ``AppGroup.count_records()``,
  ``AppGroup.fetch_records()`` and ``AppGroup.fetch_recordpage()``).

  The queries are now composed as t-strings, and all values (including the
  out parameters) are passed as real bind parameters instead of being
  embedded literally into the SQL source or being passed as keyword
  arguments to ``execute()``.

* Added support for the translations of the multilingual attributes of apps,
  app groups, controls and lookup items via the new classes ``AppLang``,
  ``AppGroupLang``, ``ControlLang`` and ``LookupItemLang``.

  The multilingual attributes themselves (e.g. ``control.label``) remain
  plain strings: their getters now return the translation matching
  ``globals.lang``. A label from the active view still wins over the
  translation, and when there's no translation (or the translated attribute
  is ``None``) the attribute of the object itself is used.

  All translations are accessible (and modifiable) via the new attribute
  ``translations`` whose attributes are the language codes (e.g.
  ``control.translations.de``; this works in UL4 and in Python). Accessing a
  known language for which no translations exist yet creates a new empty
  translation object. Each translation object can be saved with its method
  ``save()``; ``translations.save()`` saves the translations for all
  languages.

  Setting e.g. ``control.label`` still sets the attribute of the control
  itself and never touches the translations.

* ``DBHandler.save_app()`` and ``DBHandler.save_control()`` now pass the
  "raw" attribute values (i.e. without the active view or the translations
  applied) to the database. This also fixes ``save_app()`` which previously
  accessed nonexistent ``App`` attributes for the grammatical gender and the
  case forms of the type name.


