diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2014-09-16 11:44:06 +0700 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2014-09-16 11:44:06 +0700 |
commit | d314888c06bf7844788813452f9509b4f0bb74d9 (patch) | |
tree | 2381202fcf95462581f683cd3ff455d780d99325 | |
parent | a0398a9b4267d363b7aa47f7824ac54fde053e24 (diff) | |
parent | 2331976db696199cfe136341b7f19d34380317f0 (diff) | |
download | askbot-d314888c06bf7844788813452f9509b4f0bb74d9.tar.gz askbot-d314888c06bf7844788813452f9509b4f0bb74d9.tar.bz2 askbot-d314888c06bf7844788813452f9509b4f0bb74d9.zip |
merged the master branch
-rw-r--r-- | askbot/conf/email.py | 6 | ||||
-rw-r--r-- | askbot/conf/words.py | 9 | ||||
-rw-r--r-- | askbot/deps/livesettings/values.py | 11 | ||||
-rw-r--r-- | askbot/media/jquery-openid/jquery.openid.js | 6 | ||||
-rw-r--r-- | askbot/models/__init__.py | 111 | ||||
-rw-r--r-- | askbot/models/post.py | 132 | ||||
-rw-r--r-- | askbot/models/question.py | 28 | ||||
-rw-r--r-- | askbot/models/user.py | 17 | ||||
-rw-r--r-- | askbot/tasks.py | 49 | ||||
-rw-r--r-- | askbot/templates/badge.html | 6 | ||||
-rw-r--r-- | askbot/templates/email/notify_author_about_approved_post.html | 22 | ||||
-rw-r--r-- | askbot/templates/macros.html | 10 | ||||
-rw-r--r-- | askbot/templates/main_page.html | 4 | ||||
-rw-r--r-- | askbot/templates/meta/bottom_scripts.html | 4 | ||||
-rw-r--r-- | askbot/templates/user_profile/user_network.html | 16 | ||||
-rw-r--r-- | askbot/templates/users.html | 6 | ||||
-rw-r--r-- | askbot/templates/widgets/user_card.html | 4 | ||||
-rw-r--r-- | askbot/templates/widgets/user_list.html | 2 | ||||
-rw-r--r-- | askbot/templates/widgets/user_long_score_and_badge_summary.html | 4 | ||||
-rw-r--r-- | askbot/templates/widgets/user_navigation.html | 11 | ||||
-rw-r--r-- | askbot/views/readers.py | 15 | ||||
-rw-r--r-- | askbot/views/writers.py | 20 |
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'>●</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, |