Changeset View
Changeset View
Standalone View
Standalone View
bid_main/models.py
| import logging | |||||
| import typing | import typing | ||||
| from django import urls | from django import urls | ||||
| from django.db import models | from django.db import models | ||||
| from django.db.models import Q | |||||
| from django.conf import settings | from django.conf import settings | ||||
| from django.core import validators | from django.core import validators | ||||
| from django.core.exceptions import ValidationError | from django.core.exceptions import ValidationError | ||||
| from django.core.mail import send_mail | from django.core.mail import send_mail | ||||
| from django.contrib.auth.models import PermissionsMixin | from django.contrib.auth.models import PermissionsMixin | ||||
| from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager | from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager | ||||
| from django.utils import timezone | from django.utils import timezone | ||||
| from django.utils.deconstruct import deconstructible | from django.utils.deconstruct import deconstructible | ||||
| from django.utils.translation import ugettext_lazy as _ | from django.utils.translation import ugettext_lazy as _ | ||||
| import sorl.thumbnail | import sorl.thumbnail | ||||
| import oauth2_provider.models as oa2_models | import oauth2_provider.models as oa2_models | ||||
| from . import fields | from . import fields | ||||
| log = logging.getLogger(__name__) | |||||
| class RoleManager(models.Manager): | class RoleManager(models.Manager): | ||||
| def badges(self) -> models.QuerySet: | def badges(self) -> models.QuerySet: | ||||
| """Query for those roles that are considered badges.""" | """Query for those roles that are considered badges.""" | ||||
| return ( | return ( | ||||
| self.filter(is_public=True, is_active=True, is_badge=True) | self.filter(is_public=True, is_active=True, is_badge=True) | ||||
| .exclude(badge_img__isnull=True) | .exclude(badge_img__isnull=True) | ||||
| ▲ Show 20 Lines • Show All 320 Lines • ▼ Show 20 Lines | class User(AbstractBaseUser, PermissionsMixin): | ||||
| @property | @property | ||||
| def must_pp_agree(self) -> bool: | def must_pp_agree(self) -> bool: | ||||
| """Return True when user needs to agree to new privacy policy.""" | """Return True when user needs to agree to new privacy policy.""" | ||||
| return ( | return ( | ||||
| self.privacy_policy_agreed is None | self.privacy_policy_agreed is None | ||||
| or self.privacy_policy_agreed < settings.PPDATE | or self.privacy_policy_agreed < settings.PPDATE | ||||
| ) | ) | ||||
| def revoke_all_tokens(self, date=None): | |||||
| """Revoke all access and refresh tokens belonging to this user.""" | |||||
| if not date: | |||||
| date = timezone.now() | |||||
| self.bid_main_oauth2accesstoken.filter( | |||||
| Q(expires__isnull=True) | Q(expires__gt=date) | |||||
| ).update(expires=date) | |||||
| self.bid_main_oauth2refreshtoken.filter( | |||||
| Q(revoked__isnull=True) | Q(revoked__gt=date) | |||||
| ).update(revoked=date) | |||||
| def request_deletion(self): | |||||
| """Store date of the deletion request and deactivate the user.""" | |||||
| if not self.date_deletion_requested: | |||||
| self.date_deletion_requested = timezone.now() | |||||
| else: | |||||
| # This should never happen, but if it does, keep the original date | |||||
| log.error( | |||||
| "Received a deletion request for pk=%s who already requested it at %s", | |||||
| self.pk, | |||||
| self.date_deletion_requested, | |||||
| ) | |||||
| self.revoke_all_tokens(date=self.date_deletion_requested) | |||||
| self.is_active = False | |||||
| self.save(update_fields=["date_deletion_requested", "is_active"]) | |||||
| # TODO(anna): delete **all** sessions of this user, maybe in a periodic cleanup | |||||
| class SettingValueField(models.CharField): | class SettingValueField(models.CharField): | ||||
| def __init__(self, *args, **kwargs): | def __init__(self, *args, **kwargs): | ||||
| kwargs["max_length"] = 128 | kwargs["max_length"] = 128 | ||||
| super().__init__(*args, **kwargs) | super().__init__(*args, **kwargs) | ||||
| SETTING_DATA_TYPE_CHOICES = [ | SETTING_DATA_TYPE_CHOICES = [ | ||||
| ▲ Show 20 Lines • Show All 74 Lines • Show Last 20 Lines | |||||