summaryrefslogtreecommitdiffstats
path: root/askbot/models/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'askbot/models/__init__.py')
-rw-r--r--askbot/models/__init__.py59
1 files changed, 53 insertions, 6 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index 0c2459ec..b39a11c4 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -2937,7 +2937,9 @@ def user_update_wildcard_tag_selections(
def user_edit_group_membership(self, user=None, group=None,
- action=None, force=False):
+ action=None, force=False,
+ level=None
+ ):
"""allows one user to add another to a group
or remove user from group.
@@ -2959,13 +2961,13 @@ def user_edit_group_membership(self, user=None, group=None,
openness = 'open'
if openness == 'open':
- level = GroupMembership.FULL
+ level = level or GroupMembership.FULL
elif openness == 'moderated':
- level = GroupMembership.PENDING
+ level = level or GroupMembership.PENDING
elif openness == 'closed':
raise django_exceptions.PermissionDenied()
else:
- level = GroupMembership.FULL
+ level = level or GroupMembership.FULL
membership, created = GroupMembership.objects.get_or_create(
user=user, group=group, level=level
@@ -2978,9 +2980,10 @@ def user_edit_group_membership(self, user=None, group=None,
else:
raise ValueError('invalid action')
-def user_join_group(self, group, force=False):
+def user_join_group(self, group, force=False, level=None):
return self.edit_group_membership(group=group, user=self,
- action='add', force=force)
+ action='add', force=force,
+ level=level)
def user_leave_group(self, group):
self.edit_group_membership(group=group, user=self, action='remove')
@@ -3852,6 +3855,49 @@ def moderate_group_joining(sender, instance=None, created=False, **kwargs):
content_object = group
)
+#this variable and the signal handler below is
+#needed to work around the issue in the django admin
+#where auth_user table editing affects group memberships
+GROUP_MEMBERSHIP_LEVELS = dict()
+def group_membership_changed(**kwargs):
+ sender = kwargs['sender']
+ user = kwargs['instance']
+ action = kwargs['action']
+ reverse = kwargs['reverse']
+ model = kwargs['model']
+ pk_set = kwargs['pk_set']
+
+ if reverse:
+ raise NotImplementedError()
+
+ #store group memberships info
+ #and then delete group memberships
+ if action == 'pre_clear':
+ #get membership info, if exists, save
+ memberships = GroupMembership.objects.filter(user=user)
+ for gm in memberships:
+ GROUP_MEMBERSHIP_LEVELS[(user.id, gm.group.id)] = gm.level
+ memberships.delete()
+ elif action == 'post_add':
+ group_ids = pk_set
+ for group_id in group_ids:
+ gm_key = (user.id, group_id)
+ #mend group membership if it does not exist
+ if not GroupMembership.objects.filter(user=user, group__id=group_id).exists():
+ try:
+ group = Group.objects.get(id=group_id)
+ except Group.DoesNotExist:
+ #this is not an Askbot group, no group profile
+ #so we don't add anything here
+ pass
+ else:
+ #restore group membership here
+ level = GROUP_MEMBERSHIP_LEVELS.get(gm_key)
+ GroupMembership.objects.create(user=user, group=group, level=level)
+
+ GROUP_MEMBERSHIP_LEVELS.pop(gm_key, None)
+
+
def tweet_new_post(sender, user=None, question=None, answer=None, form_data=None, **kwargs):
"""seends out tweets about the new post"""
from askbot.tasks import tweet_new_post_task
@@ -3884,6 +3930,7 @@ django_signals.post_save.connect(record_answer_accepted, sender=Post)
django_signals.post_save.connect(record_vote, sender=Vote)
django_signals.post_save.connect(record_favorite_question, sender=FavoriteQuestion)
django_signals.post_save.connect(moderate_group_joining, sender=GroupMembership)
+django_signals.m2m_changed.connect(group_membership_changed, sender=User.groups.through)
if 'avatar' in django_settings.INSTALLED_APPS:
from avatar.models import Avatar