From db27ed730000516b98edc3df149abe129dab6dcc Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Wed, 3 Sep 2014 17:19:29 +0700 Subject: fixed auth_user editing in Django admin and one more bugfix in the livesettings --- askbot/deps/livesettings/values.py | 11 +++++-- askbot/models/__init__.py | 59 ++++++++++++++++++++++++++++++++++---- askbot/models/user.py | 17 +++++++++++ 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/askbot/deps/livesettings/values.py b/askbot/deps/livesettings/values.py index d81047ae..87c58e1e 100644 --- a/askbot/deps/livesettings/values.py +++ b/askbot/deps/livesettings/values.py @@ -471,17 +471,22 @@ class Value(object): return '' def get_editor_value(self, language_code): + setting = None try: setting = self.get_setting(language_code) - return self.to_python(setting.value) except SettingNotSet: if language_code == django_settings.LANGUAGE_CODE: try: - return self.to_python(find_setting(self.group.key, self.key).value) + setting = find_setting(self.group.key, self.key) except SettingNotSet: pass - return self.get_default_editor_value(language_code) + if setting: + raw_value = setting.value + else: + raw_value = self.get_default_editor_value(language_code) + + return self.to_python(raw_value) # Subclasses should override the following methods where applicable 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 diff --git a/askbot/models/user.py b/askbot/models/user.py index e965cb05..167ebfbf 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -396,6 +396,21 @@ class AuthUserGroups(models.Model): managed = False +class GroupMembershipManager(models.Manager): + def create(self, **kwargs): + user = kwargs['user'] + group = kwargs['group'] + try: + #need this for the cases where auth User_groups is there, + #but ours is not + auth_gm = AuthUserGroups.objects.get(user=user, group=group) + #use this as link for the One to One relation + kwargs['authusergroups_ptr'] = auth_gm + except AuthUserGroups.DoesNotExist: + pass + super(GroupMembershipManager, self).create(**kwargs) + + class GroupMembership(AuthUserGroups): """contains one-to-one relation to ``auth_user_group`` and extra membership profile fields""" @@ -414,6 +429,8 @@ class GroupMembership(AuthUserGroups): choices=LEVEL_CHOICES, ) + objects = GroupMembershipManager() + class Meta: app_label = 'askbot' -- cgit v1.2.3-1-g7c22