summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2014-09-16 11:44:06 +0700
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2014-09-16 11:44:06 +0700
commitd314888c06bf7844788813452f9509b4f0bb74d9 (patch)
tree2381202fcf95462581f683cd3ff455d780d99325
parenta0398a9b4267d363b7aa47f7824ac54fde053e24 (diff)
parent2331976db696199cfe136341b7f19d34380317f0 (diff)
downloadaskbot-d314888c06bf7844788813452f9509b4f0bb74d9.tar.gz
askbot-d314888c06bf7844788813452f9509b4f0bb74d9.tar.bz2
askbot-d314888c06bf7844788813452f9509b4f0bb74d9.zip
merged the master branch
-rw-r--r--askbot/conf/email.py6
-rw-r--r--askbot/conf/words.py9
-rw-r--r--askbot/deps/livesettings/values.py11
-rw-r--r--askbot/media/jquery-openid/jquery.openid.js6
-rw-r--r--askbot/models/__init__.py111
-rw-r--r--askbot/models/post.py132
-rw-r--r--askbot/models/question.py28
-rw-r--r--askbot/models/user.py17
-rw-r--r--askbot/tasks.py49
-rw-r--r--askbot/templates/badge.html6
-rw-r--r--askbot/templates/email/notify_author_about_approved_post.html22
-rw-r--r--askbot/templates/macros.html10
-rw-r--r--askbot/templates/main_page.html4
-rw-r--r--askbot/templates/meta/bottom_scripts.html4
-rw-r--r--askbot/templates/user_profile/user_network.html16
-rw-r--r--askbot/templates/users.html6
-rw-r--r--askbot/templates/widgets/user_card.html4
-rw-r--r--askbot/templates/widgets/user_list.html2
-rw-r--r--askbot/templates/widgets/user_long_score_and_badge_summary.html4
-rw-r--r--askbot/templates/widgets/user_navigation.html11
-rw-r--r--askbot/views/readers.py15
-rw-r--r--askbot/views/writers.py20
22 files changed, 288 insertions, 205 deletions
diff --git a/askbot/conf/email.py b/askbot/conf/email.py
index 088e0590..cbdb2ba1 100644
--- a/askbot/conf/email.py
+++ b/askbot/conf/email.py
@@ -308,11 +308,11 @@ settings.register(
livesettings.StringValue(
EMAIL,
'SELF_NOTIFY_EMAILED_POST_AUTHOR_WHEN',
- description = _(
+ description=_(
'Emailed post: when to notify author about publishing'
),
- choices = const.SELF_NOTIFY_EMAILED_POST_AUTHOR_WHEN_CHOICES,
- default = const.NEVER
+ choices=const.SELF_NOTIFY_EMAILED_POST_AUTHOR_WHEN_CHOICES,
+ default=const.NEVER
)
)
diff --git a/askbot/conf/words.py b/askbot/conf/words.py
index bb99bbce..6b1361d2 100644
--- a/askbot/conf/words.py
+++ b/askbot/conf/words.py
@@ -869,15 +869,6 @@ settings.register(
settings.register(
values.StringValue(
WORDS,
- 'WORDS_GIVE_AN_ANSWER_INTERESTING_TO_THIS_COMMUNITY',
- default=_('give an answer interesting to this community'),
- description=_('give an answer interesting to this community'),
- )
-)
-
-settings.register(
- values.StringValue(
- WORDS,
'WORDS_GIVE_A_GOOD_ANSWER',
default=_('give a substantial answer'),
description=_('give a substantial answer'),
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/media/jquery-openid/jquery.openid.js b/askbot/media/jquery-openid/jquery.openid.js
index 9c13ecb7..f2b985f1 100644
--- a/askbot/media/jquery-openid/jquery.openid.js
+++ b/askbot/media/jquery-openid/jquery.openid.js
@@ -460,12 +460,6 @@ $.fn.authenticator = function() {
);
}
- /*var googlePlusBtn = signin_page.find('input.google-plus');
- if (googlePlusBtn.length) {
- activateGooglePlusBtn(googlePlusBtn);
- }*/
-
-
setup_event_handlers(
signin_page.find('input.oauth,input.oauth2'),
start_simple_login
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
diff --git a/askbot/models/post.py b/askbot/models/post.py
index b4d8bfca..d155667a 100644
--- a/askbot/models/post.py
+++ b/askbot/models/post.py
@@ -235,7 +235,7 @@ class PostManager(BaseQuerySetManager):
parse_results = post.parse_and_save(author=author, is_private=is_private)
- post.add_revision(
+ revision = post.add_revision(
author=author,
revised_at=added_at,
text=text,
@@ -244,16 +244,17 @@ class PostManager(BaseQuerySetManager):
ip_addr=ip_addr
)
- from askbot.models import signals
- signals.post_updated.send(
- post=post,
- updated_by=author,
- newly_mentioned_users=parse_results['newly_mentioned_users'],
- timestamp=added_at,
- created=True,
- diff=parse_results['diff'],
- sender=post.__class__
- )
+ if revision.revision > 0:
+ from askbot.models import signals
+ signals.post_updated.send(
+ post=post,
+ updated_by=author,
+ newly_mentioned_users=parse_results['newly_mentioned_users'],
+ timestamp=added_at,
+ created=True,
+ diff=parse_results['diff'],
+ sender=post.__class__
+ )
return post
@@ -510,7 +511,7 @@ class Post(models.Model):
'html': post_html,
'newly_mentioned_users': mentioned_authors,
'removed_mentions': removed_mentions,
- }
+ }
return data
#todo: when models are merged, it would be great to remove author parameter
@@ -864,7 +865,7 @@ class Post(models.Model):
is_multilingual = getattr(django_settings, 'ASKBOT_MULTILINGUAL', False)
if is_multilingual:
request_language = get_language()
- activate_language(self.thread.language_code)
+ activate_language(self.language_code)
if self.is_answer():
if not question_post:
@@ -1853,7 +1854,7 @@ class Post(models.Model):
latest_rev.save()
else:
#otherwise we create a new revision
- self.add_revision(
+ latest_rev = self.add_revision(
author=edited_by,
revised_at=edited_at,
text=text,
@@ -1863,19 +1864,22 @@ class Post(models.Model):
is_anonymous=edit_anonymously
)
- parse_results = self.parse_and_save(author=edited_by, is_private=is_private)
+ if latest_rev.revision > 0:
+ parse_results = self.parse_and_save(author=edited_by, is_private=is_private)
- from askbot.models import signals
- signals.post_updated.send(
- post=self,
- updated_by=edited_by,
- newly_mentioned_users=parse_results['newly_mentioned_users'],
- suppress_email=suppress_email,
- timestamp=edited_at,
- created=False,
- diff=parse_results['diff'],
- sender=self.__class__
- )
+ from askbot.models import signals
+ signals.post_updated.send(
+ post=self,
+ updated_by=edited_by,
+ newly_mentioned_users=parse_results['newly_mentioned_users'],
+ suppress_email=suppress_email,
+ timestamp=edited_at,
+ created=False,
+ diff=parse_results['diff'],
+ sender=self.__class__
+ )
+
+ return latest_rev
def _answer__apply_edit(
@@ -1899,7 +1903,7 @@ class Post(models.Model):
else:
self.make_public()
- self.__apply_edit(
+ revision = self.__apply_edit(
edited_at=edited_at,
edited_by=edited_by,
text=text,
@@ -1917,6 +1921,7 @@ class Post(models.Model):
last_activity_at=edited_at,
last_activity_by=edited_by
)
+ return revision
def _question__apply_edit(
self,
@@ -1963,7 +1968,7 @@ class Post(models.Model):
else:
self.thread.make_public(recursive=False)
- self.__apply_edit(
+ revision = self.__apply_edit(
edited_at=edited_at,
edited_by=edited_by,
text=text,
@@ -1980,6 +1985,7 @@ class Post(models.Model):
last_activity_at=edited_at,
last_activity_by=edited_by
)
+ return revision
def apply_edit(self, *args, **kwargs):
#todo: unify this, here we have unnecessary indirection
@@ -2204,13 +2210,15 @@ class PostRevisionManager(models.Manager):
kwargs['summary'] = ''
author = kwargs['author']
+ post = kwargs['post']
moderate_email = False
if kwargs.get('email'):
from askbot.models.reply_by_email import emailed_content_needs_moderation
moderate_email = emailed_content_needs_moderation(kwargs['email'])
- needs_moderation = author.needs_moderation() or moderate_email
+ is_content = post.is_question() or post.is_answer() or post.is_comment()
+ needs_moderation = is_content and (author.needs_moderation() or moderate_email)
#0 revision is not shown to the users
if askbot_settings.CONTENT_MODERATION_MODE == 'premoderation' and needs_moderation:
@@ -2221,9 +2229,16 @@ class PostRevisionManager(models.Manager):
'revision': 0,
'summary': kwargs['summary'] or _('Suggested edit')
})
- revision = super(PostRevisionManager, self).create(*args, **kwargs)
+
+ #see if we have earlier revision with number 0
+ try:
+ pending_revs = post.revisions.filter(revision=0)
+ assert(len(pending_revs) == 1)
+ pending_revs.update(**kwargs)
+ revision = pending_revs[0]
+ except AssertionError:
+ revision = super(PostRevisionManager, self).create(*args, **kwargs)
else:
- post = kwargs['post']
kwargs['revision'] = post.get_latest_revision_number() + 1
revision = super(PostRevisionManager, self).create(*args, **kwargs)
@@ -2344,33 +2359,39 @@ class PostRevision(models.Model):
#Activity instance is the actual queue item
from askbot.models import Activity
- activity = Activity(
- user = self.author,
- content_object = self,
- activity_type = activity_type,
- question = self.get_origin_post()
- )
- activity.save()
- activity.add_recipients(self.post.get_moderators())
+ content_type = ContentType.objects.get_for_model(self)
+ #try
+ try:
+ activity = Activity.objects.get(
+ activity_type=activity_type,
+ object_id=self.id,
+ content_type=content_type
+ )
+ except Activity.DoesNotExist:
+ activity = Activity(
+ user = self.author,
+ content_object = self,
+ activity_type = activity_type,
+ question = self.get_origin_post()
+ )
+ activity.save()
+ activity.add_recipients(self.post.get_moderators())
- def should_notify_author_about_publishing(self, was_approved = False):
+ def should_notify_author_about_publishing(self, was_approved=False):
"""True if author should get email about making own post"""
- if self.by_email:
- schedule = askbot_settings.SELF_NOTIFY_EMAILED_POST_AUTHOR_WHEN
- if schedule == const.NEVER:
- return False
- elif schedule == const.FOR_FIRST_REVISION:
- return self.revision == 1
- elif schedule == const.FOR_ANY_REVISION:
- return True
- else:
- raise ValueError()
- else:
- #logic not implemented yet
- #the ``was_approved`` argument will be used here
- #schedule = askbot_settings.SELF_NOTIFY_WEB_POST_AUTHOR_WHEN
+ if was_approved and self.by_email == False:
return False
+ schedule = askbot_settings.SELF_NOTIFY_EMAILED_POST_AUTHOR_WHEN
+ if schedule == const.NEVER:
+ return False
+ elif schedule == const.FOR_FIRST_REVISION:
+ return self.revision == 1
+ elif schedule == const.FOR_ANY_REVISION:
+ return True
+ else:
+ raise ValueError()
+
def __unicode__(self):
return u'%s - revision %s of %s' % (self.post.post_type, self.revision, self.title)
@@ -2394,8 +2415,7 @@ class PostRevision(models.Model):
if is_multilingual:
request_language = get_language()
- if self.post.thread:
- activate_language(self.post.thread.language_code)
+ activate_language(self.post.language_code)
if self.post.is_question():
url = reverse('question_revisions', args = (self.post.id,))
diff --git a/askbot/models/question.py b/askbot/models/question.py
index a068224d..f851e33c 100644
--- a/askbot/models/question.py
+++ b/askbot/models/question.py
@@ -224,15 +224,16 @@ class ThreadManager(BaseQuerySetManager):
#todo: this is handled in signal because models for posts
#are too spread out
- signals.post_updated.send(
- post=question,
- updated_by=author,
- newly_mentioned_users=parse_results['newly_mentioned_users'],
- timestamp=added_at,
- created=True,
- diff=parse_results['diff'],
- sender=question.__class__
- )
+ if revision.revision > 0:
+ signals.post_updated.send(
+ post=question,
+ updated_by=author,
+ newly_mentioned_users=parse_results['newly_mentioned_users'],
+ timestamp=added_at,
+ created=True,
+ diff=parse_results['diff'],
+ sender=question.__class__
+ )
return thread
@@ -1097,6 +1098,7 @@ class Thread(models.Model):
post__id__in=post_ids,
revision=0
)
+
#get ids of posts that we need to patch with suggested data
if len(suggested_revs):
#find posts that we need to patch
@@ -1113,7 +1115,7 @@ class Thread(models.Model):
found.update(find_posts(comments, need_ids))
return found
- suggested_post_ids = set([rev.post_id for rev in suggested_revs])
+ suggested_post_ids = [rev.post_id for rev in suggested_revs]
question = post_data[0]
answers = post_data[1]
@@ -1132,7 +1134,10 @@ class Thread(models.Model):
rev = rev_map[post_id]
#patching work
post.text = rev.text
- post.html = post.parse_post_text()['html']
+ parse_data = post.parse_post_text()
+ post.html = parse_data['html']
+ post.summary = post.get_snippet()
+
post_to_author[post_id] = rev.author_id
post.set_runtime_needs_moderation()
@@ -1159,6 +1164,7 @@ class Thread(models.Model):
rev = rev_map[post.id]
post.text = rev.text
post.html = post.parse_post_text()['html']
+ post.summary = post.get_snippet()
post_to_author[post.id] = rev.author_id
if post.is_comment():
parents = find_posts(all_posts, set([post.parent_id]))
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'
diff --git a/askbot/tasks.py b/askbot/tasks.py
index ec3e405b..5b82316c 100644
--- a/askbot/tasks.py
+++ b/askbot/tasks.py
@@ -75,6 +75,13 @@ def notify_author_of_published_revision_celery_task(revision):
#todo: move this to ``askbot.mail`` module
#for answerable email only for now, because
#we don't yet have the template for the read-only notification
+
+ data = {
+ 'site_name': askbot_settings.APP_SHORT_NAME,
+ 'post': revision.post
+ }
+ headers = None
+
if askbot_settings.REPLY_BY_EMAIL:
#generate two reply codes (one for edit and one for addition)
#to format an answerable email or not answerable email
@@ -101,30 +108,26 @@ def notify_author_of_published_revision_celery_task(revision):
prompt = _('To add to your post EDIT ABOVE THIS LINE')
reply_separator_line = const.SIMPLE_REPLY_SEPARATOR_TEMPLATE % prompt
- data = {
- 'site_name': askbot_settings.APP_SHORT_NAME,
- 'post': revision.post,
- 'author_email_signature': revision.author.email_signature,
- 'replace_content_address': replace_content_address,
- 'reply_separator_line': reply_separator_line,
- 'mailto_link_subject': mailto_link_subject,
- 'reply_code': reply_code
- }
-
- #load the template
- activate_language(revision.post.language_code)
- template = get_template('email/notify_author_about_approved_post.html')
- #todo: possibly add headers to organize messages in threads
+ data['reply_code'] = reply_code
+ data['author_email_signature'] = revision.author.email_signature
+ data['replace_content_address'] = replace_content_address
+ data['reply_separator_line'] = reply_separator_line
+ data['mailto_link_subject'] = mailto_link_subject
headers = {'Reply-To': append_content_address}
- #send the message
- mail.send_mail(
- subject_line = _('Your post at %(site_name)s is now published') % data,
- body_text = template.render(Context(data)),
- recipient_list = [revision.author.email,],
- related_object = revision,
- activity_type = const.TYPE_ACTIVITY_EMAIL_UPDATE_SENT,
- headers = headers
- )
+
+ #load the template
+ activate_language(revision.post.language_code)
+ template = get_template('email/notify_author_about_approved_post.html')
+ #todo: possibly add headers to organize messages in threads
+ #send the message
+ mail.send_mail(
+ subject_line = _('Your post at %(site_name)s is now published') % data,
+ body_text = template.render(Context(data)),
+ recipient_list = [revision.author.email,],
+ related_object = revision,
+ activity_type = const.TYPE_ACTIVITY_EMAIL_UPDATE_SENT,
+ headers = headers
+ )
@task(ignore_result = True)
def record_post_update_celery_task(
diff --git a/askbot/templates/badge.html b/askbot/templates/badge.html
index 4a405218..25bda5ea 100644
--- a/askbot/templates/badge.html
+++ b/askbot/templates/badge.html
@@ -16,11 +16,7 @@
</div>
<div class="clean"></div>
<div id="award-list">
- {{ macros.user_list(
- badge_recipients,
- karma_mode=settings.KARMA_MODE,
- badges_mode=settings.BADGES_MODE
- )}}
+ {{ macros.user_list(badge_recipients) }}
</div>
{% endblock %}
<!-- end template badge.html -->
diff --git a/askbot/templates/email/notify_author_about_approved_post.html b/askbot/templates/email/notify_author_about_approved_post.html
index 6007f06e..01901cd7 100644
--- a/askbot/templates/email/notify_author_about_approved_post.html
+++ b/askbot/templates/email/notify_author_about_approved_post.html
@@ -10,14 +10,16 @@
* reply_code (comma-separated list of emails to respond to this message)
#}
-{%block content %}
-{{ reply_separator_line }}
-<p>{% trans
- post_text = post.text|safe_urlquote,
- subject = mailto_link_subject|safe_urlquote,
- author_email_signature = author_email_signature|safe_urlquote
-%}If you would like to edit by email, please
-<a href="mailto:{{ replace_content_address }}?body={{ post_text }}{{ author_email_signature}}&subject={{ subject }}">click here</a>{% endtrans %}</p>
+{% block content %}
+{% if email_code %}
+ {{ reply_separator_line }}
+ <p>{% trans
+ post_text = post.text|safe_urlquote,
+ subject = mailto_link_subject|safe_urlquote,
+ author_email_signature = author_email_signature|safe_urlquote
+ %}If you would like to edit by email, please
+ <a href="mailto:{{ replace_content_address }}?body={{ post_text }}{{ author_email_signature}}&subject={{ subject }}">click here</a>{% endtrans %}</p>
+{% endif %}
<p>{% trans %}Below is a copy of your post:{% endtrans %}</p>
{% if post.post_type == 'question' %}
<p style="font-size:16px">{{ post.thread.title }}</p>
@@ -27,5 +29,7 @@
{%block footer %}
{% include "email/footer.html" %}
-<p style="{{ macros.fine_print_style() }}">{{ email_code }}</p>{# important #}
+{% if email_code %}
+ <p style="{{ macros.fine_print_style() }}">{{ email_code }}</p>{# important #}
+{% endif %}
{% endblock %}
diff --git a/askbot/templates/macros.html b/askbot/templates/macros.html
index 19aab815..f0fe368e 100644
--- a/askbot/templates/macros.html
+++ b/askbot/templates/macros.html
@@ -57,7 +57,7 @@
<img alt="{% trans %}anonymous user{% endtrans %}" src="{{ '/images/anon.png'|media }} " class="gravatar" width="32" height="32" />
<p>{{ revision.author.get_anonymous_name() }}</p>
{% else %}
- {{ user_card(revision.author, karma_mode=karma_mode, badges_mode=badges_mode) }}
+ {{ user_card(revision.author) }}
{% endif %}
{% if settings.GROUPS_ENABLED %}
{{ user_primary_group(revision.author) }}
@@ -582,9 +582,7 @@ for the purposes of the AJAX comment editor #}
{% endif %}
{%- endmacro -%}
-{%- macro user_long_score_and_badge_summary(
- user, karma_mode=None, badges_mode = None
-) -%}
+{%- macro user_long_score_and_badge_summary(user) -%}
{%- include "widgets/user_long_score_and_badge_summary.html" -%}
{%- endmacro -%}
@@ -626,11 +624,11 @@ for the purposes of the AJAX comment editor #}
{{ user_country_name_and_flag(user) }}
{%- endmacro -%}
-{% macro user_card(user, karma_mode=None, badges_mode=None) %}
+{% macro user_card(user) %}
{% include "widgets/user_card.html" %}
{% endmacro %}
-{%- macro user_list(users, karma_mode=None, badges_mode=None) -%}
+{%- macro user_list(users) -%}
{% include "widgets/user_list.html" %}
{%- endmacro -%}
diff --git a/askbot/templates/main_page.html b/askbot/templates/main_page.html
index 19c447a2..207e064d 100644
--- a/askbot/templates/main_page.html
+++ b/askbot/templates/main_page.html
@@ -29,10 +29,6 @@
<script type="text/javascript">
{# cant cache this #}
askbot['settings']['showSortByRelevance'] = {{ show_sort_by_relevance|as_js_bool }};
- askbot['messages']['questionSingular'] = '{{ settings.WORDS_QUESTION_SINGULAR|escapejs }}';
- askbot['messages']['answerSingular'] = '{{ settings.WORDS_ANSWER_SINGULAR|escapejs }}';
- askbot['messages']['acceptOwnAnswer'] = '{{ settings.WORDS_ACCEPT_OR_UNACCEPT_OWN_ANSWER|escapejs }}';
- askbot['messages']['followQuestions'] = '{{ settings.WORDS_FOLLOW_QUESTIONS|escapejs }}';
</script>
{% include "main_page/javascript.html" %}
{% include "main_page/custom_javascript.html" ignore missing %}
diff --git a/askbot/templates/meta/bottom_scripts.html b/askbot/templates/meta/bottom_scripts.html
index c027258e..7af13b46 100644
--- a/askbot/templates/meta/bottom_scripts.html
+++ b/askbot/templates/meta/bottom_scripts.html
@@ -34,6 +34,10 @@
askbot['settings']['editorType'] = '{{ settings.EDITOR_TYPE }}';
askbot['settings']['commentsEditorType'] = '{{ settings.COMMENTS_EDITOR_TYPE }}';
askbot['messages']['askYourQuestion'] = '{{ settings.WORDS_ASK_YOUR_QUESTION }}';
+ askbot['messages']['questionSingular'] = '{{ settings.WORDS_QUESTION_SINGULAR|escapejs }}';
+ askbot['messages']['answerSingular'] = '{{ settings.WORDS_ANSWER_SINGULAR|escapejs }}';
+ askbot['messages']['acceptOwnAnswer'] = '{{ settings.WORDS_ACCEPT_OR_UNACCEPT_OWN_ANSWER|escapejs }}';
+ askbot['messages']['followQuestions'] = '{{ settings.WORDS_FOLLOW_QUESTIONS|escapejs }}';
{% if settings.ALLOWED_UPLOAD_FILE_TYPES %}
askbot['settings']['allowedUploadFileTypes'] = [
"{{ settings.ALLOWED_UPLOAD_FILE_TYPES|join('", "')|replace('.','') }}"
diff --git a/askbot/templates/user_profile/user_network.html b/askbot/templates/user_profile/user_network.html
index ce13d5c4..c4006392 100644
--- a/askbot/templates/user_profile/user_network.html
+++ b/askbot/templates/user_profile/user_network.html
@@ -8,23 +8,11 @@
{% if followed_users or followers %}
{% if followers %}
<h2>{% trans count=followers|length %}Followed by {{count}} person{% pluralize count %}Followed by {{count}} people{% endtrans %}</h2>
- {{
- macros.user_list(
- followers,
- karma_mode = settings.KARMA_MODE,
- badges_mode = settings.BADGES_MODE
- )
- }}
+ {{ macros.user_list(followers) }}
{% endif %}
{% if followed_users %}
<h2>{% trans count=followed_users|length %}Following {{count}} person{% pluralize count %}Following {{count}} people{% endtrans %}</h2>
- {{
- macros.user_list(
- followed_users,
- karma_mode = settings.KARMA_MODE,
- badges_mode = settings.BADGES_MODE
- )
- }}
+ {{ macros.user_list(followed_users) }}
{% endif %}
{% else %}
{% if request.user == view_user %}
diff --git a/askbot/templates/users.html b/askbot/templates/users.html
index 23c1f443..1f5cb631 100644
--- a/askbot/templates/users.html
+++ b/askbot/templates/users.html
@@ -68,11 +68,7 @@
{% if not users.object_list %}
<p><span>{% trans %}Nothing found.{% endtrans %}</span></p>
{% endif %}
-{{ macros.user_list(
- users.object_list,
- karma_mode = settings.KARMA_MODE, badges_mode = settings.BADGES_MODE
- )
-}}
+{{ macros.user_list(users.object_list) }}
<div class="pager">
{{ macros.paginator(paginator_context) }}
</div>
diff --git a/askbot/templates/widgets/user_card.html b/askbot/templates/widgets/user_card.html
index af8555c0..04c66d99 100644
--- a/askbot/templates/widgets/user_card.html
+++ b/askbot/templates/widgets/user_card.html
@@ -11,11 +11,11 @@
<br/>
- {% if karma_mode == 'public' %}
+ {% if settings.KARMA_MODE == 'public' %}
<span class="reputation-score">{{ user.reputation }}</span>
{% endif %}
- {% if badges_mode == 'public' %}
+ {% if settings.BADGES_MODE == 'public' %}
<span class="badges" title="{{ user.get_badge_summary() }}">
{% if user.gold %}
<span class='badge1'>&#9679;</span><span class="badgecount">{{ user.gold }}</span>
diff --git a/askbot/templates/widgets/user_list.html b/askbot/templates/widgets/user_list.html
index 6f3c97cb..343977f7 100644
--- a/askbot/templates/widgets/user_list.html
+++ b/askbot/templates/widgets/user_list.html
@@ -2,7 +2,7 @@
{% if users %}
<ul class="user-list">
{% for user in users %}
- <li>{{ macros.user_card(user, karma_mode=karma_mode, badges_mode=badges_mode) }}</li>
+ <li>{{ macros.user_card(user) }}</li>
{% endfor %}
</ul>
{% endif %}
diff --git a/askbot/templates/widgets/user_long_score_and_badge_summary.html b/askbot/templates/widgets/user_long_score_and_badge_summary.html
index dc93987c..76e5d4d4 100644
--- a/askbot/templates/widgets/user_long_score_and_badge_summary.html
+++ b/askbot/templates/widgets/user_long_score_and_badge_summary.html
@@ -2,12 +2,12 @@
{%- if user.is_read_only() -%}
{% trans %}read only access{% endtrans %}
{%- else -%}
- {%- if karma_mode != 'hidden' -%}
+ {%- if settings.KARMA_MODE != 'hidden' -%}
<a
class="user-micro-info reputation"
href="{{user.get_absolute_url()}}?sort=reputation"
data-url="{% url 'get_perms_data' %}"
- >{% trans %}karma:{% endtrans %} {{user.reputation}}</a>{% if badges_mode == 'public' and have_badges %}, {% endif -%}
+ >{% trans %}karma:{% endtrans %} {{user.reputation}}</a>{% if settings.BADGES_MODE == 'public' and have_badges %}, {% endif -%}
{%- endif -%}
{%- if badges_mode == 'public' and have_badges -%}
<a class="user-micro-info"
diff --git a/askbot/templates/widgets/user_navigation.html b/askbot/templates/widgets/user_navigation.html
index d451e65b..97c42da2 100644
--- a/askbot/templates/widgets/user_navigation.html
+++ b/askbot/templates/widgets/user_navigation.html
@@ -3,15 +3,8 @@
<span class="user-info">
{{ macros.inbox_link(request.user) }}
{{ macros.moderation_items_link(request.user, moderation_items) }}
- {%-
- if settings.KARMA_MODE != 'hidden' or settings.BADGES_MODE != 'hidden'
- -%}
- ({{ macros.user_long_score_and_badge_summary(
- user,
- karma_mode=settings.KARMA_MODE,
- badges_mode=settings.BADGES_MODE
- )
- }})
+ {%- if settings.KARMA_MODE != 'hidden' or settings.BADGES_MODE != 'hidden' -%}
+ ({{ macros.user_long_score_and_badge_summary(user) }})
{%- endif -%}
</span>
{% if settings.USE_ASKBOT_LOGIN_SYSTEM %}
diff --git a/askbot/views/readers.py b/askbot/views/readers.py
index 2e3c8249..4327e13a 100644
--- a/askbot/views/readers.py
+++ b/askbot/views/readers.py
@@ -508,15 +508,10 @@ def question(request, id):#refactor - long subroutine. display question body, an
#load answers and post id's->athor_id mapping
#posts are pre-stuffed with the correctly ordered comments
- updated_question_post, answers, post_to_author, published_answer_ids = thread.get_post_data_for_question_view(
+ question_post, answers, post_to_author, published_answer_ids = thread.get_post_data_for_question_view(
sort_method=answer_sort_method,
user=request.user
)
- question_post.set_cached_comments(
- updated_question_post.get_cached_comments()
- )
-
- #Post.objects.precache_comments(for_posts=[question_post] + answers, visitor=request.user)
user_votes = {}
user_post_id_list = list()
@@ -711,7 +706,13 @@ def get_comment(request):
id = int(request.GET['id'])
comment = models.Post.objects.get(post_type='comment', id=id)
request.user.assert_can_edit_comment(comment)
- return {'text': comment.text}
+
+ try:
+ rev = comment.revisions.get(revision=0)
+ except models.PostRevision.DoesNotExist:
+ rev = comment.get_latest_revision()
+
+ return {'text': rev.text}
@csrf.csrf_exempt
diff --git a/askbot/views/writers.py b/askbot/views/writers.py
index 42477d07..973bc544 100644
--- a/askbot/views/writers.py
+++ b/askbot/views/writers.py
@@ -302,7 +302,7 @@ def ask(request):#view used to ask a new question
draft_tagnames = draft.tagnames
form.initial = {
- 'ask_anonymously': request.REQUEST.get('ask_anonymousy', False),
+ 'ask_anonymously': request.REQUEST.get('ask_anonymously', False),
'tags': request.REQUEST.get('tags', draft_tagnames),
'text': request.REQUEST.get('text', draft_text),
'title': request.REQUEST.get('title', draft_title),
@@ -399,7 +399,11 @@ def edit_question(request, id):
if askbot_settings.READ_ONLY_MODE_ENABLED:
return HttpResponseRedirect(question.get_absolute_url())
- revision = question.get_latest_revision()
+ try:
+ revision = question.revisions.get(revision=0)
+ except models.PostRevision.DoesNotExist:
+ revision = question.get_latest_revision()
+
revision_form = None
try:
@@ -510,7 +514,10 @@ def edit_answer(request, id):
if askbot_settings.READ_ONLY_MODE_ENABLED:
return HttpResponseRedirect(answer.get_absolute_url())
- revision = answer.get_latest_revision()
+ try:
+ revision = answer.revisions.get(revision=0)
+ except models.PostRevision.DoesNotExist:
+ revision = answer.get_latest_revision()
class_path = getattr(settings, 'ASKBOT_EDIT_ANSWER_FORM', None)
if class_path:
@@ -794,7 +801,7 @@ def edit_comment(request):
id=form.cleaned_data['comment_id']
)
- request.user.edit_comment(
+ revision = request.user.edit_comment(
comment_post=comment_post,
body_text=form.cleaned_data['comment'],
suppress_email=form.cleaned_data['suppress_email'],
@@ -812,6 +819,11 @@ def edit_comment(request):
tz = template_filters.TIMEZONE_STR
timestamp = str(comment_post.added_at.replace(microsecond=0)) + tz
+ #need this because the post.text is due to the latest approved
+ #revision, but we may need the suggested revision
+ comment_post.text = revision.text
+ comment_post.html = comment_post.parse_post_text()['html']
+
return {
'id' : comment_post.id,
'object_id': comment_post.parent.id,