diff --git a/src/api/views/mixins.py b/src/api/views/mixins.py index 8cc93edfcafef1aae7d8a3dc5578cfd40ae7f8a9..46c9302450d1ce62942b9217e02672d560521884 100644 --- a/src/api/views/mixins.py +++ b/src/api/views/mixins.py @@ -39,10 +39,8 @@ class ConferenceSlugMixin(PermissionRequiredMixin): @property def conferencemember(self): if self._conferencemember is None: - try: - self._conferencemember = ConferenceMember.objects.get(conference=self.conference, user=self.request.user) - except ConferenceMember.DoesNotExist: - return None + self._conferencemember = ConferenceMember.get_member(conference=self.conference, user=self.request.user) + return self._conferencemember if self._conferencemember.is_authenticated else None return self._conferencemember diff --git a/src/backoffice/views/mixins.py b/src/backoffice/views/mixins.py index 0b5e6867b95cc05e5165ec11ad1b00bb2cd416bf..c1acd632730e309e82fadaf27f067229f50b9883 100644 --- a/src/backoffice/views/mixins.py +++ b/src/backoffice/views/mixins.py @@ -52,18 +52,11 @@ class ConferenceRequiredMixin(PermissionRequiredMixin): @property def conferencemember(self): if self._conferencemember is None: - if not self.request.user.is_authenticated: - return ConferenceMember.get_anonymous_member(self.conference) - - try: - self._conferencemember = ( - ConferenceMember.objects.select_related('user') - .prefetch_related('user__groups', 'user__user_permissions', 'permission_groups') - .get(conference=self.conference, user=self.request.user) - ) - except ConferenceMember.DoesNotExist: - self._conferencemember = ConferenceMember.get_anonymous_member(self.conference) - + self._conferencemember = ConferenceMember.get_member( + conference=self.conference, + user=self.request.user, + prefetch_user=True, + ) return self._conferencemember @property diff --git a/src/core/models/conference.py b/src/core/models/conference.py index 51b231760532cb529ba542e60f97246885b0d474..8aa080ee902193dc7e8026f7a466376f400c1e01 100644 --- a/src/core/models/conference.py +++ b/src/core/models/conference.py @@ -114,8 +114,19 @@ class ConferenceMember(models.Model): all_permissions = self.user.get_all_permissions() | self.get_permission_groups_permissions() return all_permissions + @property + def is_authenticated(self): + return self.user.is_authenticated + @classmethod - def get_member(cls, conference: 'Conference', *, user: PlatformUser | None = None, member: 'ConferenceMember | None' = None) -> 'ConferenceMember': + def get_member( + cls, + conference: 'Conference', + *, + user: PlatformUser | None = None, + member: 'ConferenceMember | None' = None, + prefetch_user: bool = False, + ) -> 'ConferenceMember': if member is None and user is None: raise ValueError('Either user or member must be given.') if member and user and member.user != user: @@ -127,7 +138,10 @@ class ConferenceMember(models.Model): if not user.is_authenticated: return cls.get_anonymous_member(conference, user) try: - return cls.objects.get(conference=conference, user=user) + qs = cls.objects.all() + if prefetch_user: + qs = qs.select_related('user').prefetch_related('user__groups', 'user__user_permissions', 'permission_groups') + return qs.get(conference=conference, user=user) except cls.DoesNotExist: return cls.get_anonymous_member(conference, user) @@ -146,7 +160,6 @@ class ConferenceMember(models.Model): def has_perms(self, *perms: str, require_all: bool = True, require_staff: bool = False) -> bool: return False - is_authenticated = False conference = conf def save(self, *args, **kwargs): diff --git a/src/core/models/users.py b/src/core/models/users.py index 169a80bbc29f43ab44ded914d4a1221d666e662b..495500edd4384f407c78a27d4d3c6e7b7db3b7f6 100644 --- a/src/core/models/users.py +++ b/src/core/models/users.py @@ -230,7 +230,7 @@ class PlatformUser(AbstractUser): is_authenticated = False def save(self, *args, **kwargs): - raise Exception + raise TypeError('Cannot save an anonymous user.') return AnonUser()