Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prieiga prie Saugyklos projektui #262

Open
sirex opened this issue Feb 10, 2023 · 18 comments · Fixed by #853, #893, #937 or #976
Open

Prieiga prie Saugyklos projektui #262

sirex opened this issue Feb 10, 2023 · 18 comments · Fixed by #853, #893, #937 or #976

Comments

@sirex
Copy link
Contributor

sirex commented Feb 10, 2023

Projektams gali būti išduodamas prieigos prie Saugyklos raktas, kad projektas galėtu pasiekti viešuosius asmens duomenis, pažymėtus access=public. Raktas gali būti išduodamas tik tuo atveju, jei projekto autorius yra autorizuotas per VIISP.

Raktas išduodamas projektui, per projekto puslapyje esantį API meniu, kuriame rodoma informacija, kaip gauti prieigos raktą ir kaip pasiekti duomenis.

Projektui suteikiavas vienas prieigos raktas, tačiau, scopes suteikiami atskirai kiekvienam duomenų rinkiniui, per duomenų rinkinio priskyrimo formą projektui, kuriame reikia nurodyti duomenų naudojimo tikslą.

Priklauso nuo

Susiję

@sirex
Copy link
Contributor Author

sirex commented Nov 23, 2023

Image
-- https://data.gov.lt/projects/427

Panaudojimo atvejo puslapyje atsiranda naujas kontekstinis meniu „Leidimai“, kurį paspaudus, rodo panašų puslapį į Rakto peržiūra puslapį, kuris yra aprašytas čia:

Panaudojimo atvejo leidimų lentelė rodoma tik projekto autoriui ir super administratoriui. Ir tik tuo atveju, jei Panaudojimo atvejis turi bent vieną duomenų rinkinį su access:public lauku.

Leidimų lentelė

Leidimų puslapyje rodoma tokia lentelė:

Duomenų rinkinys Leidimas
COVID-19 pandemijos duomenys ✅ Suteikta

Lentelėje rodomi tokie stulpeliai:

  • Duomenų rinkinys - nuoroda į duomenų rinkinį ir rinkinio pavadinimas, kuriam suteikiamas leidimas.
  • Leidimas - leidimo suteikimo/nesuteikimo statusas. Statusas gali būti vienas iš šių:
    • ✅ Suteikta - Leidimas suteiktas
    • ⏳ Laukiama - Laukiam, kol organizacija suteiks leidimą
    • ☐ Nepateikta - Prašymas dėl leidimo suteikimo nepateiktas
    • ❌ Atmestas - Prašymas suteikti leidimą atmestas

Leidimų lentelėje rodomi duomenų rinkiniai, kuriuos naudoja projektas, t.y. rinkiniai, kurie yra įtraukti į panaudojimo atvejį, tačiau rodomi tik tie rinkiniai, kurie turi bent vieną duomenų lauką, kurio access nėra open.

Leidimų lentelėje negalima nieko keisti ir lentelėje nėra jokių mygtukų.

Prašymas suteikti leidimą

Virš leidimų lentelės rodomas mygtukas „Prašyti leidimų“, kurį paspaudus:

  • jei raktas iš vis nebuvo sukurtas, t.y. nėra įrašo ApiKey lentelėje, tada atidaroma naujo rakto forma per Saugyklos API sukuriamas raktas ir sukuriamas įrašas tiek ApiKey lentelėje, tiek ApiScope lentelėje su prašomais leidimais. Ir galiausiai virš leidimų lentelės, persikrovus puslapiui, parodomas sugeneruotas kliento slaptažodis, kuris bus rodomas tik vieną kartą, todėl prie rakto turi būti nurodyta, kad reaktą reikia išsisaugoti, nes jis bus parodytas tik vieną kartą.
  • jei raktas jau sukurtas, tada tiesiog papildoma ApiScope lentelė, pridedant trūkstamus leidimus, kurių nebuvo.

Saugykloje turėtu būti suteikiami tokie leidimai:

  • spinta_<dataset.name>_getall
  • spinta_<dataset.name>_getone
  • spinta_<dataset.name>_search
  • spinta_<dataset.name>_changes

Leidimai suteikiami tik konkretiems duomenų rinkiniams, kurie turi access:public laukų. Jokie kiti leidimai nesuteikiami.

Minėti leidimai suteikiami tik tuo atveju, jei duomenų Savininkas patvirtina leidimą, tik tada tie leidimai įtraukiami į raktą Saugykloje. Kol Savininkas nepatvirtina, leidimai saugomi tik ApiScope lentelėje.

