From 8f6876007589d5e9ff5b6ca2c3d5774f54460042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org> Date: Wed, 15 Feb 2023 14:53:49 +0900 Subject: [PATCH] add admin interface --- contracts/admin.py | 35 ++++++++++++++++++- contracts/forms.py | 11 ++++++ contracts/models.py | 8 ++++- static_src/admin/contract_form.js | 57 +++++++++++++++++++++++++++++++ webpack.config.js | 6 +++- 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 contracts/forms.py create mode 100644 static_src/admin/contract_form.js diff --git a/contracts/admin.py b/contracts/admin.py index a9093aa..1eb707c 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -2,6 +2,7 @@ from django.contrib import admin from shared.admin import MarkdownxGuardedModelAdmin +from .forms import ContractAdminForm from .models import ( Contract, Contractee, @@ -22,6 +23,37 @@ class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin): return False +class ContractAdmin(MarkdownxGuardedModelAdmin): + form = ContractAdminForm + + fields = ( + "type", + "subtype", + "signee_signature", + "contractee_signatures", + "valid_start_date", + "valid_end_date", + "legal_state", + "public_state", + "paper_form_state", + "publishing_rejection_comment", + "tender_url", + "identifier", + "issues", + "notes", + "summary", + "anonymized_contract_file", + "original_contract_file", + "primary_contract", + "expected_cost_total", + "expected_cost_year", + "expected_cost_month", + "expected_cost_hour", + "agreement_url", + "filing_area", + ) + + for model in ( SigneeRepresentative, SigneeSignature, @@ -37,6 +69,7 @@ for model in ( Contractee, ContractIssue, ContractFilingArea, - Contract, ): admin.site.register(model, MarkdownxGuardedModelAdmin) + +admin.site.register(Contract, ContractAdmin) diff --git a/contracts/forms.py b/contracts/forms.py new file mode 100644 index 0000000..f5d1c5a --- /dev/null +++ b/contracts/forms.py @@ -0,0 +1,11 @@ +from django import forms +from webpack_loader.loader import WebpackLoader + + +class ContractAdminForm(forms.ModelForm): + class Media: + js = ( + "shared/runtime.js", + "shared/shared.js", + "shared/admin_contract_form.js", + ) diff --git a/contracts/models.py b/contracts/models.py index f3b62b7..b9f8446 100644 --- a/contracts/models.py +++ b/contracts/models.py @@ -68,6 +68,7 @@ class SigneeRepresentative(models.Model): Signee, on_delete=models.CASCADE, related_name="representatives", + verbose_name="Smluvní strana", ) name = models.CharField( @@ -90,6 +91,7 @@ class SigneeSignature(models.Model): Signee, on_delete=models.CASCADE, related_name="signatures", + verbose_name="Smluvní strana", ) date = models.DateField( @@ -162,6 +164,7 @@ class ContracteeRepresentative(models.Model): Contractee, on_delete=models.CASCADE, related_name="representatives", + verbose_name="Smluvní strana", ) name = models.CharField( @@ -184,6 +187,7 @@ class ContracteeSignature(models.Model): Contractee, on_delete=models.CASCADE, related_name="signatures", + verbose_name="Smluvní strana", ) date = models.DateField( @@ -334,7 +338,7 @@ class Contract(models.Model): null=True, verbose_name="Důvod nezveřejnění", help_text="Obsah není veřejně přístupný.", - ) # WARNING: exclude in admin + ) # WARNING: public status dependent tender_url = models.URLField( max_length=256, @@ -406,6 +410,7 @@ class Contract(models.Model): blank=True, null=True, related_name="filed_contracts", + verbose_name="Spisovna", help_text="Obsah není veřejně přístupný.", ) # WARNING: Dependent on the type! @@ -426,6 +431,7 @@ class ContractIntent(models.Model): Contract, on_delete=models.CASCADE, related_name="intents", + verbose_name="Smlouva", ) class Meta: diff --git a/static_src/admin/contract_form.js b/static_src/admin/contract_form.js new file mode 100644 index 0000000..a3672ce --- /dev/null +++ b/static_src/admin/contract_form.js @@ -0,0 +1,57 @@ +import $ from "jquery"; + +$(window).ready( + () => { + $(".field-publishing_rejection_comment"). + css( + "display", + ( + ($("#id_public_state").find(":selected").val() === "no") ? + "block": "none" + ) + ); + + const allowedPrimaryContractValues = new Set(["amendment", "framework_order"]); + + $(".field-primary_contract"). + css( + "display", + ( + ( + allowedPrimaryContractValues.has( + $("#id_type").find(":selected").val() + ) + ) ? + "block": "none" + ) + ); + + $("#id_public_state").on( + "change", + event => { + $(".field-publishing_rejection_comment"). + css( + "display", + ( + ($(event.target).val() === "no") ? + "block" : "none" + ) + ); + } + ); + + $("#id_type").on( + "change", + event => { + $(".field-primary_contract"). + css( + "display", + ( + (allowedPrimaryContractValues.has($(event.target).val())) ? + "block": "none" + ) + ); + } + ); + } +); diff --git a/webpack.config.js b/webpack.config.js index 5fd3468..579381e 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,11 +9,15 @@ module.exports = { import: path.resolve("static_src", "base.js"), dependOn: "shared", }, + admin_contract_form: { + import: path.resolve("static_src", "admin", "contract_form.js"), + dependOn: "shared", + }, shared: ["jquery"], }, output: { path: path.resolve(__dirname, "shared", "static", "shared"), - filename: "[name]-[fullhash].js", + filename: "[name].js", // Whitenoise takes care of hashes for us }, module: { rules: [ -- GitLab