From c230a766029577e88d070a03a96cc5c3c4b5c9b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Mon, 20 Feb 2023 12:46:24 +0100
Subject: [PATCH] squash migrations, finish single contract view for the most
 part

---
 contracts/migrations/0001_initial.py          | 712 ++++--------------
 ...ve_contract_expected_cost_hour_and_more.py |  28 -
 ...name_subtype_contract_subtypes_and_more.py |  29 -
 ...ttype_remove_contract_subtypes_and_more.py |  48 --
 .../0005_rename_type_contract_types.py        |  18 -
 .../0006_remove_contract_contains_nda.py      |  17 -
 contracts/models.py                           |  12 +-
 contracts/templates/contracts/index.html      |  17 +-
 .../templates/contracts/view_contract.html    | 131 +++-
 9 files changed, 254 insertions(+), 758 deletions(-)
 delete mode 100644 contracts/migrations/0002_remove_contract_expected_cost_hour_and_more.py
 delete mode 100644 contracts/migrations/0003_rename_subtype_contract_subtypes_and_more.py
 delete mode 100644 contracts/migrations/0004_contracttype_remove_contract_subtypes_and_more.py
 delete mode 100644 contracts/migrations/0005_rename_type_contract_types.py
 delete mode 100644 contracts/migrations/0006_remove_contract_contains_nda.py

diff --git a/contracts/migrations/0001_initial.py b/contracts/migrations/0001_initial.py
index 00dd0b8..c7ad739 100644
--- a/contracts/migrations/0001_initial.py
+++ b/contracts/migrations/0001_initial.py
@@ -1,15 +1,17 @@
-# Generated by Django 4.1.4 on 2023-02-16 03:36
+# 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 shared.models
 
 
 class Migration(migrations.Migration):
