annotate gpp/downloads/models.py @ 133:c515b7401078

Use the new common way to apply markItUp to textareas and to get the smiley and markdown help dialogs for all the remaining apps except for forums and comments.
author Brian Neal <bgneal@gmail.com>
date Fri, 27 Nov 2009 00:21:47 +0000
parents 48621ba5c385
children 5c889b587416
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)
gremmie@1 17 description = models.TextField(blank=True)
gremmie@1 18
gremmie@1 19 class Meta:
gremmie@1 20 verbose_name_plural = 'Categories'
gremmie@1 21 ordering = ('title', )
gremmie@1 22
gremmie@1 23 def __unicode__(self):
gremmie@1 24 return self.title
gremmie@1 25
gremmie@1 26 def num_downloads(self):
gremmie@1 27 return Download.public_objects.filter(category=self.pk).count()
gremmie@1 28
gremmie@1 29
gremmie@1 30 def download_path(instance, filename):
gremmie@1 31 """
gremmie@1 32 Creates a path for a download. Uses the current date to avoid filename
gremmie@1 33 clashes. Uses the current microsecond also to make the directory name
gremmie@1 34 harder to guess.
gremmie@1 35 """
gremmie@1 36 now = datetime.datetime.now()
gremmie@1 37 parts = ['downloads']
gremmie@1 38 parts.extend([str(p) for p in (now.year, now.month, now.day, now.microsecond)])
gremmie@1 39 parts.append(filename)
gremmie@1 40 return os.path.join(*parts)
gremmie@1 41
gremmie@1 42
gremmie@1 43 class PublicDownloadManager(models.Manager):
gremmie@1 44 """The manager for all public downloads."""
gremmie@1 45 def get_query_set(self):
gremmie@1 46 return super(PublicDownloadManager, self).get_query_set().filter(is_public=True)
gremmie@1 47
gremmie@1 48
gremmie@1 49 class Download(models.Model):
gremmie@1 50 """Model to represent a download."""
gremmie@1 51 title = models.CharField(max_length=128)
gremmie@1 52 category = models.ForeignKey(Category)
gremmie@1 53 description = models.TextField()
gremmie@1 54 html = models.TextField(blank=True)
gremmie@1 55 file = models.FileField(upload_to=download_path)
gremmie@1 56 user = models.ForeignKey(User)
gremmie@1 57 date_added = models.DateTimeField(auto_now_add=True)
gremmie@1 58 ip_address = models.IPAddressField('IP Address')
gremmie@1 59 hits = models.IntegerField(default=0)
gremmie@1 60 average_score = models.FloatField(default=0.0)
gremmie@1 61 total_votes = models.IntegerField(default=0)
gremmie@1 62 is_public = models.BooleanField(default=False, db_index=True)
gremmie@1 63
gremmie@1 64 # Managers:
gremmie@1 65 objects = models.Manager()
gremmie@1 66 public_objects = PublicDownloadManager()
gremmie@1 67
gremmie@1 68 def __unicode__(self):
gremmie@1 69 return self.title
gremmie@1 70
bgneal@14 71 @models.permalink
bgneal@14 72 def get_absolute_url(self):
bgneal@23 73 return ('downloads-details', [str(self.id)])
bgneal@14 74
gremmie@1 75 def save(self, force_insert=False, force_update=False):
bgneal@128 76 self.html = site_markup(self.description)
gremmie@1 77 super(Download, self).save(force_insert, force_update)
gremmie@1 78
gremmie@1 79 def vote(self, vote_value):
gremmie@1 80 """receives a vote_value and updates internal score accordingly"""
gremmie@1 81 total_score = self.average_score * self.total_votes
gremmie@1 82 total_score += vote_value
gremmie@1 83 self.total_votes += 1
gremmie@1 84 self.average_score = total_score / self.total_votes
gremmie@1 85 return self.average_score
gremmie@1 86
gremmie@1 87 def size(self):
gremmie@1 88 return filesizeformat(self.file.size)
gremmie@1 89
gremmie@1 90
gremmie@1 91 class AllowedExtensionManager(models.Manager):
gremmie@1 92 def get_extension_list(self):
gremmie@1 93 return self.values_list('extension', flat=True)
gremmie@1 94
gremmie@1 95
gremmie@1 96 class AllowedExtension(models.Model):
gremmie@1 97 """Model to represent the list of allowed file extensions."""
gremmie@1 98 extension = models.CharField(max_length=8)
gremmie@1 99
gremmie@1 100 objects = AllowedExtensionManager()
gremmie@1 101
gremmie@1 102 def __unicode__(self):
gremmie@1 103 return self.extension
gremmie@1 104
gremmie@1 105 class Meta:
gremmie@1 106 ordering = ('extension', )
gremmie@1 107
gremmie@1 108
gremmie@1 109 class VoteRecord(models.Model):
gremmie@1 110 """Model to record the date that a user voted on a download."""
gremmie@1 111 download = models.ForeignKey(Download)
gremmie@1 112 user = models.ForeignKey(User)
gremmie@1 113 vote_date = models.DateTimeField(auto_now_add=True)
gremmie@1 114
gremmie@1 115 def __unicode__(self):
gremmie@1 116 return "%s voted on '%s' on %s" % (
gremmie@1 117 self.user.username,
gremmie@1 118 self.download.title,
gremmie@1 119 self.vote_date.strftime('%b %d, %Y %H:%M:%S'))
gremmie@1 120
gremmie@1 121 class Meta:
gremmie@1 122 ordering = ('-vote_date', )