feat: Migrate to new Integer choice field to allow nicer handling
This commit is contained in:
parent
08e20e1875
commit
7efa626b8b
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.1.1 on 2024-11-20 18:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('fellchensammlung', '0021_user_reason_for_signup'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='reason_for_signup',
|
||||||
|
field=models.TextField(help_text="Wir würden gerne wissen warum du dich registriertst, ob du dich z.B. Tiere eines bestimmten Tierheim einstellen willst 'nur mal gucken' willst. Beides ist toll! Wenn du für ein Tierheim/eine Pflegestelle arbeitest kontaktieren wir dich ggf. um dir erweiterte Rechte zu geben.", verbose_name='Grund für die Registrierung'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='user',
|
||||||
|
name='trust_level',
|
||||||
|
field=models.IntegerField(choices=[(1, 'Member'), (2, 'Coordinator'), (3, 'Moderator'), (4, 'Admin')], default=1),
|
||||||
|
),
|
||||||
|
]
|
@ -121,6 +121,17 @@ class RescueOrganization(models.Model):
|
|||||||
return AdoptionNotice.objects.filter(organization=self)
|
return AdoptionNotice.objects.filter(organization=self)
|
||||||
|
|
||||||
|
|
||||||
|
# Admins can perform all actions and have the highest trust associated with them
|
||||||
|
# Moderators can make moderation decisions regarding the deletion of content
|
||||||
|
# Coordinators can create adoption notices without them being checked
|
||||||
|
# Members can create adoption notices that must be activated
|
||||||
|
class TrustLevel(models.IntegerChoices):
|
||||||
|
MEMBER = 1, 'Member'
|
||||||
|
COORDINATOR = 2, 'Coordinator'
|
||||||
|
MODERATOR = 3, 'Moderator'
|
||||||
|
ADMIN = 4, 'Admin'
|
||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
"""
|
"""
|
||||||
Model that holds a user's profile, including the django user model
|
Model that holds a user's profile, including the django user model
|
||||||
@ -128,28 +139,17 @@ class User(AbstractUser):
|
|||||||
The trust levels act as permission system and can be displayed as a badge for the user
|
The trust levels act as permission system and can be displayed as a badge for the user
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Admins can perform all actions and have the highest trust associated with them
|
trust_level = models.IntegerField(
|
||||||
# Moderators can make moderation decisions regarding the deletion of content
|
choices=TrustLevel.choices,
|
||||||
# Coordinators can create adoption notices without them being checked
|
default=TrustLevel.MEMBER, # Default to the lowest trust level
|
||||||
# Members can create adoption notices that must be activated
|
)
|
||||||
ADMIN = "admin"
|
|
||||||
MODERATOR = "Moderator"
|
|
||||||
COORDINATOR = "Koordinator*in"
|
|
||||||
MEMBER = "Mitglied"
|
|
||||||
TRUST_LEVEL = {
|
|
||||||
ADMIN: 4,
|
|
||||||
MODERATOR: 3,
|
|
||||||
COORDINATOR: 2,
|
|
||||||
MEMBER: 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
preferred_language = models.ForeignKey(Language, on_delete=models.PROTECT, null=True, blank=True,
|
preferred_language = models.ForeignKey(Language, on_delete=models.PROTECT, null=True, blank=True,
|
||||||
verbose_name=_('Bevorzugte Sprache'))
|
verbose_name=_('Bevorzugte Sprache'))
|
||||||
trust_level = models.IntegerField(choices=TRUST_LEVEL, default=TRUST_LEVEL[MEMBER])
|
|
||||||
updated_at = models.DateTimeField(auto_now=True)
|
updated_at = models.DateTimeField(auto_now=True)
|
||||||
organization_affiliation = models.ForeignKey(RescueOrganization, on_delete=models.PROTECT, null=True, blank=True,
|
organization_affiliation = models.ForeignKey(RescueOrganization, on_delete=models.PROTECT, null=True, blank=True,
|
||||||
verbose_name=_('Organisation'))
|
verbose_name=_('Organisation'))
|
||||||
reason_for_signup = models.TextField(verbose_name=_("Grund für die Registrierung"), help_text=_("Wir würden gerne wissen warum du dich registriertst, ob du dich z.B. Tiere eines bestimmten Tierheim einstellen willst 'nur mal gucken' willst. Beides ist toll! Wenn du für ein Tierheim/eine Pflegestelle arbeitest kontaktieren wir dich ggf. um dir erweiterte Rechte zu geben."))
|
reason_for_signup = models.TextField(verbose_name=_("Grund für die Registrierung"), help_text=_(
|
||||||
|
"Wir würden gerne wissen warum du dich registriertst, ob du dich z.B. Tiere eines bestimmten Tierheim einstellen willst 'nur mal gucken' willst. Beides ist toll! Wenn du für ein Tierheim/eine Pflegestelle arbeitest kontaktieren wir dich ggf. um dir erweiterte Rechte zu geben."))
|
||||||
REQUIRED_FIELDS = ["reason_for_signup", "email"]
|
REQUIRED_FIELDS = ["reason_for_signup", "email"]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -16,7 +16,7 @@ from notfellchen import settings
|
|||||||
from fellchensammlung import logger
|
from fellchensammlung import logger
|
||||||
from .models import AdoptionNotice, Text, Animal, Rule, Image, Report, ModerationAction, \
|
from .models import AdoptionNotice, Text, Animal, Rule, Image, Report, ModerationAction, \
|
||||||
User, Location, AdoptionNoticeStatus, Subscriptions, CommentNotification, BaseNotification, RescueOrganization, \
|
User, Location, AdoptionNoticeStatus, Subscriptions, CommentNotification, BaseNotification, RescueOrganization, \
|
||||||
Species, Log, Timestamp
|
Species, Log, Timestamp, TrustLevel
|
||||||
from .forms import AdoptionNoticeForm, AdoptionNoticeFormWithDateWidget, ImageForm, ReportAdoptionNoticeForm, \
|
from .forms import AdoptionNoticeForm, AdoptionNoticeFormWithDateWidget, ImageForm, ReportAdoptionNoticeForm, \
|
||||||
CommentForm, ReportCommentForm, AnimalForm, \
|
CommentForm, ReportCommentForm, AnimalForm, \
|
||||||
AdoptionNoticeSearchForm, AnimalFormWithDateWidget, AdoptionNoticeFormWithDateWidgetAutoAnimal
|
AdoptionNoticeSearchForm, AnimalFormWithDateWidget, AdoptionNoticeFormWithDateWidgetAutoAnimal
|
||||||
@ -28,16 +28,16 @@ from .tasks import add_adoption_notice_location
|
|||||||
from rest_framework.authtoken.models import Token
|
from rest_framework.authtoken.models import Token
|
||||||
|
|
||||||
|
|
||||||
def user_is_trust_level_or_above(user, trust_level=User.MODERATOR):
|
def user_is_trust_level_or_above(user, trust_level=TrustLevel.MODERATOR):
|
||||||
return user.is_authenticated and user.trust_level >= User.TRUST_LEVEL[trust_level]
|
return user.is_authenticated and user.trust_level >= trust_level
|
||||||
|
|
||||||
|
|
||||||
def user_is_owner_or_trust_level(user, django_object, trust_level=User.MODERATOR):
|
def user_is_owner_or_trust_level(user, django_object, trust_level=TrustLevel.MODERATOR):
|
||||||
return user.is_authenticated and (
|
return user.is_authenticated and (
|
||||||
user.trust_level == User.TRUST_LEVEL[trust_level] or django_object.owner == user)
|
user.trust_level == trust_level or django_object.owner == user)
|
||||||
|
|
||||||
|
|
||||||
def fail_if_user_not_owner_or_trust_level(user, django_object, trust_level=User.MODERATOR):
|
def fail_if_user_not_owner_or_trust_level(user, django_object, trust_level=TrustLevel.MODERATOR):
|
||||||
if not user_is_owner_or_trust_level(user, django_object, trust_level):
|
if not user_is_owner_or_trust_level(user, django_object, trust_level):
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user