Kod źródłowy modułu poradnia.cases.forms
from atom.ext.crispy_forms.forms import (
FormHorizontalMixin,
HelperMixin,
SingleButtonMixin,
)
from braces.forms import UserKwargModelFormMixin
from crispy_forms.layout import Submit
from dal import autocomplete
from django import forms
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from guardian.shortcuts import assign_perm
from ..letters.models import Letter
from ..records.models import Record
from .models import Case, PermissionGroup
[dokumentacja]
class CaseForm(
UserKwargModelFormMixin, FormHorizontalMixin, SingleButtonMixin, forms.ModelForm
):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if "instance" in kwargs:
self.helper.form_action = kwargs["instance"].get_edit_url()
[dokumentacja]
def save(self, commit=True, *args, **kwargs):
obj = super().save(commit=False, *args, **kwargs)
if obj.pk: # old
obj.modified_by = self.user
if obj.status == Case.STATUS.assigned:
obj.send_notification(
actor=self.user,
user_qs=obj.get_users_with_perms().filter(is_staff=True),
verb="updated",
)
else: # new
obj.send_notification(
actor=self.user,
user_qs=obj.get_users_with_perms().filter(is_staff=True),
verb="created",
)
obj.created_by = self.user
if commit:
obj.save()
return obj
class Meta:
model = Case
fields = ("name", "status", "has_project")
[dokumentacja]
class CaseGroupPermissionForm(HelperMixin, forms.Form):
action_text = _("Grant")
user = forms.ModelChoiceField(
queryset=None,
required=True,
widget=autocomplete.ModelSelect2("users:autocomplete"),
label=_("User"),
)
group = forms.ModelChoiceField(
queryset=PermissionGroup.objects.all(), label=_("Permissions group")
)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user")
self.case = kwargs.pop("case")
super().__init__(*args, **kwargs)
self.fields["user"].queryset = get_user_model().objects.for_user(self.user)
self.helper.form_class = "form-inline"
self.helper.layout.append(Submit("grant", _("Grant")))
self.helper.form_action = reverse(
"cases:permission_grant", kwargs={"pk": str(self.case.pk)}
)
def assign(self):
perms = list(self.cleaned_data["group"].permissions.all())
self.cleaned_data["user"].caseuserobjectpermission_set.filter(
content_object=self.case
).exclude(permission__in=perms).delete()
for perm in perms:
assign_perm(perm, self.cleaned_data["user"], self.case)
self.case.update_status()
self.case.send_notification(
actor=self.user,
verb="grant_group",
action_object=self.cleaned_data["user"],
action_target=self.cleaned_data["group"],
user_qs=self.case.get_users_with_perms().filter(is_staff=True),
)
[dokumentacja]
class CaseCloseForm(UserKwargModelFormMixin, HelperMixin, forms.ModelForm):
# skip user notification, code left for potential future use
# notify = forms.BooleanField(required=False, label=_("Notify user"))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper.add_input(Submit("action", _("Close"), css_class="btn-primary"))
if "instance" in kwargs:
self.helper.form_action = kwargs["instance"].get_close_url()
[dokumentacja]
def save(self, commit=True, *args, **kwargs):
obj = super().save(commit=False, *args, **kwargs)
# skip user notification
# obj.close(actor=self.user, notify=self.cleaned_data["notify"])
obj.close(actor=self.user, notify=False)
if commit:
obj.save()
return obj
class Meta:
model = Case
fields = ()
[dokumentacja]
class CaseMergeForm(UserKwargModelFormMixin, HelperMixin, forms.ModelForm):
target = forms.ModelChoiceField(
label=_("Destination case"),
queryset=Case.objects.none(),
required=True,
widget=autocomplete.ModelSelect2(url="cases:autocomplete"),
help_text=_(
"The selected case will receive all letters, "
+ "events, etc. from the current case."
),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper.add_input(Submit("action", _("Merge"), css_class="btn-primary"))
self.fields["target"].queryset = Case.objects.for_user(self.user).all()
self.helper.form_action = reverse(
"cases:merge", kwargs={"pk": kwargs["instance"].pk}
)
def create_letter(self, case):
target = self.cleaned_data["target"]
source = self.instance
msg = Letter.objects.create(
case=case,
genre=Letter.GENRE.comment,
created_by=self.user,
created_by_is_staff=self.user.is_staff,
text=_("Case #{source} have been merged with case #{target}").format(
source=source.pk, target=target.pk
),
status=Letter.STATUS.staff,
)
msg.send_notification(actor=self.user, verb="drop_a_note")
[dokumentacja]
def save(self, *args, **kwargs):
target = self.cleaned_data["target"]
source = self.instance
Record.objects.filter(case=source).move(target)
self.create_letter(target)
self.create_letter(source)
source.close(actor=self.user, notify=False)
source.save()
return source
class Meta:
model = Case
fields = ()