Skip to content
Snippets Groups Projects
Verified Commit f9397b6d authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Auto-select primary group if pattern is configured

parent 78cbcb78
No related branches found
No related tags found
1 merge request!196Resolve "Select primary group if unset"
Pipeline #1141 failed
from typing import Any, List, Optional, Tuple from typing import Any, List, Optional, Tuple
import django.apps import django.apps
from django.contrib.auth.signals import user_logged_in
from django.http import HttpRequest
from .signals import clean_scss from .signals import clean_scss
from .util.apps import AppConfig from .util.apps import AppConfig
from .util.core_helpers import has_person
class CoreConfig(AppConfig): class CoreConfig(AppConfig):
...@@ -29,3 +32,10 @@ class CoreConfig(AppConfig): ...@@ -29,3 +32,10 @@ class CoreConfig(AppConfig):
apps.get_model("otp_yubikey", "ValidationService").objects.using(using).update_or_create( apps.get_model("otp_yubikey", "ValidationService").objects.using(using).update_or_create(
name="default", defaults={"use_ssl": True, "param_sl": "", "param_timeout": ""} name="default", defaults={"use_ssl": True, "param_sl": "", "param_timeout": ""}
) )
def user_logged_in(
self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs
) -> None:
if has_person(user):
# Save the associated person to pick up defaults
user.person.save()
...@@ -176,8 +176,6 @@ class Person(ExtensibleModel): ...@@ -176,8 +176,6 @@ class Person(ExtensibleModel):
return f"{self.first_name} {self.last_name}" return f"{self.first_name} {self.last_name}"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super().save(*args, **kwargs)
# Synchronise user fields to linked User object to keep it up to date # Synchronise user fields to linked User object to keep it up to date
if self.user: if self.user:
self.user.first_name = self.first_name self.user.first_name = self.first_name
...@@ -185,6 +183,9 @@ class Person(ExtensibleModel): ...@@ -185,6 +183,9 @@ class Person(ExtensibleModel):
self.user.email = self.email self.user.email = self.email
self.user.save() self.user.save()
self.auto_select_primary_group()
super().save(*args, **kwargs)
def __str__(self) -> str: def __str__(self) -> str:
return self.full_name return self.full_name
...@@ -204,6 +205,21 @@ class Person(ExtensibleModel): ...@@ -204,6 +205,21 @@ class Person(ExtensibleModel):
person = Person(user=admin) person = Person(user=admin)
person.save() person.save()
def auto_select_primary_group(self, pattern: Optional[str] = None, force: bool = False) -> None:
""" Auto-select the primary group among the groups the person is member of
Uses either the pattern passed as argument, or the pattern configured system-wide.
Does not do anything if either no pattern is defined or the user already has
a primary group, unless force is True.
"""
pattern = pattern or config.PRIMARY_GROUP_PATTERN
if pattern:
if force or not self.primary_group:
self.primary_group = self.member_of.filter(name__regex=pattern).first()
class Group(ExtensibleModel): class Group(ExtensibleModel):
"""Any kind of group of persons in a school, including, but not limited """Any kind of group of persons in a school, including, but not limited
......
...@@ -2,7 +2,9 @@ from importlib import import_module ...@@ -2,7 +2,9 @@ from importlib import import_module
from typing import Any, List, Optional, Tuple from typing import Any, List, Optional, Tuple
import django.apps import django.apps
from django.contrib.auth.signals import user_logged_in, user_logged_out
from django.db.models.signals import post_migrate, pre_migrate from django.db.models.signals import post_migrate, pre_migrate
from django.http import HttpRequest
from constance.signals import config_updated from constance.signals import config_updated
...@@ -26,6 +28,8 @@ class AppConfig(django.apps.AppConfig): ...@@ -26,6 +28,8 @@ class AppConfig(django.apps.AppConfig):
pre_migrate.connect(self.pre_migrate, sender=self) pre_migrate.connect(self.pre_migrate, sender=self)
post_migrate.connect(self.post_migrate, sender=self) post_migrate.connect(self.post_migrate, sender=self)
config_updated.connect(self.config_updated) config_updated.connect(self.config_updated)
user_logged_in.connect(self.user_logged_in)
user_logged_out.connect(self.user_logged_out)
# Getting an app ready means it should look at its config once # Getting an app ready means it should look at its config once
self.config_updated() self.config_updated()
...@@ -82,6 +86,24 @@ class AppConfig(django.apps.AppConfig): ...@@ -82,6 +86,24 @@ class AppConfig(django.apps.AppConfig):
""" """
self._maintain_default_data() self._maintain_default_data()
def user_logged_in(
self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs
) -> None:
""" Called after a user logged in
By default, it does nothing.
"""
pass
def user_logged_out(
self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs
) -> None:
""" Called after a user logged out
By default, it does nothing.
"""
pass
def _maintain_default_data(self): def _maintain_default_data(self):
if not self.models_module: if not self.models_module:
# This app does not have any models, so bail out early # This app does not have any models, so bail out early
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment