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__.py111
1 files changed, 85 insertions, 26 deletions
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index 0c2459ec..0d7c2fa7 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -1798,7 +1798,7 @@ def user_edit_comment(
todo: add timestamp
"""
self.assert_can_edit_comment(comment_post)
- comment_post.apply_edit(
+ revision = comment_post.apply_edit(
text=body_text,
edited_at=timestamp,
edited_by=self,
@@ -1807,6 +1807,7 @@ def user_edit_comment(
ip_addr=ip_addr,
)
comment_post.thread.invalidate_cached_data()
+ return revision
def user_edit_post(self,
post=None,
@@ -1824,7 +1825,7 @@ def user_edit_post(self,
because we cannot bypass the permissions checks set within
"""
if post.post_type == 'comment':
- self.edit_comment(
+ return self.edit_comment(
comment_post=post,
body_text=body_text,
by_email=by_email,
@@ -1832,7 +1833,7 @@ def user_edit_post(self,
ip_addr=ip_addr
)
elif post.post_type == 'answer':
- self.edit_answer(
+ return self.edit_answer(
answer=post,
body_text=body_text,
timestamp=timestamp,
@@ -1842,7 +1843,7 @@ def user_edit_post(self,
ip_addr=ip_addr
)
elif post.post_type == 'question':
- self.edit_question(
+ return self.edit_question(
question=post,
body_text=body_text,
timestamp=timestamp,
@@ -1853,7 +1854,7 @@ def user_edit_post(self,
ip_addr=ip_addr
)
elif post.post_type == 'tag_wiki':
- post.apply_edit(
+ return post.apply_edit(
edited_at=timestamp,
edited_by=self,
text=body_text,
@@ -1886,7 +1887,7 @@ def user_edit_question(
if force == False:
self.assert_can_edit_question(question)
- question.apply_edit(
+ revision = question.apply_edit(
edited_at=timestamp,
edited_by=self,
title=title,
@@ -1910,6 +1911,7 @@ def user_edit_question(
context_object = question,
timestamp = timestamp
)
+ return revision
@auto_now_timestamp
def user_edit_answer(
@@ -1928,7 +1930,7 @@ def user_edit_answer(
if force == False:
self.assert_can_edit_answer(answer)
- answer.apply_edit(
+ revision = answer.apply_edit(
edited_at=timestamp,
edited_by=self,
text=body_text,
@@ -1947,6 +1949,7 @@ def user_edit_answer(
context_object = answer,
timestamp = timestamp
)
+ return revision
@auto_now_timestamp
def user_create_post_reject_reason(
@@ -1984,7 +1987,7 @@ def user_edit_post_reject_reason(
):
reason.title = title
reason.save()
- reason.details.apply_edit(
+ return reason.details.apply_edit(
edited_by = self,
edited_at = timestamp,
text = details
@@ -2789,8 +2792,23 @@ def user_approve_post_revision(user, post_revision, timestamp = None):
post.thread.answer_count += 1
post.thread.save()
+
+
post.approved = True
- post.save()
+ post.text = post_revision.text
+
+ post_is_new = (post.revisions.count() == 1)
+ parse_results = post.parse_and_save(author=post_revision.author)
+ signals.post_updated.send(
+ post=post,
+ updated_by=post_revision.author,
+ newly_mentioned_users=parse_results['newly_mentioned_users'],
+ #suppress_email=suppress_email,
+ timestamp=timestamp,
+ created=post_is_new,
+ diff=parse_results['diff'],
+ sender=post.__class__
+ )
if post_revision.post.post_type == 'question':
thread = post.thread
@@ -2801,8 +2819,10 @@ def user_approve_post_revision(user, post_revision, timestamp = None):
#send the signal of published revision
signals.post_revision_published.send(
- None, revision = post_revision, was_approved = True
- )
+ None,
+ revision=post_revision,
+ was_approved=True
+ )
@auto_now_timestamp
def flag_post(
@@ -2937,7 +2957,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 +2981,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 +3000,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')
@@ -3368,9 +3391,7 @@ def get_reply_to_addresses(user, post):
return primary_addr, secondary_addr
-def notify_author_of_published_revision(
- revision = None, was_approved = None, **kwargs
-):
+def notify_author_of_published_revision(revision=None, was_approved=False, **kwargs):
"""notifies author about approved post revision,
assumes that we have the very first revision
"""
@@ -3404,12 +3425,6 @@ def record_post_update_activity(
this handler will set notifications about the post
"""
- if post.needs_moderation():
- #do not give notifications yet
- #todo: it is possible here to trigger
- #moderation email alerts
- return
-
assert(timestamp != None)
assert(updated_by != None)
if newly_mentioned_users is None:
@@ -3852,6 +3867,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 +3942,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