From fa5104ed0d0a181f791c8c5d24b144fa6615ea51 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 8 Nov 2010 13:38:55 -0500 Subject: fixed bugs in per-user response counts --- .gitignore | 2 +- askbot/models/__init__.py | 14 ++++++++++++-- askbot/models/meta.py | 5 +++-- askbot/models/user.py | 2 ++ askbot/skins/default/templates/header.html | 2 ++ askbot/tests/on_screen_notification_tests.py | 2 +- askbot/views/commands.py | 14 ++++++++------ 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index a9ff6eaf..98ff79a4 100755 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ askbot/upfiles/*.gif askbot/upfiles/*.png askbot/skins/common/media/mathjax/ /jinja2 -*.tag.tz +*.tar.tz diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index c0229ccf..ca3ff443 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -1383,10 +1383,19 @@ def user_decrement_response_count(user, amount=1): user.seen_response_count += amount if user.new_response_count >= amount: user.new_response_count -= amount - else: + user.clean_response_counts() + +def user_clean_response_counts(user): + "" + if user.new_response_count < 0: user.new_response_count = 0 logging.critical( - 'response count wanted to go below zero' + 'new response count wanted to go below zero for %s' % user.username + ) + if user.seen_response_count < 0: + user.seen_response_count = 0 + logging.critical( + 'seen response count wanted to go below zero form %s' % user.username ) User.add_to_class('is_username_taken',classmethod(user_is_username_taken)) @@ -1417,6 +1426,7 @@ User.add_to_class('unfollow_question', user_unfollow_question) User.add_to_class('is_following', user_is_following) User.add_to_class('decrement_response_count', user_decrement_response_count) User.add_to_class('increment_response_count', user_increment_response_count) +User.add_to_class('clean_response_counts', user_clean_response_counts) User.add_to_class('is_administrator', user_is_administrator) User.add_to_class('is_moderator', user_is_moderator) User.add_to_class('is_approved', user_is_approved) diff --git a/askbot/models/meta.py b/askbot/models/meta.py index 248979ae..19f537be 100644 --- a/askbot/models/meta.py +++ b/askbot/models/meta.py @@ -241,11 +241,12 @@ class Comment(base.MetaContent, base.UserContent): #on these activities decrement response counter #todo: implement a custom delete method on these #all this should pack into Activity.responses.filter( somehow ).delete() - response_activity_types = const.RESPONSE_ACTIVITY_TYPES_FOR_DISPLAY + activity_types = const.RESPONSE_ACTIVITY_TYPES_FOR_DISPLAY + activity_types += (const.TYPE_ACTIVITY_MENTION,) activities = Activity.objects.filter( content_type = comment_content_type, object_id = comment_id, - activity_type__in = response_activity_types + activity_type__in = activity_types ) for activity in activities: for user in activity.recipients.all(): diff --git a/askbot/models/user.py b/askbot/models/user.py index fcf60639..bc943f5a 100644 --- a/askbot/models/user.py +++ b/askbot/models/user.py @@ -80,6 +80,8 @@ class ActivityManager(models.Manager): if mentioned_whom: assert(isinstance(mentioned_whom, User)) mention_activity.add_recipients([mentioned_whom]) + mentioned_whom.increment_response_count() + mentioned_whom.save() return mention_activity diff --git a/askbot/skins/default/templates/header.html b/askbot/skins/default/templates/header.html index 03e641e0..49771721 100644 --- a/askbot/skins/default/templates/header.html +++ b/askbot/skins/default/templates/header.html @@ -8,6 +8,8 @@ {% spaceless %} {% if request.user.new_response_count > 0 or request.user.seen_response_count > 0 %} + new {{request.user.new_response_count}} + old {{request.user.seen_response_count}} {% trans username=request.user.username %}responses for {{username}}{% endtrans %} 0 %} diff --git a/askbot/tests/on_screen_notification_tests.py b/askbot/tests/on_screen_notification_tests.py index f8da736e..574f4e5e 100644 --- a/askbot/tests/on_screen_notification_tests.py +++ b/askbot/tests/on_screen_notification_tests.py @@ -205,7 +205,7 @@ class OnScreenUpdateNotificationTests(TestCase): def post_mention_in_answer_then_edit_out(self): pass - def test_post_mention_in_question_comment_then_delete(self): + def test_post_mention_in_comments_then_delete(self): self.reset_response_counts() time.sleep(1) timestamp = datetime.datetime.now() diff --git a/askbot/views/commands.py b/askbot/views/commands.py index 01487768..5fe80035 100644 --- a/askbot/views/commands.py +++ b/askbot/views/commands.py @@ -112,25 +112,24 @@ def manage_inbox(request): if action_type == 'delete': user.new_response_count -= new_memos.count() user.seen_response_count -= seen_memos.count() - assert(user.new_response_count >= 0) - assert(user.seen_response_count >= 0) + user.clean_response_counts() user.save() memo_set.delete() elif action_type == 'mark_new': user.new_response_count += seen_memos.count() user.seen_response_count -= seen_memos.count() - assert(user.seen_response_count >= 0) + user.clean_response_counts() user.save() memo_set.update(status = models.ActivityAuditStatus.STATUS_NEW) elif action_type == 'mark_seen': user.new_response_count -= new_memos.count() user.seen_response_count += new_memos.count() - assert(user.new_response_count >= 0) + user.clean_response_counts() user.save() memo_set.update(status = models.ActivityAuditStatus.STATUS_SEEN) else: raise exceptions.PermissionDenied( - _('Oops, sorry - there was some error - please try again') + _('Oops, apologies - there was some error') ) response_data['success'] = True data = simplejson.dumps(response_data) @@ -145,7 +144,10 @@ def manage_inbox(request): #todo: show error page but no-one is likely to get here return HttpResponseRedirect(reverse('index')) except Exception, e: - response_data['message'] = unicode(e) + message = unicode(e) + if message == '': + message = _('Oops, apologies - there was some error') + response_data['message'] = message response_data['success'] = False data = simplejson.dumps(response_data) return HttpResponse(data, mimetype="application/json") -- cgit v1.2.3-1-g7c22