+
     initial = True
 
     dependencies = [
@@ -18,669 +20,211 @@ 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",
-                    ),
-                ),
-                (
-                    "type",
-                    models.CharField(
-                        choices=[
-                            ("primary", "Hlavní"),
-                            ("amendment", "Dodatek"),
-                            ("framework_order", "Objednávka u rámcové smlouvy"),
-                        ],
-                        default="primary",
-                        max_length=15,
-                        verbose_name="Typ",
-                    ),
-                ),
-                (
-                    "contains_nda",
-                    models.BooleanField(default=False, verbose_name="Obsahuje NDA"),
-                ),
-                (
-                    "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á"),
-                        ],
-                        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í",
-                    ),
-                ),
-                (
-                    "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",
-                    ),
-                ),
-                (
-                    "expected_cost_total",
-                    models.IntegerField(
-                        blank=True, null=True, verbose_name="Očekáváná celková cena"
-                    ),
-                ),
-                (
-                    "expected_cost_year",
-                    models.IntegerField(
-                        blank=True, null=True, verbose_name="Očekáváná cena za rok"
-                    ),
-                ),
-                (
-                    "expected_cost_month",
-                    models.IntegerField(
-                        blank=True, null=True, verbose_name="Očekáváná cena za měsíc"
-                    ),
-                ),
-                (
-                    "expected_cost_hour",
-                    models.IntegerField(
-                        blank=True, null=True, verbose_name="Očekáváná cena za hodinu"
-                    ),
-                ),
-                (
-                    "agreement_url",
-                    models.URLField(
-                        blank=True,
-                        max_length=256,
-                        null=True,
-                        verbose_name="Odkaz na schválení",
-                    ),
-                ),
-                (
-                    "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",
-                    models.CharField(
-                        blank=True, max_length=6, null=True, 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="ContractSubtype",
+            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": "Podtyp smlouvy",
-                "verbose_name_plural": "Podtypy 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",
-                    models.CharField(
-                        blank=True, max_length=6, null=True, 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",
-                    ),
-                ),
-                (
-                    "url",
-                    models.URLField(
-                        blank=True, max_length=256, null=True, 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="Hlavní 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="subtype",
-            field=models.ManyToManyField(
-                blank=True, to="contracts.contractsubtype", verbose_name="Podtypy"
-            ),
+            model_name='contract',
+            name='types',
+            field=models.ManyToManyField(to='contracts.contracttype', verbose_name='Typ'),
         ),
     ]
diff --git a/contracts/migrations/0002_remove_contract_expected_cost_hour_and_more.py b/contracts/migrations/0002_remove_contract_expected_cost_hour_and_more.py
deleted file mode 100644
index 2eb5524..0000000
--- a/contracts/migrations/0002_remove_contract_expected_cost_hour_and_more.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Generated by Django 4.1.4 on 2023-02-17 03:00
-
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-    dependencies = [
-        ("contracts", "0001_initial"),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name="contract",
-            name="expected_cost_hour",
-        ),
-        migrations.RemoveField(
-            model_name="contract",
-            name="expected_cost_month",
-        ),
-        migrations.RemoveField(
-            model_name="contract",
-            name="expected_cost_total",
-        ),
-        migrations.RemoveField(
-            model_name="contract",
-            name="expected_cost_year",
-        ),
-    ]
diff --git a/contracts/migrations/0003_rename_subtype_contract_subtypes_and_more.py b/contracts/migrations/0003_rename_subtype_contract_subtypes_and_more.py
deleted file mode 100644
index fa1788d..0000000
--- a/contracts/migrations/0003_rename_subtype_contract_subtypes_and_more.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Generated by Django 4.1.4 on 2023-02-19 12:40
-
-import colorfield.fields
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contracts', '0002_remove_contract_expected_cost_hour_and_more'),
-    ]
-
-    operations = [
-        migrations.RenameField(
-            model_name='contract',
-            old_name='subtype',
-            new_name='subtypes',
-        ),
-        migrations.AlterField(
-            model_name='contractee',
-            name='color',
-            field=colorfield.fields.ColorField(blank=True, default=None, image_field=None, max_length=18, null=True, samples=None, verbose_name='Barva'),
-        ),
-        migrations.AlterField(
-            model_name='signee',
-            name='color',
-            field=colorfield.fields.ColorField(blank=True, default=None, image_field=None, max_length=18, null=True, samples=None, verbose_name='Barva'),
-        ),
-    ]
diff --git a/contracts/migrations/0004_contracttype_remove_contract_subtypes_and_more.py b/contracts/migrations/0004_contracttype_remove_contract_subtypes_and_more.py
deleted file mode 100644
index 1048d44..0000000
--- a/contracts/migrations/0004_contracttype_remove_contract_subtypes_and_more.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Generated by Django 4.1.4 on 2023-02-19 13:08
-
-from django.db import migrations, models
-import django.db.models.deletion
-import shared.models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contracts', '0003_rename_subtype_contract_subtypes_and_more'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            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')),
-            ],
-            options={
-                'verbose_name': 'Typ smlouvy',
-                'verbose_name_plural': 'Typy smlouvy',
-            },
-            bases=(shared.models.NameStrMixin, models.Model),
-        ),
-        migrations.RemoveField(
-            model_name='contract',
-            name='subtypes',
-        ),
-        migrations.AlterField(
-            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.RemoveField(
-            model_name='contract',
-            name='type',
-        ),
-        migrations.DeleteModel(
-            name='ContractSubtype',
-        ),
-        migrations.AddField(
-            model_name='contract',
-            name='type',
-            field=models.ManyToManyField(to='contracts.contracttype', verbose_name='Typ'),
-        ),
-    ]
diff --git a/contracts/migrations/0005_rename_type_contract_types.py b/contracts/migrations/0005_rename_type_contract_types.py
deleted file mode 100644
index 6e55348..0000000
--- a/contracts/migrations/0005_rename_type_contract_types.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 4.1.4 on 2023-02-19 13:09
-
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contracts', '0004_contracttype_remove_contract_subtypes_and_more'),
-    ]
-
-    operations = [
-        migrations.RenameField(
-            model_name='contract',
-            old_name='type',
-            new_name='types',
-        ),
-    ]
diff --git a/contracts/migrations/0006_remove_contract_contains_nda.py b/contracts/migrations/0006_remove_contract_contains_nda.py
deleted file mode 100644
index a9a9f4d..0000000
--- a/contracts/migrations/0006_remove_contract_contains_nda.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Generated by Django 4.1.4 on 2023-02-19 13:13
-
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contracts', '0005_rename_type_contract_types'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='contract',
-            name='contains_nda',
-        ),
-    ]
diff --git a/contracts/models.py b/contracts/models.py
index 975098f..c0b2abd 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -549,11 +549,14 @@ class SigneeSignature(models.Model):
         return result
 
 
-class ContractIntent(models.Model):
+class ContractIntent(NameStrMixin, models.Model):
+    name = models.CharField(
+        max_length=128,
+        verbose_name="Jméno",
+    )
+
     url = models.URLField(
         max_length=256,
-        blank=True,
-        null=True,
         verbose_name="Odkaz",
     )
 
@@ -567,6 +570,3 @@ class ContractIntent(models.Model):
     class Meta:
         verbose_name = "Záměr"
         verbose_name_plural = "Záměry"
