Completed
Push — master ( 84e615...a5de1a )
by Johannes
01:08
created

pre_save_delete_callback()   B

Complexity

Conditions 6

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 9
rs 8
cc 6
1
# -*- coding: utf-8 -*-
2
from __future__ import absolute_import, unicode_literals
3
4
import os
5
import uuid
6
7
from django.core.files.storage import default_storage
8
from django.utils.text import slugify
9
10
from .models import StdImageField, StdImageFieldFile
11
12
13
class UploadTo(object):
14
    file_pattern = "%(name)s%(ext)s"
15
    path_pattern = "%(path)s"
16
17
    def __call__(self, instance, filename):
18
        path, ext = os.path.splitext(filename)
19
        path, name = os.path.split(path)
20
        defaults = {
21
            'ext': ext,
22
            'name': name,
23
            'path': path,
24
            'class_name': instance.__class__.__name__,
25
        }
26
        defaults.update(self.kwargs)
27
        return os.path.join(self.path_pattern % defaults,
28
                            self.file_pattern % defaults).lower()
29
30
    def __init__(self, *args, **kwargs):
31
        self.kwargs = kwargs
32
        self.args = args
33
34
    def deconstruct(self):
35
        path = "%s.%s" % (self.__class__.__module__, self.__class__.__name__)
36
        return path, self.args, self.kwargs
37
38
39
class UploadToUUID(UploadTo):
40
41
    def __call__(self, instance, filename):
42
        self.kwargs.update({
43
            'name': uuid.uuid4().hex,
44
        })
45
        return super(UploadToUUID, self).__call__(instance, filename)
46
47
48
class UploadToClassNameDir(UploadTo):
49
    path_pattern = '%(class_name)s'
50
51
52
class UploadToClassNameDirUUID(UploadToClassNameDir, UploadToUUID):
53
    pass
54
55
56
class UploadToAutoSlug(UploadTo):
57
58
    def __init__(self, populate_from, **kwargs):
59
        self.populate_from = populate_from
60
        super(UploadToAutoSlug, self).__init__(populate_from, **kwargs)
61
62
    def __call__(self, instance, filename):
63
        field_value = getattr(instance, self.populate_from)
64
        self.kwargs.update({
65
            'name': slugify(field_value),
66
        })
67
        return super(UploadToAutoSlug, self).__call__(instance, filename)
68
69
70
class UploadToAutoSlugClassNameDir(UploadToClassNameDir, UploadToAutoSlug):
71
    pass
72
73
74
def pre_delete_delete_callback(sender, instance, **kwargs):
75
    for field in instance._meta.fields:
76
        if isinstance(field, StdImageField):
77
            getattr(instance, field.name).delete(False)
78
79
80
def pre_save_delete_callback(sender, instance, **kwargs):
81
    if instance.pk:
82
        obj = sender.objects.get(pk=instance.pk)
83
        for field in instance._meta.fields:
84
            if isinstance(field, StdImageField):
85
                obj_field = getattr(obj, field.name)
86
                instance_field = getattr(instance, field.name)
87
                if obj_field and obj_field != instance_field:
88
                    obj_field.delete(False)
89
90
91
def render_variations(file_name, variations, replace=False,
92
                      storage=default_storage):
93
    """Render all variations for a given field."""
94
    for key, variation in variations.items():
95
        StdImageFieldFile.render_variation(
96
            file_name, variation, replace, storage
97
        )
98