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:

text

Text arbitrar. Pot fi specificate lungimi minime și maxime.

numeric

O valoare numerică. Pot fi specificate valori sau lungimi minime și maxime.

list

O listă derulantă cu un singur element selectabil în mod implicit.

true-false

O valoare booleană fals/adevărat. Ordinea valorilor poate fi controlată în câmpul de definire a listei, de exemplu false, true.

date

O 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 time

O dată urmată de un spațiu și o oră în format hour:minute:second. Dacă secundele sunt omise, aplicația le consideră automat 00 ș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.

time

O 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.

autocomplete

Generează 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 schema public a bazei de date gisdata.

autocompletelist

Similar cu autocomplete, dar permite introducerea mai multor valori de completare automată într-un singur câmp.

photo id

Dacă modulul pentru fotografii este activat, aplicația stochează în acest câmp identificatorii fotografiilor încărcate.

geometry: point

O geometrie punctuală reprezentată ca WKT POINT(...).

geometry: line

O geometrie liniară reprezentată ca WKT LINESTRING(...).

geometry: polygon

O geometrie poligonală reprezentată ca WKT POLYGON(...).

geometry: any

O geometrie reprezentată în WKT folosind un tip de geometrie acceptat. Consultați un exemplu de formular.

colour rings

Permite 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; și

  • M — 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:

Function

Utilizează valoarea documentată select_list.

optionsSchema

Identifică schema care conține tabelul de căutare. Acest exemplu utilizează shared.

optionsTable

Identifică tabelul de căutare.

valueColumn

Identifică coloana care furnizează valorile pentru lista inițiatoare.

labelColumn

Identifică coloana care furnizează etichetele vizibile.

triggerTargetColumn

Identifică 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:

sticky

Utilizată în principal de aplicația mobilă. Atunci când este selectată, câmpul își păstrează valoarea la începerea unui rând nou.

hidden

Câmpul nu este afișat.

read only

Valoarea 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 buttons

Afiș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 list

Oferă 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:

year

Pentru câmpurile de dată, extrage componenta anului dintr-un șir de dată.

minmax

Pentru câmpurile text sau numerice, efectuează o verificare a intervalului minim și maxim.

obligatory

Pentru orice tip de câmp, modifică dacă respectivul câmp curent este obligatoriu.

inequality

Pentru 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_field la 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.