-
-    def __str__(self) -> str:
-        return self.url
diff --git a/contracts/templates/contracts/index.html b/contracts/templates/contracts/index.html
index 9f51d4a..c7fd3f0 100644
--- a/contracts/templates/contracts/index.html
+++ b/contracts/templates/contracts/index.html
@@ -11,8 +11,7 @@
                 <td>Právní stav</td>
                 <td>Účinná od</td>
                 <td>Platná do</td>
-                <td>Naše podpisy</td>
-                <td>Cizí podpisy</td>
+                <td>Podepsána s</td>
             </tr>
         </thead>
         <tbody>
@@ -32,18 +31,8 @@
                         </ul>
                     </td>
                     <td>{{ contract.get_legal_state_display }}</td>
-                    <td>{{ contract.valid_start_date }}</td>
-                    <td>{{ contract.valid_end_date }}</td>
-                    <td>
-                        <ul class="flex flex-wrap gap-1.5">
-                            {% for signature in contract.contractee_signatures.all %}
-                                <li
-                                    class="p-1.5 rounded-sm whitespace-nowrap cursor-pointer {% if not signature.signee.color %}bg-gray-200 duration-100 hover:bg-gray-300{% endif %}"
-                                    {% if signature.signee.color %}style="background-color:{{ signature.signee.color }}"{% endif %}
-                                >{{ signature.contractee.name }}</li>
-                            {% endfor %}
-                        </ul>
-                    </td>
+                    <td class="whitespace-nowrap">{{ contract.valid_start_date }}</td>
+                    <td class="whitespace-nowrap">{{ contract.valid_end_date }}</td>
                     <td>
                         <ul class="flex flex-wrap gap-1.5">
                             {% for signature in contract.signee_signatures.all %}
diff --git a/contracts/templates/contracts/view_contract.html b/contracts/templates/contracts/view_contract.html
index 29f7c3a..db76960 100644
--- a/contracts/templates/contracts/view_contract.html
+++ b/contracts/templates/contracts/view_contract.html
@@ -18,6 +18,14 @@
                     </ul>
                 </td>
             </tr>
+            <tr>
+                <td class="w-1/5 !p-2.5">Začátek účinnosti</td>
+                <td class="w-4/5 !p-2.5">{{ contract.valid_start_date }}</td>
+            </tr>
+            <tr>
+                <td class="w-1/5 !p-2.5">Konec platnosti</td>
+                <td class="w-4/5 !p-2.5">{{ contract.valid_end_date }}</td>
+            </tr>
             <tr>
                 <td class="w-1/5 !p-2.5">Právní stav</td>
                 <td class="w-4/5 !p-2.5">{{ contract.get_legal_state_display }}</td>
@@ -52,6 +60,27 @@
                     {% endif %}
                 </td>
             </tr>
+            <tr>
+                <td class="w-1/5 !p-2.5">Záměry</td>
+                <td class="w-4/5 !p-2.5">
+                    {% with contract.intents.all as intents %}
+                        {% if intents|length != 0 %}
+                            <ul class="flex gap-2">
+                                {% for intent in intents %}
+                                    <li class="flex">
+                                        <a
+                                            class="p-1.5 rounded-sm text-ellipsis bg-gray-200 duration-100 hover:bg-gray-300 hover:no-underline"
+                                            href="{{ intent.url }}"
+                                        ><i class="ico--link mr-2"></i>{{ intent.name }}</a>
+                                    </li>
+                                {% endfor %}
+                            </ul>
+                        {% else %}
+                            <span class="text-grey-200">Žádné</span>
+                        {% endif %}
+                    {% endwith %}
+                </td>
+            </tr>
             <tr>
                 <td class="w-1/5 !p-2.5">Problémy</td>
                 <td class="w-4/5 !p-2.5">
@@ -59,7 +88,7 @@
                         {% if issues|length != 0 %}
                             <ul class="flex gap-2">
                                 {% for issue in issues %}
-                                    <li class="p-1.5 rounded-sm bg-grey-200">{{ issue.name }}</li>
+                                    <li class="p-1.5 rounded-sm bg-gray-200">{{ issue.name }}</li>
                                 {% endfor %}
                             </ul>
                         {% else %}
@@ -85,8 +114,9 @@
                         {% if files|length != 0 %}
                             <ul class="flex gap-2">
                                 {% for file in files %}
-                                    <li class="p-1.5 rounded-sm bg-gray-200">
+                                    <li class="flex">
                                         <a
