Skip to content
Snippets Groups Projects
Commit 23e09850 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

conditionally show address info when type "other", input validation, grammar

parent 57ede8c1
Branches
No related tags found
No related merge requests found
Pipeline #12176 passed
# Generated by Django 4.1.4 on 2023-04-02 19:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contracts', '0029_alter_contracteesignature_role_and_more'),
]
operations = [
migrations.AlterField(
model_name='signee',
name='address_country',
field=models.CharField(blank=True, default='Česká Republika', max_length=256, null=True, verbose_name='Země'),
),
migrations.AlterField(
model_name='signee',
name='address_district',
field=models.CharField(blank=True, max_length=256, null=True, verbose_name='Obec'),
),
migrations.AlterField(
model_name='signee',
name='address_street_with_number',
field=models.CharField(blank=True, help_text='Veřejné pouze, když typ není nastaven na fyzickou osobu.', max_length=256, null=True, verbose_name='Ulice, č.p.'),
),
migrations.AlterField(
model_name='signee',
name='address_zip',
field=models.CharField(blank=True, help_text='Veřejné pouze, když typ není nastaven na fyzickou osobu.', max_length=16, null=True, verbose_name='PSČ'),
),
migrations.AlterField(
model_name='signee',
name='date_of_birth',
field=models.DateField(blank=True, help_text='U fyzických osob musí být vyplněno.', null=True, verbose_name='Datum narození'),
),
migrations.AlterField(
model_name='signee',
name='ico_number',
field=models.CharField(blank=True, help_text='U právnických a podnikajících fyzických osob musí být vyplněno. Vyplněním můžeš automaticky načíst data z ARES.', max_length=16, null=True, verbose_name='IČO'),
),
]
# Generated by Django 4.1.4 on 2023-04-02 19:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contracts', '0030_alter_signee_address_country_and_more'),
]
operations = [
migrations.AlterField(
model_name='contract',
name='cost_unit_other',
field=models.CharField(blank=True, help_text='Je nutno vyplnit v případě, že máš vybranou možnost "jiné" v jednotce nákladů.', max_length=128, null=True, verbose_name='Jednotka nákladů (jiné)'),
),
migrations.AlterField(
model_name='contracteesignature',
name='role',
field=models.CharField(blank=True, help_text='Např. "nájemník"', max_length=256, null=True, verbose_name='Role'),
),
migrations.AlterField(
model_name='signeesignature',
name='role',
field=models.CharField(blank=True, help_text='Např. "pronajímatel"', max_length=256, null=True, verbose_name='Role'),
),
]
...@@ -103,23 +103,31 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo ...@@ -103,23 +103,31 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo
address_street_with_number = models.CharField( address_street_with_number = models.CharField(
max_length=256, max_length=256,
blank=True,
null=True,
verbose_name="Ulice, č.p.", verbose_name="Ulice, č.p.",
help_text="Veřejné pouze, když typ není nastaven na fyzickou osobu.", help_text="Veřejné pouze, když typ není nastaven na fyzickou osobu.",
) # WARNING: Legal entity status dependent! ) # WARNING: Legal entity status dependent!
address_district = models.CharField( address_district = models.CharField(
max_length=256, max_length=256,
blank=True,
null=True,
verbose_name="Obec", verbose_name="Obec",
) )
address_zip = models.CharField( address_zip = models.CharField(
max_length=16, max_length=16,
blank=True,
null=True,
verbose_name="PSČ", verbose_name="PSČ",
help_text="Veřejné pouze, když typ není nastaven na fyzickou osobu.", help_text="Veřejné pouze, když typ není nastaven na fyzickou osobu.",
) # WARNING: Legal entity status dependent! ) # WARNING: Legal entity status dependent!
address_country = models.CharField( address_country = models.CharField(
max_length=256, max_length=256,
blank=True,
null=True,
verbose_name="Země", verbose_name="Země",
default=settings.DEFAULT_COUNTRY, default=settings.DEFAULT_COUNTRY,
) )
...@@ -129,13 +137,17 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo ...@@ -129,13 +137,17 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo
blank=True, blank=True,
null=True, null=True,
verbose_name="IČO", verbose_name="IČO",
help_text="Vyplněním můžeš automaticky načíst data z ARES.", help_text=(
"U právnických a podnikajících fyzických osob musí být vyplněno. "
"Vyplněním můžeš automaticky načíst data z ARES."
),
) # WARNING: Legal entity status dependent! ) # WARNING: Legal entity status dependent!
date_of_birth = models.DateField( date_of_birth = models.DateField(
blank=True, blank=True,
null=True, null=True,
verbose_name="Datum narození", verbose_name="Datum narození",
help_text="U fyzických osob musí být vyplněno."
) # WARNING: Legal entity status dependent! ) # WARNING: Legal entity status dependent!
department = models.CharField( department = models.CharField(
...@@ -156,6 +168,53 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo ...@@ -156,6 +168,53 @@ class Signee(CreatedByMixin, OwnPermissionsMixin, SignatureCountMixin, models.Mo
self.EntityTypes.OTHER, self.EntityTypes.OTHER,
) )
@property
def has_any_address_information(self) -> bool:
for field in (
"address_street_with_number",
"address_district",
"address_zip",
"address_country",
):
if getattr(self, field):
return True
return False
def clean(self):
if (
self.entity_type == self.EntityTypes.NATURAL_PERSON
and not self.date_of_birth
):
raise ValidationError({
"date_of_birth": "U fyzických osob musí být definováno."
})
if (
self.entity_type in (
self.EntityTypes.LEGAL_ENTITY,
self.EntityTypes.BUSINESS_NATURAL_PERSON
)
and not self.ico_number
):
raise ValidationError({
"ico_number": "U právnických a podnikajících fyzických osob musí být definováno."
})
if (self.entity_type != self.EntityTypes.OTHER):
for field in (
"address_street_with_number",
"address_district",
"address_zip",
"address_country",
):
if not getattr(self, field):
raise ValidationError({
field: "Pokud není vybrán typ \"Jiné\", musí být definováno."
})
return super().clean()
def __str__(self) -> str: def __str__(self) -> str:
result = self.name result = self.name
...@@ -491,7 +550,7 @@ class Contract(NameStrMixin, models.Model): ...@@ -491,7 +550,7 @@ class Contract(NameStrMixin, models.Model):
cost_unit_other = models.CharField( cost_unit_other = models.CharField(
max_length=128, max_length=128,
verbose_name="Jednotka nákladů (jiné)", verbose_name="Jednotka nákladů (jiné)",
help_text="Je nutno vyplnit v případě, že máš vybranou možnost 'jiné' v jednotce nákladů.", help_text="Je nutno vyplnit v případě, že máš vybranou možnost \"jiné\" v jednotce nákladů.",
blank=True, blank=True,
null=True, null=True,
) )
...@@ -610,13 +669,13 @@ class Contract(NameStrMixin, models.Model): ...@@ -610,13 +669,13 @@ class Contract(NameStrMixin, models.Model):
if self.cost_unit == self.CostUnits.OTHER and not self.cost_unit_other: if self.cost_unit == self.CostUnits.OTHER and not self.cost_unit_other:
raise ValidationError( raise ValidationError(
{ {
"cost_unit_other": "Musí být definováno, pokud je vybrána jednotka nákladů 'jiné'." "cost_unit_other": "Musí být definováno, pokud je vybrána jednotka nákladů \"jiné\"."
} }
) )
elif self.cost_unit != self.CostUnits.OTHER and self.cost_unit_other: elif self.cost_unit != self.CostUnits.OTHER and self.cost_unit_other:
raise ValidationError( raise ValidationError(
{ {
"cost_unit_other": "Nemůže být definováno, pokud není vybrána jednotka nákladů 'jiné'." "cost_unit_other": "Nemůže být definováno, pokud není vybrána jednotka nákladů \"jiné\"."
} }
) )
...@@ -631,6 +690,8 @@ class Contract(NameStrMixin, models.Model): ...@@ -631,6 +690,8 @@ class Contract(NameStrMixin, models.Model):
} }
) )
return super().clean()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.updated_on = get_current_utc_timestamp() self.updated_on = get_current_utc_timestamp()
...@@ -712,7 +773,7 @@ class ContracteeSignature(models.Model): ...@@ -712,7 +773,7 @@ class ContracteeSignature(models.Model):
blank=True, blank=True,
null=True, null=True,
verbose_name="Role", verbose_name="Role",
help_text="Např. 'nájemník'", help_text="Např. \"nájemník\"",
) )
def __str__(self) -> str: def __str__(self) -> str:
...@@ -749,7 +810,7 @@ class SigneeSignature(models.Model): ...@@ -749,7 +810,7 @@ class SigneeSignature(models.Model):
blank=True, blank=True,
null=True, null=True,
verbose_name="Role", verbose_name="Role",
help_text="Např. 'pronajímatel'", help_text="Např. \"pronajímatel\"",
) )
def __str__(self) -> str: def __str__(self) -> str:
......
...@@ -416,9 +416,11 @@ ...@@ -416,9 +416,11 @@
</a> </a>
</div> </div>
{% if signature.signee.entity_type != signature.signee.EntityTypes.OTHER %}
<div class="mb-2"> <div class="mb-2">
{{ signature.signee.get_entity_type_display }} {{ signature.signee.get_entity_type_display }}
</div> </div>
{% endif %}
{% if user.can_view_confidential and not signature.signee.entity_has_public_address %} {% if user.can_view_confidential and not signature.signee.entity_has_public_address %}
<div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block"> <div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block">
...@@ -437,11 +439,13 @@ ...@@ -437,11 +439,13 @@
</div> </div>
{% if user.can_view_confidential or signature.signee.entity_has_public_address %} {% if user.can_view_confidential or signature.signee.entity_has_public_address %}
{{ signature.signee.address_street_with_number }}<br> {% if signature.signee.address_street_with_number %}{{ signature.signee.address_street_with_number }}<br>{% endif %}
{{ signature.signee.address_zip }} {{ signature.signee.address_district }}<br> {% if signature.signee.address_zip %}{{ signature.signee.address_zip }}{% endif %}
{{ signature.signee.address_country }} {% if signature.signee.address_district %}{{ signature.signee.address_district }}<br>{% endif %}
{% if signature.signee.address_country %}{{ signature.signee.address_country }}{% endif %}
{% else %} {% else %}
{{ signature.signee.address_district }}, {{ signature.signee.address_country }} {% if signature.signee.address_district %}{{ signature.signee.address_district }},{% endif %}
{% if signature.signee.address_country %}{{ signature.signee.address_country }}{% endif %}
{% endif %} {% endif %}
{% if signature.signee.ico_number %} {% if signature.signee.ico_number %}
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
</div> </div>
</div> </div>
{% if signee.has_any_address_information %}
<address class="mb-8"> <address class="mb-8">
<div class="mb-2"> <div class="mb-2">
<strong>{{ signee.name }}</strong> <strong>{{ signee.name }}</strong>
...@@ -19,9 +20,11 @@ ...@@ -19,9 +20,11 @@
{% endif %} {% endif %}
</div> </div>
{% if signee.entity_type != signee.EntityTypes.OTHER %}
<div class="mb-2"> <div class="mb-2">
{{ signee.get_entity_type_display }} {{ signee.get_entity_type_display }}
</div> </div>
{% endif %}
{% if user.can_view_confidential and not signee.entity_has_public_address %} {% if user.can_view_confidential and not signee.entity_has_public_address %}
<div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block"> <div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block">
...@@ -40,11 +43,13 @@ ...@@ -40,11 +43,13 @@
</div> </div>
{% if user.can_view_confidential or signee.entity_has_public_address %} {% if user.can_view_confidential or signee.entity_has_public_address %}
{{ signee.address_street_with_number }}<br> {% if signee.address_street_with_number %}{{ signee.address_street_with_number }}<br>{% endif %}
{{ signee.address_zip }} {{ signee.address_district }}<br> {% if signee.address_zip %}{{ signee.address_zip }}{% endif %}
{{ signee.address_country }} {% if signee.address_district %}{{ signee.address_district }}<br>{% endif %}
{% if signee.address_country %}{{ signee.address_country }}{% endif %}
{% else %} {% else %}
{{ signee.address_district }}, {{ signee.address_country }} {% if signee.address_district %}{{ signee.address_district }},{% endif %}
{% if signee.address_country %}{{ signee.address_country }}{% endif %}
{% endif %} {% endif %}
{% if signee.ico_number %} {% if signee.ico_number %}
...@@ -61,6 +66,7 @@ ...@@ -61,6 +66,7 @@
</div> </div>
{% endif %} {% endif %}
</address> </address>
{% endif %}
<h2 class="text-lg font-bold mb-10"> <h2 class="text-lg font-bold mb-10">
Smlouvy podepsané touto stranou Smlouvy podepsané touto stranou
......
from xml.etree import ElementTree
import requests import requests
from django.conf import settings from django.conf import settings
from django.core.paginator import Paginator from django.core.paginator import Paginator
...@@ -368,6 +370,13 @@ def get_ares_info(request, ico: int): ...@@ -368,6 +370,13 @@ def get_ares_info(request, ico: int):
f"https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico={ico}" f"https://wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico={ico}"
) )
tree = ElementTree.fromstring(ares_info.content)
for result_count in tree.iter("are:Pocet_zaznamu"):
if result_count.text == "0":
raise HTTPExceptions.NOT_FOUND
return HttpResponse( return HttpResponse(
content=ares_info.content, content=ares_info.content,
status=ares_info.status_code, status=ares_info.status_code,
......
...@@ -10,14 +10,17 @@ const fieldDepartmentValues = new Set([ ...@@ -10,14 +10,17 @@ const fieldDepartmentValues = new Set([
$(window).ready( $(window).ready(
() => { () => {
let isNaturalPerson = ($("#id_entity_type").find(":selected").val() === "natural_person"); let selectedValue = $("#id_entity_type").find(":selected").val();
let isEmpty = ($("#id_entity_type").find(":selected").val() === "");
let isNaturalPerson = (selectedValue === "natural_person");
let isOther = (selectedValue === "other");
let isEmpty = (selectedValue === "");
$(".field-date_of_birth"). $(".field-date_of_birth").
css( css(
"display", "display",
( (
(isNaturalPerson) ? (!isEmpty && (isNaturalPerson || isOther)) ?
"block" : "none" "block" : "none"
) )
); );
...@@ -35,26 +38,29 @@ $(window).ready( ...@@ -35,26 +38,29 @@ $(window).ready(
css( css(
"display", "display",
( (
(!isEmpty && fieldDepartmentValues.has($("#id_entity_type").find(":selected").val())) ? (!isEmpty && fieldDepartmentValues.has(selectedValue)) ?
"block" : "none" "block" : "none"
) )
); );
if (!isNaturalPerson && !isEmpty) $("#id_date_of_birth").val(""); if (!isNaturalPerson && !isOther && !isEmpty) $("#id_date_of_birth").val("");
if (isNaturalPerson) $("#id_ico_number").val(""); if (isNaturalPerson) $("#id_ico_number").val("");
if (!fieldDepartmentValues.has($("#id_entity_type").find(":selected").val()) && !isEmpty) $("#id_department").val(""); if (!fieldDepartmentValues.has(selectedValue) && !isEmpty) $("#id_department").val("");
$("#id_entity_type").on( $("#id_entity_type").on(
"change", "change",
event => { event => {
isEmpty = ($(event.target).val() === ""); selectedValue = $(event.target).val();
isNaturalPerson = ($(event.target).val() === "natural_person");
isEmpty = (selectedValue === "");
isOther = (selectedValue === "other");
isNaturalPerson = (selectedValue === "natural_person");
$(".field-date_of_birth"). $(".field-date_of_birth").
css( css(
"display", "display",
( (
(!isEmpty && isNaturalPerson) ? (!isEmpty && (isNaturalPerson || isOther)) ?
"block" : "none" "block" : "none"
) )
); );
...@@ -76,7 +82,7 @@ $(window).ready( ...@@ -76,7 +82,7 @@ $(window).ready(
) )
); );
if (!isNaturalPerson && !isEmpty) $("#id_date_of_birth").val(""); if (!isNaturalPerson && !isOther && !isEmpty) $("#id_date_of_birth").val("");
if (isNaturalPerson) $("#id_ico_number").val(""); if (isNaturalPerson) $("#id_ico_number").val("");
if (!fieldDepartmentValues.has($(event.target).val()) && !isEmpty) $("#id_department").val(""); if (!fieldDepartmentValues.has($(event.target).val()) && !isEmpty) $("#id_department").val("");
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment