Skip to content

Commit

Permalink
Separated managers into managers.py
Browse files Browse the repository at this point in the history
  • Loading branch information
iarp committed Mar 13, 2022
1 parent ecd49f6 commit b7faead
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 154 deletions.
29 changes: 29 additions & 0 deletions core/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from django.contrib.auth.models import BaseUserManager
from django.utils.translation import gettext


class _UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""

@staticmethod
def normalize_email(email):
return email.lower()

def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError(gettext("email is required for User objects"))
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault("is_staff", False)
extra_fields.setdefault("is_superuser", False)
return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
extra_fields["is_staff"] = True
extra_fields["is_superuser"] = True
return self._create_user(email, password, **extra_fields)
3 changes: 0 additions & 3 deletions core/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,6 @@ class Migration(migrations.Migration):
options={
"abstract": False,
},
managers=[
("objects", core.models._UserManager()),
],
),
migrations.CreateModel(
name="Division",
Expand Down
34 changes: 3 additions & 31 deletions core/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.conf import settings
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.db import models
from django.db.models import F, Q
Expand All @@ -10,43 +10,15 @@
from loguru import logger
from positions.fields import PositionField

from . import managers
from .model_helpers import _BaseModel, _BaseModelWithCommonIDs, _BasePermissions


class _UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""

use_in_migrations = True

@staticmethod
def normalize_email(email):
return email.lower()

def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError(gettext("email is required for User objects"))
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault("is_staff", False)
extra_fields.setdefault("is_superuser", False)
return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
extra_fields["is_staff"] = True
extra_fields["is_superuser"] = True
return self._create_user(email, password, **extra_fields)


class User(_BaseModel, AbstractUser):
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
username_validator = UnicodeUsernameValidator()
objects = _UserManager()
objects = managers._UserManager()

username = models.CharField(
gettext_lazy("username"),
Expand Down
4 changes: 2 additions & 2 deletions core/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
from django.urls import reverse
from django.utils import timezone

from team.models import Division, Staff, StaffType, SubDivision, Team
from team.models import Staff, StaffType, Team

from .models import League, PermissionOverrides, Season
from .models import Division, League, PermissionOverrides, Season, SubDivision
from .perms import add_override_permission, has_perm
from .test_helpers import FixtureBasedTestCase

Expand Down
117 changes: 117 additions & 0 deletions team/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
from django.db import models
from django.db.models import Q
from django.utils.translation import gettext, gettext_lazy


class _StaffObjectsManagerWithDetails(models.Manager):
def head_coach(self, *args, **kwargs):
if self.instance.__class__.__name__ == "Team":
return self.filter(*args, type__name="Coach", **kwargs).first()
raise TypeError(gettext_lazy("head_coach is available on the Team instance."))

def own(self, *args, **kwargs):
instance_type = self.instance.__class__.__name__
extras = {}
if instance_type == "Season":
extras = {
"league_id__isnull": True,
"division_id__isnull": True,
"subdivision_id__isnull": True,
"team_id__isnull": True,
}
elif instance_type == "League":
extras = {
"division_id__isnull": True,
"subdivision_id__isnull": True,
"team_id__isnull": True,
}
elif instance_type == "Division":
extras = {
"subdivision_id__isnull": True,
"team_id__isnull": True,
}
elif instance_type == "SubDivision":
extras = {
"team_id__isnull": True,
}
return self.filter(*args, **extras, **kwargs)

def vps(self):
if self.instance.__class__.__name__ == "Season":
return self.filter(
division_id__isnull=True,
subdivision_id__isnull=True,
team_id__isnull=True,
).exclude(league_id__isnull=True)
raise TypeError(gettext("vps is available on the Season instance."))

def senior_convenors(self):
if self.instance.__class__.__name__ == "Season":
return self.filter(
subdivision_id__isnull=True,
team_id__isnull=True,
).exclude(Q(league_id__isnull=True) | Q(division_id__isnull=True))
elif self.instance.__class__.__name__ == "League":
return self.filter(
subdivision_id__isnull=True,
team_id__isnull=True,
).exclude(Q(league_id__isnull=True) | Q(division_id__isnull=True))
raise TypeError(
gettext("senior_convenors is available on the Season or League instance.")
)

def convenors(self):
if self.instance.__class__.__name__ == "Season":
return self.filter(team_id__isnull=True).exclude(
Q(league_id__isnull=True)
| Q(division_id__isnull=True)
| Q(subdivision_id__isnull=True)
)
elif self.instance.__class__.__name__ == "League":
return self.filter(team_id__isnull=True).exclude(
Q(division_id__isnull=True) | Q(subdivision_id__isnull=True)
)
elif self.instance.__class__.__name__ == "Division":
return self.filter(team_id__isnull=True).exclude(
subdivision_id__isnull=True,
)
raise TypeError(
gettext(
"convenors is available on the Season, League, or Division instance."
)
)

def coaches(self):
return self.filter(type__name="Coach")
# if isinstance(self.instance, Season):
# return qs.exclude(
# Q(league_id__isnull=True)
# | Q(division_id__isnull=True)
# | Q(subdivision_id__isnull=True)
# | Q(team_id__isnull=True)
# )
# elif isinstance(self.instance, League):
# return qs.exclude(
# Q(division_id__isnull=True)
# | Q(subdivision_id__isnull=True)
# | Q(team_id__isnull=True)
# )
# elif isinstance(self.instance, Division):
# return qs.exclude(Q(subdivision_id__isnull=True) | Q(team_id__isnull=True))
# elif isinstance(self.instance, SubDivision):
# return qs.exclude(team_id__isnull=True)
# raise TypeError(
# gettext("coaches is available on the Season, League, Division, or SubDivision instance.")
# )

def managers(self):
if self.instance.__class__.__name__ == "Team":
return self.filter(type__name="Manager")
raise TypeError(gettext("managers is available on the Team instance."))


class _StaffManagerCustomQuerySet(models.QuerySet):
def emails(self):
return self.filter(user__email__contains="@").values_list(
"user__email", flat=True
)
123 changes: 5 additions & 118 deletions team/models.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from django.conf import settings
from django.db import models
from django.db.models import Q
from django.db.models.functions import Lower
from django.utils.translation import gettext, gettext_lazy
from django.utils.translation import gettext_lazy
from positions.fields import PositionField

from core.model_helpers import _BaseModel, _BaseModelWithCommonIDs, _BasePermissions
from core.models import Division, League, Season, SubDivision
from core.perms import add_override_permission, has_perm

from . import managers


class Team(_BaseModelWithCommonIDs):
season = models.ForeignKey(
Expand Down Expand Up @@ -229,126 +229,13 @@ class Meta:
weight = PositionField(default=0)


class _StaffObjectsManagerWithDetails(models.Manager):
def head_coach(self, *args, **kwargs):
if isinstance(self.instance, Team):
return self.filter(*args, type__name="Coach", **kwargs).first()
raise TypeError(gettext_lazy("head_coach is available on the Team instance."))

def own(self, *args, **kwargs):
extras = {}
if isinstance(self.instance, Season):
extras = {
"league_id__isnull": True,
"division_id__isnull": True,
"subdivision_id__isnull": True,
"team_id__isnull": True,
}
elif isinstance(self.instance, League):
extras = {
"division_id__isnull": True,
"subdivision_id__isnull": True,
"team_id__isnull": True,
}
elif isinstance(self.instance, Division):
extras = {
"subdivision_id__isnull": True,
"team_id__isnull": True,
}
elif isinstance(self.instance, SubDivision):
extras = {
"team_id__isnull": True,
}
return self.filter(*args, **extras, **kwargs)

def vps(self):
if isinstance(self.instance, Season):
return self.filter(
division_id__isnull=True,
subdivision_id__isnull=True,
team_id__isnull=True,
).exclude(league_id__isnull=True)
raise TypeError(gettext("vps is available on the Season instance."))

def senior_convenors(self):
if isinstance(self.instance, Season):
return self.filter(
subdivision_id__isnull=True,
team_id__isnull=True,
).exclude(Q(league_id__isnull=True) | Q(division_id__isnull=True))
elif isinstance(self.instance, League):
return self.filter(
subdivision_id__isnull=True,
team_id__isnull=True,
).exclude(Q(league_id__isnull=True) | Q(division_id__isnull=True))
raise TypeError(
gettext("senior_convenors is available on the Season or League instance.")
)

def convenors(self):
if isinstance(self.instance, Season):
return self.filter(team_id__isnull=True).exclude(
Q(league_id__isnull=True)
| Q(division_id__isnull=True)
| Q(subdivision_id__isnull=True)
)
elif isinstance(self.instance, League):
return self.filter(team_id__isnull=True).exclude(
Q(division_id__isnull=True) | Q(subdivision_id__isnull=True)
)
elif isinstance(self.instance, Division):
return self.filter(team_id__isnull=True).exclude(
subdivision_id__isnull=True,
)
raise TypeError(
gettext(
"convenors is available on the Season, League, or Division instance."
)
)

def coaches(self):
return self.filter(type__name="Coach")
# if isinstance(self.instance, Season):
# return qs.exclude(
# Q(league_id__isnull=True)
# | Q(division_id__isnull=True)
# | Q(subdivision_id__isnull=True)
# | Q(team_id__isnull=True)
# )
# elif isinstance(self.instance, League):
# return qs.exclude(
# Q(division_id__isnull=True)
# | Q(subdivision_id__isnull=True)
# | Q(team_id__isnull=True)
# )
# elif isinstance(self.instance, Division):
# return qs.exclude(Q(subdivision_id__isnull=True) | Q(team_id__isnull=True))
# elif isinstance(self.instance, SubDivision):
# return qs.exclude(team_id__isnull=True)
# raise TypeError(
# gettext("coaches is available on the Season, League, Division, or SubDivision instance.")
# )

def managers(self):
if isinstance(self.instance, Team):
return self.filter(type__name="Manager")
raise TypeError(gettext("managers is available on the Team instance."))


class _StaffManagerCustomQuerySet(models.QuerySet):
def emails(self):
return self.filter(user__email__contains="@").values_list(
"user__email", flat=True
)


class Staff(_BaseModel):
class Meta:
verbose_name = gettext_lazy("Team Staff")
verbose_name_plural = gettext_lazy("Team Staff")

objects = _StaffObjectsManagerWithDetails.from_queryset(
_StaffManagerCustomQuerySet
objects = managers._StaffObjectsManagerWithDetails.from_queryset(
managers._StaffManagerCustomQuerySet
)()

season = models.ForeignKey(
Expand Down

0 comments on commit b7faead

Please sign in to comment.