-
-
Save elcolie/64a3a3daf22240b2072e113eb10164e2 to your computer and use it in GitHub Desktop.
Role
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.contrib.auth.models import User, Group | |
from django.db import models | |
from django.utils.translation import ugettext_lazy as _ | |
from djchoices import DjangoChoices, ChoiceItem | |
from poinkbackend.apps.branches.models import Branch | |
from poinkbackend.apps.commons.models import AbstractTimestamp | |
from poinkbackend.apps.companies.models import Company | |
""" | |
Requirements: | |
1. Copy from template | |
2. Copy from existing instance | |
""" | |
class RoleManager(models.Manager): | |
""" | |
Customized model manager | |
""" | |
def _add_group(self, name: str, company: Company, type): | |
group = Group.objects.create(name=f'{name}-{company.name}') | |
return Role.objects.create( | |
name=name, | |
type=type, | |
company=company, | |
group=group, | |
) | |
def add_front(self, name: str, company: Company): | |
""" | |
Add default front role with permissions | |
:param company: | |
:return: | |
""" | |
role = self._add_group(name, company, Role.RoleType.front) | |
from poinkbackend.apps.company_perms.models import CompanyPermission | |
CompanyPermission.objects.add_front(role=role) | |
return role | |
def add_support(self, name: str, company: Company): | |
role = self._add_group(name, company, Role.RoleType.support) | |
from poinkbackend.apps.company_perms.models import CompanyPermission | |
CompanyPermission.objects.add_support(role) | |
return role | |
def add_manager(self, name: str, company: Company): | |
role = self._add_group(name, company, Role.RoleType.manager) | |
from poinkbackend.apps.company_perms.models import CompanyPermission | |
CompanyPermission.objects.add_manager(role) | |
return role | |
def add_admin(self, name: str, company: Company): | |
role = self._add_group(name, company, Role.RoleType.admin) | |
from poinkbackend.apps.company_perms.models import CompanyPermission | |
CompanyPermission.objects.add_admin(role) | |
return role | |
class Role(AbstractTimestamp): | |
""" | |
Business is depends on company. | |
That's mean Boy has "Support" and "Front" will be "Support and Front" all over the entire branches | |
""" | |
class RoleType(DjangoChoices): | |
owner = ChoiceItem(_(f'owner')) | |
admin = ChoiceItem(_(f'admin')) | |
manager = ChoiceItem(_(f'manager')) | |
front = ChoiceItem(_(f'front')) | |
support = ChoiceItem(_(f'support')) | |
name = models.CharField(max_length=255) | |
type = models.CharField(max_length=20, choices=RoleType.choices, default=RoleType.admin) | |
company = models.ForeignKey(Company, related_name='roles', null=True, blank=True, on_delete=models.CASCADE) | |
group = models.OneToOneField(Group) | |
objects = RoleManager() | |
def __str__(self): | |
return f'{self.name}' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment