annotate gpp/downloads/models.py @ 271:4746df47a538

Follow on to last rev (r292) for #126. Missed updating a shoutbox template. Also the repoze.timeago package uses UTC time by default. Change this to local time for now until we decide to switch over to UTC for everything.
author Brian Neal <bgneal@gmail.com>
date Sun, 26 Sep 2010 17:42:00 +0000
parents 27bee3ac85e6
children d424b8bae71d
rev   line source
gremmie@1 1 """
gremmie@1 2 Models for the downloads application.
gremmie@1 3 """
gremmie@1 4 import os
gremmie@1 5
gremmie@1 6 import datetime
gremmie@1 7 from django.db import models
gremmie@1 8 from django.contrib.auth.models import User
gremmie@1 9 from django.template.defaultfilters import filesizeformat
gremmie@1 10
bgneal@128 11 from core.markup import site_markup
bgneal@124 12
gremmie@1 13
gremmie@1 14 class Category(models.Model):
gremmie@1 15 """Downloads belong to categories."""
gremmie@1 16 title = models.CharField(max_length=64)
bgneal@241 17 slug = models.SlugField(max_length=64)
gremmie@1 18 description = models.TextField(blank=True)
bgneal@192 19 count = models.IntegerField(default=0, blank=True)
gremmie@1 20
gremmie@1 21 class Meta:
gremmie@1 22 verbose_name_plural = 'Categories'
gremmie@1 23 ordering = ('title', )
gremmie@1 24
gremmie@1 25 def __unicode__(self):
gremmie@1 26 return self.title
gremmie@1 27
gremmie@1 28
gremmie@1 29 def download_path(instance, filename):
gremmie@1 30 """
gremmie@1 31 Creates a path for a download. Uses the current date to avoid filename
gremmie@1 32 clashes. Uses the current microsecond also to make the directory name
gremmie@1 33 harder to guess.
gremmie@1 34 """
gremmie@1 35 now = datetime.datetime.now()
gremmie@1 36 parts = ['downloads']
bgneal@210 37 parts.extend([str(p) for p in (now.year, now.month, now.day)])
bgneal@210 38 parts.append(hex((now.hour * 3600 + now.minute * 60 + now.second) * 1000 + (
bgneal@210 39 now.microsecond / 1000))[2:])
gremmie@1 40 parts.append(filename)
gremmie@1 41 return os.path.join(*parts)
gremmie@1 42
gremmie@1 43
gremmie@1 44 class PublicDownloadManager(models.Manager):
gremmie@1 45 """The manager for all public downloads."""
gremmie@1 46 def get_query_set(self):
bgneal@190 47 return super(PublicDownloadManager, self).get_query_set().filter(
bgneal@190 48 is_public=True).select_related()
gremmie@1 49
gremmie@1 50
bgneal@204 51 class DownloadBase(models.Model):
bgneal@204 52 """Abstract model to collect common download fields."""
gremmie@1 53 title = models.CharField(max_length=128)
gremmie@1 54 category = models.ForeignKey(Category)
gremmie@1 55 description = models.TextField()
gremmie@1 56 html = models.TextField(blank=True)
gremmie@1 57 file = models.FileField(upload_to=download_path)
gremmie@1 58 user = models.ForeignKey(User)
bgneal@204 59 date_added = models.DateTimeField()
gremmie@1 60 ip_address = models.IPAddressField('IP Address')
bgneal@204 61
bgneal@204 62 class Meta:
bgneal@204 63 abstract = True
bgneal@204 64
bgneal@204 65 def size(self):
bgneal@204 66 return filesizeformat(self.file.size)
bgneal@204 67
bgneal@204 68
bgneal@204 69 class PendingDownload(DownloadBase):
bgneal@204 70 """This model represents pending downloads created by users. These pending
bgneal@204 71 downloads must be approved by an admin before they turn into "real"
bgneal@204 72 Downloads and are visible on site.
bgneal@204 73 """
bgneal@204 74 class Meta:
bgneal@204 75 ordering = ('date_added', )
bgneal@204 76
bgneal@204 77 def __unicode__(self):
bgneal@204 78 return self.title
bgneal@204 79
bgneal@204 80 def save(self, *args, **kwargs):
bgneal@204 81 if not self.pk:
bgneal@204 82 self.date_added = datetime.datetime.now()
bgneal@204 83 self.html = site_markup(self.description)
bgneal@204 84 super(PendingDownload, self).save(*args, **kwargs)
bgneal@204 85
bgneal@204 86
bgneal@204 87 class Download(DownloadBase):
bgneal@204 88 """Model to represent a download."""
gremmie@1 89 hits = models.IntegerField(default=0)
gremmie@1 90 average_score = models.FloatField(default=0.0)
gremmie@1 91 total_votes = models.IntegerField(default=0)
gremmie@1 92 is_public = models.BooleanField(default=False, db_index=True)
gremmie@1 93
gremmie@1 94 # Managers:
gremmie@1 95 objects = models.Manager()
gremmie@1 96 public_objects = PublicDownloadManager()
gremmie@1 97
gremmie@1 98 def __unicode__(self):
gremmie@1 99 return self.title
gremmie@1 100
bgneal@14 101 @models.permalink
bgneal@14 102 def get_absolute_url(self):
bgneal@23 103 return ('downloads-details', [str(self.id)])
bgneal@14 104
bgneal@182 105 def save(self, *args, **kwargs):
bgneal@128 106 self.html = site_markup(self.description)
bgneal@182 107 super(Download, self).save(*args, **kwargs)
gremmie@1 108
gremmie@1 109 def vote(self, vote_value):
gremmie@1 110 """receives a vote_value and updates internal score accordingly"""
gremmie@1 111 total_score = self.average_score * self.total_votes
gremmie@1 112 total_score += vote_value
gremmie@1 113 self.total_votes += 1
gremmie@1 114 self.average_score = total_score / self.total_votes
gremmie@1 115 return self.average_score
gremmie@1 116
bgneal@221 117 def search_title(self):
bgneal@221 118 return self.title
bgneal@221 119
bgneal@221 120 def search_summary(self):
bgneal@221 121 return self.description
bgneal@221 122
gremmie@1 123
gremmie@1 124 class AllowedExtensionManager(models.Manager):
gremmie@1 125 def get_extension_list(self):
gremmie@1 126 return self.values_list('extension', flat=True)
gremmie@1 127
gremmie@1 128
gremmie@1 129 class AllowedExtension(models.Model):
gremmie@1 130 """Model to represent the list of allowed file extensions."""
bgneal@206 131 extension = models.CharField(max_length=8, help_text="e.g. .txt")
gremmie@1 132
gremmie@1 133 objects = AllowedExtensionManager()
gremmie@1 134
gremmie@1 135 def __unicode__(self):
gremmie@1 136 return self.extension
gremmie@1 137
gremmie@1 138 class Meta:
gremmie@1 139 ordering = ('extension', )
gremmie@1 140
gremmie@1 141
gremmie@1 142 class VoteRecord(models.Model):
gremmie@1 143 """Model to record the date that a user voted on a download."""
gremmie@1 144 download = models.ForeignKey(Download)
gremmie@1 145 user = models.ForeignKey(User)
gremmie@1 146 vote_date = models.DateTimeField(auto_now_add=True)
gremmie@1 147
gremmie@1 148 def __unicode__(self):
bgneal@192 149 return u"%s voted on '%s' on %s" % (
gremmie@1 150 self.user.username,
gremmie@1 151 self.download.title,
gremmie@1 152 self.vote_date.strftime('%b %d, %Y %H:%M:%S'))
gremmie@1 153
gremmie@1 154 class Meta:
gremmie@1 155 ordering = ('-vote_date', )