~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to wlimages/models.py

  • Committer: Holger Rapp
  • Date: 2019-06-21 18:34:42 UTC
  • mfrom: (540.1.3 update_ops_script)
  • Revision ID: sirver@gmx.de-20190621183442-y2ulybzr0rdvfefd
Adapt the update script for the new server.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
from django.db import models
2
2
from django.contrib.contenttypes.models import ContentType
3
 
from django.contrib.contenttypes import generic
 
3
from django.contrib.contenttypes.fields import GenericForeignKey
 
4
 
4
5
from django.contrib.auth.models import User
5
6
from django.utils.translation import ugettext_lazy as _
6
7
from django.db import IntegrityError
7
8
from datetime import datetime
 
9
from django.conf import settings
 
10
from django.core.files.storage import FileSystemStorage
8
11
 
9
 
from settings import MEDIA_ROOT, MEDIA_URL
10
12
 
11
13
class ImageManager(models.Manager):
12
 
    """
13
 
    We overwrite the defaults manager to make sure 
14
 
    that the create function checks for validity. We also include
15
 
    some convenience functions here
16
 
    """
17
 
    def has_image(self,image_name):
 
14
    """We overwrite the defaults manager to make sure that the create function
 
15
    checks for validity.
 
16
 
 
17
    We also include some convenience functions here
 
18
 
 
19
    """
 
20
 
 
21
    def has_image(self, image_name):
18
22
        return bool(self.filter(name=image_name).count())
19
 
           
20
 
 
21
 
    def create(self,**keyw):
22
 
        """
23
 
        Makes sure that no image/revision pair is already in the database
24
 
        """
25
 
        if "name" not in keyw or "revision" not in keyw:
26
 
            raise IntegrityError("needs name and revision as keywords")
27
 
 
28
 
        if self.filter(name=keyw["name"],revision=keyw["revision"]).count():
 
23
 
 
24
    def create(self, **keyw):
 
25
        """Makes sure that no image/revision pair is already in the
 
26
        database."""
 
27
 
 
28
        if 'name' not in keyw or 'revision' not in keyw:
 
29
            raise IntegrityError('needs name and revision as keywords')
 
30
 
 
31
        if self.filter(name=keyw['name'], revision=keyw['revision']).count():
29
32
            raise Image.AlreadyExisting()
30
 
        
31
 
        return super(ImageManager,self).create(**keyw)
32
 
 
33
 
    def create_and_save_image(self,user,image, content_type, object_id, ip):
34
 
        # if self.has_image(name):
35
 
        #     raise RuntimeError,"Image with name %s already exists. This is likely an Error" % name
36
 
        name = image.name.lower()
37
 
        im = self.create(content_type=content_type, object_id=object_id, 
38
 
                    user=user,revision=1,name=name, editor_ip = ip)
39
 
 
40
 
        path = "%s/wlimages/%s" % (MEDIA_ROOT,image.name)
41
 
        url = "%s/wlimages/%s" % (MEDIA_URL,image.name)
42
 
 
43
 
        destination = open(path,"wb")
 
33
 
 
34
        return super(ImageManager, self).create(**keyw)
 
35
 
 
36
    def create_and_save_image(self, user, image, content_type, object_id):
 
37
        # Use Django's get_valid_name() to get a safe filename
 
38
        storage = FileSystemStorage()
 
39
        safe_filename = storage.get_valid_name(image.name)
 
40
        im = self.create(content_type=content_type, object_id=object_id,
 
41
                         user=user, revision=1, name=image.name)
 
42
        path = '%swlimages/%s' % (settings.MEDIA_ROOT, safe_filename)
 
43
 
 
44
        destination = open(path, 'wb')
44
45
        for chunk in image.chunks():
45
46
            destination.write(chunk)
46
47
 
47
 
        im.image = path
48
 
        im.url = url
 
48
        im.image = 'wlimages/%s' % (safe_filename)
49
49
 
50
50
        im.save()
51
51
 
52
52
 
53
53
class Image(models.Model):
 
54
 
54
55
    class AlreadyExisting(IntegrityError):
 
56
 
55
57
        def __str__(self):
56
 
            return "The combination of image/revision is already in the database"
 
58
            return 'The combination of image/revision is already in the database'
57
59
 
58
60
    """
59
61
    TODO
60
62
    """
61
63
    # Generic Foreign Key Fields
62
64
    content_type = models.ForeignKey(ContentType)
63
 
    object_id = models.PositiveIntegerField(_('object ID'))
64
 
    content_object = generic.GenericForeignKey()
65
 
    
 
65
    object_id = models.PositiveIntegerField()
 
66
    content_object = GenericForeignKey()
 
67
 
66
68
    name = models.CharField(max_length=100)
67
69
    revision = models.PositiveIntegerField()
68
70
 
69
71
    # User Field
70
72
    user = models.ForeignKey(User)
71
 
    editor_ip = models.IPAddressField(_('IP address'), null=True, blank=True)
72
 
    
 
73
 
73
74
    # Date Fields
74
 
    date_submitted = models.DateTimeField(_('date/time submitted'), default = datetime.now)
75
 
    image = models.ImageField(upload_to="images/")
76
 
    url = models.CharField(max_length=250)
77
 
 
 
75
    date_submitted = models.DateTimeField(
 
76
        _('date/time submitted'), default=datetime.now)
 
77
    image = models.ImageField(upload_to='wlimages/')
78
78
 
79
79
    objects = ImageManager()
80
 
   
81
 
    def __unicode__(self):
82
 
        return "Image:%s" % self.name
 
80
 
 
81
    def __str__(self):
 
82
        return self.name
83
83
 
84
84
    def get_content_object(self):
85
85
        """
89
89
        and due to ``list_display`` limitations.
90
90
        """
91
91
        return self.content_object
92
 
    
 
92
 
93
93
    class Meta:
94
94
        ordering = ('-date_submitted',)
95
 
        verbose_name = _("Image")
96
 
        verbose_name_plural = _("Images")
97
 
        get_latest_by = "date_submitted"
98
 
 
99
 
 
 
95
        verbose_name = _('Image')
 
96
        verbose_name_plural = _('Images')
 
97
        get_latest_by = 'date_submitted'