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

finish admin interface, for the time being

parent 783059be
No related branches found
No related tags found
No related merge requests found
......@@ -27,6 +27,16 @@ class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
# BEGIN Contracts
class ContracteeSignatureInline(admin.TabularInline):
model = ContracteeSignature
extra = 0
class SigneeSignatureInline(admin.TabularInline):
model = SigneeSignature
extra = 0
class ContractFileInline(admin.TabularInline):
model = ContractFile
extra = 0
......@@ -37,19 +47,13 @@ class ContractIntentInline(admin.TabularInline):
extra = 0
class ContractIssueInline(admin.TabularInline):
model = Contract.issues.through
extra = 0
class ContractAdmin(MarkdownxGuardedModelAdmin):
form = ContractAdminForm
fields = (
"created_by",
"type",
"subtype",
"signee_signatures",
"contractee_signatures",
"valid_start_date",
"valid_end_date",
"legal_state",
......@@ -58,6 +62,7 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
"publishing_rejection_comment",
"tender_url",
"identifier",
"issues",
"notes",
"summary",
"primary_contract",
......@@ -69,12 +74,21 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
"filing_area",
)
readonly_fields = ("created_by",)
inlines = (
ContracteeSignatureInline,
SigneeSignatureInline,
ContractFileInline,
ContractIntentInline,
ContractIssueInline,
)
def save_model(self, request, obj, form, change) -> None:
if obj.created_by is None:
obj.created_by = request.user
super().save_model(request, obj, form, change)
# END Contracts
......@@ -91,6 +105,7 @@ class SigneeAdmin(MarkdownxGuardedModelAdmin):
inlines = (
SigneeRepresentativeInline,
SigneeSignatureInline,
)
......@@ -100,15 +115,15 @@ class ContracteeRepresentativeInline(admin.TabularInline):
class ContracteeAdmin(MarkdownxGuardedModelAdmin):
inlines = (
ContracteeRepresentativeInline,
)
inlines = (ContracteeRepresentativeInline, ContracteeSignatureInline)
# END Signing parties
for model in (
SigneeSignature,
ContracteeSignature,
SigneeRepresentative,
ContracteeRepresentative,
ContractSubtype,
......@@ -117,8 +132,6 @@ for model in (
admin.site.register(model, IndexHiddenModelAdmin)
for model in (
SigneeSignature,
ContracteeSignature,
ContractIssue,
ContractFilingArea,
):
......
This diff is collapsed.
# Generated by Django 4.1.4 on 2023-02-15 17:19
from django.db import migrations, models
import markdownx.models
class Migration(migrations.Migration):
dependencies = [
('contracts', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='contract',
name='all_parties_sign_date',
field=models.DateField(blank=True, null=True, verbose_name='Datum podpisu všech stran'),
),
migrations.AlterField(
model_name='contract',
name='notes',
field=markdownx.models.MarkdownxField(blank=True, help_text='Poznámky jsou viditelné pro všechny, kteří mohou smlouvu spravovat.', null=True, verbose_name='Poznámky'),
),
migrations.AlterField(
model_name='contract',
name='summary',
field=markdownx.models.MarkdownxField(blank=True, help_text='Obsah není veřejně přístupný.', null=True, verbose_name='Rekapitulace'),
),
]
# Generated by Django 4.1.4 on 2023-02-15 17:21
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contracts', '0002_alter_contract_all_parties_sign_date_and_more'),
]
operations = [
migrations.AlterField(
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.CASCADE, related_name='public_status_altered_contracts', to=settings.AUTH_USER_MODEL, verbose_name='Zveřejněno / nezveřejněno uživatelem'),
),
]
......@@ -3,8 +3,8 @@ from django.db import models
from django_countries.fields import CountryField
from markdownx.models import MarkdownxField
from users.models import User
from shared.models import NameStrMixin
from users.models import User
class Signee(models.Model):
......@@ -128,26 +128,6 @@ class SigneeRepresentative(models.Model):
return result
class SigneeSignature(models.Model):
signee = models.ForeignKey(
Signee,
on_delete=models.CASCADE,
related_name="signatures",
verbose_name="Smluvní strana",
)
date = models.DateField(
verbose_name="Datum podpisu",
)
class Meta:
verbose_name = "Podpis jiné smluvní strany"
verbose_name_plural = "Podpisy ostatních smluvních stran"
def __str__(self) -> str:
return f"{self.signee.name}, {self.date}"
class Contractee(models.Model):
name = models.CharField(
max_length=256,
......@@ -258,26 +238,6 @@ class ContracteeRepresentative(models.Model):
return result
class ContracteeSignature(models.Model):
contractee = models.ForeignKey(
Contractee,
on_delete=models.CASCADE,
related_name="signatures",
verbose_name="Smluvní strana",
)
date = models.DateField(
verbose_name="Datum podpisu",
)
class Meta:
verbose_name = "Podpis naší smluvní strany"
verbose_name_plural = "Podpisy našich smluvních stran"
def __str__(self) -> str:
return f"{self.contractee.name}, {self.date}"
class ContractSubtype(NameStrMixin, models.Model):
name = models.CharField(
max_length=32,
......@@ -332,6 +292,7 @@ class Contract(models.Model):
subtype = models.ManyToManyField(
ContractSubtype,
verbose_name="Podtypy",
blank=True,
)
contains_nda = models.BooleanField(
......@@ -339,16 +300,6 @@ class Contract(models.Model):
verbose_name="Obsahuje NDA",
)
signee_signatures = models.ManyToManyField(
SigneeSignature,
verbose_name="Podpisy ostatních smluvních stran",
)
contractee_signatures = models.ManyToManyField(
ContracteeSignature,
verbose_name="Podpisy našich smluvních stran",
)
all_parties_sign_date = models.DateField(
verbose_name="Datum podpisu všech stran",
blank=True,
......@@ -362,12 +313,14 @@ class Contract(models.Model):
verbose_name="Konec platnosti",
)
uploaded_by = models.ForeignKey(
User,
on_delete=models.CASCADE,
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name="uploaded_contracts",
verbose_name="Nahráno uživatelem",
help_text="Informace není veřejně přístupná.",
verbose_name="Vytvořena uživatelem",
help_text="Informace není veřejně přístupná. Pokud vytváříš novou smlouvu, budeš to ty.",
) # WARNING: exclude in admin
class LegalStates(models.TextChoices):
......@@ -377,8 +330,7 @@ class Contract(models.Model):
INVALID = "invalid", "Neplatná"
class PublicStates(models.TextChoices):
UNKNOWN = "unknown", "Nová"
YES = "yes", "Zveřejněná"
YES = "yes", "Veřejná"
NO = "no", "Neveřejná"
class PaperFormStates(models.TextChoices):
......@@ -407,7 +359,7 @@ class Contract(models.Model):
public_status_set_by = models.ForeignKey(
User,
on_delete=models.CASCADE,
on_delete=models.SET_NULL,
blank=True,
null=True,
related_name="public_status_altered_contracts",
......@@ -438,7 +390,9 @@ class Contract(models.Model):
issues = models.ManyToManyField(
ContractIssue,
verbose_name="Problémy",
blank=True,
)
notes = MarkdownxField(
blank=True,
null=True,
......@@ -455,20 +409,36 @@ class Contract(models.Model):
primary_contract = models.ForeignKey(
"Contract",
on_delete=models.CASCADE,
on_delete=models.SET_NULL, # TODO: Figure out if we want this behavior
blank=True,
null=True,
related_name="subcontracts",
verbose_name="Hlavní smlouva",
) # WARNING: Dependent on the type!
expected_cost_total = models.IntegerField(verbose_name="Očekáváná celková cena")
expected_cost_total = models.IntegerField(
blank=True,
null=True,
verbose_name="Očekáváná celková cena",
)
expected_cost_year = models.IntegerField(verbose_name="Očekáváná cena za rok")
expected_cost_year = models.IntegerField(
blank=True,
null=True,
verbose_name="Očekáváná cena za rok",
)
expected_cost_month = models.IntegerField(verbose_name="Očekáváná cena za měsíc")
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(verbose_name="Očekáváná cena za hodinu")
expected_cost_hour = models.IntegerField(
blank=True,
null=True,
verbose_name="Očekáváná cena za hodinu",
)
agreement_url = models.URLField(
max_length=256,
......@@ -479,7 +449,7 @@ class Contract(models.Model):
filing_area = models.ForeignKey(
ContractFilingArea,
on_delete=models.CASCADE,
on_delete=models.SET_NULL,
blank=True,
null=True,
related_name="filed_contracts",
......@@ -524,6 +494,60 @@ class ContractFile(NameStrMixin, models.Model):
verbose_name_plural = "Soubory"
class ContracteeSignature(models.Model):
contractee = models.ForeignKey(
Contractee,
on_delete=models.CASCADE,
related_name="signatures",
verbose_name="Smluvní strana",
)
contract = models.ForeignKey(
Contract,
on_delete=models.CASCADE,
related_name="contractee_signatures",
verbose_name="Podpisy našich smluvních stran",
)
date = models.DateField(
verbose_name="Datum podpisu",
)
class Meta:
verbose_name = "Podpis naší smluvní strany"
verbose_name_plural = "Podpisy našich smluvních stran"
def __str__(self) -> str:
return f"{self.contractee.name}, {self.date}"
class SigneeSignature(models.Model):
signee = models.ForeignKey(
Signee,
on_delete=models.CASCADE,
related_name="signatures",
verbose_name="Smluvní strana",
)
contract = models.ForeignKey(
Contract,
on_delete=models.CASCADE,
related_name="signee_signatures",
verbose_name="Podpisy jiných smluvních stran",
)
date = models.DateField(
verbose_name="Datum podpisu",
)
class Meta:
verbose_name = "Podpis jiné smluvní strany"
verbose_name_plural = "Podpisy ostatních smluvních stran"
def __str__(self) -> str:
return f"{self.signee.name}, {self.date}"
class ContractIntent(models.Model):
url = models.URLField(
max_length=256,
......
......@@ -15,6 +15,7 @@
- `Zástupce naší smluvní strany` (propojený s `Naší smluvní stranou`):
- Celé jméno
- Funkce
- Role
- `Podpis naší smluvní strany` (propojený se `Smlouvou`):
- Datum
......@@ -38,6 +39,7 @@
- `Zástupce druhé smluvní strany` (propojený s `Druhou smluvní stranou`):
- Celé jméno
- Funkce
- Role
- `Podpis druhé smluvní strany` (propojený se `Smlouvou`):
- Datum
......@@ -54,6 +56,10 @@
- `Problém` (propojený se `Smlouvou`):
- Jméno
- `Soubor` (propojený se `Smlouvou`):
- Jméno
- Obsah souboru (např. PDF)
- `Spisovna` (existuje nezávisle):
- Jméno
- Jméno odpovědné osoby
......@@ -93,8 +99,7 @@
- `Problémy`
- Poznámky - sdílený textový blok
- Sumarizace
- PDF originální smlouvy
- PDF anonymizované smlouvy
- `Soubory`
- (Pouze pro dodatky a objednávky) hlavní `Smlouva`
- Očekávaná cena za:
- Celkem
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment