reverse manytomany field between access restrictions and their groups

This commit is contained in:
Laura Klünder 2024-12-11 14:43:27 +01:00
parent 34199b2bf3
commit 450c9486c0
3 changed files with 55 additions and 10 deletions

View file

@ -0,0 +1,41 @@
# Generated by Django 5.0.8 on 2024-12-11 13:24
from django.db import migrations, models
def forwards_func(apps, schema_editor):
AccessRestrictionGroup = apps.get_model('mapdata', 'AccessRestrictionGroup')
for group in AccessRestrictionGroup.objects.prefetch_related("accessrestrictions").all():
group.members.set(group.accessrestrictions.all())
def backwards_func(apps, schema_editor):
AccessRestrictionGroup = apps.get_model('mapdata', 'AccessRestrictionGroup')
for group in AccessRestrictionGroup.objects.prefetch_related("members").all():
group.accessrestrictions.set(group.members.all())
class Migration(migrations.Migration):
dependencies = [
('mapdata', '0113_locationgroup_can_report_mistake'),
]
operations = [
migrations.AddField(
model_name='accessrestrictiongroup',
name='members',
field=models.ManyToManyField(blank=True, to='mapdata.accessrestriction', verbose_name='Access Restrictions'),
),
migrations.RunPython(forwards_func, backwards_func),
migrations.RemoveField(
model_name='accessrestriction',
name='groups',
),
migrations.AlterField(
model_name='accessrestrictiongroup',
name='members',
field=models.ManyToManyField(blank=True, related_name='groups', to='mapdata.accessrestriction',
verbose_name='Access Restrictions'),
),
]

View file

@ -21,7 +21,6 @@ class AccessRestriction(TitledMixin, models.Model):
An access restriction
"""
public = models.BooleanField(default=False, verbose_name=_('public'))
groups = models.ManyToManyField('mapdata.AccessRestrictionGroup', verbose_name=_('Groups'), blank=True)
class Meta:
verbose_name = _('Access Restriction')
@ -60,6 +59,9 @@ class AccessRestrictionGroup(TitledMixin, models.Model):
"""
An access restriction group
"""
members = models.ManyToManyField('mapdata.AccessRestriction', verbose_name=_('Access Restrictions'), blank=True,
related_name="groups")
class Meta:
verbose_name = _('Access Restriction Group')
verbose_name_plural = _('Access Restriction Groups')
@ -77,7 +79,7 @@ class AccessRestrictionGroup(TitledMixin, models.Model):
permissions = AccessPermission.get_for_request(request)
# now we filter out groups where the user doesn't have a permission for all members
filter_perms = all_permissions - permissions
return ~Q(accessrestrictions__pk__in=filter_perms)
return ~Q(members__pk__in=filter_perms)
@classmethod
def qs_for_user(cls, user):
@ -91,7 +93,7 @@ class AccessRestrictionGroup(TitledMixin, models.Model):
permissions = AccessPermission.get_for_user(user)
# now we filter out groups where the user doesn't have a permission for all members
filter_perms = all_permissions - permissions
return ~Q(accessrestrictions__pk__in=filter_perms)
return ~Q(members__pk__in=filter_perms)
def default_valid_until():
@ -288,7 +290,7 @@ class AccessPermission(models.Model):
result = tuple(
qs.select_related(
'access_restriction_group'
).prefetch_related('access_restriction_group__accessrestrictions')
).prefetch_related('access_restriction_group__members')
)
# collect permissions (can be multiple for one restriction)
@ -297,7 +299,7 @@ class AccessPermission(models.Model):
if permission.access_restriction_id:
permissions.setdefault(permission.access_restriction_id, set()).add(permission.expire_date)
if permission.access_restriction_group_id:
for member in permission.access_restriction_group.accessrestrictions.all():
for member in permission.access_restriction_group.members.all():
permissions.setdefault(member.pk, set()).add(permission.expire_date)
# get latest expire date for each permission