Poradnia

Date:

30 kwi 2024

Spis treści

Poradnia

TravisCI Code Climate GitHub issues counter https://coveralls.io/repos/watchdogpolska/poradnia/badge.svg?branch=master&service=github

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) – Sprawa

  • subject (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ązanego

  • advicer_id (ForeignKey to poradnia.users.models.User) – Osoba, która udzieliła porady

  • grant_on (DateTimeField) – Udzielona o

  • created_by_id (ForeignKey to poradnia.users.models.User) – Utworzony przez

  • created_on (DateTimeField) – Data utworzenia

  • helped (BooleanField) – Czy udzieliliśmy porady?

  • modified_by_id (ForeignKey to poradnia.users.models.User) – Zmodyfikowany przez

  • modified_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:
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
class poradnia.advicer.models.Issue(id, name)[źródło]
Parametry:
  • id (AutoField) – Id

  • name (CharField) – Nazwa

exception DoesNotExist
exception MultipleObjectsReturned
class poradnia.advicer.models.PersonKind(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_nameadvicer:advice_table_ajax_data

get_column_defs(request)[źródło]

Override to customize based of request

model

alias of Advice

class poradnia.advicer.views.AdviceCreate(**kwargs)[źródło]
Parametry:

url_nameadvicer:create

form_class

alias of AdviceForm

get_initial(*args, **kwargs)[źródło]

Return the initial data to use for forms on this view.

inline_form_cls

alias of AttachmentForm

inline_model

alias of Attachment

model

alias of Advice

class poradnia.advicer.views.AdviceDelete(**kwargs)[źródło]
Parametry:

url_nameadvicer:delete

model

alias of Advice

class poradnia.advicer.views.AdviceDetail(**kwargs)[źródło]
Parametry:

url_nameadvicer:detail

get_context_data(**kwargs)[źródło]

Insert the single object into the context dict.

model

alias of Advice

class poradnia.advicer.views.AdviceList(**kwargs)[źródło]
Parametry:

url_nameadvicer:list

model

alias of Advice

class poradnia.advicer.views.AdviceTableView(**kwargs)[źródło]

View for displaying template with Advices table.

Parametry:

url_nameadvicer:table

class poradnia.advicer.views.AdviceUpdate(**kwargs)[źródło]
Parametry:

url_nameadvicer: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

model

alias of Advice

class poradnia.advicer.views.AreaAutocomplete(**kwargs)[źródło]
Parametry:

url_nameadvicer:area-autocomplete

model

alias of Area

class poradnia.advicer.views.IssueAutocomplete(**kwargs)[źródło]
Parametry:

url_nameadvicer:issue-autocomplete

model

alias of Issue

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.

class poradnia.advicer.forms.AttachmentForm(*args, **kwargs)[źródło]
Parametry:

attachment – Plik

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_namecases:case_table_ajax_data

model

alias of Case

class poradnia.cases.views.cases.CaseAutocomplete(**kwargs)[źródło]
Parametry:

url_namecases:autocomplete

get_queryset()[źródło]

Filter the queryset with GET[«q»].

class poradnia.cases.views.cases.CaseCloseView(**kwargs)[źródło]
Parametry:

url_namecases:close

form_class

alias of CaseCloseForm

form_valid(form)[źródło]

If the form is valid, save the associated model.

model

alias of Case

class poradnia.cases.views.cases.CaseDetailView(**kwargs)[źródło]
Parametry:

url_namecases:detail

get_context_data(**kwargs)[źródło]

Insert the single object into the context dict.

model

alias of Case

class poradnia.cases.views.cases.CaseListView(**kwargs)[źródło]
Parametry:

url_namecases:list

get_context_data(**kwargs)[źródło]

Get the context for this view.

get_filterset_class(*args, **kwargs)[źródło]

Returns the filterset class to use in this view

get_filterset_kwargs(*args, **kwargs)[źródło]

Returns the keyword arguments for instantiating the filterset.

get_queryset(*args, **kwargs)[źródło]

Return the list of items for this view.

The return value must be an iterable and may be an instance of QuerySet in which case QuerySet specific behavior will be enabled.

model

alias of Case

class poradnia.cases.views.cases.CaseMergeView(**kwargs)[źródło]
Parametry:

url_namecases:merge

form_class

alias of CaseMergeForm

form_valid(form)[źródło]

If the form is valid, save the associated model.

model

alias of Case

class poradnia.cases.views.cases.CaseTableView(**kwargs)[źródło]

View for displaying template with Cases table.

Parametry:

url_namecases:table

class poradnia.cases.views.cases.CaseUpdateView(**kwargs)[źródło]
Parametry:

url_namecases:edit

form_class

alias of CaseForm

form_valid(form)[źródło]

If the form is valid, save the associated model.

model

alias of Case

class poradnia.cases.views.cases.SingleObjectPermissionMixin[źródło]
class poradnia.cases.views.permissions.CaseGroupPermissionView(**kwargs)[źródło]
Parametry:

url_namecases: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.

get_context_data(*args, **kwargs)[źródło]

Insert the form into the context dict.

get_form_kwargs()[źródło]

Return the keyword arguments for instantiating the form.

get_form_valid_message()[źródło]

Validate that form_valid_message is set and is either a unicode or str object.

get_success_url()[źródło]

Return the URL to redirect to after processing a valid form.

model

alias of Case

class poradnia.cases.views.permissions.CasePermissionTestMixin[źródło]
get_required_permissions(request=None)[źródło]

Returns list of permissions in format <app_label>.<codename> that should be checked against request.user and object. By default, it returns list from permission_required attribute.

Parametry:

request – Original request.

class poradnia.cases.views.permissions.UserPermissionCreateView(**kwargs)[źródło]
Parametry:

url_namecases:permission_add

form_class

alias of TranslatedManageObjectPermissionForm

form_valid(form)[źródło]

If the form is valid, redirect to the supplied URL.

get_context_data(**kwargs)[źródło]

Insert the form into the context dict.

get_form_kwargs(*args, **kwargs)[źródło]

Return the keyword arguments for instantiating the form.

get_success_url()[źródło]

Return the URL to redirect to after processing a valid form.

class poradnia.cases.views.permissions.UserPermissionRemoveView(**kwargs)[źródło]
Parametry:

url_namecases:permission_remove

get_context_data(**kwargs)[źródło]

Insert the single object into the context dict.

model

alias of Case

class poradnia.cases.views.permissions.UserPermissionUpdateView(**kwargs)[źródło]
Parametry:

url_namecases: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.

get_context_data(**kwargs)[źródło]

Insert the form into the context dict.

get_form_kwargs()[źródło]

Return the keyword arguments for instantiating the form.

get_form_valid_message()[źródło]

Validate that form_valid_message is set and is either a unicode or str object.

get_success_url()[źródło]

Return the URL to redirect to after processing a valid form.

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) – Klient

  • letter_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) – Termin

  • created_by_id (ForeignKey to poradnia.users.models.User) – Utworzony przez

  • created_on (DateTimeField) – Utworzone o

  • modified_by_id (ForeignKey to poradnia.users.models.User) – Zmodyfikowany przez

  • modified_on (DateTimeField) – Zmodyfikowane o

  • handled (BooleanField) – Obsłużona

  • has_project (BooleanField) – Posiada projekt

