Merge pull request '20_Multiple_laws' (#23) from 20_Multiple_laws into master
Reviewed-on: SGD-Nord/konova#23
This commit is contained in:
		
						commit
						e7b7fa84aa
					
				@ -50,6 +50,19 @@
 | 
				
			|||||||
                        <th scope="row">{% trans 'Intervention handler' %}</th>
 | 
					                        <th scope="row">{% trans 'Intervention handler' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{obj.responsible.handler|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{obj.responsible.handler|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <th scope="row">{% trans 'Funded by' %}</th>
 | 
				
			||||||
 | 
					                        <td class="align-middle">
 | 
				
			||||||
 | 
					                            {% for funding in obj.fundings.all %}
 | 
				
			||||||
 | 
					                                <div class="badge badge-pill rlp-r-outline">
 | 
				
			||||||
 | 
					                                    {{ funding.short_name}}
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <br>
 | 
				
			||||||
 | 
					                            {% empty %}
 | 
				
			||||||
 | 
					                            {% trans 'None' %}
 | 
				
			||||||
 | 
					                            {% endfor %}
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Last modified' %}</th>
 | 
					                        <th scope="row">{% trans 'Last modified' %}</th>
 | 
				
			||||||
                        <td class="align-middle">
 | 
					                        <td class="align-middle">
 | 
				
			||||||
 | 
				
			|||||||
@ -31,7 +31,6 @@ class LegalAdmin(admin.ModelAdmin):
 | 
				
			|||||||
    list_display = [
 | 
					    list_display = [
 | 
				
			||||||
        "id",
 | 
					        "id",
 | 
				
			||||||
        "process_type",
 | 
					        "process_type",
 | 
				
			||||||
        "law",
 | 
					 | 
				
			||||||
        "registration_date",
 | 
					        "registration_date",
 | 
				
			||||||
        "binding_date",
 | 
					        "binding_date",
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
				
			|||||||
@ -412,10 +412,13 @@ class RunCheckForm(BaseModalForm):
 | 
				
			|||||||
        super().__init__(*args, **kwargs)
 | 
					        super().__init__(*args, **kwargs)
 | 
				
			||||||
        self.form_title = _("Run check")
 | 
					        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)
 | 
					        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()
 | 
					        super_result = super().is_valid()
 | 
				
			||||||
        # Perform check
 | 
					        # Perform check
 | 
				
			||||||
        msgs = self.instance.quality_check()
 | 
					        msgs = self.instance.quality_check()
 | 
				
			||||||
@ -427,6 +430,11 @@ class RunCheckForm(BaseModalForm):
 | 
				
			|||||||
        return super_result and (len(msgs) == 0)
 | 
					        return super_result and (len(msgs) == 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def save(self):
 | 
					    def save(self):
 | 
				
			||||||
 | 
					        """ Saving logic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
        with transaction.atomic():
 | 
					        with transaction.atomic():
 | 
				
			||||||
            user_action = UserActionLogEntry.objects.create(
 | 
					            user_action = UserActionLogEntry.objects.create(
 | 
				
			||||||
                user=self.user,
 | 
					                user=self.user,
 | 
				
			||||||
 | 
				
			|||||||
@ -136,6 +136,7 @@ class RevocationDocument(AbstractDocument):
 | 
				
			|||||||
                # Folder seems to be missing already
 | 
					                # Folder seems to be missing already
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LegalData(UuidModel):
 | 
					class LegalData(UuidModel):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Holds intervention legal data such as important dates, laws or responsible handler
 | 
					    Holds intervention legal data such as important dates, laws or responsible handler
 | 
				
			||||||
@ -158,11 +159,9 @@ class LegalData(UuidModel):
 | 
				
			|||||||
            "is_archived": False,
 | 
					            "is_archived": False,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    law = models.ForeignKey(
 | 
					    laws = models.ManyToManyField(
 | 
				
			||||||
        KonovaCode,
 | 
					        KonovaCode,
 | 
				
			||||||
        on_delete=models.SET_NULL,
 | 
					 | 
				
			||||||
        null=True,
 | 
					        null=True,
 | 
				
			||||||
        related_name="+",
 | 
					 | 
				
			||||||
        blank=True,
 | 
					        blank=True,
 | 
				
			||||||
        limit_choices_to={
 | 
					        limit_choices_to={
 | 
				
			||||||
            "code_lists__in": [CODELIST_LAW_ID],
 | 
					            "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)
 | 
					    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):
 | 
					class Intervention(BaseObject):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
				
			|||||||
@ -34,9 +34,14 @@
 | 
				
			|||||||
                        <th scope="row">{% trans 'Process type' %}</th>
 | 
					                        <th scope="row">{% trans 'Process type' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.legal.process_type|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.legal.process_type|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr {% if not intervention.legal.law %}class="alert alert-danger" title="{% trans 'Missing' %}" {% endif %}>
 | 
					                    <tr {% if intervention.legal.laws.count == 0 %}class="alert alert-danger" title="{% trans 'Missing' %}" {% endif %}>
 | 
				
			||||||
                        <th scope="row">{% trans 'Law' %}</th>
 | 
					                        <th scope="row">{% trans 'Law' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.legal.law|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">
 | 
				
			||||||
 | 
					                            {% for law in intervention.legal.laws.all %}
 | 
				
			||||||
 | 
					                                <div class="badge pill-badge rlp-r-outline">{{law.short_name}} - {{law.long_name}}</div>
 | 
				
			||||||
 | 
					                                <br>
 | 
				
			||||||
 | 
					                            {% endfor %}
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr {% if not intervention.responsible.registration_office %}class="alert alert-danger" title="{% trans 'Missing' %}" {% endif %}>
 | 
					                    <tr {% if not intervention.responsible.registration_office %}class="alert alert-danger" title="{% trans 'Missing' %}" {% endif %}>
 | 
				
			||||||
                        <th scope="row">{% trans 'Registration office' %}</th>
 | 
					                        <th scope="row">{% trans 'Registration office' %}</th>
 | 
				
			||||||
 | 
				
			|||||||
@ -101,6 +101,37 @@ class BaseForm(forms.Form):
 | 
				
			|||||||
        for field in disabled_fields:
 | 
					        for field in disabled_fields:
 | 
				
			||||||
            self.disable_form_field(field)
 | 
					            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):
 | 
					class RemoveForm(BaseForm):
 | 
				
			||||||
    check = forms.BooleanField(
 | 
					    check = forms.BooleanField(
 | 
				
			||||||
@ -153,17 +184,16 @@ class BaseModalForm(BaseForm, BSModalForm):
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    is_modal_form = True
 | 
					    is_modal_form = True
 | 
				
			||||||
    render_submit = True
 | 
					    render_submit = True
 | 
				
			||||||
 | 
					    full_width_fields = False
 | 
				
			||||||
    template = "modal/modal_form.html"
 | 
					    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)
 | 
					        super().__init__(*args, **kwargs)
 | 
				
			||||||
        # Automatically add bootstrap w-100 class for maximum width of form fields in modals
 | 
					        if self.full_width_fields:
 | 
				
			||||||
        for key, val in self.fields.items():
 | 
					            # Automatically add bootstrap w-100 class for maximum width of form fields in modals
 | 
				
			||||||
            val.widget.attrs.update(
 | 
					            for key, val in self.fields.items():
 | 
				
			||||||
                {
 | 
					                self.add_widget_html_class(key, "w-100")
 | 
				
			||||||
                    "class": "w-100"
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def process_request(self, request: HttpRequest, msg_success: str = _("Object removed"), msg_error: str = FORM_INVALID, redirect_url: str = None):
 | 
					    def process_request(self, request: HttpRequest, msg_success: str = _("Object removed"), msg_error: str = FORM_INVALID, redirect_url: str = None):
 | 
				
			||||||
        """ Generic processing of request
 | 
					        """ Generic processing of request
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user