Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c6cf298
change hr_group and primary_group to admin_group and member_group in …
simensandhaug Nov 7, 2022
d800ba4
update group constants
simensandhaug Nov 7, 2022
5faef25
change instances of hr_group and primary_group
simensandhaug Nov 7, 2022
1d6e42b
fix query error
simensandhaug Nov 7, 2022
aa5c147
write custom migration
simensandhaug Nov 14, 2022
ad93482
revert changes to previous migrations
simensandhaug Nov 17, 2022
22a5b20
revert changes to previous migrations
simensandhaug Nov 17, 2022
1eef979
revert changes to previous migrations
simensandhaug Nov 17, 2022
de5d3d7
move custom migrations to more appropriate folder
simensandhaug Nov 17, 2022
3733a79
merge migrations due to conflicts
simensandhaug Nov 17, 2022
ccd26d8
remove manage_organization permission from organizations/signals.py
simensandhaug Nov 21, 2022
bb000da
uncomment manage_organization permission in organizations/models.py
simensandhaug Nov 21, 2022
008dfdb
remove autogenerated yarn.lock file
simensandhaug Nov 21, 2022
188b95f
quality of life improvement for admin-panel, more easily readable wit…
simensandhaug Nov 21, 2022
2cde7d2
Admin-panel improvements and update signal and migration to be more d…
simensandhaug Nov 21, 2022
30d6ad4
update migration
simensandhaug Nov 22, 2022
fe30038
fix naming error
simensandhaug Nov 22, 2022
6556ecf
fix typing error
simensandhaug Nov 22, 2022
1f8b106
Update backend/apps/organizations/signals.py
simensandhaug Feb 20, 2023
a230e7b
Update backend/apps/organizations/signals.py
simensandhaug Feb 20, 2023
a6bc2b3
fix bug when referencing group.uuid
simensandhaug Feb 20, 2023
0c5e871
Merge branch 'main' into feat/migrate-org-group
simensandhaug Feb 20, 2023
3f005d2
Merge branch 'main' into feat/migrate-org-group
simensandhaug Feb 27, 2023
6a8a60e
fix black linting
simensandhaug Feb 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/apps/ecommerce/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def setUp(self) -> None:
MembershipFactory(
user=self.staff_user,
organization=self.organization,
group=self.organization.primary_group,
group=self.organization.member_group,
)
self.total_quantity = 5
self.max_buyable_quantity = 2
Expand Down
2 changes: 1 addition & 1 deletion backend/apps/forms/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
def handle_new_form(sender, instance: Form, created: bool, **kwargs) -> None:
if created:
perms = ["forms.manage_form", "forms.change_form", "forms.delete_form"]
group = instance.organization.hr_group.group
group = instance.organization.admin_group.group
for perm in perms:
assign_perm(perm, group, instance)
2 changes: 1 addition & 1 deletion backend/apps/forms/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def setUp(self) -> None:
MembershipFactory(
user=self.authorized_user,
organization=self.organization,
group=self.organization.hr_group,
group=self.organization.admin_group,
)

# Create the form
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class Migration(migrations.Migration):
),
migrations.AddField(
model_name="organization",
name="primary_group",
name="member_group",
field=models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE, to="permissions.responsiblegroup", null=True
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
from django.db import migrations


def set_primary_groups(apps, schema_editor):
def set_member_groups(apps, schema_editor):
Organization = apps.get_model("organizations", "Organization")
ResponsibleGroup = apps.get_model("permissions", "ResponsibleGroup")

for organization in Organization.objects.all():
if organization.primary_group is None:
if organization.member_group is None:
rg = ResponsibleGroup.objects.create(
name=organization.name, description=f"Medlemmer av {organization.name}"
)
organization.primary_group = rg
organization.member_group = rg
organization.save()


Expand All @@ -22,4 +22,4 @@ class Migration(migrations.Migration):
("organizations", "0024_auto_20210422_2020"),
]

