Basraah 4ae450f963 Group system overhaul (#588)
* Add open/hidden group membership display and remove

* Include requestable groups other than open

* Prevent users requesting or leaving non-joinable groups

I have not prevented users joining hidden groups however, as
there may be some use cases where the direct link is provided
for users to request access to the group.

Also prevent users generating leave requests for groups they
are not a member of.

* Refactor Group extension models into a single OneToOne model

Added group leader field

* Add blankable fields

* Switched to use navactive for menu highlighting

* Consolidate member state checking for easier code reuse

* Added support for group leaders to manage groups

* Added info log when a user removes someone from a group

* Add ordering to group member list
2017-01-02 18:52:20 -05:00

113 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-12-04 10:25
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
from django.core.exceptions import ObjectDoesNotExist
import django.db.models.deletion
def internal_group(group):
return (
"Corp_" in group.name or
"Alliance_" in group.name or
settings.DEFAULT_AUTH_GROUP in group.name or
settings.DEFAULT_BLUE_GROUP in group.name
)
def combine_group_models(apps, schema_editor):
Group = apps.get_model("auth", "Group")
AuthGroup = apps.get_model("groupmanagement", "AuthGroup")
for group in Group.objects.all():
authgroup = AuthGroup(group=group)
if not hasattr(group, 'hiddengroup'):
authgroup.hidden = False
if hasattr(group, 'opengroup'):
authgroup.open = True
if hasattr(group, 'groupdescription'):
authgroup.description = group.groupdescription.description
authgroup.internal = internal_group(group)
authgroup.save()
def reverse_group_models(apps, schema_editor):
Group = apps.get_model("auth", "Group")
GroupDescription = apps.get_model("groupmanagement", "GroupDescription")
OpenGroup = apps.get_model("groupmanagement", "OpenGroup")
HiddenGroup = apps.get_model("groupmanagement", "HiddenGroup")
for group in Group.objects.all():
if not hasattr(group, 'authgroup') or group.authgroup is None:
continue
if group.authgroup.open:
OpenGroup.objects.get_or_create(group=group)
else:
try:
OpenGroup.objects.get(group=group).delete()
except ObjectDoesNotExist:
pass
if group.authgroup.hidden:
HiddenGroup.objects.get_or_create(group=group)
else:
try:
HiddenGroup.objects.get(group=group).delete()
except ObjectDoesNotExist:
pass
if len(group.authgroup.description):
GroupDescription.objects.update_or_create(group=group,
defaults={'description': group.authgroup.description})
class Migration(migrations.Migration):
dependencies = [
('auth', '0008_alter_user_username_max_length'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('groupmanagement', '0003_default_groups'),
]
operations = [
migrations.CreateModel(
name='AuthGroup',
fields=[
('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True,
serialize=False, to='auth.Group')),
('internal', models.BooleanField(default=True, help_text='Internal group, users cannot see, join or request to join this group.<br>Used for groups such as Members, Corp_*, Alliance_* etc.<br><b>Overrides Hidden and Open options when selected.</b>')),
('hidden', models.BooleanField(default=True, help_text='Group is hidden from users but can still join with the correct link.')),
('open', models.BooleanField(default=False, help_text='Group is open and users will be automatically added upon request. <br>If the group is not open users will need their request manually approved.')),
('description', models.CharField(max_length=512, blank=True, help_text='Description of the group shown to users.', )),
('group_leaders', models.ManyToManyField(related_name='leads_groups', to=settings.AUTH_USER_MODEL, blank=True, help_text='Group leaders can process group requests for this group specifically. Use the auth.group_management permission to allow a user to manage all groups.',)),
],
),
migrations.RunPython(combine_group_models, reverse_group_models),
migrations.RemoveField(
model_name='groupdescription',
name='group',
),
migrations.RemoveField(
model_name='hiddengroup',
name='group',
),
migrations.RemoveField(
model_name='opengroup',
name='group',
),
migrations.DeleteModel(
name='GroupDescription',
),
migrations.DeleteModel(
name='HiddenGroup',
),
migrations.DeleteModel(
name='OpenGroup',
),
]