App
Ein App-Objekt stellt eine Applikation dar und hat folgende Attribute:
idStringDer eindeutige Datenbank-Identifizierer der App.
globalsGlobalsVerweist auf das
Globals-Objekt, das globale Informationen enthält.nameStringDer Name der App.
Dieses Attribut kann geändert werden.
descriptionString oderNoneDie Beschreibung der App.
Dieses Attribut kann geändert werden.
langStringDie Sprache in der die App angezeigt wird (beispielsweise
"de"für Deutsch und"en"für Englisch).typename_nom_sinStringDie Bezeichnung für Datensätze in dieser LivingApp (im Nominativ Singular).
Sind in Ihrer LivingApps z.B. Kunden gespeichert, so wäre dies sinnvollerweise „Kunde“.
Dieses Attribut kann geändert werden.
typename_gen_sinStringDie Bezeichnung für Datensätze in dieser LivingApp (im Genitiv Singular).
Dieses Attribut kann geändert werden.
typename_dat_sinStringDie Bezeichnung für Datensätze in dieser LivingApp (im Dativ Singular).
Dieses Attribut kann geändert werden.
typename_acc_sinStringDie Bezeichnung für Datensätze in dieser LivingApp (im Akkusativ Singular).
Dieses Attribut kann geändert werden.
typename_nom_pluStringDie Bezeichnung für Datensätze in dieser LivingApp (im Nominativ Plural).
Sind in Ihrer LivingApps z.B. Kunden gespeichert, so wäre dies sinnvollerweise „Kunden“.
Dieses Attribut kann geändert werden.
typename_gen_pluStringDie Bezeichnung für Datensätze in dieser LivingApp (im Genitiv Plural).
Dieses Attribut kann geändert werden.
typename_dat_pluStringDie Bezeichnung für Datensätze in dieser LivingApp (im Dativ Plural).
Dieses Attribut kann geändert werden.
typename_acc_pluStringDie Bezeichnung für Datensätze in dieser LivingApp (im Akkusativ Plural).
Dieses Attribut kann geändert werden.
gramgenStringDas grammatikalische Gechlecht der Bezeichnung für Datensätze in dieser LivingApp.
"m"für männlich,"f"für weiblich,"n"für sählich.Dies (und die obigen Attribute
typename_nom_sinusw.) können dazu verwendet werden um korrekte Meldungen für Ihre Datensätze in den Anzeige-Templates zu erzeugen.Dieses Attribut kann geändert werden.
groupAppGroup oderNoneDie AppGroup zu der diese App gehört.
mainBoolEin Flag, das kennzeichnet, ob dies die Haupt-App innerhalb ihrer AppGroup ist.
ai_generatedBoolEin Flag, das kennzeichnet, ob diese App von Lilo erzeugt wurde.
imageFile oderNoneDas App-Icon in Original-Größe.
Wird das Icon in einer anderen Größe benötigt, kann scaled_url(…) benutzt werden.
Dieses Attribut kann geändert werden.
private_uploadsBoolGibt an, ob auf hochgeladene Dateien dieser App nur von autorisierten Benutzern zugegriffen werden darf.
createdbyUserDer Besitzer der App.
createdatDatumDer Zeitpunkt zu dem die App erstellt wurde.
updatedbyUser oderNoneDer Benutzer, der die App zuletzt geändert hat. (Wurde die App noch nicht geändert, so ist
updatedbyNone.)updatedatDatum oderNoneDer Zeitpunkt, zu dem die App das letzte Mal geändert wurde. (Wurde die App noch nicht geändert, so ist
updatedatNone.)controlsDictionary(String ➝ Control)Die Definition der Felder der App. Dieses Dictionary ist sortiert, d.h. beim Durchlauf werden die Felder in der Reihenfolge durchlaufen in der sie angelegt wurden. Die Schlüssel in diesem Dictionary sind die Feld-Identifizierer und die Werte sind
Control-Objekte.Normalerweise beinhaltet
controlsalle Felder des Datensatzes, außer wenn in der Datenquellen-Konfiguration Nur Listenfelder? gesetzt ist, dann werden nur diejenigen Felder übernommen, die unter ausgewählt wurden.c_<identifier>ControlControl-Objekte stehen auch über sogenannte „Shortcut“-Attribute zur Verfügung. D.h. dass beispielsweise das Feldvornamedas normalerweise unterapp.controls.vornamezu finden ist, auch direkt alsapp.c_vornamezur Verfügung steht.recordsDictionary(String ➝ Record) oderNoneDie Datensätze der App. Dies sind evtl. nicht alle Datensätze, wenn der Benutzer nur eingeschränkte Zugriffrechte besitzt. Dieses Dictionary ist sortiert, die Reihenfolge kann in der Konfiguration der Datenquellen konfiguriert werden. Die Schlüssel des Dictionarys sind die Datensatz-Identifizierer und die Werte sind
Record-Objekte.Wenn in der Datenquellen-Konfiguration Nur Anzahl? gesetzt ist, ist
recordsNone.recordpageRecordPage oderNoneDie Datensätze der App als RecordPage-Objekt. Wenn
recordsNoneist, ist auchrecordpageNone.recordcountInteger oderNoneWenn in der Datenquellen-Konfiguration Nur Anzahl? gesetzt ist, beinhaltet
recordcountdie Anzahl der Datensätze (ansonsten istrecordcountNone).installationInstallation oderNoneWenn die Aplikation durch einen Installationsvorgang erzeugt wurde, ist
installationeinInstallation-Objekt. Ansonsten istinstallationNone.templatesDictionary(String ➝ UL4-Template)Alle internen Templates, die in der App definiert sind. Diese Templates können unter in der Interne Templates-Maske angelegt werden. Die Schlüssel des Dictionarys sind dabei der Identifizierer des Templates und die Werte die UL4-Templates selbst.
Haben Sie als Datenquelle nicht die aktuelle, sondern eine andere App ausgewählt, haben Sie hiermit die Möglichkeit, auf die internen Templates dieser in der Datenquelle konfigurierten App mit zuzugreifen.
t_<identifier>UL4-TemplateTemplate-Objekte stehen auch über sogenannte „Shortcut“-Attribute zur Verfügung. D. h., dass beispielsweise das Templategurk, das normalerweise unterapp.templates.gurkzu finden ist, auch direkt alsapp.t_gurkzur Verfügung steht. Oder alsdatasources.beispiel.app.t_gurkwenn Sie als Datenquelle eine andere App ausgewählt haben.viewtemplatesDictionary(String ➝ ViewTemplateInfo) oderNoneDie Anzeige-Templates dieser App. Die Schlüssel des Dictionarys sind die
identifierder Anzeige-Templates.categoriesDictionary(String ➝ Category) oderNoneWenn in der Datenquellen-Konfiguration Kategorien etwas ausgewählt ist, enthält
categoriesdie Kategorien, denen diese App zugeordnet ist. Die Schlüssel des Dictionarys sind die internen Datenbank-Identifizierer der Kategorie und die Werte sindCategory-Objekte.Ist bei Kategorien nichts ausgewählt, ist
categoriesNone.paramsDictionary(String ➝ AppParameter)Die Parameter der Applikation (die unter in der Parameter-Maske angelegt werden können). Die Schlüssel des Dictionarys sind die Identifizierer der Parameter. Die Werte sind
AppParameter-Objekte.p_<identifier>AppParameterAppParameter-Objekte stehen auch über sogenannte „Shortcut“-Attribute zur Verfügung. D. h., dass beispielsweise der App-Parameterbeispiel, der normalerweise unterapp.params.beispielzu finden ist, auch direkt alsapp.p_beispielzur Verfügung steht.pv_<identifier>ObjektDamit kann direkt auf den Wert eines``AppParameter``-Objekts zugegriffen werden. D. h.
app.pv_beispielist äquivalent zuapp.p_beispiel.value(was wiederum zuapp.params.beispiel.valueäquivalent ist).viewsDictionary(String ➝ View)Die verschiedenen Formularvarianten der Applikation (die unter bei Formularvarianten angelegt werden können). Die Schlüssel des Dictionarys sind die Identifizierer der Views. Die Werte sind
View-Objekte.active_viewViewDie aktive Formularvariante. Ist
active_viewgesetzt (was durch Ändern dieses Attributs im Template getan werden kann, bzw. bei Formular-Templates automatisch passiert), werden beim Setzen von Feld-Werten die in dieser Variante definierten Feld-Restriktionen berücksichtigt (minlengthundmaxlengthfür String-Felder,requiredfür alle).Wird das Attribut
active_viewgesetzt kann als Wert sowohl ein View-Objekt verwendet werden, als auch dieideines View-Objekts. Dieses View-Objekt muß zu dieser App gehören.datasourceDataSourceDas DataSource-Objekt das diese App beinhaltet, oder
None, wenn es für diese App kein DataSource-Objekt gibt. D.h. es gibt für jede Appaimmera.datasource is None or `a.datasource.app is a.layout_controlsDictionary(String ➝ LayoutControl) oderNoneDie Layout-Controls des aktiven Views. Dazu muß es einen aktiven View geben und in der Datenquelle muß bei Felder Alle Felder und Layout-Felder ausgewählt sein. Ansonsten ist
layout_controlsNone.child_controlsDictionary(String ➝ Control)Die Controls vom Typ
applookupundmultipleapplookupdie diese LivingApp als Ziel-App habe. Die Schlüssel in diesem Dictionary sind die internen Datenbank-IDs der Felder und die Werte sindControl-Objekte.lc_<identifier>LayoutControl„Shortcut“-Attribut zum Zugriff auf die Layout-Controls des aktiven Views.
app.lc_beispielist äquivalent zuapp.layout_controls.beispiel.favoriteBoolGibt an, ob der aktuelle eingeloggte Benutzer diese App als Favorit festgelegt hat.
Dieses Attribut kann geändert werden.
filter_defaultListe von StringsIst für diese App eine Datenquelle definiert, so ist
filter_defaultdie eine Liste mit dieser Filter-Bedingung. Ansonsten ist die Liste leer.sort_defaultListe von StringsDie Standard-Sortierung für Datensätze in dieser App. Ist für diese App eine Datenquelle definiert, so ist
sort_defaultdie dort angegebene Sortierung, ansonsten die für das Datenmanagement dieser App konfigurierte Sortierung. Ist auch dort nichts konfiguriert, so wird die Standard-Sortierung["r.createdat desc"]verwendet.filter_owndataStringDie Filter-Bedingungen die verwendet werden sollen, wenn dem Benutzer nur die ihm zugewiesenen Datensätze angezeigt werden sollen.
Dies kann unter Zugewiesene Daten konfiguriert werden.
Ist dorts nichts konfiguriert, so enthält die Liste standardmäßig den Ausdruck
r.createdby.id == user.idverwendet.permissionsPermissionsDie Berechtigungen, der der aktuell eingeloggte Benutzer an dieser App hat.
menusDictionary(String ➝ MenuItem) oderNoneDie zu dieser App konfigurierten Menüs. Die Schlüssel in diesem Dictionary sind die Identifizierer und die Werte sind
MenuItem-Objekte.panelsDictionary(String ➝ Panel) oderNoneDie zu dieser App konfigurierten Panels. Die Schlüssel in diesem Dictionary sind die Identifizierer und die Werte sind
Panel-Objekte.save()Methode() ➝ BoolSpeichert die Werte der veränderbaren Attribute in der Datenbank.
Veränderbare Attribute sind
name,description,image,favorite,typename_nom_sin,typename_gen_sin,typename_dat_sin,typename_acc_sin,typename_nom_plu,typename_gen_plu,typename_dat_pluundtypename_acc_plu.
insert(**values)Methode(**Objekt) ➝ RecordMithilfe von
insert()kann in der App ein neuer Datensatz angelegt werden. Die Parameter müssen per Schlüsselwort übergeben werden. Der Parametername ist dabei jeweils der Feld-Identifizierer des zu setzenden Feldes. Beispielsweise kann in eine Personen-App mit den Feldernvorname,nachnameundgeburtstagmittels folgendem Aufruf ein Datensatz eingefügt werden:<?code record = app.insert( vorname="Max", nachname="Mustermann", geburtsdatum=@(2000-02-29), )?>
Der zurückgegebene Datensatz wird mit den übergebenen Feldwerten initialisiert und das Attribut
id(der eindeutige Datensatz-Identifizierer) ist gesetzt. Jedoch spiegelt der Datensatz keinerlei Änderungen wieder, die evtl. vom System über Datenaktionen durchgeführt wurden.
count_records(filter)Methode(String oder Liste von Strings) ➝ IntegerGibt die Anzahl der Datensätze in dieser LivingApp zurück, auf die die vSQL-Bedingung
filterzutrifft.Als
filterkann sowohl eine einzelne Filter-Bedingung übergeben werden, als auch eine Liste von Filter-Bedingungen. Diese werden dann mitandverknüpft.Folgender Aufruf gibt beispielsweise die Anzahl der in den letzten 30 Tagen angelegten Datensätze aus:
<?printx app.count_records("r.v_createdat >= now() - days(30)")?>
Hinweis
Um alle Datensätze zu zählen, kann folgender Code verwendet werden:
<?printx app.count_records("True")?>
delete_records(filter)Methode(String oder Liste von Strings) ➝ IntegerLöscht alle Datensätze in dieser LivingApp, auf die die vSQL-Bedingung
filterzutrifft und gibt die Anzahl der gelöschten Datensätze zurück.Als
filterkann sowohl eine einzelne Filter-Bedingung übergeben werden, als auch eine Liste von Filter-Bedingungen. Diese werden dann mitandverknüpft.Record-Objekte für gelöschte Datensätze werden als gelöscht markiert.
Folgender Aufruf löscht beispielsweise alle Datensätze, die nicht innerhalb der letzten 30 Tagen angelegt wurdem (und gibt die Anzahl aus):
<?printx app.delete_records("r.v_createdat < now() - days(30)")?>
Hinweis
Um alle Datensätze zu löschen, kann folgender Code verwendet werden:
<?printx app.delete_records("True")?>
fetch_records(filter, sorts=None, offset=None, limit=None)Methode(String oder Liste von Strings, String oder Liste von Strings oderNone, Integer oderNone, Integer oderNone) ➝ Dictionary(String ➝ Record)Gibt Datensätze in dieser LivingApp zurück, auf die die vSQL-Bedingung
filterzutrifft.Als
filterkann sowohl eine einzelne Filter-Bedingung übergeben werden, als auch eine Liste von Filter-Bedingungen. Diese werden dann mitandverknüpft.sortslegt die Sortierreihenfolge fest. IstsortsNoneoder eine leere Liste werden die Datensätze in „natürlicher“ Reihenfolge zurückgegeben, ansonsten werden die Datensätze nach diesen Such-Ausdrücken sortiert. Istsortsein Liste von mehreren Strings erfolgt die Sortierung lexikografisch. Ein Sortierausdruck muß ein vSQL-Ausdruck sein, optional gefolgt vonascoderdesc, optional gefolgt vonnulls firstodernulls last.Ist
offsetnichtNonemuß es eine nicht-negative Zahl sein, die festlegt wieviele Datensätze in der festgelegten Reihenfolge übersprungen werden, bevor Datensätze zurückgegeben werden (d.h. z.B. daßoffset=1den ersten Datensatz überspringt). IstoffsetNone(oder wird nicht übergeben) werden keine Datensätze übersprungen.Ist
limitnichtNonemuß es eine positive Zahl sein, die festlegt wieviele Datensätze (beginnend mit dem durchoffsetfestgelegten Start-Datensatz) insgesamt ausgegeben werden. IstlimitNone(oder wird nicht übergeben) werden alle Datensätze zurückgegeben.Der Rückgabewert ist ein Dictionary mit den Datensatz-IDs als Schlüssel und den Record-Objekten als Werte.
Folgender Aufruf gibt beispielsweise Personen-Datensätze nach Nach- und Vornamen sortiert zurück von Personen die im 20. Jahrhundert geboren wurden.
<?code records = app.fetch_records( "r.v_geburtstag.year//100 == 20", ["r.v_nachname", "r.v_vorname"], )?>
Und folgender Aufruf gibt den neuesten geänderten Datensatz zurück:
<?code record = first(app.fetch_records( "r.updatedat is not None", "r.createdat desc", limit=1, ).values())?>
fetch_recordpage(filter, sorts=None, offset=None, limit=None)Methode(String oder Liste von Strings, String oder Liste von Strings oderNone, Integer oderNone, Integer oderNone) ➝ RecordPageGibt Datensätze in dieser LivingApp zurück.
Die Parameter haben dieselbe Bedeutung wie bei fetch_records(filter, sorts=None, offset=None, limit=None), jedoch wird das Resultat als RecordPage-Objekt zurückgegeben.
new_embedded_url(**params)Methode(**Objekt) ➝ StringGibt die absolute URL zurück für das Eingabe-Formular zum Anlegen neuer Datensätze dieser App. Bei dieser URL ist das Formular in den üblichen LivingApps-Rahmen eingebettet und der Benutzer muß eingeloggt sein um es benutzen zu können.
Mittels
paramskönnen der URL zusätzliche Parameter übergeben werden. Als Werte werden sowohl Strings unterstützt als auch Listen von Strings (in diesem Fall wird der Parameter mehrmals an die URL angefügt). Außerdem wird beim WertNoneder Parameter ignoriert.Beispiel 1:
<?print app.new_embedded_url()?>
erzeugt:
https://my.living-apps.de/dateneingabe/1234567890abcdef12345678/new
Beispiel 2:
<?print app.new_embedded_url(view="abcdef12345678901234")?>
erzeugt:
https://my.living-apps.de/dateneingabe/1234567890abcdef12345678/new?view=abcdef12345678901234
Beispiel 3:
<?print app.new_embedded_url(a=["17", 23], b=None, c=[today(), None])?>
erzeugt:
https://my.living-apps.de/dateneingabe/1234567890abcdef12345678/new?a=17&a=23&c=2022-11-10
new_standalone_url(**params)Methode(**Objekt) ➝ StringGibt die absolute URL zurück für das Eingabe-Formular zum Anlegen neuer Datensätze dieser App. Bei dieser URL ist das Formular nicht in den üblichen LivingApps-Rahmen eingebettet sondern unabhängig und kann auch von nicht eingeloggten Benutzern ausgefüllt werden.
Mittels
paramskönnen der URL zusätzliche Parameter übergeben werden.Beispiel 1:
<?print app.new_standalone_url()?>
erzeugt:
https://my.living-apps.de/gateway/apps/1234567890abcdef12345678/new
Beispiel 2:
<?print app.new_standalone_url(view="abcdef12345678901234")?>
erzeugt:
https://my.living-apps.de/gateway/apps/1234567890abcdef12345678/new?view=abcdef12345678901234
Beispiel 3:
<?print app.new_standalone_url(a={"17", 23}, b=None, c=[today(), None])?>
erzeugt:
https://my.living-apps.de/gateway/apps/1234567890abcdef12345678/new?a=17&a=23&c=2022-11-10
template_url(identifier, record=None, /, **params)Methode(String, Record oderNone, **Objekt) ➝ StringGibt die absolute URL zurück für ein Anzeige-Template mit dem Identifizierer
identifier. IstrecordNoneso wird ein Link zu einem Listen-Template generiert, wird fürrecordein Datensatz übergeben, so wird ein Link zu einem Detail-Template generiert (Die verlinkte App ist dabei die App für die diese Methode aufgerufen wird, nicht die App zu der der Datensatz gehört).Mittels
paramskönnen der URL zusätzliche Parameter übergeben werden.Beispiel 1:
<?print app.template_url("beispiel")?>
erzeugt:
https://my.living-apps.de/gateway/apps/1234567890abcdef12345678?template=beispiel
Beispiel 2:
<?print app.template_url("beispiel", r)?>
erzeugt:
https://my.living-apps.de/gateway/apps/1234567890abcdef12345678/0987654321fedcba1234?template=beispiel
Beispiel 3:
<?print app.template_url("beispiel", x=17, y=23)?>
erzeugt:
https://my.living-apps.de/gateway/apps/1234567890abcdef12345678?template=beispiel&x=17&y=23
home_url()Methode() ➝ StringGibt die absolute URL zur Detail-Seite einer App zurück.
Beispiel:
<?print app.home_url()?>
erzeugt:
https://my.living-apps.de/apps/1234567890abcdef12345678.htm
datamanagement_url()Methode() ➝ StringGibt die absolute URL zur Datenmanagement-Seite einer App zurück.
Beispiel:
<?print app.datamanagement_url()?>
erzeugt:
https://my.living-apps.de/_id_36_.htm?uuid=1234567890abcdef12345678&dId=1234567890abcdef12345678&resetInfo=true&templateIdentifier=created_1234567890abcdef12345678
import_url()Methode() ➝ StringGibt die absolute URL zur Import-Seite einer App zurück.
Beispiel:
<?print app.import_url()?>
erzeugt:
https://my.living-apps.de/import-export/1234567890abcdef12345678.htm
tasks_url()Methode() ➝ StringGibt die absolute URL zur Aufgaben-Seite einer App zurück.
Beispiel:
<?print app.tasks_url()?>
erzeugt:
https://my.living-apps.de/_id_1073_.htm?uuid=1234567890abcdef12345678&dId=1234567890abcdef12345678&p_tpl_uuid=1234567890abcdef12345678&resetInfo=true&templateIdentifier=created_task_1234567890abcdef12345678
datamanagement_config_url()Methode() ➝ StringGibt die absolute URL zur Datenmanagement-Konfigurations-Seite einer App zurück.
Beispiel:
<?print app.datamanagement_config_url()?>
erzeugt:
https://my.living-apps.de/datenmanagement-konfigurieren/1234567890abcdef12345678.htm
permissions_url()Methode() ➝ StringGibt die absolute URL zur Berechtigungs-Seite einer App zurück.
Beispiel:
<?print app.permissions_url()?>
erzeugt:
https://my.living-apps.de/_id_833_.htm?uuid=1234567890abcdef12345678&dId=1234567890abcdef12345678&resetInfo=true
datamanageview_url(identifier)Methode(String) ➝ StringGibt die absolute URL zu einer Datenauswertungs-Seite im Datenmanagement einer App zurück.
Beispiel:
<?print app.datamanageview_url("beispiel")?>
erzeugt:
https://my.living-apps.de/_id_36_.htm?uuid=1234567890abcdef12345678&dId=1234567890abcdef12345678&resetInfo=true&templateIdentifier=created_1234567890abcdef12345678_datamanage_master_beispiel
seq()Methode() ➝ NumberGibt einen fortlaufenden Integer-Wert zurück, der innerhalb dieser App eindeutig ist.
send_mail()Methode(from: String oderNone,reply_to: String oderNone,to: String oderNone,cc: String oderNone,bcc: String oderNone,subject: String oderNone,body_text: String oderNone,body_html: String oderNone, attachments: File oderNone) ➝NoneVerschickt eine E-Mail.
Nähere Informationen finden Sie unter E-Mails über die LivingAPI versenden.
customObjektDieses Attribut kann vom Benutzer für beliebige zusätzliche Informationen gesetzt werden.
x_<identifier>ObjektEs werden beliebige zusätzliche Attribute unterstützt deren Namen mit
x_beginnt.
Neue Datensatzobjekte können angelegt werden, indem das App-Objekt aufgerufen
wird. Feld-Werte können als Keyword-Argumente übergeben werden. So erzeugt z. B.
datasources.beispiel.app() ein leeres Datensatzobjekt zur App „Beispiel“.
Besitzt diese App die Felder vorname, nachname und geburtstag
kann mittels folgendem Aufruf ein Datensatz-Objekt mit den entsprechenden
Feld-Werten angelegt werden:
<?code record = app(
vorname="Liv",
nachname="Logic",
geburtsdatum=@(2000-02-29),
)?>
Im Gegensatz zu insert() wurde der Datensatz
nach diesem Aufruf noch nicht gespeichert, dies erfolgt erst durch den Aufruf
von record.save(). Daher sind vorher
die Attribute id, createdby, createdat, updatedby und
updatedat auch None und werden erst durch den Aufruf von
record.save() gesetzt.
Ist eine App nicht explizit in einer Datenquelle konfiguriert, so kann das
zugehörige App-Objekt trotzdem innerhalb der LivingAPI auftauchen, wenn
ein Datensatz über ein Auswahlfeld auf diese App verweist. In einem solchen
Fall ist sowohl records als auch recordcount None.
Wird durch Aufruf des App-Objektes eine neues Datensatz-Object angelegt, und die App hat einen aktiven View so werden die in diesem View konfigurierten Standardwerte für die Felder berücksichtigt.
Außerdem werden bei aktivem View zwar alle Felder des Datensatzes gespeichert, aber Fehler in Feldern, die nicht im aktiven Vies sind werden ignoriert.