Poradnia¶
- Date:
30 kwi 2024
Spis treści¶
Poradnia¶
Oprogramowanie ma na celu usprawnienie obsługi klientów Pozarządowego Centrum Dostępu do Informacji Publicznej oraz zwiększenie efektywności wsparcia ze strony praktykantów i ekspertów zewnętrznych. Powstałe narzędzie ma również dostarczać dane o charakterze ilościowym na temat zakresu udzielanego wsparcia, uwzględniając drogę mailowa, telefoniczną, ustną i szkoleniową.
Aplikacja została wykorzystana z wykorzystaniem frameworka Django w języku Python.
Opis uruchomienia i wdrożenia aplikacji zostało przeniesione do pliku docs/getting_up.rst
.
Użycie aplikacji¶
Dostępne i aktywnie wspierane są aktualnie dwie metody uruchomienia aplikacji. Starsze oparte o Vagrant (wspartym przez Ansible) oraz nowsze oparte o Docker.
Praca w środowisku Docker¶
Obraz przygotowany dla środowiska Docker właściwy jest wyłącznie do pracy w środowisku deweloperskim.
Uruchomienie:
$ docker-compose build
$ docker-compose up
Po poprawnym uruchomieniu usług można przejść w przeglądarce pod adres http://localhost:8000
.
Warto na początku pracy utworzyć konto administratora poprzez polecenie:
$ docker-compose run web python manage.py createsuperuser
Wskazane jest także zaimportowanie danych z rejestru TERC poprzez polecenie:
$ docker-compose run web bash ./.contrib/load_terc.sh
Wdrożenie¶
Wdrożenie aplikacji odbywa się w sposób typowy dla aplikacji Django z uwzględnieniem standardu 12factory.
Testy end-to-end¶
Testy end-to-end wykonywane są w środowisku cypress.io.
HowTo¶
Testy najłatwiej wywołać używając pliku docker-compose.test.yml lub Makefile. Użycie opcji volumes sprawia, że pliki zapisane przez Cypress będą widoczne na maszynie użytkownika. Przydatne w debugowaniu, gdyż Cypress zapisuje pliki wideo przedstawiające przebieg testów.
Debugowanie¶
Po każdym wykonaniu, Cypress pozostawia po sobie:
Pliki wideo z nagraniem przebiegu każdego testu. Znajdują się w folderze cypress/videos.
Zrzuty ekranu w razie zachowania niezgodnego z oczekiwaniami. Folder cypress/screenshots.
Przy lokalnym wywołaniu testów poprzez docker-compose, pliki widoczne będą na maszynie użytkownika. Pliki te nie są śledzone przez repozytorium.
Interfejs Cypress¶
Testy uruchomione wewnątrz kontenera Docker używają uproszczonej przeglądarki Electron, wystarczającej do zastosowań CI. Możliwe jest także uruchomienie testów bez użycia Dockera, co pozwala na interakcję z interfejsem Cypress:
$ npm install
$ npx cypress open
Praca z interfejsem jest przydatna zwłaszcza przy pisaniu nowych testów i debugowaniu istniejących.
Lokalna instancja Cypress wymaga podania parametru baseUrl. Dokumentacja dotycząca konfiguracji Cypress dostępna jest tutaj.
Rozbudowa¶
Kod jest formatowany z użyciem prettier.io.
Instalacja:
$ npm install -g prettier
Aby sformatować plik .js, należy wywołać polecenie:
$ npx prettier <sciezka_pliku> -w
Moduły¶
Aplikacja została wykonana modularnie w sposób właściwy dla aplikacji Django.
advicer - rejstr tagów (dawniej rejestr porad)¶
Aplikacja służy do tagowania spraw (dawniej: rejestracji porad) udzielonych zarówno w ramach systemu spraw (:doc:/modules/cases.rst), jak również poza jego obiegiem. Przeznaczeniem aplikacji jest gromadzenie danych statystycznych o udzielonych poradach na potrzeby działań crownfundingowcyh, przedstawianie danych grantodawcom, promocji działań itp. Narzędzie dostarcza dane o charakterze ilościowym na temat zakresu udzielanego wsparcia, uwzględniając drogę mailowa, telefoniczną, ustną i szkoleniową.
Model¶
- class poradnia.advicer.models.AbstractCategory(*args, **kwargs)[źródło]¶
- Parametry:
name (CharField) – Nazwa
- class poradnia.advicer.models.Advice(id, case, subject, person_kind, institution_kind, advicer, grant_on, created_by, created_on, helped, modified_by, modified_on, visible, comment, jst)[źródło]¶
- Parametry:
id (AutoField) – Id
case_id (OneToOneField to
poradnia.cases.models.Case
) – Sprawasubject (CharField) – Przedmiot
person_kind_id (ForeignKey to
poradnia.advicer.models.PersonKind
) – Rodzaj osoby, która się zgłasza o poradęinstitution_kind_id (ForeignKey to
poradnia.advicer.models.InstitutionKind
) – Rodzaj podmiotu zobowiązanegoadvicer_id (ForeignKey to
poradnia.users.models.User
) – Osoba, która udzieliła poradygrant_on (DateTimeField) – Udzielona o
created_by_id (ForeignKey to
poradnia.users.models.User
) – Utworzony przezcreated_on (DateTimeField) – Data utworzenia
helped (BooleanField) – Czy udzieliliśmy porady?
modified_by_id (ForeignKey to
poradnia.users.models.User
) – Zmodyfikowany przezmodified_on (DateTimeField) – Data modyfikacji
visible (BooleanField) – Widoczne
comment (TextField) – Komentarz
jst_id (ForeignKey to
poradnia.teryt.models.JST
) – Jednostka podziału terytorialnego
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.advicer.models.AdviceQuerySet(model=None, query=None, using=None, hints=None)[źródło]¶
- class poradnia.advicer.models.Area(id, name)[źródło]¶
- Parametry:
id (AutoField) – Id
name (CharField) – Nazwa
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.advicer.models.Attachment(id, attachment, advice)[źródło]¶
- Parametry:
id (AutoField) – Id
attachment (FileField) – Plik
advice_id (ForeignKey to
poradnia.advicer.models.Advice
) – Advice
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.advicer.models.InstitutionKind(id, name)[źródło]¶
- Parametry:
id (AutoField) – Id
name (CharField) – Nazwa
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
Widoki¶
- class poradnia.advicer.views.AdviceAjaxDatatableView(**kwargs)[źródło]¶
View to provide table list of all Advices with ajax data.
- Parametry:
url_name –
advicer:advice_table_ajax_data
- class poradnia.advicer.views.AdviceCreate(**kwargs)[źródło]¶
- Parametry:
url_name –
advicer:create
- form_class¶
alias of
AdviceForm
- inline_form_cls¶
alias of
AttachmentForm
- inline_model¶
alias of
Attachment
- class poradnia.advicer.views.AdviceTableView(**kwargs)[źródło]¶
View for displaying template with Advices table.
- Parametry:
url_name –
advicer:table
- class poradnia.advicer.views.AdviceUpdate(**kwargs)[źródło]¶
- Parametry:
url_name –
advicer:update
- form_class¶
alias of
AdviceForm
- get_form_valid_message()[źródło]¶
Validate that form_valid_message is set and is either a unicode or str object.
- inline_form_cls¶
alias of
AttachmentForm
- inline_model¶
alias of
Attachment
Formularze¶
- class poradnia.advicer.forms.AdviceForm(*args, **kwargs)[źródło]¶
- Parametry:
case – Sprawa
subject – Przedmiot
grant_on – Udzielona o
issues – Zakresy tematyczne zapytania
area – Problemy z zakresu prawa do informacji
person_kind – Rodzaj osoby, która się zgłasza o poradę
institution_kind – Rodzaj podmiotu zobowiązanego
advicer – Radzący
comment – Komentarz
helped – Czy udzieliliśmy porady?
jst – Jednostka podziału terytorialnego
- property media¶
Return all media required to render the widgets on this form.
Cases - rejestr spraw¶
W celu zrozumienia używanych określeń użytkowników zapoznaj się z Users
Podstawowy przepływ pracy¶
1. Wniesienie sprawy za pomocą poczty elektronicznej¶
Klient wypełnia formularz na stronie internetowej. Ma możliwość dołączyć załączniki. Jeżeli użytkownik nie jest zalogowany - ma możliwość podać adres e-mail.
2. Rejestracja sprawy¶
Sprawa jest rejestrowana w systemie. O jej utworzeniu zostają powiadomieni administratorzy. Nadany zostaje unikalny numer.
3. Przypisanie sprawy¶
Sekretariat dokonuje wstępnego przeglądu sprawy przypisując sprawę do praktykanta / obserwatora za powiadomieniem wszystkich wewnętrznych w sprawie, a także ustala oznacza ewentualny termin.
4. Przygotowanie projektu pisma¶
Wsparcie sporządza projekt odpowiedzi w sprawie. O jej nadesłaniu powiadomiony zostaje każdy członek zaangażowany w sprawę.
5. Zatwierdzenie pisma¶
Prawnik zatwierdzają pismo. Ma możliwość przedstawić uwagi do pisma. O akceptacji i uwagach powiadamiany jest każdy z zespołu zaangażowany w sprawę. Zatwierdzone pismo jest przesyłane do każdego zaangażowanego.
6. Zamykanie sprawy¶
Prawnik zamyka sprawę, co ma charakter jedyny organizacyjny.
7. Odpowiedź na dowolną wiadomość¶
Klient ma możliwość w każdej chwili, aby odpowiadzieć na dowolne pismo z systemu. Skutkuje to otwarciem ponownie sprawy, a także powiadomieniem o nowym piśmie osoby, które dotychczas były zaangażowane w sprawe.
Alternatywny przepływ pracy¶
Wniesienie sprawy za pomocą poczty elektronicznej¶
Klient ma możliwość wniesienia sprawy z wykorzystaniem dedykowanego adresu e-mail. Aplikacja na podstawie adresu e-mail przypisuje sprawę do konta użytkownika-klienta. Klient jest powiadamiany o numer sprawy i przesyłany jest mu link do akt sprawy. Następnie sprawa kontynuowana jest zgodnie z krokiem 2. Rejestracja sprawy.
Wniesienie sprawy anonimowo¶
Klient wypełnia formularz na stronie internetowej. Ma możliwość dołączyć załączniki, a także obowiązek podać adres e-mail. Podany adres e-mail to jest on wykorzystywany do utworzenia konta użytkownika. Nazwa użytkownika jest generowana automatycznie na podstawie adresu e-mail. Hasło jest losowe. Dane te są przesyłane do użytkownika. Następnie sprawa kontynuowana jest zgodnie z krokiem 2. Rejestracja sprawy.
Odrzucenie projektu pisma¶
Jeżeli prawnik nie akceptuje projektu pisma przedstawionego przez wolontariusza ma możliwość napisania uwag, które będą dostępne tylko dla członków zespołu. Następnie sprawa powraca do kroku 4. Przygotowanie projektu pisma.
Odpowiedź e-mailowa¶
Na każde nadesłane pismo w sprawie każdy ma możliwość odpowiedzi, a odpowiedź jest rejestrowana w systemie. Odpowiedź - na podstawie adresu e-mail - jest identyfikowana i przypisywana do wolontariusza. Zamknięta sprawa jest otwierana. Następnie sprawa powraca do kroku 4. Przygotowanie projektu pisma.
Status sprawy¶
Każda sprawa ma swój status, który może uleca następującej zmianie zgodnie z poniżej przedstawionym schematem.
digraph case_status { "free" [label="wolna"]; "assigned" [label="przypisana"]; "closed" [label="zamknięta"]; free -> assigned [label="przypisanie prawnika"]; assigned -> free [label="usunięcie ostatniego prawnika"]; assigned -> closed [label="zamknięcie sprawy"]; free -> closed [label="zamknięcie sprawy"]; closed -> free [label="nowe pismo do wcześniej wolnej sprawy"]; closed -> assigned [label="nowe pismo do wcześniej przypisanej sprawy"] }Uprawnienia¶
Moduł w zakresie zarządzania kontrolą dostępu i użytkownikami wykorzystuje:
uprawnienia, które mogą być lokalne, odnoszące się do konkretnej sprawy i globalne, które dotyczą całego systemu,
flagi, które konfigurują zachowanie systemu wobec użytkownika,
Moduł wykorzystuje następujące uprawnienia umożliwiający określone akcje o sprecyzowanym zasięgu (domyślnie lokalnym):
Może widzieć sprawę (
cases.can_view
) - oglądanie spraw, które jest globalne lub lokalne,Może nadawać nowe uprawnienia (
cases.can_assign
) - przypisywanie użytkowników do wolnej sprawy, które jest globalne lub lokalne,Może komunikować się z klientem (
cases.can_send_to_client
) - zatwierdzania pism, wysyłania pism bezpośrednio do klienta, a także jego obecność zmienia status sprawy na przypisana,Może nadawać uprawnienia (
cases.can_manage_permission
) - zarządzanie dowolnymi uprawnieniami w sprawie,Może dodawać wpisy (
cases.can_add_record
) - dodawać rekordy (listy, wydarzenia) w sprawie,Może zmieniać własne wpisy (
cases.can_change_own_record
) - edytować samodzielnie utworzone rekordy w sprawie,Może zmieniać wszystkie wpisy (
cases.can_change_all_record
) - edytować cudze rekordy w sprawie,Może zamknąć sprawę (
cases.can_close_case
) - oznaczyć sprawę jako zamkniętą,Może wybierać klienta (
cases.can_select_client
) - podczas tworzenia nowej sprawy przez WWW może sam wybrać klienta, które jest globalne,Może edytować sprawę (
cases.can_change_case
) - modyfikować tytuł sprawy i jej inne opcje.
Moduł wykorzystujące następujące flagi w edycji użytkownika:
„W zespole” (
is_staff
), które określa czy użytkownik może oglądać projekty pism i wewnętrzną korespondencje w sprawie,„Powiadamiaj o nowej sprawie” (
notify_new_case
), które określa czy użytkownik ma być powiadamiany o nowych sprawach,„Powiadamiaj o listach w wolnych sprawach” (
notify_unassigned_letter
), które określa czy użytkownik ma być powiadamiany o listach w sprawach, które nie są przypisane.
W panelu administracyjnym podczas edycji użytkownika możliwe jest:
zarządzanie uprawnieniami globalnymi,
modyfikowanie flag użytkownika.
Zarządzanie uprawnieniami lokalnymi odbywa się z poziomu własnej sprawy.
Przykładowo, aby uzyskać użytkownika:
widzi tylko przypisane do siebie sprawy (czyli jak zwykły członek zespołu), nie dostaje tych powiadomień o nowej sprawie, nie widzi spraw innych – wyłącznie nadać flagę „W zespole” dla użytkownika,
widzi wszystkie sprawy, ale nie dostaje tych powiadomień o nowej sprawie należy nadać globalnie uprawnienie „Może widzieć sprawę”,
widzi wszystkie sprawy, otrzymuje powiadomienia o nowej sprawie oraz liście w sprawie nieprzypisanej należy nadać globalne uprawnienie „Może widzieć sprawę” oraz zmodyfikować flagę użytkownika „Powiadamiaj o nowej sprawie” oraz „Powiadamiaj o listach w wolnych sprawach”.
Kod aplikacji¶
Widoki¶
- class poradnia.cases.views.cases.CaseAjaxDatatableView(**kwargs)[źródło]¶
View to provide table list of all Cases with ajax data.
- Parametry:
url_name –
cases:case_table_ajax_data
- class poradnia.cases.views.cases.CaseAutocomplete(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:autocomplete
- class poradnia.cases.views.cases.CaseCloseView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:close
- form_class¶
alias of
CaseCloseForm
- class poradnia.cases.views.cases.CaseDetailView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:detail
- class poradnia.cases.views.cases.CaseListView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:list
- get_filterset_kwargs(*args, **kwargs)[źródło]¶
Returns the keyword arguments for instantiating the filterset.
- class poradnia.cases.views.cases.CaseMergeView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:merge
- form_class¶
alias of
CaseMergeForm
- class poradnia.cases.views.cases.CaseTableView(**kwargs)[źródło]¶
View for displaying template with Cases table.
- Parametry:
url_name –
cases:table
- class poradnia.cases.views.permissions.CaseGroupPermissionView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:permission_grant
- form_class¶
alias of
CaseGroupPermissionForm
- form_valid(form, *args, **kwargs)[źródło]¶
Call the super first, so that when overriding get_form_valid_message, we have access to the newly saved object.
- class poradnia.cases.views.permissions.UserPermissionCreateView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:permission_add
- form_class¶
alias of
TranslatedManageObjectPermissionForm
- class poradnia.cases.views.permissions.UserPermissionRemoveView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:permission_remove
- class poradnia.cases.views.permissions.UserPermissionUpdateView(**kwargs)[źródło]¶
- Parametry:
url_name –
cases:permission_update
- form_class¶
alias of
TranslatedUserObjectPermissionsForm
- form_valid(form)[źródło]¶
Call the super first, so that when overriding get_form_valid_message, we have access to the newly saved object.
Model¶
- class poradnia.cases.models.Case(id, name, status, status_changed, client, letter_count, last_send, last_action, last_received, deadline, created_by, created_on, modified_by, modified_on, handled, has_project)[źródło]¶
- Parametry:
id (AutoField) – Numer sprawy
name (CharField) – Przedmiot
status (StatusField) – Status
status_changed (MonitorField) – Status changed
client_id (ForeignKey to
poradnia.users.models.User
) – Klientletter_count (IntegerField) – Liczba listów
last_send (DateTimeField) – Ostatnia odpowiedź
last_action (DateTimeField) – Ostatnia czynność
last_received (DateTimeField) – Ostatnio otrzymano
deadline_id (ForeignKey to
poradnia.events.models.Event
) – Termincreated_by_id (ForeignKey to
poradnia.users.models.User
) – Utworzony przezcreated_on (DateTimeField) – Utworzone o
modified_by_id (ForeignKey to
poradnia.users.models.User
) – Zmodyfikowany przezmodified_on (DateTimeField) – Zmodyfikowane o
handled (BooleanField) – Obsłużona
has_project (BooleanField) – Posiada projekt
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.cases.models.CaseGroupObjectPermission(id, permission, group, content_object)[źródło]¶
- Parametry:
id (AutoField) – Id
permission_id (ForeignKey to
django.contrib.auth.models.Permission
) – Permissiongroup_id (ForeignKey to
django.contrib.auth.models.Group
) – Groupcontent_object_id (ForeignKey to
poradnia.cases.models.Case
) – Content object
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.cases.models.CaseUserObjectPermission(id, permission, user, content_object)[źródło]¶
- Parametry:
id (AutoField) – Id
permission_id (ForeignKey to
django.contrib.auth.models.Permission
) – Permissionuser_id (ForeignKey to
poradnia.users.models.User
) – Usercontent_object_id (ForeignKey to
poradnia.cases.models.Case
) – Content object
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- delete(*args, **kwargs)[źródło]¶
Note: this method is not invoked in usual circumstances (remove_perm call).
- save(*args, **kwargs)[źródło]¶
Save the current instance. Override this in a subclass if you want to control the saving process.
The «force_insert» and «force_update» parameters can be used to insist that the „save” must be an SQL insert or update (or equivalent for non-SQL backends), respectively. Normally, they should not be set.
- class poradnia.cases.models.DeleteCaseProxy(id, name, status, status_changed, client, letter_count, last_send, last_action, last_received, deadline, created_by, created_on, modified_by, modified_on, handled, has_project)[źródło]¶
- Parametry:
id (AutoField) – Numer sprawy
name (CharField) – Przedmiot
status (StatusField) – Status
status_changed (MonitorField) – Status changed
client_id (ForeignKey to
poradnia.users.models.User
) – Klientletter_count (IntegerField) – Liczba listów
last_send (DateTimeField) – Ostatnia odpowiedź
last_action (DateTimeField) – Ostatnia czynność
last_received (DateTimeField) – Ostatnio otrzymano
deadline_id (ForeignKey to
poradnia.events.models.Event
) – Termincreated_by_id (ForeignKey to
poradnia.users.models.User
) – Utworzony przezcreated_on (DateTimeField) – Utworzone o
modified_by_id (ForeignKey to
poradnia.users.models.User
) – Zmodyfikowany przezmodified_on (DateTimeField) – Zmodyfikowane o
handled (BooleanField) – Obsłużona
has_project (BooleanField) – Posiada projekt
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
Formularze¶
- class poradnia.cases.forms.CaseCloseForm(*args, **kwargs)[źródło]¶
- property media¶
Return all media required to render the widgets on this form.
- class poradnia.cases.forms.CaseForm(*args, **kwargs)[źródło]¶
- Parametry:
name – Przedmiot
status – Status
has_project – Posiada projekt
- property media¶
Return all media required to render the widgets on this form.
- class poradnia.cases.forms.CaseGroupPermissionForm(*args, **kwargs)[źródło]¶
- Parametry:
user – Użytkownik / użytkowniczka
group – Grupa uprawnień
- property media¶
Return all media required to render the widgets on this form.
Events - wydarzenia¶
Kod aplikacji¶
Model¶
- class poradnia.events.models.Event(id, case, deadline, completed, public, time, text, created_by, created_on, modified_by, modified_on)[źródło]¶
- Parametry:
id (AutoField) – Id
case_id (ForeignKey to
poradnia.cases.models.Case
) – Casedeadline (BooleanField) – Istotne wydarzenie, szczególnie podkreślone np. na liście spraw.
completed (BooleanField) – Wydarzenie zostało zakończone, nie będzie przypomnień.
public (BooleanField) – Zdarzenie jest widoczne dla klientów (ext).
time (DateTimeField) – Czas
text (TextField) – Przedmiot
created_by_id (ForeignKey to
poradnia.users.models.User
) – Utworzony przezcreated_on (DateTimeField) – Utworzone o
modified_by_id (ForeignKey to
poradnia.users.models.User
) – Zmodyfikowany przezmodified_on (DateTimeField) – Zmodyfikowane o
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.events.models.Reminder(id, created, modified, event, user, active)[źródło]¶
- Parametry:
id (AutoField) – Id
created (AutoCreatedField) – Utworzony
modified (AutoLastModifiedField) – Zmodyfikowany
event_id (ForeignKey to
poradnia.events.models.Event
) – Eventuser_id (ForeignKey to
poradnia.users.models.User
) – Odbiorcaactive (BooleanField) – Status aktywności
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
Widoki¶
- class poradnia.events.views.CalendarEventView(**kwargs)[źródło]¶
- Parametry:
url_name –
events:calendar
- class poradnia.events.views.CalendarListView(**kwargs)[źródło]¶
- Parametry:
url_name –
events:calendar
- class poradnia.events.views.EventAjaxDatatableView(**kwargs)[źródło]¶
View to provide table list of all Events with ajax data.
- Parametry:
url_name –
events:events_table_ajax_data
- class poradnia.events.views.EventCreateView(**kwargs)[źródło]¶
- Parametry:
url_name –
events:add
- form_valid(form)[źródło]¶
Call the super first, so that when overriding get_form_valid_message, we have access to the newly saved object.
- class poradnia.events.views.EventTableView(**kwargs)[źródło]¶
View for displaying template with Events table.
- Parametry:
url_name –
events:table
- class poradnia.events.views.EventUpdateView(**kwargs)[źródło]¶
- Parametry:
url_name –
events:edit
- form_valid(form)[źródło]¶
Call the super first, so that when overriding get_form_valid_message, we have access to the newly saved object.
- get_form_valid_message()[źródło]¶
Validate that form_valid_message is set and is either a unicode or str object.
Formularze¶
Feedback_Custom¶
Kod aplikacji¶
Formularze¶
Keys¶
Wdrożony został moduł kluczy dostępu. Zapewnia on kontrolę dostępu do treści przeznaczonych dla konkretnego użytkownika w przypadku dostępu maszynowego. Umożliwia on uzyskanie dostępu do treści bez ujawniania hasła użytkownika.
Moduł rejestruje dane w zakresie: * czasu ostatniego użycia klucza, * czasu pobrania klucza z aplikacji, * etykiety klucza
Treści o dostępie maszynowym¶
Tylko do wybranych treści dostęp możliwy jest z wykorzystaniem kluczy dostępu. Z strony programistycznej są to treści wykorzystujące `keys.mixins.KeyAuthMixin`
, co w praktyce oznacza ([szukaj w kodzie](https://github.com/watchdogpolska/poradnia/search?utf8=%E2%9C%93&q=KeyAuthMixin)):
* widok kalendarza w formacie - `/event/ical/`
.
Logowanie¶
Aby uzyskać treści należy przekazać dane autoryzacyjne przy każdym żądaniu. Można to zrobić poprzez:
* dane HTTPAuth Basic - `//{{username}}}:{{key}}}@example.com/event/ical`
* dane GET - `//example.com/event/ical?username={{username}}&key={{key}}`
Kod aplikacji¶
Model¶
- class poradnia.keys.models.Key(id, user, password, description, created_on, used_on, download_on)[źródło]¶
- Parametry:
id (AutoField) – Id
user_id (ForeignKey to
poradnia.users.models.User
) – Użytkownik / użytkowniczkapassword (CharField) – Klucz
description (CharField) – Opis
created_on (DateTimeField) – Utworzone o
used_on (DateTimeField) – Użyty o
download_on (DateTimeField) – Pobrany o
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
Widoki¶
Formularze¶
Letters¶
Kod aplikacji¶
Model¶
- class poradnia.letters.models.Attachment(id, letter, attachment)[źródło]¶
- Parametry:
id (AutoField) – Id
letter_id (ForeignKey to
poradnia.letters.models.Letter
) – Letterattachment (FileField) – Plik
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.letters.models.AttachmentQuerySet(model=None, query=None, using=None, hints=None)[źródło]¶
- class poradnia.letters.models.Letter(id, case, genre, status, status_changed, accept, name, text, html, signature, created_by, created_by_is_staff, created_on, modified_by, modified_on, message, eml)[źródło]¶
- Parametry:
id (AutoField) – Id
case_id (ForeignKey to
poradnia.cases.models.Case
) – Casegenre (CharField) – Genre
status (StatusField) – Status
status_changed (MonitorField) – Status changed
accept (MonitorField) – Zaakceptowane o
name (CharField) – Przedmiot
text (TextField) – Treść
html (TextField) – Mail sformatowany w html
signature (TextField) – Podpis
created_by_id (ForeignKey to
poradnia.users.models.User
) – Utworzony przezcreated_by_is_staff (BooleanField) – Created by staff member
created_on (DateTimeField) – Utworzone o
modified_by_id (ForeignKey to
poradnia.users.models.User
) – Zmodyfikowany przezmodified_on (DateTimeField) – Zmodyfikowane o
message_id (ForeignKey to
django_mailbox.models.Message
) – Messageeml (FileField) – Oryginalna, pełna treść wiadomości
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
Widoki¶
Formularze¶
- class poradnia.letters.forms.AddLetterForm(*args, **kwargs)[źródło]¶
- Parametry:
name – Przedmiot
html – Mail sformatowany w HTML
- property media¶
Return all media required to render the widgets on this form.
- class poradnia.letters.forms.AttachmentForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)[źródło]¶
- Parametry:
attachment – Plik
- property media¶
Return all media required to render the widgets on this form.
- class poradnia.letters.forms.AttachmentsFieldForm(*args, **kwargs)[źródło]¶
- Parametry:
file_field – Załączniki (wybierz lub upuść tutaj)
- property media¶
Return all media required to render the widgets on this form.
- class poradnia.letters.forms.LetterForm(*args, **kwargs)[źródło]¶
- Parametry:
name – Przedmiot
html – Mail sformatowany w HTML
- property media¶
Return all media required to render the widgets on this form.
- class poradnia.letters.forms.NewCaseForm(*args, **kwargs)[źródło]¶
- Parametry:
name – Przedmiot
text – Treść
client – Klient
email – E-mail użytkownika
email_registration – E-mail
- attachment_cls¶
alias of
Attachment
- clean()[źródło]¶
Hook for doing any extra form-wide cleaning after Field.clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named «__all__».
- property media¶
Return all media required to render the widgets on this form.
Notiication_custom¶
Niezalecane od wersji Use: module template_mail instead.
Widoki¶
Records¶
Kod aplikacji¶
Model¶
- class poradnia.records.models.AbstractRecord(*args, **kwargs)[źródło]¶
- Parametry:
case_id (ForeignKey to
poradnia.cases.models.Case
) – Case
- save(*args, **kwargs)[źródło]¶
Save the current instance. Override this in a subclass if you want to control the saving process.
The «force_insert» and «force_update» parameters can be used to insist that the „save” must be an SQL insert or update (or equivalent for non-SQL backends), respectively. Normally, they should not be set.
- class poradnia.records.models.AbstractRecordQuerySet(model=None, query=None, using=None, hints=None)[źródło]¶
- class poradnia.records.models.Record(id, case, created_on, letter, event, courtcase, content_type, object_id)[źródło]¶
- Parametry:
id (AutoField) – Id
case_id (ForeignKey to
poradnia.cases.models.Case
) – Casecreated_on (DateTimeField) – Created on
letter_id (OneToOneField to
poradnia.letters.models.Letter
) – Letterevent_id (OneToOneField to
poradnia.events.models.Event
) – Eventcourtcase_id (OneToOneField to
poradnia.judgements.models.CourtCase
) – Courtcasecontent_type_id (ForeignKey to
django.contrib.contenttypes.models.ContentType
) – Content typeobject_id (PositiveIntegerField) – Object id
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
Template_mail¶
Widoki¶
django-tinycontent¶
Aplikacja została wyposażona w moduł sekcji edycyjnych. Moduł
wykorzystuje dominicrodger/django-tinycontent
.
Zdefiniowane sekcje¶
Istnieją następujące zdefiniowane sekcje edycyjne:
./templates/pages/home.html
:home:start
- początkowa część strony głównej, która jest dostępna dla każdego i wyświetlana każdemuhome:anonymous
- część strony głównej, która jest wyświetlana dla osoby niezalogowanejhome:user
- część strony głównej, która jest wyświetlana dla osoby zalogowanej
./templates/base.html
:footer
- stopka strony
./letters/templates/letters/form_new.html
:letters:new_case_up
- opis formularza nowej sprawy
./utilities/forms.py
:giodo
- opis pola wyrażenia zgody na przetwarzanie danych osobowych
Users¶
Kategoria użytkowników¶
- Zespół (
is_staff=True
) Osoby, które pełnią rolę prawnika, obserwatora, wsparcia lub wsparcia +.
- Prawnik
osoba o pełnym dostępie do wszystkich danych zgromadzonych w systemie,
- Obserwator
osoby o dostępie do wybranych spraw wyłącznie na potrzeby jej obserwacji np. na potrzeby samokształcenia zespołu, specjalnego monitoringu,
- Wsparcie
osoba (praktykant, ekspert zewnętrzny) o dostępie do wybranych spraw na potrzeby realizacji określonych zadań w niej np. przygotowania pisma, ale bez możliwości kierowania sprawy do klienta,
- Wsparcie+
osoba, która ma wszelkie uprawnienia roli wsparcia, a także możliwością samozatwierdzenie pisma i skierowanie go do klienta.
Osoba zewnętrzna (is_staff=False
):
Klient – osoba o dostępie do własnych spraw na potrzeby archiwalne oraz sporządzania nowych podań.
Przez każdego w sprawie należy rozumieć osobę, która jest albo prawnikiem, albo w kontekście danej sprawy obserwatorem, praktykantem, klientem.
Patrz Uprawnienia.
Kod aplikacji¶
Model¶
- class poradnia.users.models.Profile(user, description, www, email_footer, event_reminder_time)[źródło]¶
- Parametry:
user_id (OneToOneField to
poradnia.users.models.User
) – Userdescription (TextField) – Opis
www (URLField) – Strona domowa
email_footer (TextField) – Podpis dla wiadomości e-mail
event_reminder_time (IntegerField) – Przypominaj o wydarzeniach
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- class poradnia.users.models.User(id, password, last_login, is_superuser, username, first_name, last_name, email, is_staff, is_active, date_joined, picture, codename, nicename, is_content_editor, notify_new_case, notify_unassigned_letter, notify_old_cases, created_on)[źródło]¶
- Parametry:
id (AutoField) – Id
password (CharField) – Hasło
last_login (DateTimeField) – Data ostatniego logowania
is_superuser (BooleanField) – Oznacza, że ten użytkownik ma wszystkie uprawnienia bez ich jawnego przypisywania.
username (CharField) – Wymagana. 150 lub mniej znaków. Jedynie litery, cyfry i @/./+/-/_.
first_name (CharField) – Imię
last_name (CharField) – Nazwisko
email (EmailField) – Adres e-mail
is_staff (BooleanField) – Określa czy użytkownik może zalogować się do panelu administracyjnego.
is_active (BooleanField) – Określa czy użytkownika należy uważać za aktywnego. Odznacz zamiast usuwać konto.
date_joined (DateTimeField) – Data przyłączenia
picture (ImageField) – Avatar
codename (CharField) – Kryptonim
nicename (CharField) – Pełna nazwa
is_content_editor (BooleanField) – Określa, czy użytkownikowi mają być wyświetlane edytowalne bloki treści tinycontent
notify_new_case (BooleanField) – Czy powiadomić o wszystkich nowych sprawach?
notify_unassigned_letter (BooleanField) – Czy powiadamiać w sprawach bez kogokolwiek kto może odpowiedzieć
notify_old_cases (BooleanField) – Czy powiadomić użytkownika o starych sprawach
created_on (DateTimeField) – Utworzone o
- exception DoesNotExist¶
- exception MultipleObjectsReturned¶
- save(*args, **kwargs)[źródło]¶
Save the current instance. Override this in a subclass if you want to control the saving process.
The «force_insert» and «force_update» parameters can be used to insist that the „save” must be an SQL insert or update (or equivalent for non-SQL backends), respectively. Normally, they should not be set.
Widoki¶
- class poradnia.users.views.ProfileUpdateView(**kwargs)[źródło]¶
- Parametry:
url_name –
users:profile
- form_class¶
alias of
ProfileForm
- class poradnia.users.views.UserAutocomplete(**kwargs)[źródło]¶
- Parametry:
url_name –
users:autocomplete
- class poradnia.users.views.UserDetailView(**kwargs)[źródło]¶
- Parametry:
url_name –
users:detail
- class poradnia.users.views.UserInfoView(**kwargs)[źródło]¶
- Parametry:
url_name –
users:user_info
- class poradnia.users.views.UserListView(**kwargs)[źródło]¶
- Parametry:
url_name –
users:list
- class poradnia.users.views.UserUpdateView(**kwargs)[źródło]¶
- Parametry:
url_name –
users:update
- form_class¶
alias of
UserForm