FossilRepo

fossilrepo / organization / models.py
Source Blame History 77 lines
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}"

Keyboard Shortcuts

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