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(*args, **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(*args, **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(*args, **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(*args, **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]

Apply select_related, with appropriate fields, to the queryset

model

alias of Case

class poradnia.cases.views.cases.CaseMergeView(*args, **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.CaseSearchArticlesView(*args, **kwargs)[źródło]
Parametry:
  • url_namecases:search_articles

  • url_namecases:classify_and_search_articles

model

alias of Case

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

View for displaying template with Cases table.

Parametry:

url_namecases:table

class poradnia.cases.views.cases.CaseUpdateView(*args, **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(*args, **kwargs)[źródło]
class poradnia.cases.views.permissions.CaseGroupPermissionView(*args, **kwargs)[źródło]
Parametry:

url_namecases:permission_grant

form_class

alias of CaseGroupPermissionForm

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

Set the „form valid” message for standard form validation

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 correctly

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

Get the required permissions.

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

Parametry:

request (HttpRequest) – Original request.

class poradnia.cases.views.permissions.UserPermissionCreateView(*args, **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(*args, **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(*args, **kwargs)[źródło]
Parametry:

url_namecases:permission_update

form_class

alias of TranslatedUserObjectPermissionsForm

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

Set the „form valid” message for standard form validation

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 correctly

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, advice_classification_response_status, advice_classification_request_sent_on)[ź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) – Utworzona przez

  • created_on (DateTimeField) – Utworzone o

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

  • modified_on (DateTimeField) – Zmodyfikowane o

  • handled (BooleanField) – Obsłużona

  • has_project (BooleanField) – Posiada projekt

  • advice_classification_response_status (IntegerField) – Status odpowiedzi na tag porady

  • advice_classification_request_sent_on (DateTimeField) – Prośba o tag porady została wysłana

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.

request_n8n_advice_classification()[źródło]

Send this case to the configured n8n advice-classification webhook.

The webhook is expected to create or update the Advice object related to this Case. The request is authenticated with a Bearer token and contains case context, the first two non-staff letters with attachment OCR text, active advicer taxonomy tags, client data, and the first involved staff user as advisor candidate.

Required settings: - N8N_ADVICE_WEBHOOK_URL - N8N_ADVICE_WEBHOOK_TOKEN

Returns the decoded JSON response when n8n returns JSON; otherwise returns a dict with the response status code and raw response text. Raises requests.HTTPError for non-2xx responses.

search_articles_for_case(direct_search=False)[źródło]

Send all client message content for this case to the n8n articles-search webhook and persist the request as an N8nArticlesSearchRequest.

When direct_search=False (default), n8n classifies the question first: FOI-related questions proceed to article search; out-of-scope questions receive a redirect response without searching.

When direct_search=True, classification is skipped and article search runs immediately. Use this when the caller has already established that the question is FOI-related (e.g. a staff-triggered action).

The result is delivered asynchronously via the N8nArticlesSearchCallbackView and stored as a Letter with genre ai_message_staff on this 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 if you need 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 statement, respectively (or equivalent for non-SQL backends). Normally, they should not be set.

Parametry:
  • force_insert (bool) – If True, the save will be forced to be an insert.

  • force_update (bool) – If True, the save will be forced to be an update.

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, advice_classification_response_status, advice_classification_request_sent_on)[ź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) – Utworzona przez

  • created_on (DateTimeField) – Utworzone o

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

  • modified_on (DateTimeField) – Zmodyfikowane o

  • handled (BooleanField) – Obsłużona

  • has_project (BooleanField) – Posiada projekt

  • advice_classification_response_status (IntegerField) – Status odpowiedzi na tag porady

  • advice_classification_request_sent_on (DateTimeField) – Prośba o tag porady została wysłana

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

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