Mercurial > public > sg101
diff gpp/contests/models.py @ 540:51fa1e0ca218
For #243, create a contests application.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Mon, 09 Jan 2012 01:13:08 +0000 |
parents | |
children | 0a8e6a9ccf53 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpp/contests/models.py Mon Jan 09 01:13:08 2012 +0000 @@ -0,0 +1,93 @@ +""" +Models for the contest application. + +""" +import random +import datetime + +from django.db import models +from django.contrib.auth.models import User + + +class PublicContestManager(models.Manager): + """ + The manager for all public contests. + + """ + def get_query_set(self): + return super(PublicContestManager, self).get_query_set().filter(is_public=True) + + +class Contest(models.Model): + """ + A model to represent contests where users sign up to win something. + + """ + title = models.CharField(max_length=64) + slug = models.SlugField(max_length=64) + description = models.TextField() + is_public = models.BooleanField(db_index=True) + creation_date = models.DateTimeField(blank=True) + end_date = models.DateTimeField() + contestants = models.ManyToManyField(User, related_name='contests', + null=True, blank=True) + winner = models.ForeignKey(User, null=True, blank=True, + related_name='winning_contests') + win_date = models.DateTimeField(null=True, blank=True) + meta_description = models.TextField() + + objects = models.Manager() + public_objects = PublicContestManager() + + class Meta: + ordering = ['-creation_date'] + + def __unicode__(self): + return self.title + + @models.permalink + def get_absolute_url(self): + return ('contests-contest', [], {'slug': self.slug}) + + def save(self, *args, **kwargs): + if not self.pk and not self.creation_date: + self.creation_date = datetime.datetime.now() + + super(Contest, self).save(*args, **kwargs) + + def is_active(self): + """ + Returns True if the contest is still active. + + """ + now = datetime.datetime.now() + return self.creation_date <= now < self.end_date + + def can_enter(self): + """ + Returns True if the contest is still active and does not have a winner. + + """ + return not self.winner and self.is_active() + + def pick_winner(self): + """ + This function randomly picks a winner from all the contestants. + + """ + user_ids = self.contestants.values_list('id', flat=True) + winner_id = random.choice(user_ids) + self.winner = User.objects.get(id=winner_id) + self.win_date = datetime.datetime.now() + + def ogp_tags(self): + """ + Returns a dict of Open Graph Protocol meta tags. + + """ + return { + 'og:title': self.title, + 'og:type': 'game', + 'og:url': self.get_absolute_url(), + 'og:description': self.meta_description, + }