+                                            class="p-1.5 rounded-sm bg-gray-200 duration-100 hover:bg-gray-300 hover:no-underline"
                                             href="{{ file.file.url }}"
                                         ><i class="ico--attachment mr-2"></i>{{ file.name }}</a>
                                     </li>
@@ -103,18 +133,24 @@
     
     <h2 class="text-xl font-bold mb-5"><i class="ico--pencil mr-3"></i>Podpisy</h2>
     
-    <h3 class="text-lg font-bold mb-5">Naší smluvní strany</h3>
+    <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">
+            <ul class="mb-5 grid grid-cols-3 gap-2">
                 {% for signature in signatures %}
-                    <li class="py-2 {% if not forloop.last %}border-b border-grey-200{% endif %}">
-                        <address>
-                            <strong>{{ signature.contractee.name }}</strong>
-                            {% if signature.contractee.department %}
-                                - {{ signature.contractee.department }}
-                            {% endif %}<br>
+                    <li class="p-3 border border-gray-300 rounded-md">
+                        <address class="mb-3">
+                            <div class="mb-1">
+                                <a
+                                    class="inline-block p-1.5 mb-1 rounded-sm whitespace-nowrap cursor-pointer not-italic hover:no-underline bg-gray-200 duration-100 hover:bg-gray-300"
+                                >
+                                    <strong>{{ signature.contractee.name }}</strong>
+                                    {% if signature.contractee.department %}
+                                        - {{ signature.contractee.department }}
+                                    {% endif %}
+                                </a>
+                            </div>
                             
                             {{ signature.contractee.address_street_with_number }}<br>
                             {{ signature.contractee.address_zip }} {{ signature.contractee.address_district }}<br>
@@ -124,6 +160,20 @@
                                 IČO: {{ signature.contractee.ico_number }}<br>
                             {% endif %}
                         </address>
+                        
+                        <div class="block mb-2">
+                            <p class="block mb-2">
+                                <strong>Zástupci:</strong>
+                            </p>
+                            <ul class="list-disc ml-6">
+                                {% for representative in signature.contractee.representatives.all %}
+                                    <li>{{ representative.name }}, {{ representative.function }}</li>
+                                {% endfor %}
+                            </ul>
+                        </div>
+                        <p>
+                            <strong>Datum podpisu:</strong> {{ signature.date }}
+                        </p>
                     </li>
                 {% endfor %}
             </ul>
@@ -132,9 +182,62 @@
         {% endif %}
     {% endwith %}
     
-    <h3 class="text-lg font-bold mb-5">Ostatních smluvní stran</h3>
+    <h3 class="text-lg font-bold mb-5">Ostatních smluvních stran</h3>
     
-    <ul>
-        
-    </ul>
+    {% with contract.signee_signatures.all as signatures %}
+        {% if signatures|length != 0 %}
+            <ul class="mb-5 grid grid-cols-3 gap-2">
+                {% for signature in signatures %}
+                    <li class="p-3 border border-gray-300 rounded-md">
+                        <address class="mb-3">
+                            <div class="mb-1">
+                                <a
+                                    class="inline-block p-1.5 mb-1 rounded-sm whitespace-nowrap cursor-pointer not-italic hover:no-underline bg-gray-200 duration-100 hover:bg-gray-300"
+                                >
+                                    <strong>{{ signature.signee.name }}</strong>
+                                    {% if signature.signee.department %}
+                                        - {{ signature.signee.department }}
+                                    {% endif %}
+                                </a>
+                            </div>
+                            
+                            {% if signee.is_legal_entity %}
+                                {{ signature.signee.address_street_with_number }}<br>
+                                {{ signature.signee.address_zip }} {{ signature.signee.address_district }}<br>
+                                {{ signature.signee.get_address_country_display }}<br>
+                            {% else %}
+                                {{ signature.signee.address_district }}<br>
+                            {% endif %}
+                            
+                            {% if signature.signee.ico_number %}
+                                IČO: {{ signature.signee.ico_number }}<br>
+                            {% endif %}
+                            
+                            {% if not 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>
+                            </p>
+                            <ul class="list-disc ml-6">
+                                {% for representative in signature.signee.representatives.all %}
+                                    <li>{{ representative.name }}, {{ representative.function }}</li>
+                                {% endfor %}
+                            </ul>
+                        </div>
+                        <p>
+                            <strong>Datum podpisu:</strong> {{ signature.date }}
+                        </p>
+                    </li>
+                {% endfor %}
+            </ul>
+        {% else %}
+            <div class="mb-5 text-grey-200">Žádné podpisy.</div>
+        {% endif %}
+    {% endwith %}
 {% endblock %}
-- 
GitLab