GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 8448c4...91ccaa )
by Dmitry
8s
created

WatermarkFilter   A

Complexity

Total Complexity 29

Size/Duplication

Total Lines 239
Duplicated Lines 0 %
Metric Value
dl 0
loc 239
rs 10
wmc 29

14 Methods

Rating   Name   Duplication   Size   Complexity  
A _get_scaled_image() 0 21 2
A apply() 0 17 3
A _center_position() 0 13 1
A _bottom_right_position() 0 13 1
A _get_image() 0 14 3
F __init__() 0 34 10
A _top_left_position() 0 10 1
A _top_position() 0 13 1
A _right_position() 0 13 1
A _bottom_position() 0 13 1
A _reduce_opacity() 0 14 2
A _left_position() 0 13 1
A _top_right_position() 0 13 1
A _bottom_left_position() 0 13 1
1
"""
2
This module implement a Watermark filter.
3
"""
4
import os
5
from flask import current_app
6
7
from .interface import ImagineFilterInterface
8
from PIL import Image, ImageEnhance
9
10
11
class WatermarkFilter(ImagineFilterInterface):
12
    """
13
    Watermark filter
14
    """
15
    positions = ['top_left', 'top', 'top_right', 'left', 'center', 'right', 'bottom_left', 'bottom', 'bottom_right']
16
17
    image_path = None
18
    image = None
19
    size = None
20
    position = None
21
    opacity = None
22
23
    def __init__(self, **kwargs):
24
        """
25
        :param kwargs: dict
26
        """
27
        if 'image' in kwargs:
28
            self.image_path = os.path.normpath(str(kwargs['image']))
29
        else:
30
            raise ValueError('Watermark image path doesn\'t set.')
31
32
        if 'size' in kwargs:
33
            try:
34
                self.size = float(kwargs.get('size'))
35
                assert 0 <= self.size <= 1
36
            except Exception, e:
37
                raise ValueError('Unsupported size format: %s' % unicode(e))
38
        else:
39
            raise ValueError('Watermark size doesn\'t set.')
40
41
        if 'position' in kwargs:
42
            if kwargs['position'] in self.positions:
43
                self.position = kwargs.get('position')
44
            else:
45
                raise ValueError('Unsupported watermark position: %s' % kwargs.get('position'))
46
        else:
47
            raise ValueError('Watermark position doesn\'t set.')
48
49
        if 'opacity' in kwargs:
50
            try:
51
                self.opacity = float(kwargs.get('opacity', 0.3))
52
                assert 0 <= self.opacity <= 1
53
            except Exception, e:
54
                raise ValueError('Unsupported opacity format: %s' % unicode(e))
55
        else:
56
            self.opacity = 0.3
57
58
    def apply(self, resource):
59
        """
60
        Apply filter to resource
61
        :param resource: Image.Image
62
        :return: Image.Image
63
        """
64
        if not isinstance(resource, Image.Image):
65
            raise ValueError('Unknown resource format')
66
67
        if resource.mode != 'RGBA':  # pragma: no cover
68
            resource = resource.convert('RGBA')
69
70
        layer = Image.new('RGBA', resource.size, (0, 0, 0, 0))
71
        image, left, upper = getattr(self, '_' + self.position + '_position')(resource)
72
        layer.paste(image, (left, upper))
73
74
        return Image.composite(layer, resource, layer)
75
76
    def _top_left_position(self, resource):
77
        """
78
        Place watermark to top left position
79
        :param layer: Image.Image
80
        :param resource: Image.Image
81
        :return: Image.Image
82
        """
83
        image = self._get_scaled_image(resource)
84
85
        return image, 0, 0
86
87
    def _top_position(self, resource):
88
        """
89
        Place watermark to top position
90
        :param layer: Image.Image
91
        :param resource: Image.Image
92
        :return: Image.Image
93
        """
94
        image = self._get_scaled_image(resource)
95
96
        left = int(round(resource.size[0] / 2 - image.size[0] / 2))
97
        upper = 0
98
99
        return image, left, upper
100
101
    def _top_right_position(self, resource):
102
        """
103
        Place watermark to top right position
104
        :param layer: Image.Image
105
        :param resource: Image.Image
106
        :return: Image.Image
107
        """
108
        image = self._get_scaled_image(resource)
