diff --git a/ema/templates/ema/detail/view.html b/ema/templates/ema/detail/view.html index 9ffce728..640711b2 100644 --- a/ema/templates/ema/detail/view.html +++ b/ema/templates/ema/detail/view.html @@ -50,6 +50,19 @@ {% trans 'Intervention handler' %} {{obj.responsible.handler|default_if_none:""}} + + {% trans 'Funded by' %} + + {% for funding in obj.fundings.all %} +
+ {{ funding.short_name}} +
+
+ {% empty %} + {% trans 'None' %} + {% endfor %} + + {% trans 'Last modified' %} diff --git a/intervention/admin.py b/intervention/admin.py index cf49bc39..de11ee27 100644 --- a/intervention/admin.py +++ b/intervention/admin.py @@ -31,7 +31,6 @@ class LegalAdmin(admin.ModelAdmin): list_display = [ "id", "process_type", - "law", "registration_date", "binding_date", ] diff --git a/intervention/forms.py b/intervention/forms.py index c84c51c6..2b1ce398 100644 --- a/intervention/forms.py +++ b/intervention/forms.py @@ -412,10 +412,13 @@ class RunCheckForm(BaseModalForm): super().__init__(*args, **kwargs) self.form_title = _("Run check") self.form_caption = _("I, {} {}, confirm that all necessary control steps have been performed by myself.").format(self.user.first_name, self.user.last_name) - # Disable automatic w-100 setting for this type of modal form. Looks kinda strange - self.fields["confirm"].widget.attrs["class"] = "" - def is_valid(self): + def is_valid(self) -> bool: + """ Perform a validity check based on quality_check() logic + + Returns: + result (bool) + """ super_result = super().is_valid() # Perform check msgs = self.instance.quality_check() @@ -427,6 +430,11 @@ class RunCheckForm(BaseModalForm): return super_result and (len(msgs) == 0) def save(self): + """ Saving logic + + Returns: + + """ with transaction.atomic(): user_action = UserActionLogEntry.objects.create( user=self.user, diff --git a/intervention/models.py b/intervention/models.py index f4a7e739..3a8f7ac3 100644 --- a/intervention/models.py +++ b/intervention/models.py @@ -136,6 +136,7 @@ class RevocationDocument(AbstractDocument): # Folder seems to be missing already pass + class LegalData(UuidModel): """ Holds intervention legal data such as important dates, laws or responsible handler @@ -158,11 +159,9 @@ class LegalData(UuidModel): "is_archived": False, } ) - law = models.ForeignKey( + laws = models.ManyToManyField( KonovaCode, - on_delete=models.SET_NULL, null=True, - related_name="+", blank=True, limit_choices_to={ "code_lists__in": [CODELIST_LAW_ID], @@ -173,13 +172,6 @@ class LegalData(UuidModel): revocation = models.OneToOneField(Revocation, null=True, blank=True, help_text="Refers to 'Widerspruch am'", on_delete=models.SET_NULL) - def __str__(self): - return "{} | {} | {}".format( - self.process_type, - self.law, - self.id - ) - class Intervention(BaseObject): """ diff --git a/intervention/templates/intervention/detail/view.html b/intervention/templates/intervention/detail/view.html index ee0acc4e..a279013a 100644 --- a/intervention/templates/intervention/detail/view.html +++ b/intervention/templates/intervention/detail/view.html @@ -34,9 +34,14 @@ {% trans 'Process type' %} {{intervention.legal.process_type|default_if_none:""}} - + {% trans 'Law' %} - {{intervention.legal.law|default_if_none:""}} + + {% for law in intervention.legal.laws.all %} +
{{law.short_name}} - {{law.long_name}}
+
+ {% endfor %} + {% trans 'Registration office' %} diff --git a/konova/forms.py b/konova/forms.py index 84f2a724..2b0f18a5 100644 --- a/konova/forms.py +++ b/konova/forms.py @@ -101,6 +101,37 @@ class BaseForm(forms.Form): for field in disabled_fields: self.disable_form_field(field) + def add_widget_html_class(self, field: str, cls: str): + """ Adds a HTML class string to the widget of a field + + Args: + field (str): The field's name + cls (str): The new class string + + Returns: + + """ + set_class = self.fields[field].widget.attrs.get("class", "") + if cls in set_class: + return + else: + set_class += " " + cls + self.fields[field].widget.attrs["class"] = set_class + + def remove_widget_html_class(self, field: str, cls: str): + """ Removes a HTML class string from the widget of a field + + Args: + field (str): The field's name + cls (str): The new class string + + Returns: + + """ + set_class = self.fields[field].widget.attrs.get("class", "") + set_class = set_class.replace(cls, "") + self.fields[field].widget.attrs["class"] = set_class + class RemoveForm(BaseForm): check = forms.BooleanField( @@ -153,17 +184,16 @@ class BaseModalForm(BaseForm, BSModalForm): """ is_modal_form = True render_submit = True + full_width_fields = False template = "modal/modal_form.html" - def __init__(self, *args, **kwargs): + def __init__(self, full_width_fields: bool = True, *args, **kwargs): + self.full_width_fields = full_width_fields super().__init__(*args, **kwargs) - # Automatically add bootstrap w-100 class for maximum width of form fields in modals - for key, val in self.fields.items(): - val.widget.attrs.update( - { - "class": "w-100" - } - ) + if self.full_width_fields: + # Automatically add bootstrap w-100 class for maximum width of form fields in modals + for key, val in self.fields.items(): + self.add_widget_html_class(key, "w-100") def process_request(self, request: HttpRequest, msg_success: str = _("Object removed"), msg_error: str = FORM_INVALID, redirect_url: str = None): """ Generic processing of request