Gestionarea formularelor de încărcare¶
Formularele de încărcare definesc modul în care utilizatorii și clienții externi pot trimite date unui proiect. Un formular specifică tabelul destinație, disponibilitatea, setările de acces, clienții acceptați, câmpurile, regulile de validare, valorile implicite și relațiile dintre câmpuri.
Lista formularelor disponibile¶
Formularele existente pot fi selectate pentru editare, ștergere sau blocare.
Datele nu pot fi încărcate folosind formulare blocate, iar aceste formulare nu sunt vizibile pentru clienți în lista formularelor. Clienții offline nu pot încărca date folosind formulare șterse, iar formularele șterse nu pot fi restaurate. Prin editarea formularelor, puteți modifica domeniul lor de utilizare (web, API sau încărcare de fișiere), relația cu câmpurile tabelului bazei de date, descrierea și regulile de acces, precum și modul lor de funcționare: eveniment de observare sau ad-hoc.
Formularele blocate apar pe un fundal gri în listă.
Formularele pot fi setate și în mod doar în citire, indicat în listă printr-o
pictogramă cu lacăt. (Pentru aceasta, setați valoarea câmpului active din
tabelul project_forms la 3.)
Definirea antetului formularului¶
Tabel destinație¶
Selectați tabelul proiectului în care vor fi scrise datele trimise prin formularul de încărcare.
Puteți selecta numai tabele SQL înregistrate de OpenBioMaps în cadrul
proiectului, care conțin câmpurile OpenBioMaps de bază, precum obm_id,
obm_uploading_id etc.
Tabelul selectat nu poate fi modificat ulterior, deoarece câmpurile
formularului sunt legate de câmpurile tabelului selectat.
Formularele sunt sensibile la modificările structurii tabelului. Din acest motiv, se recomandă insistent să nu editați tabelele cu alt instrument decât OpenBioMaps, deoarece formularul își va pierde legătura cu câmpurile. În astfel de cazuri, salvarea modificărilor formularului poate rezolva inconsecvența, dar clienții nu vor putea încărca datele offline!
Numele formularului¶
Introduceți un nume pentru formularul de încărcare. Numele trebuie să fie unic în cadrul proiectului, deoarece face parte din identificatorul unic al formularelor.
Un formular poate fi copiat prin redenumire. În acest caz, formularul original își păstrează numele inițial; cu alte cuvinte, un formular nu poate fi redenumit, ci numai copiat într-un formular nou, ceea ce afectează funcționarea clienților offline!
Numele poate fi multilingv atunci când se utilizează o cheie de traducere cu
prefixul str_. Pentru mai multe informații, consultați
Traduceri.
Accesul la formular¶
Definiți cine poate vizualiza și utiliza formularul:
utilizatorii publici;
toți utilizatorii autentificați; sau
numai grupurile specificate.
Dacă este selectată opțiunea numai grupurile specificate, câmpul de selectare a utilizatorilor și grupurilor devine activ, permițând acordarea accesului utilizatorilor sau grupurilor selectate.
Accesul la date¶
Datele încărcate prin formular vor fi disponibile numai grupurilor specificate aici. În mod implicit, utilizatorul care efectuează încărcarea poate citi și edita datele încărcate.
Tipul formularului¶
Trebuie selectat cel puțin unul dintre următoarele tipuri de formular:
formular web;
formular pentru încărcarea fișierelor; sau
formular API, pentru accesul clienților externi, precum aplicația mobilă.
Descrierea formularului¶
Introduceți o descriere scurtă sau detaliată a formularului. Descrierea poate oferi instrucțiuni contribuitorilor.
SRID-ul formularului¶
Selectați sistemul de referință spațială utilizat de datele trimise prin formular. Sistemele de referință spațială pot fi căutate la https://spatialreference.org/. Valoarea implicită este EPSG:4326 (WGS 84).
Dacă este specificată o listă de sisteme de referință spațială, utilizatorii care efectuează încărcarea pot selecta numai opțiunile din listă. Definiți lista sub forma unor identificatori EPSG și etichete vizibile separate prin virgulă, utilizând următorul format:
4326:wgs84,23700:eov
Gruparea formularelor¶
Formularele pot fi organizate în grupuri în interfața web de selectare a formularelor. Numele grupurilor pot fi definite sau selectate aici.
Această opțiune nu este disponibilă în prezent în aplicația mobilă.
Publicarea formularului¶
Un formular poate fi blocat prin publicarea sa folosind butonul portocaliu de publicare din zona antetului formularului. Actualizarea unui formular publicat creează o versiune nouă. Versiunile anterioare rămân disponibile clienților API, precum aplicația mobilă.
Dintr-un formular publicat poate fi creată o versiune preliminară pentru testare utilizând butonul Creați o versiune preliminară din partea de jos a paginii. În mod implicit, versiunea preliminară este disponibilă numai creatorului său. Ulterior, aceasta poate fi publicată în ramura publicată a formularului.
Setările evenimentelor de observare¶
Pentru o explicație a evenimentelor de observare și a diferenței dintre observațiile ocazionale și cele bazate pe evenimente, consultați Evenimente de observare și observații ocazionale.
Pentru un eveniment de observare poate fi stabilită o limită de timp, exprimată în minute. Când limita este atinsă, aplicația mobilă avertizează utilizatorul că timpul a expirat. Avertismentul nu încheie evenimentul, iar utilizatorul poate continua înregistrarea observațiilor.
Un eveniment de observare forțat înseamnă că formularul poate fi lansat numai în modul eveniment. Dacă suportul pentru evenimente de observare este activat, dar nu este forțat, utilizatorul poate alege între modul eveniment și modul de observare ocazională.
Jurnalul traseului¶
Această opțiune activează înregistrarea automată a jurnalului traseului în timp ce formularul este utilizat. Înregistrarea jurnalului traseului poate fi obligatorie sau opțională și este disponibilă numai în modul eveniment.
Notificare periodică¶
La intervalul specificat, în minute, aplicația îi reamintește observatorului să înregistreze o observație nouă. Cronometrul rulează continuu și repornește de fiecare dată când utilizatorul înregistrează o observație.
Definirea coloanelor formularului¶
Secțiunea de definire a coloanelor specifică ce coloane ale tabelului destinație apar în formular și cum sunt afișate și validate valorile trimise.
Inclusă¶
Dacă este selectată, coloana apare în formular.
Ordinea coloanelor¶
Câmpul mic de introducere de lângă opțiunea Inclusă definește ordinea coloanei în formular. În mod implicit, acesta este gol.
Coloană¶
Sunt afișate două nume: numele vizibil al coloanei, care poate fi editat pentru formular, și numele original al coloanei bazei de date.
Obligatorie¶
Sunt disponibile trei opțiuni: da, nu și eroare necritică.
Da(vișiniu)Formularul nu poate fi trimis fără o valoare în această coloană.
Nu(gri)Formularul poate fi trimis cu o valoare goală în această coloană.
Eroare necritică(roz)Valorile goale sau cele care nu respectă o restricție pot fi trimise, dar utilizatorul care efectuează încărcarea trebuie să confirme fiecare rând afectat.
Descrierea coloanei¶
Introduceți o scurtă descriere a câmpului.
Tipul coloanei¶
Sunt disponibile următoarele tipuri de coloane ale formularului:
textText arbitrar. Pot fi specificate lungimi minime și maxime.
numericO valoare numerică. Pot fi specificate valori sau lungimi minime și maxime.
listO listă derulantă cu un singur element selectabil în mod implicit.
true-falseO valoare booleană fals/adevărat. Ordinea valorilor poate fi controlată în câmpul de definire a listei, de exemplu
false, true.dateO dată cu anul, luna și ziua separate printr-un caracter acceptat. Este stocată utilizând un tip de dată al bazei de date.
date and timeO dată urmată de un spațiu și o oră în format
hour:minute:second. Dacă secundele sunt omise, aplicația le consideră automat00și îi solicită utilizatorului care efectuează încărcarea să accepte modificarea. Dacă minutele sunt omise, aplicația le consideră00și solicită, de asemenea, confirmarea. Valoarea este stocată utilizând un tip dată-oră al bazei de date.time (timetominutes)O valoare în format
hours:minutes, pe care aplicația o transformă într-un număr întreg. Este stocată utilizând un tip întreg al bazei de date.timeO valoare în format
hours:minutes, stocată utilizând un tip de oră al bazei de date.time interval (timeinterval)Un interval de timp, de exemplu
2014-02-25 12:00:00 2014-02-25 13:00:00. Este stocat utilizând un tip de interval de timp al bazei de date.autocompleteGenerează sugestii de completare automată din coloana tabelului SQL specificată în câmpul de definire a listei. Sintaxa prescurtată documentată este
table_name.column. În mod implicit, tabelul este căutat în schemapublica bazei de dategisdata.autocompletelistSimilar cu
autocomplete, dar permite introducerea mai multor valori de completare automată într-un singur câmp.photo idDacă modulul pentru fotografii este activat, aplicația stochează în acest câmp identificatorii fotografiilor încărcate.
geometry: pointO geometrie punctuală reprezentată ca WKT
POINT(...).geometry: lineO geometrie liniară reprezentată ca WKT
LINESTRING(...).geometry: polygonO geometrie poligonală reprezentată ca WKT
POLYGON(...).geometry: anyO geometrie reprezentată în WKT folosind un tip de geometrie acceptat. Consultați un exemplu de formular.
colour ringsPermite specificarea unei combinații de inele colorate. Secțiunea dintre paranteze drepte definește numărul maxim de inele care poate fi specificat pentru diferitele secțiuni ale piciorului. Aceasta este urmată de codurile individuale și etichetele culorilor disponibile, de exemplu
[XX],Blue:B,red:R,green:G.Codurile culorilor documentate sunt:
R— roșu;P— roz;G— verde;g— verde-deschis;O— portocaliu;Y— galben;B— albastru;b— albastru-deschis;W— alb;K— negru;N— maro;U— purpuriu;V— violet; șiM— argintiu.
Consultați un exemplu de formular pentru inele colorate.
Controlul datelor introduse¶
Controalele datelor introduse verifică valorile introduse în câmp. Opțiunile disponibile sunt:
fără verificare;
minim și maxim;
expresie regulată;
spațial; și
verificare personalizată.
Definirea listei¶
Pentru a utiliza o listă în timpul trimiterii datelor, setați tipul coloanei
la list, autocomplete sau autocompletelist.
Definițiile listelor pot descrie liste simple sau cu selecție multiplă, surse de completare automată, valori obținute din alte tabele ale bazei de date și reguli pentru filtrarea valorilor respective.
O listă scurtă poate fi definită direct. În exemplul următor, utilizatorii
care efectuează încărcarea pot selecta female sau male dintr-o listă
derulantă. Valoarea selectată este stocată în baza de date.
{
"list": {
"female": [],
"male": []
}
}
Mai multe etichete de intrare pot fi mapate la aceeași valoare stocată. De
exemplu, F, f și female pot fi interpretate toate drept valoarea
stocată female. Acest lucru este util în special la încărcarea fișierelor
atunci când datele provenite de la contribuitori sau din ani diferiți
utilizează etichete diferite pentru același concept.
{
"list": {
"female": [
"F",
"f",
"female"
],
"male": [
"M",
"m",
"male"
]
}
}
O listă poate fi introdusă și în format text simplu, cu câte o valoare pe fiecare rând. Când formularul este salvat, aplicația transformă lista în text simplu în JSON. JSON-ul rezultat poate fi apoi editat direct.
Valorile listelor pot proveni și dintr-un tabel SQL. Specificați schema
(optionsSchema), tabelul (optionsTable), coloana valorii stocate
(valueColumn) și, dacă este necesar, coloana etichetei vizibile
(labelColumn).
Valorile pot fi filtrate utilizând preFilterColumn și
preFilterValue. Exemplul următor aplică prefiltre:
{
"optionsTable": "milvus_taxon",
"valueColumn": "word",
"preFilterColumn": [
"lang",
"status"
],
"preFilterValue": [
"obm_taxon",
[
"accepted",
"undefined"
]
],
"orderBy": "taxon_db",
"order": "desc"
}
Definiția completă a listei utilizează JSON. Aceasta poate fi alcătuită cu editorul de liste din interfața web, iar aplicația verifică validitatea sintaxei. Dacă sintaxa nu este validă, aplicația returnează un mesaj de eroare.
Exemplul următor enumeră proprietățile documentate:
{
"list": {
"val1": [
"label1",
"label2"
]
},
"optionsSchema": "e.g. public",
"optionsTable": "a table name",
"valueColumn": "a column from the table",
"labelColumn": "a column from the table - optional",
"filterColumn": "",
"pictures": {
"an element from the list, e.g. val1": "url-string"
},
"triggerTargetColumn": [
""
],
"Function": "",
"disabled": [
"an element from the list, e.g. val1"
],
"preFilterColumn": [
""
],
"preFilterValue": [
""
],
"preFilterRelation": [
""
],
"multiselect": "true or false, default is false",
"selected": [
"an element from the list, e.g. val1"
],
"size": "a numeric value",
"orderBy": [
"column or SQL expression"
],
"order": [
"ASC or DESC"
],
"limit": "numeric value"
}
Liste corelate¶
O listă corelată utilizează valoarea selectată într-o coloană, denumită coloană inițiatoare, pentru a determina valorile disponibile în altă coloană. Astfel se creează o listă dependentă sau în cascadă.
Mai întâi, creați un tabel de căutare care conține relațiile dintre
nivelurile listei. De exemplu, un tabel animal_taxons ar putea descrie ce
grupuri de animale aparțin fiecărui supergrup. Vertebratele ar putea conține
amfibieni, reptile, păsări și mamifere, iar nevertebratele ar putea conține
cnidari și insecte.
În definiția listei coloanei inițiatoare, specificați coloana țintă:
{
"triggerTargetColumn": [
"affected_list_name"
],
"Function": "select_list",
"optionsSchema": "shared",
"optionsTable": "animal_taxons",
"valueColumn": "animal_group_name",
"labelColumn": "animal_group_name",
"labelAsValue": true
}
Proprietățile utilizate în acest exemplu sunt:
FunctionUtilizează valoarea documentată
select_list.optionsSchemaIdentifică schema care conține tabelul de căutare. Acest exemplu utilizează
shared.optionsTableIdentifică tabelul de căutare.
valueColumnIdentifică coloana care furnizează valorile pentru lista inițiatoare.
labelColumnIdentifică coloana care furnizează etichetele vizibile.
triggerTargetColumnIdentifică coloana formularului a cărei listă trebuie actualizată.
În coloana afectată, definiți ce coloană a tabelului de căutare furnizează valorile și ce coloană este utilizată pentru filtrarea lor:
{
"optionsTable": "animal_taxons",
"valueColumn": "animal_group_name",
"labelColumn": "animal_group_name",
"filterColumn": "animal_supergroup",
"Function": "select_list",
"optionsSchema": "shared"
}
Aici, filterColumn identifică acea coloană a tabelului de căutare care
este comparată cu valoarea selectată în coloana precedentă a formularului.
Listele corelate pot conecta mai mult de două coloane ale formularului:
{
"optionsSchema": "shared",
"optionsTable": "animal_taxons",
"filterColumn": "animal_supergroup",
"Function": "select_list",
"valueColumn": "animal_group_name",
"triggerTargetColumn": [
"species"
],
"labelColumn": "animal_group_name"
}
Într-un lanț de liste corelate, triggerTargetColumn identifică următoarea
coloană a formularului, filterColumn identifică acea coloană a tabelului
de căutare utilizată pentru potrivirea selecției precedente, iar
valueColumn și labelColumn definesc lista curentă.
Exemplu de listă corelată: clădiri dintr-o localitate¶
Să presupunem că un proiect colectează date despre specii care se reproduc în
cuiburi artificiale. Un tabel de căutare denumit tytoalba_buildings
înregistrează clădirile din fiecare localitate. Câmpul localității trebuie să
ofere o listă cu completare automată, iar câmpul clădirii trebuie să afișeze
numai clădirile din localitatea selectată.
Mai întâi, configurați coloana localității ca un câmp cu completare automată și identificați coloana clădirii drept țintă:
{
"triggerTargetColumn": [
"building"
],
"Function": "select_list",
"optionsSchema": "public",
"optionsTable": "tytoalba_buildings",
"valueColumn": "settlement"
}
Apoi configurați coloana clădirii ca listă și filtrați-i valorile utilizând localitatea selectată:
{
"optionsTable": "tytoalba_buildings",
"filterColumn": "settlement",
"Function": "select_list",
"valueColumn": "building"
}
Valori implicite¶
Unui câmp i se poate atribui o valoare predefinită. Valorile implicite dinamice documentate sunt:
_autocomplete;_input;_list;_geometry;_login_name;_email;_boolean;_attacment;_datum; și_auto_geometry.
De exemplu, _input generează un câmp de introducere gol, _list
completează o listă de selecție utilizând definiția listei, _geometry
oferă selectarea geometriei, iar _datum oferă selectarea datei.
Consultați un exemplu de formular.
Opțiunile de afișare ale câmpului¶
Sunt documentate următoarele opțiuni de afișare:
stickyUtilizată în principal de aplicația mobilă. Atunci când este selectată, câmpul își păstrează valoarea la începerea unui rând nou.
hiddenCâmpul nu este afișat.
read onlyValoarea câmpului nu poate fi modificată.
onceÎn aplicația mobilă, câmpul este afișat o singură dată pentru o listă de observații, la sfârșitul observației.
Această opțiune este destinată mutării unui câmp în afara tabelului repetitiv din formularul web. În prezent, în formularul web se poate obține un rezultat similar prin utilizarea unei valori implicite.
list elements as buttonsAfișează elementele listei sub formă de butoane. Pe butoane pot fi utilizate imagini. Imaginile trebuie definite pentru toate elementele listei în definiția listei.
unfolding listOferă un flux de lucru cu listă de specii pentru aplicația mobilă. Această opțiune poate fi utilizată numai cu un câmp de completare automată, de regulă un câmp pentru denumirea științifică, atunci când formularul conține și un câmp pentru numărul de indivizi căruia i-a fost atribuit rolul semantic corespunzător în setările tabelului bazei de date.
Aplicația mobilă afișează într-o listă denumirile speciilor selectate și numărul indivizilor acestora. Numerele pot fi modificate fără salvarea unei înregistrări separate după fiecare modificare. Prin urmare, opțiunea este cea mai utilă într-un formular pentru evenimente de observare, în care Salvați observația funcționează ca o salvare intermediară și nu golește lista de specii acumulată.
Următoarea definiție de listă asociază imagini valorilor demonstrative ale butoanelor:
{
"pictures": {
"animals": "http://....png",
"plants": "http://....png",
"mushrooms": "http://....png",
"bats": "http://....png"
}
}
Relațiile dintre coloane¶
Relațiile dintre coloane verifică sau modifică valoarea unui câmp în funcție
de valoarea altui câmp. De exemplu, un câmp pentru greutate poate fi
restricționat la un interval numeric de la 20 la 30 atunci când câmpul pentru
sex conține female:
(sex=female) {minmax(20:30)}
Consultați un exemplu de formular.
Pseudocoloane¶
Coloanele din alte formulare de încărcare pot fi adăugate utilizând următorul format:
form-name:column1,column2,columnN
Coloanele enumerate apar după coloana care conține această definiție. Valorile introduse în pseudocoloane sunt încărcate utilizând definiția celuilalt formular. Astfel, datele pot fi trimise în două tabele într-un singur flux.
Definirea limbajului relațiilor¶
Sintaxa generală documentată a limbajului relațiilor este:
(rel_field=rel_statement) {rel_type(rel_value)}, (rel_field=rel_statement) {rel_type(rel_value)}, ...
Interpretarea prevăzută este:
IF another field (rel_field) matches rel_statement,
THEN apply rel_type with rel_value to the current field.
rel_type este o funcție asociată tipului câmpului curent. Funcțiile
documentate sunt:
yearPentru câmpurile de dată, extrage componenta anului dintr-un șir de dată.
minmaxPentru câmpurile text sau numerice, efectuează o verificare a intervalului minim și maxim.
obligatoryPentru orice tip de câmp, modifică dacă respectivul câmp curent este obligatoriu.
inequalityPentru orice tip de câmp, compară câmpul corelat și câmpul curent folosind un operator de comparație acceptat. O comparație nereușită produce o eroare de validare.
O instrucțiune cu expresie regulată începe cu !!, urmat de o expresie
regulată, de exemplu:
!!^(\d{2})$
Atunci când rel_statement este o expresie regulată, rel_value poate
utiliza o funcție de înlocuire bazată pe valoarea potrivită:
.Înlocuiește valoarea câmpului curent cu șirul care a corespuns în
rel_field..+Adaugă valoarea câmpului curent la sfârșitul șirului care a corespuns în
rel_field.+.Adaugă șirul care a corespuns în
rel_fieldla sfârșitul valorii câmpului curent.
Pentru o relație inequality, expresiile documentate utilizează +
pentru valoarea potrivită din rel_field și . pentru valoarea câmpului
curent:
+<.
+<=.
+>=.
+=.
+<>.
Pentru alte tipuri de relații, rel_value poate conține altă valoare sau
poate fi ignorată, în funcție de funcție.
Exemple de relații¶
Transformarea unui câmp în câmp obligatoriu¶
Pe coloana tarsus_length:
(clutch_size=!!^([123])$) {obligatory(1)}
Aceasta face ca tarsus_length să fie obligatorie atunci când
clutch_size este 1, 2 sau 3.
Compararea a două date¶
Pe coloana end_date:
(found_date=!!^(.+)$) {inequality(+>=.)}
Dacă found_date nu este goală, relația verifică dacă end_date este
mai mare sau egală cu found_date. Un rezultat fals produce o eroare de
încărcare.
Adăugarea unui an la o dată¶
Pe un câmp de dată care nu conține un an:
(year=!!^(d{4})$) {set(.)}
Dacă coloana year nu este goală și conține patru cifre, câmpul de dată
este actualizat cu anul respectiv.
Solicitarea unui număr de inel¶
Pe câmpul ring_number:
(recapture=1) {obligatory(1)}
Dacă recapture are valoarea 1, ring_number devine obligatoriu.
Solicitarea unei denumiri alternative¶
Pe coloana english_name:
(scientific_name=!!(^$)) {obligatory(1)}
Dacă scientific_name este goală, english_name devine obligatorie.
Setarea unei valori în funcție de un număr¶
Pe câmpul amount_type:
(number_of_individuals>50) {set(estimated value)},(egyedszam<=50) {set(exact value)}
Dacă numărul de indivizi este mai mare de 50, amount_type este setat la
estimated value. Dacă este cel mult 50, amount_type este setat la
exact value.