operations = [migrations.RunPython(set_primary_groups, lambda apps, schema_editor: None)]
operations = [migrations.RunPython(set_member_groups, lambda apps, schema_editor: None)]
25 changes: 13 additions & 12 deletions backend/apps/organizations/migrations/0026_auto_20210426_1802.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,24 @@
import django.db.models.deletion


def set_primary_groups(apps, schema_editor):
def set_member_groups(apps, schema_editor):
Organization = apps.get_model("organizations", "Organization")
ResponsibleGroup = apps.get_model("permissions", "ResponsibleGroup")

for organization in Organization.objects.all():
created = False
if organization.primary_group is None:
primary_group = ResponsibleGroup.objects.create(
if organization.member_group is None:
member_group = ResponsibleGroup.objects.create(
name=organization.name, description=f"Medlemmer av {organization.name}"
)
organization.primary_group = primary_group
organization.member_group = member_group
created = True
if organization.hr_group is None:
hr_group = ResponsibleGroup.objects.create(
name="HR", description=f"HR-gruppen til {organization.name}. Tillatelser for å se og behandle søknader."
if organization.admin_group is None:
admin_group = ResponsibleGroup.objects.create(
name="ADMIN",
description=f"ADMIN-gruppen til {organization.name}. Tillatelser for å se og behandle søknader.",
)
organization.hr_group = hr_group
organization.admin_group = admin_group
created = True

if created:
Expand All @@ -41,22 +42,22 @@ class Migration(migrations.Migration):
),
migrations.AddField(
model_name="organization",
name="hr_group",
name="admin_group",
field=models.OneToOneField(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="hr_organization",
related_name="admin_organization",
to="permissions.responsiblegroup",
),
),
migrations.AlterField(
model_name="organization",
name="primary_group",
name="member_group",
field=models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="organization",
to="permissions.responsiblegroup",
),
),
migrations.RunPython(set_primary_groups, lambda apps, schema_editor: None),
migrations.RunPython(set_member_groups, lambda apps, schema_editor: None),
]
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
from django.db import migrations


def add_existing_members_to_primary_group(apps, schema_editor):
def add_existing_members_to_member_group(apps, schema_editor):
Membership = apps.get_model("organizations", "Membership")

for membership in Membership.objects.all():
group = membership.organization.primary_group.group
group = membership.organization.member_group.group
user = membership.user
user.groups.add(group)

Expand All @@ -18,4 +18,4 @@ class Migration(migrations.Migration):
("organizations", "0027_auto_20210426_1843"),
]

