FossilRepo

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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button