exception DoesNotExist
exception MultipleObjectsReturned
has_assignees()[źródło]

Checks if there exists a staff member who has a permission to handle the case.

has_team()[źródło]

Checks if there exists a staff member who has a permission to handle the case.

class poradnia.cases.models.CaseGroupObjectPermission(id, permission, group, content_object)[źródło]
Parametry:
exception DoesNotExist
exception MultipleObjectsReturned
class poradnia.cases.models.CaseQuerySet(model=None, query=None, using=None, hints=None)[źródło]
class poradnia.cases.models.CaseUserObjectPermission(id, permission, user, content_object)[źródło]
Parametry:
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) – Klient

  • letter_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) – Termin

  • created_by_id (ForeignKey to poradnia.users.models.User) – Utworzony przez

  • created_on (DateTimeField) – Utworzone o

  • modified_by_id (ForeignKey to poradnia.users.models.User) – Zmodyfikowany przez

  • modified_on (DateTimeField) – Zmodyfikowane o

  • handled (BooleanField) – Obsłużona

  • has_project (BooleanField) – Posiada projekt

exception DoesNotExist
exception MultipleObjectsReturned
class poradnia.cases.models.PermissionGroup(id, name)[źródło]
Parametry:
  • id (AutoField) – Id

  • name (CharField) – Nazwa

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.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

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.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

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.

class poradnia.cases.forms.CaseMergeForm(*args, **kwargs)[źródło]
Parametry:

target – Docelowa sprawa

property media

Return all media required to render the widgets on this form.