operations = [migrations.RunPython(add_existing_members_to_primary_group, lambda apps, schema_editor: None)]
operations = [migrations.RunPython(add_existing_members_to_member_group, lambda apps, schema_editor: None)]
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterField(
model_name="organization",
name="hr_group",
name="admin_group",
field=models.OneToOneField(
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="hr_organization",
related_name="admin_organization",
to="permissions.responsiblegroup",
),
),
migrations.AlterField(
model_name="organization",
name="primary_group",
name="member_group",
field=models.OneToOneField(
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="organization",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterField(
model_name="organization",
name="hr_group",
name="admin_group",
field=models.OneToOneField(
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="hr_organization",
related_name="admin_organization",
to="permissions.responsiblegroup",
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,18 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterField(
model_name="organization",
name="hr_group",
name="admin_group",
field=models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="hr_organization",
related_name="admin_organization",
to="permissions.responsiblegroup",
),
),
migrations.AlterField(
model_name="organization",
name="primary_group",
name="member_group",
field=models.OneToOneField(
blank=True,
null=True,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ class Migration(migrations.Migration):
operations = [
migrations.RemoveField(
model_name="organization",
name="hr_group",
name="admin_group",
Comment thread
simensandhaug marked this conversation as resolved.
Outdated
),
migrations.RemoveField(
model_name="organization",
name="primary_group",
name="member_group",
),
]
26 changes: 26 additions & 0 deletions backend/apps/organizations/migrations/0034_auto_20221114_1854.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Generated by Django 3.2.16 on 2022-11-14 17:54
Comment thread
simensandhaug marked this conversation as resolved.
Outdated

from django.db import migrations
from apps.permissions.constants import ADMIN_GROUP_NAME, ADMIN_GROUP_TYPE, MEMBER_GROUP_NAME, MEMBER_GROUP_TYPE


def migrate_org_groups(apps, schema_editor):
ResponsibleGroup = apps.get_model("permissions", "ResponsibleGroup")
for group in ResponsibleGroup.objects.all():
if group.name == "HR":
group.name == ADMIN_GROUP_NAME
group.group_type == ADMIN_GROUP_TYPE
group.save()
if group.name == "Medlem":
group.name = MEMBER_GROUP_NAME
group.group_type = MEMBER_GROUP_TYPE
group.save()
Comment thread
simensandhaug marked this conversation as resolved.
Outdated


class Migration(migrations.Migration):

dependencies = [
("organizations", "0033_merge_0031_auto_20210909_1813_0032_auto_20210824_1457"),
]

operations = [migrations.RunPython(migrate_org_groups)]
15 changes: 8 additions & 7 deletions backend/apps/organizations/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.db import models
from django.db.models import UniqueConstraint

from apps.permissions.constants import HR_TYPE, PRIMARY_TYPE
from apps.permissions.constants import ADMIN_GROUP_TYPE, MEMBER_GROUP_TYPE
from apps.permissions.models import ResponsibleGroup


Expand All @@ -28,7 +28,8 @@ class Organization(models.Model):
# Permission groups
# All members are added to the primary group
# Members can be added to groups programatically
# The HR-group has the "forms.manage_form" permission, allowing them to view and manage responses to e.g. listings.
# The ADMIN-group has the "forms.manage_form" permission, allowing them to view and manage responses to e.g.
# listings.
# The primary group is intended to act as a group for organizations who need any kind of
# special permission, e.g. hyttestyret
# Or if we wish to limit the creation of events or listings to certain organizations.
Expand All @@ -42,22 +43,22 @@ class Organization(models.Model):
)

@property
def hr_group(self) -> Optional["ResponsibleGroup"]:
def admin_group(self) -> Optional["ResponsibleGroup"]:
try:
return self.permission_groups.get(group_type=HR_TYPE)
return self.permission_groups.get(group_type=ADMIN_GROUP_TYPE)
except ResponsibleGroup.DoesNotExist:
return None

@property
def primary_group(self) -> Optional["ResponsibleGroup"]:
def member_group(self) -> Optional["ResponsibleGroup"]:
try:
return self.permission_groups.get(group_type=PRIMARY_TYPE)
return self.permission_groups.get(group_type=MEMBER_GROUP_TYPE)
except ResponsibleGroup.DoesNotExist:
return None

class Meta:
constraints = [UniqueConstraint(fields=["parent", "name"], name="unique_child_organization_name")]
permissions = [("manage_organization", "Can manage organizations, used for admins")]
# permissions = [("manage_organization", "Can manage organizations, used for admins")]
Comment thread
simensandhaug marked this conversation as resolved.
Outdated

def __str__(self):
return f"{self.name}"
Expand Down
29 changes: 15 additions & 14 deletions backend/apps/organizations/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@

from apps.organizations.models import Membership, Organization
from apps.permissions.constants import (
HR_GROUP_NAME,
HR_TYPE,
ADMIN_GROUP_NAME,
ADMIN_GROUP_TYPE,
ORGANIZATION,
PRIMARY_GROUP_NAME,
PRIMARY_TYPE,
MEMBER_GROUP_NAME,
MEMBER_GROUP_TYPE,
)
from apps.permissions.models import ResponsibleGroup


@receiver(post_save, sender=Membership)
def handle_new_member(instance: Membership, **kwargs):
optional_group: Optional[ResponsibleGroup] = instance.group
group: Group = instance.organization.primary_group.group
group: Group = instance.organization.member_group.group
org_group: Group = Group.objects.get(name=ORGANIZATION)
user = instance.user
user.groups.add(org_group)
Expand All @@ -31,7 +31,7 @@ def handle_new_member(instance: Membership, **kwargs):

@receiver(pre_delete, sender=Membership)
def handle_removed_member(instance: Membership, **kwargs):
group: Group = instance.organization.primary_group.group
group: Group = instance.organization.member_group.group
org_group: Group = Group.objects.get(name=ORGANIZATION)
user = instance.user
if group:
Expand All @@ -44,19 +44,20 @@ def handle_removed_member(instance: Membership, **kwargs):
@receiver(post_save, sender=Organization)
def create_default_groups(instance: Organization, created, **kwargs):
"""
Creates and assigns a primary group and HR group to members of the organization.
Creates and assigns a primary group and ADMIN group to members of the organization.
"""
if created:
ResponsibleGroup.objects.create(
name=PRIMARY_GROUP_NAME,
name=MEMBER_GROUP_NAME,
description=f"Medlemmer av {instance.name}.",
organization=instance,
group_type=PRIMARY_TYPE,
group_type=MEMBER_GROUP_TYPE,
)
hr_group = ResponsibleGroup.objects.create(
name=HR_GROUP_NAME,
description=f"HR-gruppen til {instance.name}. Tillatelser for å se og behandle søknader.",
admin_group = ResponsibleGroup.objects.create(
name=ADMIN_GROUP_NAME,
description=f"ADMIN-gruppen til {instance.name}. Tillatelser for å se og behandle søknader og medlemmer.",
organization=instance,
group_type=HR_TYPE,
group_type=ADMIN_GROUP_TYPE,
)
assign_perm("forms.add_form", hr_group.group)
assign_perm("forms.add_form", admin_group.group)
assign_perm("organizations.manage_organization", admin_group.group)
Comment thread
simensandhaug marked this conversation as resolved.
Outdated
8 changes: 4 additions & 4 deletions backend/apps/organizations/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
class OrganizationType(DjangoObjectType):
absolute_slug = graphene.String()
listings = graphene.List(NonNull(ListingType))
primary_group = graphene.Field(source="primary_group", type=ResponsibleGroupType)
hr_group = graphene.Field(source="hr_group", type=ResponsibleGroupType)
member_group = graphene.Field(source="member_group", type=ResponsibleGroupType)
admin_group = graphene.Field(source="admin_group", type=ResponsibleGroupType)

class Meta:
model = Organization
Expand All @@ -30,8 +30,8 @@ class Meta:
"users",
"events",
"logo_url",
"primary_group",
"hr_group",
"member_group",
"admin_group",
]

@staticmethod
Expand Down
8 changes: 4 additions & 4 deletions backend/apps/permissions/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
DefaultPermissionsType = Final[list[tuple[str, str]]]

# Default ResponsibleGroup types
PRIMARY_TYPE: Literal["PRIMARY"] = "PRIMARY"
HR_TYPE: Literal["HR"] = "HR"
MEMBER_GROUP_TYPE: Literal["MEMBER"] = "MEMBER"
ADMIN_GROUP_TYPE: Literal["ADMIN"] = "ADMIN"

ORGANIZATION: Final = "Organization member"
INDOK: Final = "Indøk"
REGISTERED_USER: Final = "Registered user"
PRIMARY_GROUP_NAME: Final = "Medlem"
HR_GROUP_NAME: Final = "HR"
MEMBER_GROUP_NAME: Final = "Medlem"
ADMIN_GROUP_NAME: Final = "Administrator"

DEFAULT_ORGANIZATION_PERMISSIONS: DefaultPermissionsType = [
("events", "add_event"),
Expand Down
Loading