Skip to content

Instantly share code, notes, and snippets.

@elcolie
Last active November 16, 2017 03:33
Show Gist options
  • Save elcolie/64a3a3daf22240b2072e113eb10164e2 to your computer and use it in GitHub Desktop.
Save elcolie/64a3a3daf22240b2072e113eb10164e2 to your computer and use it in GitHub Desktop.
Role
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