~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to wlscreens/models.py

  • Committer: Holger Rapp
  • Date: 2009-04-11 15:21:15 UTC
  • Revision ID: rapp@mrt.uka.de-20090411152115-qpbnxxze99td19bz
Added a first version of a screenshot application

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from django.db import models
 
2
 
 
3
from django.template.defaultfilters import slugify
 
4
import Image
 
5
from cStringIO import StringIO
 
6
from django.core.files.uploadedfile import SimpleUploadedFile, UploadedFile
 
7
import os  
 
8
from settings import THUMBNAIL_SIZE
 
9
 
 
10
 
 
11
# Create your models here.
 
12
class Category(models.Model):
 
13
    name = models.CharField(max_length=256)
 
14
    slug = models.SlugField(max_length=256, unique=True, blank = True)
 
15
   
 
16
    def save(self, *args, **kwargs):
 
17
        if not self.slug:
 
18
            self.slug = slugify(self.name)
 
19
        
 
20
        return super(Category,self).save(*args,**kwargs)
 
21
    
 
22
    @models.permalink
 
23
    def get_absolute_url(self):
 
24
        return ("wlscreens_category", None, { "category_slug": self.slug } )
 
25
 
 
26
    def __unicode__(self):
 
27
        return u"%s" % self.name
 
28
 
 
29
class Screenshot(models.Model):
 
30
    name = models.CharField(max_length=256)
 
31
    
 
32
    screenshot = models.ImageField(
 
33
        upload_to= lambda i,n: "wlscreens/screens/%s/%s.%s" % (i.category,i.name,n.rsplit(".",1)[-1].lower()),
 
34
    )
 
35
    thumbnail = models.ImageField(
 
36
        upload_to= lambda i,n: "wlscreens/thumbs/%s/%s.png" % (i.category,i.name),
 
37
        editable = False,
 
38
    )
 
39
    comment = models.TextField( null = True, blank = True )
 
40
    category = models.ForeignKey( Category, related_name = "screenshots" )
 
41
    
 
42
    class Meta:
 
43
        unique_together = ("name","category")
 
44
   
 
45
    def save(self, *args, **kwargs):
 
46
      if self.screenshot and not isinstance(self.screenshot, UploadedFile):
 
47
          self.screenshot.delete(save=False)
 
48
      if self.thumbnail and not isinstance(self.thumbnail, UploadedFile):
 
49
          self.thumbnail.delete(save=False)
 
50
 
 
51
      # Open original screenshot which we want to thumbnail using PIL's Image
 
52
      # object
 
53
      image = Image.open(self.screenshot)
 
54
  
 
55
      # Convert to RGB if necessary
 
56
      if image.mode not in ('L', 'RGB'):
 
57
          image = image.convert('RGB')
 
58
  
 
59
      image.thumbnail(THUMBNAIL_SIZE, Image.ANTIALIAS)
 
60
  
 
61
      # Save the thumbnail
 
62
      temp_handle = StringIO()
 
63
      image.save(temp_handle, 'png')
 
64
      temp_handle.seek(0)
 
65
  
 
66
      # Save to the thumbnail field
 
67
      suf = SimpleUploadedFile(os.path.split(self.screenshot.name)[-1],
 
68
              temp_handle.read(), content_type='image/png')
 
69
      self.thumbnail.save(suf.name+'.png', suf, save=False)
 
70
  
 
71
      # Save this photo instance
 
72
      super(Screenshot, self).save(*args,**kwargs)
 
73
 
 
74
    def __unicode__(self):
 
75
        return u"%s:%s" % (self.category.name,self.name)
 
76
 
 
77