save(*args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

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) – Case

  • deadline (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 przez

  • created_on (DateTimeField) – Utworzone o

  • modified_by_id (ForeignKey to poradnia.users.models.User) – Zmodyfikowany przez

  • modified_on (DateTimeField) – Zmodyfikowane o

exception DoesNotExist
exception MultipleObjectsReturned
class poradnia.events.models.EventQuerySet(model=None, query=None, using=None, hints=None)[źródło]
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) – Event

  • user_id (ForeignKey to poradnia.users.models.User) – Odbiorca

  • active (BooleanField) – Status aktywności

exception DoesNotExist
exception MultipleObjectsReturned
Widoki
class poradnia.events.views.CalendarEventView(**kwargs)[źródło]
Parametry:

url_nameevents:calendar

get_allow_empty()[źródło]

Return True if the view should display empty lists and False if a 404 should be raised instead.

get_context_data(**kwargs)[źródło]

Get the context for this view.

model

alias of Event

class poradnia.events.views.CalendarListView(**kwargs)[źródło]
Parametry:

url_nameevents:calendar

model

alias of Event

class poradnia.events.views.EventAjaxDatatableView(**kwargs)[źródło]

View to provide table list of all Events with ajax data.

Parametry:

url_nameevents:events_table_ajax_data

get_latest_by(request)[źródło]

Override to customize based of request.

Provides the name of the column to be used for global date range filtering. Return either «», a fieldname or None.

When None is returned, in model’s Meta «get_latest_by» attributed will be used.

model

alias of Event

class poradnia.events.views.EventCreateView(**kwargs)[źródło]
Parametry:

url_nameevents:add

form_class

alias of EventForm

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_kwargs(*args, **kwargs)[źródło]

Return the keyword arguments for instantiating the form.

get_form_valid_message()[źródło]

Validate that form_valid_message is set and is either a unicode or str object.

model

alias of Event

class poradnia.events.views.EventTableView(**kwargs)[źródło]

View for displaying template with Events table.

Parametry:

url_nameevents:table

class poradnia.events.views.EventUpdateView(**kwargs)[źródło]
Parametry:

url_nameevents:edit

form_class

alias of EventForm

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_kwargs()[źródło]

Return the keyword arguments for instantiating the form.

get_form_valid_message()[źródło]

Validate that form_valid_message is set and is either a unicode or str object.

get_object(*args, **kwargs)[źródło]

Return the object the view is displaying.

Require self.queryset and a pk or slug argument in the URLconf. Subclasses can override this to return any object.

model

alias of Event

class poradnia.events.views.ICalendarView(**kwargs)[źródło]
Parametry:

url_nameevents:calendar_ical

get_queryset()[źródło]

Return the list of items for this view.

The return value must be an iterable and may be an instance of QuerySet in which case QuerySet specific behavior will be enabled.

model

alias of Event

Formularze
class poradnia.events.forms.EventForm(*args, **kwargs)[źródło]
Parametry:
  • deadline – Termin

  • completed – Zakończone

  • public – Publiczne

  • time – Czas

  • text – Przedmiot

property media

Return all media required to render the widgets on this form.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

Feedback_Custom

Kod aplikacji
Formularze
class poradnia.feedback_custom.forms.CustomFeedbackForm(*args, **kwargs)[źródło]
Parametry:
  • text – Komentarz

  • url – Url

property media

