diff --git a/contracts/admin.py b/contracts/admin.py index a5474b072572315009a6e7951f313b3fedb9333b..f528005365d039ae6b9d4771fb711a6d790f613e 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -1,3 +1,5 @@ +from admin_extra_buttons.api import ExtraButtonsMixin, button +from admin_extra_buttons.utils import HttpResponseRedirectToReferrer from dal_admin_filters import AutocompleteFilter from django.contrib import admin from django.utils.html import format_html @@ -73,7 +75,7 @@ class ContractIntentInline(admin.TabularInline): extra = 0 -class ContractAdmin(MarkdownxGuardedModelAdmin): +class ContractAdmin(ExtraButtonsMixin, MarkdownxGuardedModelAdmin): form = ContractAdminForm readonly_fields = ("created_by",) @@ -85,6 +87,22 @@ class ContractAdmin(MarkdownxGuardedModelAdmin): ContractIntentInline, ) + @button( + permission="contracts.approve", + label="Schválit", + change_form=True, + html_attrs={ + "style": "background-color:var(--admin-interface-save-button-background-color);" + "color:var(--admin-interface-save-button-text-color)" + } + ) + def approve(self, request): + + + self.message_user(request, "Smlouva schválena.") + + return HttpResponseRedirectToReferrer(request) + def get_fieldsets(self, request, obj=None): fieldsets = [ ( diff --git a/registry/settings/base.py b/registry/settings/base.py index 333f1295adbd8915a4b3d015f9eccde2e3dd59f0..7849f65dec14b7860058d04fc1493f201d5819cb 100644 --- a/registry/settings/base.py +++ b/registry/settings/base.py @@ -50,19 +50,20 @@ INSTALLED_APPS = [ "dal_admin_filters", "django_admin_index", "ordered_model", - "shared", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "admin_extra_buttons", "import_export", "rangefilter", "guardian", "markdownx", "pirates", "webpack_loader", + "shared", "contracts", "oidc", "users", @@ -86,7 +87,7 @@ TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ - os.path.join(BASE_DIR, "registry") + os.path.join(BASE_DIR, "registry", "templates") ], "APP_DIRS": True, "OPTIONS": { diff --git a/registry/templates/admin/base.html b/registry/templates/admin/base.html deleted file mode 100644 index 103f27d5a47f2943608c2b206ded2e578beb3297..0000000000000000000000000000000000000000 --- a/registry/templates/admin/base.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends 'admin/base.html' %} - -{% block extrastyle %}{{ block.super }} -<style> - :root { - --djai-tab-bg: #ff0080; - --djai-tab-bg--hover: #a91b60; - } -</style> -{% endblock %} diff --git a/registry/templates/admin/base_site.html b/registry/templates/admin/base_site.html new file mode 100644 index 0000000000000000000000000000000000000000..20560f91810163da950f74064fc5c50f9580c662 --- /dev/null +++ b/registry/templates/admin/base_site.html @@ -0,0 +1,34 @@ +{% extends 'admin/base_site.html' %} + +{% block extrastyle %}{{ block.super }} +<style> + :root { + --djai-tab-bg: #000 !important; + --djai-tab-bg--active: #424242 !important; + --djai-tab-bg--hover: #424242 !important; + --djai-dropdown-bg: #424242 !important; + --djai-dropdown-bg--active: #5e5e5e !important; + --djai-dropdown-bg--hover: #5e5e5e !important; + } + + .index-action-buttons { + display: flex; + flex-direction: row; + row-gap: 10px; + } + + .index-action-buttons button, + .index-action-buttons [aria-role="button"], + .index-action-buttons button:visited, + .index-action-buttons [aria-role="button"]:visited, + .index-action-buttons button:hover, + .index-action-buttons [aria-role="button"]:hover { + padding: 10px 15px; + margin-bottom: 15px; + background-color: var(--admin-interface-module-background-color) !important; + color: var(--admin-interface-module-text-color) !important; + border-radius: var(--admin-interface-module-border-radius) !important; + text-decoration: none !important; + } +</style> +{% endblock %} diff --git a/registry/templates/admin/index.html b/registry/templates/admin/index.html new file mode 100644 index 0000000000000000000000000000000000000000..be5f8f584b9ea89b3e92aeb306b25de32b31e639 --- /dev/null +++ b/registry/templates/admin/index.html @@ -0,0 +1,16 @@ +{% extends "admin/index.html" %} + +{% block content %} + +{% if request.user.can_approve_contracts %} + <div class="index-action-buttons"> + <a + href="contracts/contract/?approval_state__exact=no" + aria-role="button" + >Smlouvy ke schválení ({{ request.user.contracts_to_approve_count }})</a> + </div> +{% endif %} + +{{ block.super }} + +{% endblock %} diff --git a/requirements/base.txt b/requirements/base.txt index 9fd8bfa52a579ef340992f7d117b5ac379d74d29..ade0d47a3c92ea62029ee484bb974c6a3e36a264 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,6 @@ dal-admin-filters==1.1.0 django==4.1.4 +django-admin-extra-buttons==1.5.6 django-admin-index==2.0.2 django-admin-interface==0.24.2 django-admin-rangefilter==0.9.0 diff --git a/users/models.py b/users/models.py index 6334f7199c12eed982f8859e6ce109b424be1f9c..52074a4ad16afef593a5d1413baecf7f4be6cc79 100644 --- a/users/models.py +++ b/users/models.py @@ -14,6 +14,22 @@ class User(pirates_models.AbstractUser): return f"{first_name}{self.last_name}" + @property + def can_approve_contracts(self) -> bool: + # TODO: Do we need the superuser check? + return self.is_superuser or self.has_perm("contracts.approve") + + @property + def contracts_to_approve_count(self) -> int: + if not self.can_approve_contracts: + return 0 + + from contracts.models import Contract + + return Contract.objects.filter( + approval_state=Contract.ApprovalStates.NO + ).count() + class Meta: app_label = "users" verbose_name = "Uživatel"