Atsiradus naujiems leidimams, sukuriama užduotis duomenų rinkinio organizacijai, kuri turi patvirtinti arba atmesti leidimo prašymą.

Slaptažodžio keitimas

Virš leidimo lentelės rodomas mygtukas „Keisti slaptažodį“, kurį paspaudus, sugeneruojamas naujas slaptažodis, pakeičiams saugykloje per Saugyklos API ir išsaugomas ApiKey lentelėje, užkoduotoje formoje.

Naujas slaptažodis parodomas vieną kartą, virš leidimų lentelės, su informacija, kad slaptažodis bus rodomas vieną kartą.

Leidimų tvarkymas iš organizacijos pusės

Organizacijos raktų valdymas yra toks pat, kaip apibrėžta

Tačiau prie išorinių raktų, sąraše rodomi ne tik Organizacijų raktai, bet ir Panaudojimo atvejų raktai, rodant Panaudojimo atvejo pavadinimą ir nuorodą į patį panaudojimo atvejį.

Atsidarius panaudojimo atvejo raktą, rodomas toks pat Rakto peržiūros puslapis, su galimybe Įjungti arba Išjungti leidimą.

Įjungus leidimą, daroma Saugyklos API užklausa ir leidimas pridedamas prie kliento leidimų.

Leidimų lentelėje, ApiScope laukas enabled gali turėti None reikšmę, kuri reiškia laukimo statusą, t.y.reiškia, kad leidimas, nei suteiktas, nei atmestas. Tokiu atveju, leidimų lentelėje turi būti rodomi du mygtukai, „Įjungti“ ir „Išjungti“.

Pasikeitimai duomenų modelyje

  • ApiKey lentelėje atsiranda naujas laukas project: Project, kuris nurodo, kad raktas priklauso panaudojimo atvejui.

@adp-atea adp-atea moved this to In Progress in Portalo plėtra Dec 4, 2023
@adp-atea adp-atea linked a pull request Dec 8, 2023 that will close this issue
@github-project-automation github-project-automation bot moved this from In Progress to Done in Portalo plėtra Dec 8, 2023
@adp-atea adp-atea moved this from Done to Deploy in Portalo plėtra Dec 8, 2023
@sirex sirex moved this from Deploy to Test in Portalo plėtra Dec 11, 2023
@sirex
Copy link
Contributor Author

sirex commented Dec 17, 2023

https://test.data.gov.lt/projects/427/apikeys/add/

Image

Prašant leidimų, neturėtu prašyti įvesti rakto pavadinimo, o tiesiog turėtu sukurti naują raktą ir parodyti jo slaptažodį.

Sukūrus raktą, raktas rodomas svetainės viršuje:

Image

Nors turėtu rodyti, svetainės kontekste.

@sirex
Copy link
Contributor Author

sirex commented Dec 17, 2023

Atidarius organizacijos raktus:

https://test.data.gov.lt/orgs/269/apikeys/

Gaunu:

