From 74bc6674e54c9c779d9e7bfdb0ca2eb6e6208349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org> Date: Tue, 21 Feb 2023 21:27:59 +0100 Subject: [PATCH] run hooks --- contracts/admin.py | 5 +- contracts/migrations/0001_initial.py | 675 ++++++++++++++---- ..._approved_alter_contract_valid_end_date.py | 19 +- ...03_contract_expected_cost_hour_and_more.py | 27 +- .../migrations/0004_alter_contract_options.py | 11 +- .../0005_alter_contract_primary_contract.py | 19 +- ..._contract_issues_alter_contract_summary.py | 25 +- ...ter_contractee_address_country_and_more.py | 15 +- contracts/models.py | 36 +- contracts/templates/contracts/index.html | 18 +- .../templates/contracts/view_contract.html | 28 +- contracts/templatetags/subtract.py | 2 +- contracts/views.py | 28 +- shared/templates/shared/includes/base.html | 20 +- 14 files changed, 690 insertions(+), 238 deletions(-) diff --git a/contracts/admin.py b/contracts/admin.py index 2c934f7..d943e02 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -2,10 +2,7 @@ from django.contrib import admin from shared.admin import MarkdownxGuardedModelAdmin -from .forms import ( - ContractAdminForm, - SigneeAdminForm, -) +from .forms import ContractAdminForm, SigneeAdminForm from .models import ( Contract, Contractee, diff --git a/contracts/migrations/0001_initial.py b/contracts/migrations/0001_initial.py index c7ad739..5b23e59 100644 --- a/contracts/migrations/0001_initial.py +++ b/contracts/migrations/0001_initial.py @@ -1,17 +1,17 @@ # Generated by Django 4.1.4 on 2023-02-20 11:46 import colorfield.fields -import contracts.models -from django.conf import settings -from django.db import migrations, models import django.db.models.deletion import django_countries.fields import markdownx.models +from django.conf import settings +from django.db import migrations, models + +import contracts.models import shared.models class Migration(migrations.Migration): - initial = True dependencies = [ @@ -20,211 +20,640 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Contract', + name="Contract", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('all_parties_sign_date', models.DateField(blank=True, null=True, verbose_name='Datum podpisu všech stran')), - ('valid_start_date', models.DateField(verbose_name='Začátek účinnosti')), - ('valid_end_date', models.DateField(verbose_name='Konec platnosti')), - ('legal_state', models.CharField(choices=[('valid', 'Platná'), ('effective', 'Účinná'), ('not_effective', 'Neúčinná'), ('invalid', 'Neplatná')], max_length=13, verbose_name='Stav právního ujednání')), - ('public_state', models.CharField(choices=[('yes', 'Veřejná'), ('no', 'Neveřejná')], max_length=7, verbose_name='Veřejnost smlouvy')), - ('paper_form_state', models.CharField(choices=[('sent', 'Odeslaná'), ('stored', 'Uložená'), ('to_shred', 'Ke skartaci'), ('shredded', 'Skartovaná'), ('lost', 'Ztracená')], max_length=8, verbose_name='Stav papírové formy')), - ('publishing_rejection_comment', models.CharField(blank=True, help_text='Obsah není veřejně přístupný.', max_length=65536, null=True, verbose_name='Důvod nezveřejnění')), - ('tender_url', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz na výběrové řízení')), - ('agreement_url', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz na schválení')), - ('identifier', models.CharField(max_length=128, verbose_name='Identifikační číslo')), - ('notes', markdownx.models.MarkdownxField(blank=True, help_text='Poznámky jsou viditelné pro všechny, kteří mohou smlouvu spravovat.', null=True, verbose_name='Poznámky')), - ('summary', markdownx.models.MarkdownxField(blank=True, help_text='Obsah není veřejně přístupný.', null=True, verbose_name='Rekapitulace')), - ('created_by', models.ForeignKey(blank=True, help_text='Informace není veřejně přístupná. Pokud vytváříš novou smlouvu, budeš to ty.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_contracts', to=settings.AUTH_USER_MODEL, verbose_name='Vytvořena uživatelem')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "all_parties_sign_date", + models.DateField( + blank=True, null=True, verbose_name="Datum podpisu všech stran" + ), + ), + ( + "valid_start_date", + models.DateField(verbose_name="Začátek účinnosti"), + ), + ("valid_end_date", models.DateField(verbose_name="Konec platnosti")), + ( + "legal_state", + models.CharField( + choices=[ + ("valid", "Platná"), + ("effective", "Účinná"), + ("not_effective", "Neúčinná"), + ("invalid", "Neplatná"), + ], + max_length=13, + verbose_name="Stav právního ujednání", + ), + ), + ( + "public_state", + models.CharField( + choices=[("yes", "Veřejná"), ("no", "Neveřejná")], + max_length=7, + verbose_name="Veřejnost smlouvy", + ), + ), + ( + "paper_form_state", + models.CharField( + choices=[ + ("sent", "Odeslaná"), + ("stored", "Uložená"), + ("to_shred", "Ke skartaci"), + ("shredded", "Skartovaná"), + ("lost", "Ztracená"), + ], + max_length=8, + verbose_name="Stav papírové formy", + ), + ), + ( + "publishing_rejection_comment", + models.CharField( + blank=True, + help_text="Obsah není veřejně přístupný.", + max_length=65536, + null=True, + verbose_name="Důvod nezveřejnění", + ), + ), + ( + "tender_url", + models.URLField( + blank=True, + max_length=256, + null=True, + verbose_name="Odkaz na výběrové řízení", + ), + ), + ( + "agreement_url", + models.URLField( + blank=True, + max_length=256, + null=True, + verbose_name="Odkaz na schválení", + ), + ), + ( + "identifier", + models.CharField( + max_length=128, verbose_name="Identifikační číslo" + ), + ), + ( + "notes", + markdownx.models.MarkdownxField( + blank=True, + help_text="Poznámky jsou viditelné pro všechny, kteří mohou smlouvu spravovat.", + null=True, + verbose_name="Poznámky", + ), + ), + ( + "summary", + markdownx.models.MarkdownxField( + blank=True, + help_text="Obsah není veřejně přístupný.", + null=True, + verbose_name="Rekapitulace", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + help_text="Informace není veřejně přístupná. Pokud vytváříš novou smlouvu, budeš to ty.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="uploaded_contracts", + to=settings.AUTH_USER_MODEL, + verbose_name="Vytvořena uživatelem", + ), + ), ], options={ - 'verbose_name': 'Smlouva', - 'verbose_name_plural': 'Smlouvy', + "verbose_name": "Smlouva", + "verbose_name_plural": "Smlouvy", }, ), migrations.CreateModel( - name='Contractee', + name="Contractee", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='Česká pirátská strana', max_length=256, verbose_name='Jméno')), - ('address_street_with_number', models.CharField(default='Na Moráni 360/3', max_length=256, verbose_name='Ulice, č.p.')), - ('address_district', models.CharField(default='Praha 2', max_length=256, verbose_name='Obec')), - ('address_zip', models.CharField(default='128 00', max_length=16, verbose_name='PSČ')), - ('address_country', django_countries.fields.CountryField(default='CZ', max_length=2, verbose_name='Země')), - ('ico_number', models.CharField(blank=True, default='71339698', max_length=16, null=True, verbose_name='IČO')), - ('department', models.CharField(blank=True, max_length=128, null=True, verbose_name='Organizační složka')), - ('color', colorfield.fields.ColorField(blank=True, default=None, image_field=None, max_length=18, null=True, samples=None, verbose_name='Barva')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + default="Česká pirátská strana", + max_length=256, + verbose_name="Jméno", + ), + ), + ( + "address_street_with_number", + models.CharField( + default="Na Moráni 360/3", + max_length=256, + verbose_name="Ulice, č.p.", + ), + ), + ( + "address_district", + models.CharField( + default="Praha 2", max_length=256, verbose_name="Obec" + ), + ), + ( + "address_zip", + models.CharField( + default="128 00", max_length=16, verbose_name="PSČ" + ), + ), + ( + "address_country", + django_countries.fields.CountryField( + default="CZ", max_length=2, verbose_name="Země" + ), + ), + ( + "ico_number", + models.CharField( + blank=True, + default="71339698", + max_length=16, + null=True, + verbose_name="IČO", + ), + ), + ( + "department", + models.CharField( + blank=True, + max_length=128, + null=True, + verbose_name="Organizační složka", + ), + ), + ( + "color", + colorfield.fields.ColorField( + blank=True, + default=None, + image_field=None, + max_length=18, + null=True, + samples=None, + verbose_name="Barva", + ), + ), ], options={ - 'verbose_name': 'Naše smluvní strana', - 'verbose_name_plural': 'Naše smluvní strany', + "verbose_name": "Naše smluvní strana", + "verbose_name_plural": "Naše smluvní strany", }, ), migrations.CreateModel( - name='ContractFilingArea', + name="ContractFilingArea", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=32, verbose_name='Jméno')), - ('person_responsible', models.CharField(max_length=256, verbose_name='Odpovědná osoba')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=32, verbose_name="Jméno")), + ( + "person_responsible", + models.CharField(max_length=256, verbose_name="Odpovědná osoba"), + ), ], options={ - 'verbose_name': 'Spisovna', - 'verbose_name_plural': 'Spisovny', + "verbose_name": "Spisovna", + "verbose_name_plural": "Spisovny", }, bases=(shared.models.NameStrMixin, models.Model), ), migrations.CreateModel( - name='ContractIssue', + name="ContractIssue", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=32, verbose_name='Jméno')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=32, verbose_name="Jméno")), ], options={ - 'verbose_name': 'Problém se smlouvou', - 'verbose_name_plural': 'Problémy se smlouvami', + "verbose_name": "Problém se smlouvou", + "verbose_name_plural": "Problémy se smlouvami", }, bases=(shared.models.NameStrMixin, models.Model), ), migrations.CreateModel( - name='ContractType', + name="ContractType", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=32, verbose_name='Jméno')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=32, verbose_name="Jméno")), ], options={ - 'verbose_name': 'Typ smlouvy', - 'verbose_name_plural': 'Typy smlouvy', + "verbose_name": "Typ smlouvy", + "verbose_name_plural": "Typy smlouvy", }, bases=(shared.models.NameStrMixin, models.Model), ), migrations.CreateModel( - name='Signee', + name="Signee", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=256, verbose_name='Jméno')), - ('is_legal_entity', models.BooleanField(help_text='Důležité označit správně! Pokud není osoba právnická, zveřejňujeme pouze obec a zemi.', verbose_name='Je právnická osoba')), - ('address_street_with_number', models.CharField(help_text='Viditelné pouze u právnických osob.', max_length=256, verbose_name='Ulice, č.p.')), - ('address_district', models.CharField(max_length=256, verbose_name='Obec')), - ('address_zip', models.CharField(help_text='Viditelné pouze u právnických osob.', max_length=16, verbose_name='PSČ')), - ('address_country', django_countries.fields.CountryField(max_length=2, verbose_name='Země')), - ('ico_number', models.CharField(blank=True, max_length=16, null=True, verbose_name='IČO')), - ('date_of_birth', models.DateField(blank=True, null=True, verbose_name='Datum narození')), - ('department', models.CharField(blank=True, max_length=128, null=True, verbose_name='Organizační složka')), - ('color', colorfield.fields.ColorField(blank=True, default=None, image_field=None, max_length=18, null=True, samples=None, verbose_name='Barva')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=256, verbose_name="Jméno")), + ( + "is_legal_entity", + models.BooleanField( + help_text="Důležité označit správně! Pokud není osoba právnická, zveřejňujeme pouze obec a zemi.", + verbose_name="Je právnická osoba", + ), + ), + ( + "address_street_with_number", + models.CharField( + help_text="Viditelné pouze u právnických osob.", + max_length=256, + verbose_name="Ulice, č.p.", + ), + ), + ( + "address_district", + models.CharField(max_length=256, verbose_name="Obec"), + ), + ( + "address_zip", + models.CharField( + help_text="Viditelné pouze u právnických osob.", + max_length=16, + verbose_name="PSČ", + ), + ), + ( + "address_country", + django_countries.fields.CountryField( + max_length=2, verbose_name="Země" + ), + ), + ( + "ico_number", + models.CharField( + blank=True, max_length=16, null=True, verbose_name="IČO" + ), + ), + ( + "date_of_birth", + models.DateField( + blank=True, null=True, verbose_name="Datum narození" + ), + ), + ( + "department", + models.CharField( + blank=True, + max_length=128, + null=True, + verbose_name="Organizační složka", + ), + ), + ( + "color", + colorfield.fields.ColorField( + blank=True, + default=None, + image_field=None, + max_length=18, + null=True, + samples=None, + verbose_name="Barva", + ), + ), ], options={ - 'verbose_name': 'Jiná smluvní strana', - 'verbose_name_plural': 'Ostatní smluvní strany', + "verbose_name": "Jiná smluvní strana", + "verbose_name_plural": "Ostatní smluvní strany", }, ), migrations.CreateModel( - name='SigneeSignature', + name="SigneeSignature", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(verbose_name='Datum podpisu')), - ('contract', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='signee_signatures', to='contracts.contract', verbose_name='Podpisy jiných smluvních stran')), - ('signee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='signatures', to='contracts.signee', verbose_name='Smluvní strana')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("date", models.DateField(verbose_name="Datum podpisu")), + ( + "contract", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="signee_signatures", + to="contracts.contract", + verbose_name="Podpisy jiných smluvních stran", + ), + ), + ( + "signee", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="signatures", + to="contracts.signee", + verbose_name="Smluvní strana", + ), + ), ], options={ - 'verbose_name': 'Podpis jiné smluvní strany', - 'verbose_name_plural': 'Podpisy ostatních smluvních stran', + "verbose_name": "Podpis jiné smluvní strany", + "verbose_name_plural": "Podpisy ostatních smluvních stran", }, ), migrations.CreateModel( - name='SigneeRepresentative', + name="SigneeRepresentative", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=256, verbose_name='Jméno')), - ('function', models.CharField(blank=True, max_length=256, null=True, verbose_name='Funkce')), - ('role', models.CharField(blank=True, max_length=256, null=True, verbose_name='Role')), - ('signee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='representatives', to='contracts.signee', verbose_name='Smluvní strana')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=256, verbose_name="Jméno")), + ( + "function", + models.CharField( + blank=True, max_length=256, null=True, verbose_name="Funkce" + ), + ), + ( + "role", + models.CharField( + blank=True, max_length=256, null=True, verbose_name="Role" + ), + ), + ( + "signee", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="representatives", + to="contracts.signee", + verbose_name="Smluvní strana", + ), + ), ], options={ - 'verbose_name': 'Zástupce', - 'verbose_name_plural': 'Zástupci', + "verbose_name": "Zástupce", + "verbose_name_plural": "Zástupci", }, bases=(contracts.models.RepresentativeMixin, models.Model), ), migrations.CreateModel( - name='ContractIntent', + name="ContractIntent", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=128, verbose_name='Jméno')), - ('url', models.URLField(max_length=256, verbose_name='Odkaz')), - ('contract', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='intents', to='contracts.contract', verbose_name='Smlouva')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=128, verbose_name="Jméno")), + ("url", models.URLField(max_length=256, verbose_name="Odkaz")), + ( + "contract", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="intents", + to="contracts.contract", + verbose_name="Smlouva", + ), + ), ], options={ - 'verbose_name': 'Záměr', - 'verbose_name_plural': 'Záměry', + "verbose_name": "Záměr", + "verbose_name_plural": "Záměry", }, bases=(shared.models.NameStrMixin, models.Model), ), migrations.CreateModel( - name='ContractFile', + name="ContractFile", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=128, null=True, verbose_name='Jméno')), - ('is_public', models.BooleanField(default=False, verbose_name='Veřejně dostupný')), - ('file', models.FileField(upload_to='', verbose_name='Soubor')), - ('contract', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='contracts.contract', verbose_name='Soubory')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + blank=True, max_length=128, null=True, verbose_name="Jméno" + ), + ), + ( + "is_public", + models.BooleanField(default=False, verbose_name="Veřejně dostupný"), + ), + ("file", models.FileField(upload_to="", verbose_name="Soubor")), + ( + "contract", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="files", + to="contracts.contract", + verbose_name="Soubory", + ), + ), ], options={ - 'verbose_name': 'Soubor', - 'verbose_name_plural': 'Soubory', + "verbose_name": "Soubor", + "verbose_name_plural": "Soubory", }, bases=(shared.models.NameStrMixin, models.Model), ), migrations.CreateModel( - name='ContracteeSignature', + name="ContracteeSignature", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(verbose_name='Datum podpisu')), - ('contract', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contractee_signatures', to='contracts.contract', verbose_name='Podpisy našich smluvních stran')), - ('contractee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='signatures', to='contracts.contractee', verbose_name='Smluvní strana')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("date", models.DateField(verbose_name="Datum podpisu")), + ( + "contract", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="contractee_signatures", + to="contracts.contract", + verbose_name="Podpisy našich smluvních stran", + ), + ), + ( + "contractee", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="signatures", + to="contracts.contractee", + verbose_name="Smluvní strana", + ), + ), ], options={ - 'verbose_name': 'Podpis naší smluvní strany', - 'verbose_name_plural': 'Podpisy našich smluvních stran', + "verbose_name": "Podpis naší smluvní strany", + "verbose_name_plural": "Podpisy našich smluvních stran", }, ), migrations.CreateModel( - name='ContracteeRepresentative', + name="ContracteeRepresentative", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=256, verbose_name='Jméno')), - ('function', models.CharField(blank=True, max_length=256, null=True, verbose_name='Funkce')), - ('role', models.CharField(blank=True, max_length=256, null=True, verbose_name='Role')), - ('contractee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='representatives', to='contracts.contractee', verbose_name='Smluvní strana')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=256, verbose_name="Jméno")), + ( + "function", + models.CharField( + blank=True, max_length=256, null=True, verbose_name="Funkce" + ), + ), + ( + "role", + models.CharField( + blank=True, max_length=256, null=True, verbose_name="Role" + ), + ), + ( + "contractee", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="representatives", + to="contracts.contractee", + verbose_name="Smluvní strana", + ), + ), ], options={ - 'verbose_name': 'Zástupce', - 'verbose_name_plural': 'Zástupci', + "verbose_name": "Zástupce", + "verbose_name_plural": "Zástupci", }, bases=(contracts.models.RepresentativeMixin, models.Model), ), migrations.AddField( - model_name='contract', - name='filing_area', - field=models.ForeignKey(blank=True, help_text='Obsah není veřejně přístupný.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='filed_contracts', to='contracts.contractfilingarea', verbose_name='Spisovna'), + model_name="contract", + name="filing_area", + field=models.ForeignKey( + blank=True, + help_text="Obsah není veřejně přístupný.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="filed_contracts", + to="contracts.contractfilingarea", + verbose_name="Spisovna", + ), ), migrations.AddField( - model_name='contract', - name='issues', - field=models.ManyToManyField(blank=True, to='contracts.contractissue', verbose_name='Problémy'), + model_name="contract", + name="issues", + field=models.ManyToManyField( + blank=True, to="contracts.contractissue", verbose_name="Problémy" + ), ), migrations.AddField( - model_name='contract', - name='primary_contract', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subcontracts', to='contracts.contract', verbose_name='Primární smlouva'), + model_name="contract", + name="primary_contract", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="subcontracts", + to="contracts.contract", + verbose_name="Primární smlouva", + ), ), migrations.AddField( - model_name='contract', - name='public_status_set_by', - field=models.ForeignKey(blank=True, help_text='Obsah není veřejně přístupný.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='public_status_altered_contracts', to=settings.AUTH_USER_MODEL, verbose_name='Zveřejněno / nezveřejněno uživatelem'), + model_name="contract", + name="public_status_set_by", + field=models.ForeignKey( + blank=True, + help_text="Obsah není veřejně přístupný.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="public_status_altered_contracts", + to=settings.AUTH_USER_MODEL, + verbose_name="Zveřejněno / nezveřejněno uživatelem", + ), ), migrations.AddField( - model_name='contract', - name='types', - field=models.ManyToManyField(to='contracts.contracttype', verbose_name='Typ'), + model_name="contract", + name="types", + field=models.ManyToManyField( + to="contracts.contracttype", verbose_name="Typ" + ), ), ] diff --git a/contracts/migrations/0002_contract_is_approved_alter_contract_valid_end_date.py b/contracts/migrations/0002_contract_is_approved_alter_contract_valid_end_date.py index 43e4b59..a01c8f3 100644 --- a/contracts/migrations/0002_contract_is_approved_alter_contract_valid_end_date.py +++ b/contracts/migrations/0002_contract_is_approved_alter_contract_valid_end_date.py @@ -4,21 +4,24 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0001_initial'), + ("contracts", "0001_initial"), ] operations = [ migrations.AddField( - model_name='contract', - name='is_approved', - field=models.BooleanField(default=False, help_text='Může měnit jen schvalovatel. Pokud je smlouva veřejná, zaškrtnutím se vypustí ven.', verbose_name='Je schválená'), + model_name="contract", + name="is_approved", + field=models.BooleanField( + default=False, + help_text="Může měnit jen schvalovatel. Pokud je smlouva veřejná, zaškrtnutím se vypustí ven.", + verbose_name="Je schválená", + ), preserve_default=False, ), migrations.AlterField( - model_name='contract', - name='valid_end_date', - field=models.DateField(verbose_name='Konec účinnosti'), + model_name="contract", + name="valid_end_date", + field=models.DateField(verbose_name="Konec účinnosti"), ), ] diff --git a/contracts/migrations/0003_contract_expected_cost_hour_and_more.py b/contracts/migrations/0003_contract_expected_cost_hour_and_more.py index c098ed3..e25cd45 100644 --- a/contracts/migrations/0003_contract_expected_cost_hour_and_more.py +++ b/contracts/migrations/0003_contract_expected_cost_hour_and_more.py @@ -4,25 +4,30 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0002_contract_is_approved_alter_contract_valid_end_date'), + ("contracts", "0002_contract_is_approved_alter_contract_valid_end_date"), ] operations = [ migrations.AddField( - model_name='contract', - name='expected_cost_hour', - field=models.IntegerField(blank=True, null=True, verbose_name='Očekávané výdaje (hodina)'), + model_name="contract", + name="expected_cost_hour", + field=models.IntegerField( + blank=True, null=True, verbose_name="Očekávané výdaje (hodina)" + ), ), migrations.AddField( - model_name='contract', - name='expected_cost_month', - field=models.IntegerField(blank=True, null=True, verbose_name='Očekávané výdaje (měsíc)'), + model_name="contract", + name="expected_cost_month", + field=models.IntegerField( + blank=True, null=True, verbose_name="Očekávané výdaje (měsíc)" + ), ), migrations.AddField( - model_name='contract', - name='expected_cost_year', - field=models.IntegerField(blank=True, null=True, verbose_name='Očekávané výdaje (rok)'), + model_name="contract", + name="expected_cost_year", + field=models.IntegerField( + blank=True, null=True, verbose_name="Očekávané výdaje (rok)" + ), ), ] diff --git a/contracts/migrations/0004_alter_contract_options.py b/contracts/migrations/0004_alter_contract_options.py index 5b6fd8a..5b0c4b9 100644 --- a/contracts/migrations/0004_alter_contract_options.py +++ b/contracts/migrations/0004_alter_contract_options.py @@ -4,14 +4,17 @@ from django.db import migrations class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0003_contract_expected_cost_hour_and_more'), + ("contracts", "0003_contract_expected_cost_hour_and_more"), ] operations = [ migrations.AlterModelOptions( - name='contract', - options={'permissions': (('approve', 'Schválit / zrušit schválení'),), 'verbose_name': 'Smlouva', 'verbose_name_plural': 'Smlouvy'}, + name="contract", + options={ + "permissions": (("approve", "Schválit / zrušit schválení"),), + "verbose_name": "Smlouva", + "verbose_name_plural": "Smlouvy", + }, ), ] diff --git a/contracts/migrations/0005_alter_contract_primary_contract.py b/contracts/migrations/0005_alter_contract_primary_contract.py index b777807..fa8184a 100644 --- a/contracts/migrations/0005_alter_contract_primary_contract.py +++ b/contracts/migrations/0005_alter_contract_primary_contract.py @@ -1,19 +1,26 @@ # Generated by Django 4.1.4 on 2023-02-21 06:07 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0004_alter_contract_options'), + ("contracts", "0004_alter_contract_options"), ] operations = [ migrations.AlterField( - model_name='contract', - name='primary_contract', - field=models.ForeignKey(blank=True, help_text='Např. pro dodatky nebo objednávky u rámcových smluv.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subcontracts', to='contracts.contract', verbose_name='Primární smlouva'), + model_name="contract", + name="primary_contract", + field=models.ForeignKey( + blank=True, + help_text="Např. pro dodatky nebo objednávky u rámcových smluv.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="subcontracts", + to="contracts.contract", + verbose_name="Primární smlouva", + ), ), ] diff --git a/contracts/migrations/0006_alter_contract_issues_alter_contract_summary.py b/contracts/migrations/0006_alter_contract_issues_alter_contract_summary.py index c6ae7b9..6be6759 100644 --- a/contracts/migrations/0006_alter_contract_issues_alter_contract_summary.py +++ b/contracts/migrations/0006_alter_contract_issues_alter_contract_summary.py @@ -4,20 +4,29 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0005_alter_contract_primary_contract'), + ("contracts", "0005_alter_contract_primary_contract"), ] operations = [ migrations.AlterField( - model_name='contract', - name='issues', - field=models.ManyToManyField(blank=True, help_text='Veřejně nazváno "Poznámky".', to='contracts.contractissue', verbose_name='Problémy'), + model_name="contract", + name="issues", + field=models.ManyToManyField( + blank=True, + help_text='Veřejně nazváno "Poznámky".', + to="contracts.contractissue", + verbose_name="Problémy", + ), ), migrations.AlterField( - model_name='contract', - name='summary', - field=models.CharField(blank=True, max_length=256, null=True, verbose_name='Sumarizace obsahu smlouvy'), + model_name="contract", + name="summary", + field=models.CharField( + blank=True, + max_length=256, + null=True, + verbose_name="Sumarizace obsahu smlouvy", + ), ), ] diff --git a/contracts/migrations/0007_alter_contractee_address_country_and_more.py b/contracts/migrations/0007_alter_contractee_address_country_and_more.py index 1c2a4b4..97fba09 100644 --- a/contracts/migrations/0007_alter_contractee_address_country_and_more.py +++ b/contracts/migrations/0007_alter_contractee_address_country_and_more.py @@ -4,20 +4,19 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0006_alter_contract_issues_alter_contract_summary'), + ("contracts", "0006_alter_contract_issues_alter_contract_summary"), ] operations = [ migrations.AlterField( - model_name='contractee', - name='address_country', - field=models.CharField(default='CZ', max_length=256, verbose_name='Země'), + model_name="contractee", + name="address_country", + field=models.CharField(default="CZ", max_length=256, verbose_name="Země"), ), migrations.AlterField( - model_name='signee', - name='address_country', - field=models.CharField(default='CZ', max_length=256, verbose_name='Země'), + model_name="signee", + name="address_country", + field=models.CharField(default="CZ", max_length=256, verbose_name="Země"), ), ] diff --git a/contracts/models.py b/contracts/models.py index 529f85a..685240a 100644 --- a/contracts/models.py +++ b/contracts/models.py @@ -1,8 +1,8 @@ import math +from colorfield.fields import ColorField from django.conf import settings from django.db import models -from colorfield.fields import ColorField from markdownx.models import MarkdownxField from shared.models import NameStrMixin @@ -48,12 +48,12 @@ class ColorMixin(models.Model): # https://stackoverflow.com/a/29643643 - Thanks to John1024 and vallentin! # https://stackoverflow.com/a/58270890 - Thanks to Kardi Teknomo! - + hex_color = self.color.lstrip("#") - rgb_color = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) - + rgb_color = tuple(int(hex_color[i : i + 2], 16) for i in (0, 2, 4)) + [r, g, b] = rgb_color - + hsp = math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b)) if hsp > 127.5: @@ -368,7 +368,7 @@ class Contract(models.Model): help_text=( "Může měnit jen schvalovatel. Pokud je smlouva " "veřejná, zaškrtnutím se vypustí ven." - ) + ), ) valid_start_date = models.DateField( @@ -427,7 +427,7 @@ class Contract(models.Model): null=True, verbose_name="Odkaz na výběrové řízení", ) - + agreement_url = models.URLField( max_length=256, blank=True, @@ -439,7 +439,7 @@ class Contract(models.Model): ContractIssue, blank=True, verbose_name="Problémy", - help_text="Veřejně nazváno \"Poznámky\".", + help_text='Veřejně nazváno "Poznámky".', ) # NOTE: Could we make this into expected_cost_type and expected_cost_amount? @@ -449,13 +449,13 @@ class Contract(models.Model): null=True, verbose_name="Očekávané výdaje (rok)", ) - + expected_cost_month = models.IntegerField( blank=True, null=True, verbose_name="Očekávané výdaje (měsíc)", ) - + expected_cost_hour = models.IntegerField( blank=True, null=True, @@ -479,7 +479,7 @@ class Contract(models.Model): null=True, related_name="subcontracts", verbose_name="Primární smlouva", - help_text="Např. pro dodatky nebo objednávky u rámcových smluv." + help_text="Např. pro dodatky nebo objednávky u rámcových smluv.", ) # WARNING: Dependent on the type! notes = MarkdownxField( @@ -492,10 +492,8 @@ class Contract(models.Model): class Meta: verbose_name = "Smlouva" verbose_name_plural = "Smlouvy" - - permissions = ( - ("approve", "Schválit / zrušit schválení"), - ) + + permissions = (("approve", "Schválit / zrušit schválení"),) def __str__(self) -> str: return self.identifier @@ -555,10 +553,10 @@ class ContracteeSignature(models.Model): def __str__(self) -> str: representative_names = [] - + for representative in self.contractee.representatives.all(): representative_names.append(representative.name) - + representatives = ", ".join(representative_names) result = self.contractee.name @@ -595,10 +593,10 @@ class SigneeSignature(models.Model): def __str__(self) -> str: representative_names = [] - + for representative in self.signee.representatives.all(): representative_names.append(representative.name) - + representatives = ", ".join(representative_names) result = self.signee.name diff --git a/contracts/templates/contracts/index.html b/contracts/templates/contracts/index.html index 9771b74..b71d4d8 100644 --- a/contracts/templates/contracts/index.html +++ b/contracts/templates/contracts/index.html @@ -47,7 +47,7 @@ {% endfor %} </tbody> </table> - + {% if page.has_other_pages %} <div class="pagination-container"> <nav class="pagination space-x-1"> @@ -63,7 +63,7 @@ </div> </div> </a> - + {% if page.previous_page_number != 1 %} <a class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block" @@ -72,11 +72,11 @@ <div class="btn__body">1</div> </a> {% endif %} - + {% if page.has_previous and page.previous_page_number != 2 %} <span class="text-grey-500 hidden md:flex flex-col px-2 justify-center">...</span> {% endif %} - + {% if page.has_previous %} <a class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block" @@ -89,7 +89,7 @@ <button class="btn btn--grey-500 btn--condensed hidden md:inline-block"> <div class="btn__body">{{ page.number }}</div> </button> - + {% if page.has_next %} <a class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block" @@ -98,13 +98,13 @@ <div class="btn__body ">{{ page.next_page_number }}</div> </a> {% endif %} - + {% if paginator.num_pages != page.next_page_number and paginator.num_pages|subtract:1 != page.next_page_number %} <span class="text-grey-500 hidden md:flex flex-col px-2 justify-center">...</span> {% endif %} - + {% comment %}num_pages is equivalent to the last page number{% endcomment %} - + {% if paginator.num_pages != page.next_page_number %} <a role="button" @@ -114,7 +114,7 @@ <div class="btn__body">{{ paginator.num_pages }}</div> </a> {% endif %} - + <a class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed" {% if not page.has_next %}disabled{% endif %} diff --git a/contracts/templates/contracts/view_contract.html b/contracts/templates/contracts/view_contract.html index 8b084a0..1a77825 100644 --- a/contracts/templates/contracts/view_contract.html +++ b/contracts/templates/contracts/view_contract.html @@ -3,9 +3,9 @@ {% block content %} <h1 class="head-alt-lg mb-10">{{ contract.identifier }}</h1> - + <h2 class="text-xl font-bold mb-5"><i class="ico--info mr-3"></i>Základní informace</h2> - + <table class="table table-auto w-full table--striped table--bordered mb-10"> <tbody> <tr> @@ -163,11 +163,11 @@ </tr> </tbody> </table> - + <h2 class="text-xl font-bold mb-5"><i class="ico--pencil mr-3"></i>Podpisy</h2> - + <h3 class="text-lg font-bold mb-4">Naší smluvní strany</h3> - + {% with contract.contractee_signatures.all as signatures %} {% if signatures|length != 0 %} <ul class="mb-5 grid grid-cols-3 gap-2"> @@ -185,16 +185,16 @@ {% endif %} </a> </div> - + {{ signature.contractee.address_street_with_number }}<br> {{ signature.contractee.address_zip }} {{ signature.contractee.address_district }}<br> {{ signature.contractee.get_address_country_display }}<br> - + {% if signature.contractee.ico_number %} IČO: {{ signature.contractee.ico_number }}<br> {% endif %} </address> - + <div class="block mb-2"> <p class="block mb-2"> <strong>Zástupci:</strong> @@ -215,9 +215,9 @@ <div class="mb-5 text-grey-200">Žádné podpisy.</div> {% endif %} {% endwith %} - + <h3 class="text-lg font-bold mb-5">Ostatních smluvních stran</h3> - + {% with contract.signee_signatures.all as signatures %} {% if signatures|length != 0 %} <ul class="mb-5 grid grid-cols-3 gap-2"> @@ -235,7 +235,7 @@ {% endif %} </a> </div> - + {% if signature.signee.is_legal_entity %} {{ signature.signee.address_street_with_number }}<br> {{ signature.signee.address_zip }} {{ signature.signee.address_district }}<br> @@ -243,18 +243,18 @@ {% else %} {{ signature.signee.address_district }}<br> {% endif %} - + {% if signature.signee.ico_number %} IČO: {{ signature.signee.ico_number }}<br> {% endif %} - + {% if not signature.signee.is_legal_entity %} <span class="block mt-2"> <small class="font-thin">(Fyzická osoba, ukazujeme pouze obec.)</small><br> </span> {% endif %} </address> - + <div class="block mb-2"> <p class="block mb-2"> <strong>Zástupci:</strong> diff --git a/contracts/templatetags/subtract.py b/contracts/templatetags/subtract.py index 6faf0b9..baf7853 100644 --- a/contracts/templatetags/subtract.py +++ b/contracts/templatetags/subtract.py @@ -5,4 +5,4 @@ register = template.Library() @register.filter(name="subtract") def subtract(value, arg): - return value - arg + return value - arg diff --git a/contracts/views.py b/contracts/views.py index 79b5814..fd204c4 100644 --- a/contracts/views.py +++ b/contracts/views.py @@ -1,6 +1,6 @@ from django.conf import settings -from django.shortcuts import render from django.core.paginator import Paginator +from django.shortcuts import render from .models import Contract @@ -8,18 +8,20 @@ from .models import Contract def index(request): - contracts = Contract.objects.filter( - is_approved=True, - public_state=Contract.PublicStates.YES, - ).order_by("valid_start_date").all() - paginator = Paginator(contracts, 25) - - page = paginator.get_page( - request.GET.get('page') + contracts = ( + Contract.objects.filter( + is_approved=True, + public_state=Contract.PublicStates.YES, + ) + .order_by("valid_start_date") + .all() ) - + paginator = Paginator(contracts, 25) + + page = paginator.get_page(request.GET.get("page")) + print(request.user) - + return render( request, "contracts/index.html", @@ -30,7 +32,7 @@ def index(request): "description": "Description", "paginator": paginator, "page": page, - } + }, ) @@ -49,5 +51,5 @@ def view_contract(request, id: int): "title": contract.identifier, "description": "", # TODO "contract": contract, - } + }, ) diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html index c38dae1..8e1d971 100644 --- a/shared/templates/shared/includes/base.html +++ b/shared/templates/shared/includes/base.html @@ -5,7 +5,7 @@ <html lang="cs"> <head> <meta charset="utf-8"> - + <meta name="title" content="{{ title }} | Registr smluv Pirátské strany"> <meta name="description" content="{{ description }}"> @@ -28,13 +28,13 @@ type="image/png" href="{% static "shared/favicon.png" %}" > - + <link href="{% static "shared/style.css" %}" rel="stylesheet" media="all" > - + <link href="https://styleguide.pirati.cz/2.11.x/css/styles.css" rel="stylesheet" @@ -45,10 +45,10 @@ rel="stylesheet" media="all" > - + {% render_bundle "shared" %} {% render_bundle "base" %} - + <title>{{ title }} | Registr smluv Pirátské strany</title> </head> <body> @@ -63,13 +63,13 @@ </a> <a href="/" class="pl-4 font-bold text-xl hover:no-underline lg:border-r lg:border-grey-300 lg:pr-8">Registr smluv</a> </div> - + <div class="navbar__menutoggle my-4 flex justify-end lg:hidden"> <a href="#" @click="show = !show" class="no-underline hover:no-underline"> <i class="ico--menu text-3xl"></i> </a> </div> - + <div v-if="show || isLgScreenSize" class="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto"> <ul class="navbar-menu text-white"> <li class="navbar-menu__item"> @@ -85,7 +85,7 @@ {% endif %} </ul> </div> - + <div v-if="show || isLgScreenSize" class="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-col sm:flex-row lg:flex-col sm:space-x-4 space-y-2 sm:space-y-0 lg:space-y-2 xl:flex-row xl:space-x-2 xl:space-y-0"> {% if user and not user.is_anonymous %} <div class="flex items-center space-x-4"> @@ -119,13 +119,13 @@ </ui-navbar> </ui-app> </nav> - + <div class="container container--default py-8 lg:py-24"> <main> {% block content %}{% endblock %} </main> </div> - + <script src="https://styleguide.pirati.cz/2.11.x/js/main.bundle.js" ></script> -- GitLab