Return all media required to render the widgets on this form.

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żytkowniczka

  • password (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
class poradnia.keys.models.KeyQuerySet(model=None, query=None, using=None, hints=None)[źródło]
Widoki
class poradnia.keys.views.KeyCreateView(**kwargs)[źródło]
Parametry:

url_namekeys:create

form_class

alias of KeyForm

model

alias of Key

class poradnia.keys.views.KeyDeleteView(*args, **kwargs)[źródło]
Parametry:

url_namekeys:delete

model

alias of Key

class poradnia.keys.views.KeyDetailView(**kwargs)[źródło]
Parametry:

url_namekeys:details

get_object(*args, **kwargs)[źródło]

Return the object the view is displaying.

Require self.queryset and a pk or slug argument in the URLconf. Subclasses can override this to return any object.

model

alias of Key

class poradnia.keys.views.KeyListView(**kwargs)[źródło]
Parametry:

url_namekeys:list

model

alias of Key

Formularze
class poradnia.keys.forms.KeyForm(*args, **kwargs)[źródło]
Parametry:

description – Opis

property media

Return all media required to render the widgets on this form.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

Letters

Kod aplikacji
Model
class poradnia.letters.models.Attachment(id, letter, attachment)[źródło]
Parametry:
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) – Case

  • genre (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 przez

  • created_by_is_staff (BooleanField) – Created by staff member

  • created_on (DateTimeField) – Utworzone o

  • modified_by_id (ForeignKey to poradnia.users.models.User) – Zmodyfikowany przez

  • modified_on (DateTimeField) – Zmodyfikowane o

  • message_id (ForeignKey to django_mailbox.models.Message) – Message

  • eml (FileField) – Oryginalna, pełna treść wiadomości

exception DoesNotExist
exception MultipleObjectsReturned
class poradnia.letters.models.LetterQuerySet(model=None, query=None, using=None, hints=None)[źródło]
last()[źródło]

Return the last object of a query or None if no match is found.

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.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

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.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

class poradnia.letters.forms.MultipleFileInput(attrs=None)[źródło]
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.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

class poradnia.letters.forms.SendLetterForm(*args, **kwargs)[źródło]
Parametry:

comment – Komentarz dla zespołu

property media

Return all media required to render the widgets on this form.

save(commit=True, *args, **kwargs)[źródło]

Save this form’s self.instance object if commit=True. Otherwise, add a save_m2m() method to the form which can be called after the instance is saved manually at a later time. Return the model instance.

class poradnia.letters.forms.SimpleSubmit(name, value, **kwargs)[źródło]

Notiication_custom

Niezalecane od wersji Use: module template_mail instead.

Widoki
class poradnia.notifications_custom.views.NotificationListView(**kwargs)[źródło]

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:
exception DoesNotExist
exception MultipleObjectsReturned
class poradnia.records.models.RecordQuerySet(model=None, query=None, using=None, hints=None)[źródło]

Template_mail

Widoki
class poradnia.template_mail.utils.TemplateKey(value)[źródło]

An enumeration.

poradnia.template_mail.utils.make_auto()[źródło]

eum.auto replacement

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żdemu

    • home:anonymous - część strony głównej, która jest wyświetlana dla osoby niezalogowanej

    • home: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) – User

  • description (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.

class poradnia.users.models.UserQuerySet(model=None, query=None, using=None, hints=None)[źródło]
Widoki
class poradnia.users.views.ProfileUpdateView(**kwargs)[źródło]
Parametry:

url_nameusers:profile

form_class

alias of ProfileForm

get_object()[źródło]

Return the object the view is displaying.

Require self.queryset and a pk or slug argument in the URLconf. Subclasses can override this to return any object.

get_success_url()[źródło]

Return the URL to redirect to after processing a valid form.

model

alias of Profile

class poradnia.users.views.UserAutocomplete(**kwargs)[źródło]
Parametry:

url_nameusers:autocomplete

model

alias of User

class poradnia.users.views.UserDeassignView(**kwargs)[źródło]
Parametry:

url_nameusers:deassign

model

alias of User

class poradnia.users.views.UserDetailView(**kwargs)[źródło]
Parametry:

url_nameusers:detail

has_permission(*args, **kwargs)[źródło]

Override this method to customize the way permissions are checked.

model

alias of User

class poradnia.users.views.UserInfoView(**kwargs)[źródło]
Parametry:

url_nameusers:user_info

get_queryset()[źródło]

Return the QuerySet that will be used to look up the object.

This method is called by the default implementation of get_object() and may not be called if get_object() is overridden.

model

alias of User

class poradnia.users.views.UserListView(**kwargs)[źródło]
Parametry:

url_nameusers:list

get_context_data(**kwargs)[źródło]

Get the context for this view.

get_queryset(*args, **kwargs)[źródło]

Return the list of items for this view.

The return value must be an iterable and may be an instance of QuerySet in which case QuerySet specific behavior will be enabled.

model

alias of User

class poradnia.users.views.UserRedirectView(**kwargs)[źródło]
Parametry:

url_nameusers:redirect

get_redirect_url()[źródło]

Return the URL redirect to. Keyword arguments from the URL pattern match generating the redirect request are provided as kwargs to this method.

class poradnia.users.views.UserUpdateView(**kwargs)[źródło]
Parametry:

url_nameusers:update

form_class

alias of UserForm

get_object()[źródło]

Return the object the view is displaying.

Require self.queryset and a pk or slug argument in the URLconf. Subclasses can override this to return any object.

get_success_url()[źródło]

Return the URL to redirect to after processing a valid form.

model

alias of User

Formularze

Wskaźniki i tabele