X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/dbfc77cdf18bf52c3d35da5b8170d16753fe3a3a..ff9cf41fc82917f82e95d99eae1dd0077c1fa32b:/forum/badges/base.py?ds=sidebyside diff --git a/forum/badges/base.py b/forum/badges/base.py index 728f8b5..79fcb52 100644 --- a/forum/badges/base.py +++ b/forum/badges/base.py @@ -1,10 +1,10 @@ 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 +from forum.models import Badge, Node, Action from forum.actions import AwardAction import logging @@ -58,12 +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) - - if not awarded: - AwardAction(user=user, node=node, ip=action.ip).save(data=dict(badge=cls.ondb, trigger=action)) \ No newline at end of file + 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 + + if not awarded: + AwardAction(user=user, node=node).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