109
110
        left = int(round(resource.size[0] - image.size[0]))
111
        upper = 0
112
113
        return image, left, upper
114
115
    def _left_position(self, resource):
116
        """
117
        Place watermark to left position
118
        :param layer: Image.Image
119
        :param resource: Image.Image
120
        :return: Image.Image
121
        """
122
        image = self._get_scaled_image(resource)
123
124
        left = 0
125
        upper = int(round(resource.size[1] / 2 - image.size[1] / 2))
126
127
        return image, left, upper
128
129
    def _center_position(self, resource):
130
        """
131
        Place watermark to center position
132
        :param layer: Image.Image
133
        :param resource: Image.Image
134
        :return: Image.Image
135
        """
136
        image = self._get_scaled_image(resource)
137
138
        left = int(round(resource.size[0] / 2 - image.size[0] / 2))
139
        upper = int(round(resource.size[1] / 2 - image.size[1] / 2))
140
141
        return image, left, upper
142
143
    def _right_position(self, resource):
144
        """
145
        Place watermark to right position
146
        :param layer: Image.Image
147
        :param resource: Image.Image
148
        :return: Image.Image
149
        """
150
        image = self._get_scaled_image(resource)
151
152
        left = int(round(resource.size[0] - image.size[0]))
153
        upper = int(round(resource.size[1] / 2 - image.size[1] / 2))
154
155
        return image, left, upper
156
157
    def _bottom_left_position(self, resource):
158
        """
159
        Place watermark to bottom left position
160
        :param layer: Image.Image
161
        :param resource: Image.Image
162
        :return: Image.Image
163
        """
164
        image = self._get_scaled_image(resource)
165
166
        left = 0
167
        upper = int(round(resource.size[1] - image.size[1]))
168
169
        return image, left, upper
170
171
    def _bottom_position(self, resource):
172
        """
173
        Place watermark to bottom position
174
        :param layer: Image.Image
175
        :param resource: Image.Image
176
        :return: Image.Image
177
        """
178
        image = self._get_scaled_image(resource)
179
180
        left = int(round(resource.size[0] / 2 - image.size[0] / 2))
181
        upper = int(round(resource.size[1] - image.size[1]))
182
183
        return image, left, upper
184
185
    def _bottom_right_position(self, resource):
186
        """
187
        Place watermark to bottom right position
188
        :param layer: Image.Image
189
        :param resource: Image.Image
190
        :return: Image.Image
191
        """
192
        image = self._get_scaled_image(resource)
193
194
        left = int(round(resource.size[0] - image.size[0]))
195
        upper = int(round(resource.size[1] - image.size[1]))
196
197
        return image, left, upper
198
199
    def _get_image(self):
200
        """
201
        Prepare watermark image
202
        :return: Image.Image
203
        """
204
        if self.image is None:
205
            image_path = '%s/%s' % (current_app.static_folder, os.path.normpath(self.image_path))
206
            try:
207
                self.image = Image.open(image_path)
208
                self._reduce_opacity()
209
            except Exception, e:
210
                raise ValueError('Unsupported watermark format: %s' % unicode(e))
211
212
        return self.image
213
214
    def _reduce_opacity(self):
215
        """
216
        Reduce opacity for watermark image.
217
        """
218
        if self.image.mode != 'RGBA':
219
            image = self.image.convert('RGBA')
220
        else:
221
            image = self.image.copy()
222
223
        alpha = image.split()[3]
224
        alpha = ImageEnhance.Brightness(alpha).enhance(self.opacity)
225
        image.putalpha(alpha)
226
227
        self.image = image
228
229
    def _get_scaled_image(self, resource):
230
        """
231
        Get scaled watermark image
232
        :param resource: Image.Image
233
        :return: Image.Image
234
        """
235
        image = self._get_image()
236
        original_width, original_height = resource.size
237
238
        k = image.size[0] / float(image.size[1])
239
240
        if image.size[0] >= image.size[1]:
241
            target_width = int(original_width * self.size)
242
            target_height = int(target_width / k)
243
        else:
244
            target_height = int(original_height * self.size)
245
            target_width = int(target_height * k)
246
247
        image = image.resize((target_width, target_height), Image.ANTIALIAS)
248
249
        return image
250
251