diff --git a/README.md b/README.md index 7cae97a9485381e0eb844751fd42d8e7ea039434..17cd5641e4be239f4c3dd597b77f82c5beace004 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Je třeba definovat minimálně následující environment proměnné: | `DEFAULT_CONTRACTEE_ZIP` | Defaultní PSČ naší podepisující strany | | `DEFAULT_CONTRACTEE_DISTRICT` | Defaultní obec naší podepisující strany | | `DEFAULT_CONTRACTEE_ICO_NUMBER` | Defaultní IČO naší podepisující strany | +| `DEFAULT_STAFF_GROUP` | Defaultní skupina pro přihlášené uživatele, která bude mít přístup k vytváření smluv | V produkci je potřeba: | proměnná | popis | diff --git a/contracts/admin.py b/contracts/admin.py index ef8ee1950457a28a91705d435e0d6c3758811dad..5f218830333aefd679dd8305740aef508b367d46 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -4,11 +4,7 @@ from django.contrib import admin from django.utils.html import format_html from fieldsets_with_inlines import FieldsetsInlineMixin from import_export import resources -from nested_admin import ( - NestedModelAdmin, - NestedStackedInline, - NestedTabularInline, -) +from nested_admin import NestedModelAdmin, NestedStackedInline, NestedTabularInline from rangefilter.filters import DateRangeFilter from shared.admin import MarkdownxGuardedModelAdmin @@ -306,14 +302,10 @@ class SigneeAdmin(MarkdownxGuardedModelAdmin): "date_of_birth", ) - if ( - obj is None # Allowed to create - or request.user.has_perm("contracts.edit_signee", obj) + if obj is None or request.user.has_perm( # Allowed to create + "contracts.edit_signee", obj ): - fields.insert( - fields.index("ico_number"), - "load_ares_data_button" - ) + fields.insert(fields.index("ico_number"), "load_ares_data_button") return fields diff --git a/contracts/migrations/0009_alter_contractfile_file.py b/contracts/migrations/0009_alter_contractfile_file.py index 798582d85ee3d0b32f2e8a0d24362baa490905d6..001a84aca5edfda69e505393dbf822b7f816faf0 100644 --- a/contracts/migrations/0009_alter_contractfile_file.py +++ b/contracts/migrations/0009_alter_contractfile_file.py @@ -4,15 +4,14 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0008_alter_contracteesignaturerepresentative_options_and_more'), + ("contracts", "0008_alter_contracteesignaturerepresentative_options_and_more"), ] operations = [ migrations.AlterField( - model_name='contractfile', - name='file', - field=models.FileField(upload_to='_private/', verbose_name='Soubor'), + model_name="contractfile", + name="file", + field=models.FileField(upload_to="_private/", verbose_name="Soubor"), ), ] diff --git a/contracts/migrations/0010_alter_contractee_address_country_and_more.py b/contracts/migrations/0010_alter_contractee_address_country_and_more.py index 02a13a807101907d6e32bb2a3952f31d727aea1d..efd80315f9e63fcb8ea981ed946403da05bab24b 100644 --- a/contracts/migrations/0010_alter_contractee_address_country_and_more.py +++ b/contracts/migrations/0010_alter_contractee_address_country_and_more.py @@ -4,20 +4,23 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0009_alter_contractfile_file'), + ("contracts", "0009_alter_contractfile_file"), ] operations = [ migrations.AlterField( - model_name='contractee', - name='address_country', - field=models.CharField(default='Česká Republika', max_length=256, verbose_name='Země'), + model_name="contractee", + name="address_country", + field=models.CharField( + default="Česká Republika", max_length=256, verbose_name="Země" + ), ), migrations.AlterField( - model_name='signee', - name='address_country', - field=models.CharField(default='Česká Republika', max_length=256, verbose_name='Země'), + model_name="signee", + name="address_country", + field=models.CharField( + default="Česká Republika", max_length=256, verbose_name="Země" + ), ), ] diff --git a/contracts/migrations/0011_alter_contractee_address_country_and_more.py b/contracts/migrations/0011_alter_contractee_address_country_and_more.py index 4534288ebfcc19bb00ebd631017947c70cfe0b38..ca2fa476a869c44c61439af3c29994c73ebaec64 100644 --- a/contracts/migrations/0011_alter_contractee_address_country_and_more.py +++ b/contracts/migrations/0011_alter_contractee_address_country_and_more.py @@ -4,20 +4,19 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0010_alter_contractee_address_country_and_more'), + ("contracts", "0010_alter_contractee_address_country_and_more"), ] 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/migrations/0012_alter_contractee_address_country_and_more.py b/contracts/migrations/0012_alter_contractee_address_country_and_more.py index 357e466c1759b747ab0ac35f80b0c3144cd5fd67..7264112c5c786b307362aeb12ea8ba7a1eb551c0 100644 --- a/contracts/migrations/0012_alter_contractee_address_country_and_more.py +++ b/contracts/migrations/0012_alter_contractee_address_country_and_more.py @@ -4,20 +4,23 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0011_alter_contractee_address_country_and_more'), + ("contracts", "0011_alter_contractee_address_country_and_more"), ] operations = [ migrations.AlterField( - model_name='contractee', - name='address_country', - field=models.CharField(default='Česká Republika', max_length=256, verbose_name='Země'), + model_name="contractee", + name="address_country", + field=models.CharField( + default="Česká Republika", max_length=256, verbose_name="Země" + ), ), migrations.AlterField( - model_name='signee', - name='address_country', - field=models.CharField(default='Česká Republika', max_length=256, verbose_name='Země'), + model_name="signee", + name="address_country", + field=models.CharField( + default="Česká Republika", max_length=256, verbose_name="Země" + ), ), ] diff --git a/contracts/migrations/0013_alter_contractee_address_country_and_more.py b/contracts/migrations/0013_alter_contractee_address_country_and_more.py index e2f5af7719a7b34749d68ee6066b62eb0d3b19ed..7360f236df9c021f9f06f3c1710859fe78030336 100644 --- a/contracts/migrations/0013_alter_contractee_address_country_and_more.py +++ b/contracts/migrations/0013_alter_contractee_address_country_and_more.py @@ -4,20 +4,19 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('contracts', '0012_alter_contractee_address_country_and_more'), + ("contracts", "0012_alter_contractee_address_country_and_more"), ] 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/templates/contracts/view_contract.html b/contracts/templates/contracts/view_contract.html index 2dd519afa506d80dd656069ebfa6293c35d3dcfd..b533e30a10b2272036e3ade21afbc0af37f4ea24 100644 --- a/contracts/templates/contracts/view_contract.html +++ b/contracts/templates/contracts/view_contract.html @@ -407,7 +407,7 @@ {% if user.can_view_confidential %} <div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block"> {% endif %} - + <div> {% if not signature.signee.entity_has_public_address %} {% if user.can_view_confidential %} diff --git a/contracts/templates/contracts/view_signee.html b/contracts/templates/contracts/view_signee.html index 85f7d52c499be290ca500557d1114c87204284bc..00856b663c5863dca48626af3060843ea15a6ecd 100644 --- a/contracts/templates/contracts/view_signee.html +++ b/contracts/templates/contracts/view_signee.html @@ -29,7 +29,7 @@ {% if user.can_view_confidential %} <div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block"> {% endif %} - + <div> {% if not signee.entity_has_public_address %} {% if user.can_view_confidential %} diff --git a/contracts/views.py b/contracts/views.py index b502c93f211e7deef4a42e3eec333e2a862205b2..c2b4915607a99dc6a8d22195767536125c611a86 100644 --- a/contracts/views.py +++ b/contracts/views.py @@ -46,10 +46,7 @@ def get_pagination(request, objects) -> tuple: return page, paginator -def get_paginated_contracts( - request, - filter: typing.Union[None, dict] = None -) -> tuple: +def get_paginated_contracts(request, filter: typing.Union[None, dict] = None) -> tuple: if filter is None: filter = {} @@ -268,18 +265,12 @@ def view_contract_issues(request): **get_base_context(request), "title": ( "Poznámky" - if ( - request.user.is_anonymous - or not request.user.can_view_confidential - ) + if (request.user.is_anonymous or not request.user.can_view_confidential) else "Problémy" ), "description": ( "Poznámky ke smlouvám." - if ( - request.user.is_anonymous - or not request.user.can_view_confidential - ) + if (request.user.is_anonymous or not request.user.can_view_confidential) else "Problémy se smlouvami." ), "page": page, diff --git a/env.example b/env.example index 3a72fc29c7ada2c915b6b9ef1323870869612732..38e326158c3f703a3db62b30070ee5f73507e5e3 100644 --- a/env.example +++ b/env.example @@ -15,3 +15,5 @@ DEFAULT_CONTRACTEE_STREET="Na Moráni 360/3" DEFAULT_CONTRACTEE_ZIP="128 00" DEFAULT_CONTRACTEE_DISTRICT="Praha 2" DEFAULT_CONTRACTEE_ICO_NUMBER="71339698" + +DEFAULT_STAFF_GROUP="sso_cen:f" diff --git a/media_server/apps.py b/media_server/apps.py index 6a7dc443704f73901f1122bd07754e3c65df5cda..4aff1ea9e92371e7e70bb043a67dd347b60b3dce 100644 --- a/media_server/apps.py +++ b/media_server/apps.py @@ -2,5 +2,5 @@ from django.apps import AppConfig class MediaServerConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'media_server' + default_auto_field = "django.db.models.BigAutoField" + name = "media_server" diff --git a/media_server/views.py b/media_server/views.py index e803d5669fa1051af213c58faa18a018d9ece01b..370803dd04a396d2ee3c1946d80d853a84796d9e 100644 --- a/media_server/views.py +++ b/media_server/views.py @@ -4,7 +4,6 @@ from django.core.files.storage import FileSystemStorage from django_downloadview import StorageDownloadView from django_http_exceptions import HTTPExceptions - # Create your views here. storage = FileSystemStorage() diff --git a/oidc/auth.py b/oidc/auth.py index 975d82757265c2d41f53ce7f6c6a345bfacc9252..78db0561d5e9aa27cf1230f4f386588976ac3d68 100644 --- a/oidc/auth.py +++ b/oidc/auth.py @@ -1,9 +1,9 @@ -import typing import logging +import typing import jwt -from django.contrib.auth.models import Group from django.conf import settings +from django.contrib.auth.models import Group from pirates.auth import PiratesOIDCAuthenticationBackend logging.basicConfig(level=logging.DEBUG) @@ -11,10 +11,7 @@ logging.basicConfig(level=logging.DEBUG) class RegistryOIDCAuthenticationBackend(PiratesOIDCAuthenticationBackend): def _assign_new_user_groups( - self, - user, - access_token: dict, - user_groups: typing.Union[None, list] = None + self, user, access_token: dict, user_groups: typing.Union[None, list] = None ) -> None: if user_groups is None: user_groups = user.groups.all() @@ -37,10 +34,7 @@ class RegistryOIDCAuthenticationBackend(PiratesOIDCAuthenticationBackend): user.groups.add(group) def _remove_old_user_groups( - self, - user, - access_token: dict, - user_groups: typing.Union[None, list] = None + self, user, access_token: dict, user_groups: typing.Union[None, list] = None ) -> None: if user_groups is None: user_groups = user.groups.all() @@ -62,14 +56,10 @@ class RegistryOIDCAuthenticationBackend(PiratesOIDCAuthenticationBackend): user_groups = user.groups.all() self._remove_old_user_groups( - user, - decoded_access_token, - user_groups=user_groups + user, decoded_access_token, user_groups=user_groups ) self._assign_new_user_groups( - user, - decoded_access_token, - user_groups=user_groups + user, decoded_access_token, user_groups=user_groups ) user.update_group_based_admin() diff --git a/registry/settings/base.py b/registry/settings/base.py index 6ff6fa8a11b23393ea659aa92ee0f88bc9d600c7..cab7789c654a8c2b3242f3c09eb8e806daa748d4 100644 --- a/registry/settings/base.py +++ b/registry/settings/base.py @@ -225,3 +225,5 @@ DEFAULT_CONTRACTEE_ZIP = env.str("DEFAULT_CONTRACTEE_ZIP") DEFAULT_CONTRACTEE_DISTRICT = env.str("DEFAULT_CONTRACTEE_DISTRICT") DEFAULT_COUNTRY = env.str("DEFAULT_COUNTRY") DEFAULT_CONTRACTEE_ICO_NUMBER = env.str("DEFAULT_CONTRACTEE_ICO_NUMBER") + +DEFAULT_STAFF_GROUP = "sso_cen:f" diff --git a/run.sh b/run.sh index f9c9d4f10b89680873d203d95df033ca1f59f179..e0d1d7a7e9f84107e736c700cfc5225226ed8ee5 100644 --- a/run.sh +++ b/run.sh @@ -4,7 +4,6 @@ set -e # Migrate database -python manage.py makemigrations # Custom Group model python manage.py migrate # Start webserver diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html index 22bcd06070029f355b850814685dacb94a9e5ebb..81c1643e1bb58085ada43b2058813e9fb1deec21 100644 --- a/shared/templates/shared/includes/base.html +++ b/shared/templates/shared/includes/base.html @@ -74,7 +74,7 @@ <ul class="navbar-menu text-white"> {% if user.is_staff %} <li class="navbar-menu__item"> - <a + <a href="{% url "admin:index" %}" data-href="{% url "admin:index" %}" class="navbar-menu__link flex items-center gap-2" diff --git a/users/migrations/0002_user_is_staff_based_on_group.py b/users/migrations/0002_user_is_staff_based_on_group.py index 2f3b12c3a6a264e05934c2ff99d18fb5c6fece10..69e8343010a11e39907faeb6deecd12e6d7c8938 100644 --- a/users/migrations/0002_user_is_staff_based_on_group.py +++ b/users/migrations/0002_user_is_staff_based_on_group.py @@ -4,15 +4,16 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('users', '0001_initial'), + ("users", "0001_initial"), ] operations = [ migrations.AddField( - model_name='user', - name='is_staff_based_on_group', - field=models.BooleanField(default=True, verbose_name='Admin přístup dle členství ve skupině'), + model_name="user", + name="is_staff_based_on_group", + field=models.BooleanField( + default=True, verbose_name="Admin přístup dle členství ve skupině" + ), ), ] diff --git a/users/migrations/0003_alter_user_is_staff_based_on_group.py b/users/migrations/0003_alter_user_is_staff_based_on_group.py index e08a2ff2bcb09d5c658a728a7894c8f868f3b3b3..fef5f63e13b313556a406edd72861379533278c6 100644 --- a/users/migrations/0003_alter_user_is_staff_based_on_group.py +++ b/users/migrations/0003_alter_user_is_staff_based_on_group.py @@ -4,15 +4,18 @@ from django.db import migrations, models class Migration(migrations.Migration): - dependencies = [ - ('users', '0002_user_is_staff_based_on_group'), + ("users", "0002_user_is_staff_based_on_group"), ] operations = [ migrations.AlterField( - model_name='user', - name='is_staff_based_on_group', - field=models.BooleanField(default=True, help_text='Určuje, zda bude "Administrační přístup" uživatele definován dle členství ve skupinách, nebo podle speciálního nastavení zde.', verbose_name='Administrační přístup dle členství ve skupině'), + model_name="user", + name="is_staff_based_on_group", + field=models.BooleanField( + default=True, + help_text='Určuje, zda bude "Administrační přístup" uživatele definován dle členství ve skupinách, nebo podle speciálního nastavení zde.', + verbose_name="Administrační přístup dle členství ve skupině", + ), ), ] diff --git a/users/models.py b/users/models.py index 6683ec6c2ce806f900bda8f1cbf2c1b523711db0..2d39275f6dd35d51bef50bc48add16205b8f24e0 100644 --- a/users/models.py +++ b/users/models.py @@ -1,5 +1,6 @@ -from django.db import models +from django.conf import settings from django.contrib.auth.models import Group +from django.db import models from pirates import models as pirates_models @@ -8,10 +9,10 @@ class User(pirates_models.AbstractUser): default=True, verbose_name="Administrační přístup dle členství ve skupině", help_text=( - "Určuje, zda bude \"Administrační přístup\" uživatele " + 'Určuje, zda bude "Administrační přístup" uživatele ' "definován dle členství ve skupinách, nebo podle " "speciálního nastavení zde." - ) + ), ) def set_unusable_password(self) -> None: @@ -46,12 +47,7 @@ class User(pirates_models.AbstractUser): # customization to store the original field values on the instance instance._loaded_values = dict( zip( - field_names, - ( - value - for value in values - if value is not models.DEFERRED - ) + field_names, (value for value in values if value is not models.DEFERRED) ) ) @@ -72,7 +68,7 @@ class User(pirates_models.AbstractUser): return self.is_staff_based_on_group = True - self.is_staff = self.groups.filter(is_staff=True).exists() + self.is_staff = self.groups.filter(name=settings.DEFAULT_STAFF_GROUP).exists() @property def can_approve_contracts(self) -> bool: @@ -99,12 +95,3 @@ class User(pirates_models.AbstractUser): app_label = "users" verbose_name = "Uživatel" verbose_name_plural = "Uživatelé" - - -if not hasattr(Group, "is_staff"): - is_staff = models.BooleanField( - default=False, - verbose_name="Administrační přístup", - help_text="Určuje, zda se skupina může přihlásit do správy tohoto webu.", - ) - is_staff.contribute_to_class(Group, "is_staff")