From 73507b7369702ccf288ea77847b3878f60496445 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Fri, 24 Mar 2023 14:03:14 +0100
Subject: [PATCH] stop using custom groups, use DEFAULT_STAFF_GROUP

---
 README.md                                     |  1 +
 contracts/admin.py                            | 16 +++---------
 .../0009_alter_contractfile_file.py           |  9 +++----
 ...ter_contractee_address_country_and_more.py | 19 ++++++++------
 ...ter_contractee_address_country_and_more.py | 15 ++++++-----
 ...ter_contractee_address_country_and_more.py | 19 ++++++++------
 ...ter_contractee_address_country_and_more.py | 15 ++++++-----
 .../templates/contracts/view_contract.html    |  2 +-
 .../templates/contracts/view_signee.html      |  2 +-
 contracts/views.py                            | 15 +++--------
 env.example                                   |  2 ++
 media_server/apps.py                          |  4 +--
 media_server/views.py                         |  1 -
 oidc/auth.py                                  | 22 +++++-----------
 registry/settings/base.py                     |  2 ++
 run.sh                                        |  1 -
 shared/templates/shared/includes/base.html    |  2 +-
 .../0002_user_is_staff_based_on_group.py      | 11 ++++----
 ...0003_alter_user_is_staff_based_on_group.py | 13 ++++++----
 users/models.py                               | 25 +++++--------------
 20 files changed, 83 insertions(+), 113 deletions(-)

diff --git a/README.md b/README.md
index 7cae97a..17cd564 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 ef8ee19..5f21883 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 798582d..001a84a 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 02a13a8..efd8031 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 4534288..ca2fa47 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 357e466..7264112 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 e2f5af7..7360f23 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 2dd519a..b533e30 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 85f7d52..00856b6 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 b502c93..c2b4915 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 3a72fc2..38e3261 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 6a7dc44..4aff1ea 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 e803d56..370803d 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 975d827..78db056 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 6ff6fa8..cab7789 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 f9c9d4f..e0d1d7a 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 22bcd06..81c1643 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 2f3b12c..69e8343 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 e08a2ff..fef5f63 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 6683ec6..2d39275 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")
-- 
GitLab