summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2014-09-03 17:19:29 +0700
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2014-09-03 17:19:29 +0700
commitdb27ed730000516b98edc3df149abe129dab6dcc (patch)
tree25442071a07906eb7e09010a8aca7b4500ebc9c0
parenta0d5ce77867a76bb82690157d901f06785717d63 (diff)
downloadaskbot-db27ed730000516b98edc3df149abe129dab6dcc.tar.gz
askbot-db27ed730000516b98edc3df149abe129dab6dcc.tar.bz2
askbot-db27ed730000516b98edc3df149abe129dab6dcc.zip
fixed auth_user editing in Django admin and one more bugfix in the livesettings
-rw-r--r--askbot/deps/livesettings/values.py11
-rw-r--r--askbot/models/__init__.py59
-rw-r--r--askbot/models/user.py17
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'