summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-03-11 19:50:36 -0500
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-03-11 19:50:36 -0500
commitec6867197f168b767ec7945e59ee0668a0a6a034 (patch)
treedc7dd1cbbf31fdde653a01dd8d0082fac0067833
parent1e1877f8a0e6d90a90a1c8ab2b5b758635c5a993 (diff)
downloadaskbot-ec6867197f168b767ec7945e59ee0668a0a6a034.tar.gz
askbot-ec6867197f168b767ec7945e59ee0668a0a6a034.tar.bz2
askbot-ec6867197f168b767ec7945e59ee0668a0a6a034.zip
fixed a bug where page for a no longer used badge causes an internal server error
-rw-r--r--askbot/models/repute.py41
-rw-r--r--askbot/views/meta.py9
2 files changed, 41 insertions, 9 deletions
diff --git a/askbot/models/repute.py b/askbot/models/repute.py
index dce907ac..aa6287c2 100644
--- a/askbot/models/repute.py
+++ b/askbot/models/repute.py
@@ -13,25 +13,50 @@ class BadgeData(models.Model):
awarded_count = models.PositiveIntegerField(default=0)
awarded_to = models.ManyToManyField(User, through='Award', related_name='badges')
+ def _get_meta_data(self):
+ """retrieves badge metadata stored
+ in a file"""
+ from askbot.models import badges
+ try:
+ return badges.get_badge(self.slug)
+ except KeyError:
+ #return a dummy badge
+ return badges.Badge(level = const.BRONZE_BADGE)
+
+ def is_real_badge(self):
+ """true if badge with a given slug exists
+ todo: may need attention - currently some badge data is defined in a file,
+ and some in the database. Data in the file is considered
+ more up to date. It is possifle that the file is edited,
+ and data is not deleted from the database, this method
+ will find such condition.
+
+ The reason why some data is on disk, is that each
+ badge has code associated with them, that code is not stored in the database.
+ Therefore maintenance of badge data requires more attention...
+ """
+ from askbot.models import badges
+ try:
+ badges.get_badge(self.slug)
+ return True
+ except KeyError:
+ return False
+
@property
def name(self):
- from askbot.models import badges
- return badges.get_badge(self.slug).name
+ return self._get_meta_data().name
@property
def description(self):
- from askbot.models import badges
- return badges.get_badge(self.slug).description
+ return self._get_meta_data().description
@property
def css_class(self):
- from askbot.models import badges
- return badges.get_badge(self.slug).css_class
+ return self._get_meta_data().css_class
def get_type_display(self):
- from askbot.models import badges
#todo - rename "type" -> "level" in this model
- return badges.get_badge(self.slug).get_level_display()
+ return self._get_meta_data().get_level_display()
class Meta:
app_label = 'askbot'
diff --git a/askbot/views/meta.py b/askbot/views/meta.py
index ac06b7e0..5cd17005 100644
--- a/askbot/views/meta.py
+++ b/askbot/views/meta.py
@@ -6,7 +6,7 @@ This module contains a collection of views displaying all sorts of secondary and
from django.shortcuts import render_to_response, get_object_or_404
from django.core.urlresolvers import reverse
from django.template import RequestContext, Template
-from django.http import HttpResponseRedirect, HttpResponse
+from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _
from django.views import static
@@ -127,6 +127,13 @@ def badges(request):#user status/reputation system
def badge(request, id):
#todo: supplement database data with the stuff from badges.py
badge = get_object_or_404(BadgeData, id=id)
+ if not badge.is_real_badge():
+ #this is a hack around a non-elegant badge data system
+ #a request can come for a badge that is no longer used
+ #for example from a search engine that knows of past
+ #url structure
+ raise Http404
+
badge_recipients = User.objects.filter(
award_user__badge = badge
).annotate(