UploadTo   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 24
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
c 1
b 0
f 0
dl 0
loc 24
rs 10

3 Methods

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