Internal Server Error: /orgs/269/apikeys/
Traceback (most recent call last):
  File "vitrina/orgs/views.py", line 976, in get_context_data
    ApiKey.objects.create(
  File "django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "django/db/models/query.py", line 451, in create
    obj = self.model(**kwargs)
  File "django/db/models/base.py", line 485, in __init__
    _setattr(self, field.name, rel_obj)
  File "django/db/models/fields/related_descriptors.py", line 215, in __set__
    raise ValueError(
ValueError: Cannot assign "True": "ApiKey.organization" must be a "Organization" instance.

@sirex sirex reopened this Dec 17, 2023
@sirex sirex moved this from Test to Todo in Portalo plėtra Dec 17, 2023
@adp-atea adp-atea linked a pull request Dec 18, 2023 that will close this issue
@github-project-automation github-project-automation bot moved this from Todo to Done in Portalo plėtra Dec 18, 2023
@adp-atea adp-atea moved this from Done to Deploy in Portalo plėtra Dec 18, 2023
@sirex sirex moved this from Deploy to Test in Portalo plėtra Dec 23, 2023
@sirex sirex moved this from Test to Todo in Portalo plėtra Dec 23, 2023
@adp-atea adp-atea moved this from Todo to Deploy in Portalo plėtra Dec 27, 2023
@sirex sirex moved this from Deploy to Test in Portalo plėtra Jan 4, 2024
@aurjas
Copy link

aurjas commented Jan 11, 2024

Testavau su panaudojimo atveju https://test.data.gov.lt/projects/3/permissions/

  1. Pasirinkau skirtuką "Leidimai", kuriame rodo rinkinį "Covid-19 pandemijos duomenys".
  2. Paspaudžiau "Prašyti leidimų", po kurio išdavė raktą.
  3. Nuspaudžiau ant duomenų rinkinio, tada pasirinkau Organizaciją (Valstybės duomenų agentūra) ir iš Organizacijos meniu pasirinkau "Raktai".
  4. Prie "Išoriniai raktai" spaudžiau ant panaudojimo atvejo (https://www.trafi.com) pavadinimo ir naujame lange buvo mytukas "Leisti", kurio nepasirinkau, o vietoje to grįžau keliais žingsniais atgal, į panaudojimo atvejį.
  5. Tai padarius, pakartoti visų žingsnių nebepavyko. Paspaudus "Prašyti leidimų" rakto nebeišdavė. Nuėjus į organizacijos "Raktai" skiltį ir atsidarius panaudojimo atvejį (https://www.trafi.com) buvo tuščias langas su antrašte "Rakto peržiūra". Pabandžiau pašalinti panaudojimo atvejį iš "Išoriniai raktai" prie organizacijos "Raktai" skiltyje, bet gavau klaidą 500 https://test.data.gov.lt/orgs/78/apikeys/767/remove/.
  6. Pakartojau žingsnius su panaudojimo atveju (https://www.regia.lt/) tai pačiai organizacijai (Valstybės duomenų agentūra), tik šįkart "Raktai" skiltyje pasirinkau "Leisti" (žiūrėkite 4 žingsnį). Tačiau gavau klaidą 500 https://test.data.gov.lt/projects/6/permissions/856/toggle/1670/.

Taip pat:

  1. Prie organizacijos "Raktai", skiltyje "Vidiniai raktai" kaip pavadinimą rodo "None", nors turėtų rodyni client_name arba client_id, o ne name.
  2. Prie organizacijos "Raktai", skiltyje "Išoriniai raktai" prie "Pavadinimas" rodo rakto slaptažodį, kurio niekur neturėtų rodyti, o vietoje to, turėtų rodyti client_name arba client_id.

@Faustasm
Copy link
Contributor

Faustasm commented Jan 11, 2024

Internal Server Error: /orgs/269/apikeys/

Traceback (most recent call last):
  File "vitrina/orgs/views.py", line 976, in get_context_data
    ApiKey.objects.create(
  File "django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "django/db/models/query.py", line 451, in create
    obj = self.model(**kwargs)
  File "django/db/models/base.py", line 485, in __init__
    _setattr(self, field.name, rel_obj)
  File "django/db/models/fields/related_descriptors.py", line 215, in __set__
    raise ValueError(
ValueError: Cannot assign "True": "ApiKey.organization" must be a "Organization" instance.

@Faustasm
Copy link
Contributor

Faustasm commented Jan 11, 2024

Internal Server Error: /projects/6/permissions/856/toggle/1670/

File "/usr/local/lib/pythonX/json/encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ApiScope is not JSON serializable

@Faustasm Faustasm moved this from Test to Todo in Portalo plėtra Jan 11, 2024
@adp-atea adp-atea moved this from Todo to In Progress in Portalo plėtra Jan 12, 2024
@Faustasm Faustasm moved this from Test to Todo in Portalo plėtra Jan 12, 2024
@adp-atea adp-atea moved this from Todo to In Progress in Portalo plėtra Jan 12, 2024
@Faustasm
Copy link
Contributor

Su toggle vis dar ta pati klaida

Internal Server Error: /projects/6/permissions/856/toggle/1670/

File "/usr/local/lib/pythonX/json/encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ApiScope is not JSON serializable

@aurjas
Copy link

aurjas commented Jan 12, 2024

Taip pat, nelabai aišku, kodėl neleidžia "Prašyti leidimų" čia https://test.data.gov.lt/projects/3/permissions/. Prie organizacijos "Raktai" yra sukurtas įrašas (https://www.trafi.com/) "Išoriniai raktai" skiltyje, bet langas tuščias ir "Įjungti/Išjungti" pasirinkimo nėra.

Pašalinti API rakto taip pat nėra galimybės, išduoda žinutę
image

@adp-atea
Copy link
Contributor

adp-atea commented Jan 12, 2024

Jeigu nėra ryšio su spintos API arba grįžta būsenos kodas ne 200, tada raktas nešalinamas.
Reikia prisidėti į .env SPINTA_SERVER_CLIENT_ID ir SPINTA_SERVER_CLIENT_SECRET reikšmes.
Taip pat reiktų nusirodyti SPINTA_SERVER_URL reišmę, kuri nebūtų localhost, o veikiantis API adresas.

@adp-atea adp-atea moved this from In Progress to Deploy in Portalo plėtra Jan 12, 2024
@Faustasm
Copy link
Contributor

Faustasm commented Jan 17, 2024

Visi kintamieji prod aplinkoje yra.

@Faustasm
Copy link
Contributor

Kviečiant toggle:

 Internal Server Error: /projects/6/permissions/856/toggle/1670/
 Traceback (most recent call last):
   File "/site-packages/django/core/handlers/exception.py", line 47, in inner
     response = get_response(request)
                ^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/django/core/handlers/base.py", line 181, in _get_response
     response = wrapped_callback(request, *callback_args, **callback_kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/django/views/generic/base.py", line 70, in view
     return self.dispatch(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/vitrina/projects/views.py", line 434, in dispatch
     return super().dispatch(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/django/contrib/auth/mixins.py", line 104, in dispatch
     return super().dispatch(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/django/views/generic/base.py", line 98, in dispatch
     return handler(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/vitrina/projects/views.py", line 469, in get
     response = get_auth_session().post(SPINTA_SERVER_URL + '/auth/clients' + self.apikey.client_id,
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/requests/sessions.py", line 637, in post
     return self.request("POST", url, data=data, json=json, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/requests/sessions.py", line 575, in request
     prep = self.prepare_request(req)
            ^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/site-packages/requests/sessions.py", line 486, in prepare_request
     p.prepare(
   File "/site-packages/requests/models.py", line 371, in prepare
     self.prepare_body(data, files, json)
   File "/site-packages/requests/models.py", line 511, in prepare_body
     body = complexjson.dumps(json, allow_nan=False)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/usr/local/lib/python3.11/json/__init__.py", line 238, in dumps
     **kw).encode(obj)
           ^^^^^^^^^^^
   File "/usr/local/lib/python3.11/json/encoder.py", line 200, in encode
     chunks = self.iterencode(o, _one_shot=True)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/usr/local/lib/python3.11/json/encoder.py", line 258, in iterencode
     return _iterencode(o, 0)
            ^^^^^^^^^^^^^^^^^
   File "/usr/local/lib/python3.11/json/encoder.py", line 180, in default
     raise TypeError(f'Object of type {o.__class__.__name__} '
 TypeError: Object of type ApiScope is not JSON serializable

@Faustasm
Copy link
Contributor

Kviečiant change

 Internal Server Error: /orgs/269/apikeys/757/change/
 Traceback (most recent call last):
   File "site-packages/django/core/handlers/exception.py", line 47, in inner
     response = get_response(request)
                ^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/core/handlers/base.py", line 181, in _get_response
     response = wrapped_callback(request, *callback_args, **callback_kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/views/generic/base.py", line 70, in view
     return self.dispatch(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/vitrina/orgs/views.py", line 1315, in dispatch
     return super().dispatch(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/contrib/auth/mixins.py", line 104, in dispatch
     return super().dispatch(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/views/generic/base.py", line 98, in dispatch
     return handler(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/views/generic/edit.py", line 190, in get
     return super().get(request, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/views/generic/edit.py", line 133, in get
     return self.render_to_response(self.get_context_data())
                                    ^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/vitrina/orgs/views.py", line 1356, in get_context_data
     org = Organization.objects.filter(name=code.removeprefix('_datasets_gov_')).get()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "site-packages/django/db/models/query.py", line 435, in get
     raise self.model.DoesNotExist(
 vitrina.orgs.models.Organization.DoesNotExist: Organization matching query does not exist.

@adp-atea
Copy link
Contributor

Šios klaidos turėjo būti pataisytos su commitu b05f291, kuris buvo padarytas penktadienį.

Prašau patikrinkite.

@sirex
Copy link
Contributor Author

sirex commented Jan 25, 2024

https://test.data.gov.lt/orgs/98/apikeys/

Iš panaudojimo atvejo Miškų (VMP) panaudojimo atvejis sukūriau raktą ir paprašiau leidimo prie Privačių vidinės miškotvarkos projektų rengėjų sąrašas duomenų rinkinio, spausdamas „Prašyti leidimų“ mygtuką.

Tačiau, Miškų tarnybos raktų puslapyje, prie „Miškų (VMP) panaudojimo atvejis rakto nėra galimybės patvirtinti prašomą leidimą.

Kaip ir nurodyta užduotyje, organizacijos raktų puslapį, atsidarius išorinį raktą, turi būti galimybė patvirtinti prašomus leidimus arba juos atmesti.

@sirex sirex reopened this Jan 25, 2024
@sirex sirex moved this from Review to Todo in Portalo plėtra Jan 25, 2024
@adp-atea adp-atea moved this from Todo to In Progress in Portalo plėtra Jan 29, 2024
@adp-atea
Copy link
Contributor

Tai trūksta raktų puslapyje pridėti mygtuką Įjungti/Išjungti, kurį matytų ir galėtų paspausti tik organizacijos tvarkytojas/koordinatorius?
Screenshot_20240129_122007

@adp-atea adp-atea linked a pull request Feb 7, 2024 that will close this issue
@github-project-automation github-project-automation bot moved this from In Progress to Done in Portalo plėtra Feb 7, 2024
@adp-atea adp-atea moved this from Done to Deploy in Portalo plėtra Feb 7, 2024
@Faustasm Faustasm moved this from Deploy to Test in Portalo plėtra Feb 8, 2024
@JuliusLADP
Copy link
Collaborator

Skelbiamų asmens duomenų prieigos valdymas - užduotis, kuri nebuvo numatyta pirkimo specifikacijoje. Tačiau tai ne pagrindinė bėda. VDAI išaiškinime: https://vdai.lrv.lt/uploads/vdai/documents/files/23%20DUK_atviruju%20duomenu%20ir%20asmens%20duomenu%20santykis%202021-03-10.pdf , kur akcentuojama, kad:

  • Viešai paskelbti asmens duomenys gali būti naudojami tik tuo tikslu, kuriuo jie buvo teisėtai
    paskelbti
  • Asmens duomenys negali būti atvirieji duomenys ir (ar) skelbiami atviru formatu;
  • Pakartotinis asmens duomenų naudojimas galimas tik vadovaujantis BDAR:
    asmens duomenų perskelbimas kito duomenų valdytojo
    elektroniniuose resursuose ar tvarkymas kitais tikslais nebūtų atliekamas pagal Lietuvos Respublikos asmens
    duomenų apsaugos įstatymo reikalavimus, todėl toks duomenų valdytojas pagal BDAR 5 straipsnio
    2 dalį, turėtų sugebėti įrodyti, kad toks asmens duomenų tvarkymas atitinka BDAR, t. y. asmens duomenys
    skelbiami teisėtu tikslu, tinkama apimtimi, esant bent vienai teisėtai asmens duomenų tvarkymo sąlygai ir t.t. , kurios yra aprašytos
    https://gdpr-text.com/lt/read/article-5/#comment_gdpr-a-05_1c

@Faustasm Faustasm moved this from Test to Prod in Portalo plėtra Feb 22, 2024
@Faustasm Faustasm moved this from Prod to Test in Portalo plėtra Feb 22, 2024
@aurjas
Copy link

aurjas commented Feb 22, 2024

Pastebėjimai:

  1. Suteikus leidimą (paspaudus mytuką "Įjungti") šiam duomenų rinkiniui https://test.data.gov.lt/datasets/916/ per panaudojimo atvejį https://test.data.gov.lt/projects/439/permissions/, išmeta klaidą "Saugant API raktą įvyko klaida"
    image

  2. Suteikus leidimą vienam rinkiniui ir prie panaudojimo atvejo https://test.data.gov.lt/projects/439/permissions/ pridėjus dar vieną rinkinį, prašyti leidimų nebeleidžia ir Organizacijų raktų lange naujai pridėtas rinkinys neatsiranda, o taip pat ir įjungti leidimo nėra kaip. Statusas (ikona) yra juodas kvadratas, ne smėlio laikrodis.

image

image

  1. Kadangi leidimai suteikiami tik rinkiniams turintiems access=public lauką (-ų), tai reikėtų, kad rinkinių neturinčių access=public laukų nebūtų galimybės pridėti, nes portalo naudotojas gali pridėti daugybę tokių rinkinių prie panaudojimo atvejo, kas būtų ganėtinai painu ir estetiškai netvarkinga

image

  1. Ar būtų galimybė prie leidimo statuso (kvadratas, smėlio laikrodis, varnelė ir pan.) parašyti ką tas statusas reiškia?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment