|
4ce269c…
|
ragelink
|
1 |
from django.contrib.auth.models import Group |
|
4ce269c…
|
ragelink
|
2 |
from django.db import models |
|
4ce269c…
|
ragelink
|
3 |
|
|
4ce269c…
|
ragelink
|
4 |
from core.models import ActiveManager, BaseCoreModel, Tracking |
|
4ce269c…
|
ragelink
|
5 |
|
|
4ce269c…
|
ragelink
|
6 |
|
|
4ce269c…
|
ragelink
|
7 |
class Organization(BaseCoreModel): |
|
4ce269c…
|
ragelink
|
8 |
website = models.URLField(blank=True, default="") |
|
4ce269c…
|
ragelink
|
9 |
groups = models.ManyToManyField(Group, blank=True, related_name="organizations") |
|
4ce269c…
|
ragelink
|
10 |
|
|
4ce269c…
|
ragelink
|
11 |
objects = ActiveManager() |
|
4ce269c…
|
ragelink
|
12 |
all_objects = models.Manager() |
|
4ce269c…
|
ragelink
|
13 |
|
|
4ce269c…
|
ragelink
|
14 |
class Meta: |
|
4ce269c…
|
ragelink
|
15 |
ordering = ["name"] |
|
4ce269c…
|
ragelink
|
16 |
|
|
4ce269c…
|
ragelink
|
17 |
|
|
c588255…
|
ragelink
|
18 |
class OrgRole(BaseCoreModel): |
|
c588255…
|
ragelink
|
19 |
"""Predefined organization role with a bundle of permissions.""" |
|
c588255…
|
ragelink
|
20 |
|
|
c588255…
|
ragelink
|
21 |
is_default = models.BooleanField(default=False, help_text="Assigned to new users automatically") |
|
c588255…
|
ragelink
|
22 |
permissions = models.ManyToManyField("auth.Permission", blank=True, related_name="org_roles") |
|
c588255…
|
ragelink
|
23 |
|
|
c588255…
|
ragelink
|
24 |
objects = ActiveManager() |
|
c588255…
|
ragelink
|
25 |
all_objects = models.Manager() |
|
c588255…
|
ragelink
|
26 |
|
|
c588255…
|
ragelink
|
27 |
class Meta: |
|
c588255…
|
ragelink
|
28 |
ordering = ["name"] |
|
c588255…
|
ragelink
|
29 |
|
|
c588255…
|
ragelink
|
30 |
def __str__(self): |
|
c588255…
|
ragelink
|
31 |
return self.name |
|
c588255…
|
ragelink
|
32 |
|
|
c588255…
|
ragelink
|
33 |
def apply_to_user(self, user): |
|
c588255…
|
ragelink
|
34 |
"""Sync this role's permissions to a Django user via a group.""" |
|
c588255…
|
ragelink
|
35 |
group, _ = Group.objects.get_or_create(name=f"role_{self.slug}") |
|
c588255…
|
ragelink
|
36 |
group.permissions.set(self.permissions.all()) |
|
c588255…
|
ragelink
|
37 |
|
|
c588255…
|
ragelink
|
38 |
# Remove user from all role groups, then add to this one |
|
c588255…
|
ragelink
|
39 |
role_groups = Group.objects.filter(name__startswith="role_") |
|
c588255…
|
ragelink
|
40 |
user.groups.remove(*role_groups) |
|
c588255…
|
ragelink
|
41 |
user.groups.add(group) |
|
c588255…
|
ragelink
|
42 |
|
|
c588255…
|
ragelink
|
43 |
@staticmethod |
|
c588255…
|
ragelink
|
44 |
def remove_role_groups(user): |
|
c588255…
|
ragelink
|
45 |
"""Remove all role-based groups from a user.""" |
|
c588255…
|
ragelink
|
46 |
role_groups = Group.objects.filter(name__startswith="role_") |
|
c588255…
|
ragelink
|
47 |
user.groups.remove(*role_groups) |
|
c588255…
|
ragelink
|
48 |
|
|
c588255…
|
ragelink
|
49 |
|
|
4ce269c…
|
ragelink
|
50 |
class Team(BaseCoreModel): |
|
4ce269c…
|
ragelink
|
51 |
organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name="teams") |
|
4ce269c…
|
ragelink
|
52 |
members = models.ManyToManyField("auth.User", blank=True, related_name="teams") |
|
4ce269c…
|
ragelink
|
53 |
|
|
4ce269c…
|
ragelink
|
54 |
objects = ActiveManager() |
|
4ce269c…
|
ragelink
|
55 |
all_objects = models.Manager() |
|
4ce269c…
|
ragelink
|
56 |
|
|
4ce269c…
|
ragelink
|
57 |
class Meta: |
|
4ce269c…
|
ragelink
|
58 |
ordering = ["name"] |
|
4ce269c…
|
ragelink
|
59 |
|
|
4ce269c…
|
ragelink
|
60 |
|
|
4ce269c…
|
ragelink
|
61 |
class OrganizationMember(Tracking): |
|
4ce269c…
|
ragelink
|
62 |
is_active = models.BooleanField(default=True) |
|
4ce269c…
|
ragelink
|
63 |
member = models.ForeignKey("auth.User", on_delete=models.CASCADE, related_name="memberships") |
|
4ce269c…
|
ragelink
|
64 |
organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name="members") |
|
c588255…
|
ragelink
|
65 |
role = models.ForeignKey( |
|
c588255…
|
ragelink
|
66 |
OrgRole, null=True, blank=True, on_delete=models.SET_NULL, related_name="members", help_text="Organization role" |
|
c588255…
|
ragelink
|
67 |
) |
|
4ce269c…
|
ragelink
|
68 |
groups = models.ManyToManyField(Group, blank=True, related_name="org_memberships") |
|
4ce269c…
|
ragelink
|
69 |
|
|
4ce269c…
|
ragelink
|
70 |
objects = ActiveManager() |
|
4ce269c…
|
ragelink
|
71 |
all_objects = models.Manager() |
|
4ce269c…
|
ragelink
|
72 |
|
|
4ce269c…
|
ragelink
|
73 |
class Meta: |
|
4ce269c…
|
ragelink
|
74 |
unique_together = ("member", "organization") |
|
4ce269c…
|
ragelink
|
75 |
|
|
4ce269c…
|
ragelink
|
76 |
def __str__(self): |
|
4ce269c…
|
ragelink
|
77 |
return f"{self.organization}/{self.member}" |