99 строки
2.7 KiB
Python
99 строки
2.7 KiB
Python
from django.conf import settings
|
|
from django.db.models import signals
|
|
|
|
import badger
|
|
from badger.models import Badge, Award, Progress
|
|
|
|
|
|
def update_badges(badge_data, overwrite=False):
|
|
"""Creates or updates list of badges
|
|
|
|
:arg badge_data: list of dicts. keys in the dict correspond to the
|
|
Badge model class. Also, you can pass in ``prerequisites``.
|
|
:arg overwrite: whether or not to overwrite the existing badge
|
|
|
|
:returns: list of Badge instances---one per dict passed in
|
|
|
|
"""
|
|
badges = []
|
|
for data in badge_data:
|
|
badges.append(update_badge(data, overwrite=overwrite))
|
|
return badges
|
|
|
|
|
|
def update_badge(data_in, overwrite=False):
|
|
# Clone the data, because we might delete fields
|
|
data = dict(**data_in)
|
|
|
|
# If there are prerequisites, ensure they're real badges and remove
|
|
# from the set of data fields.
|
|
if 'prerequisites' not in data:
|
|
prerequisites = None
|
|
else:
|
|
prerequisites = [get_badge(n)
|
|
for n in data.get('prerequisites', [])]
|
|
del data['prerequisites']
|
|
|
|
badge, created = Badge.objects.get_or_create(title=data['title'],
|
|
defaults=data)
|
|
|
|
# If overwriting, and not just created, then save with current fields.
|
|
if overwrite and not created:
|
|
for k, v in data.items():
|
|
setattr(badge, k, v)
|
|
badge.save()
|
|
|
|
# Set prerequisites if overwriting, or badge is newly created.
|
|
if (overwrite or created) and prerequisites:
|
|
badge.prerequisites.clear()
|
|
badge.prerequisites.add(*prerequisites)
|
|
|
|
return badge
|
|
|
|
|
|
def get_badge(slug_or_badge):
|
|
"""Return badge specified by slug or by instance
|
|
|
|
:arg slug_or_badge: slug or Badge instance
|
|
|
|
:returns: Badge instance
|
|
|
|
"""
|
|
if isinstance(slug_or_badge, Badge):
|
|
b = slug_or_badge
|
|
else:
|
|
b = Badge.objects.get(slug=slug_or_badge)
|
|
return b
|
|
|
|
|
|
def award_badge(slug_or_badge, awardee, awarder=None):
|
|
"""Award a badge to an awardee, with optional awarder
|
|
|
|
:arg slug_or_badge: slug or Badge instance to award
|
|
:arg awardee: User this Badge is awarded to
|
|
:arg awarder: User who awarded this Badge
|
|
|
|
:returns: Award instance
|
|
|
|
:raise BadgeAwardNotAllowedexception: ?
|
|
|
|
:raise BadgeAlreadyAwardedException: if the badge is unique and
|
|
has already been awarded to this user
|
|
|
|
"""
|
|
b = get_badge(slug_or_badge)
|
|
return b.award_to(awardee=awardee, awarder=awarder)
|
|
|
|
|
|
def get_progress(slug_or_badge, user):
|
|
"""Get a progress record for a badge and awardee
|
|
|
|
:arg slug_or_badge: slug or Badge instance
|
|
:arg user: User to check progress for
|
|
|
|
:returns: Progress instance
|
|
|
|
"""
|
|
b = get_badge(slug_or_badge)
|
|
return b.progress_for(user)
|