From 2cc0aa8a5d5c3b84c59598092c289d39b0cc4d3c Mon Sep 17 00:00:00 2001 From: hernani Date: Tue, 22 Jun 2010 11:23:59 +0000 Subject: [PATCH] Fixes a problem that might allow some users to get multiple badges in some strange situations. git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@439 0cfe37f9-358a-4d5e-be75-b63607b5c754 --- forum/actions/user.py | 3 ++- forum/badges/base.py | 26 ++++++++++++++++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/forum/actions/user.py b/forum/actions/user.py index a3856a8..e8f1035 100644 --- a/forum/actions/user.py +++ b/forum/actions/user.py @@ -1,5 +1,6 @@ from django.utils.translation import ugettext as _ from django.db.models import F +from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from forum.models.action import ActionProxy from forum.models import Award, Badge, ValidationHash from forum import settings @@ -94,7 +95,7 @@ class AwardAction(ActionProxy): return Award.objects.get(user=user, badge=badge).action else: return Award.objects.get(user=user, node=node, badge=badge).action - except: + except ObjectDoesNotExist: return None def describe(self, viewer=None): diff --git a/forum/badges/base.py b/forum/badges/base.py index 3af46f7..1900119 100644 --- a/forum/badges/base.py +++ b/forum/badges/base.py @@ -1,7 +1,7 @@ import re from string import lower -from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import MultipleObjectsReturned from django.db.models.signals import post_save from forum.models import Badge, Node, Action @@ -58,14 +58,20 @@ class AbstractBadge(object): @classmethod def award(cls, user, action, once=False): - if once: - node = None - awarded = AwardAction.get_for(user, cls.ondb) - else: - node = action.node - awarded = AwardAction.get_for(user, cls.ondb, node) + try: + if once: + node = None + awarded = AwardAction.get_for(user, cls.ondb) + else: + node = action.node + awarded = AwardAction.get_for(user, cls.ondb, node) - trigger = isinstance(action, Action) and action or None + trigger = isinstance(action, Action) and action or None - if not awarded: - AwardAction(user=user, node=node, ip=action.ip).save(data=dict(badge=cls.ondb, trigger=trigger)) \ No newline at end of file + if not awarded: + AwardAction(user=user, node=node, ip=action.ip).save(data=dict(badge=cls.ondb, trigger=trigger)) + except MultipleObjectsReturned: + if node: + logging.error('Found multiple %s badges awarded for user %s (%s)' % (self.name, user.username, user.id)) + else: + logging.error('Found multiple %s badges awarded for user %s (%s) and node %s' % (self.name, user.username, user.id, node.id)) \ No newline at end of file -- 2.39.5