-
Notifications
You must be signed in to change notification settings - Fork 3
/
logoconfig.py
121 lines (89 loc) · 3.38 KB
/
logoconfig.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from ftw.logo.converter import convert
from ftw.logo.converter import SCALES
from ftw.logo.image import Image
from ftw.logo.interfaces import IIconConfig
from ftw.logo.interfaces import ILogoConfig
from hashlib import sha256
from textwrap import wrap
from zope.configuration.exceptions import ConfigurationError
from zope.interface import implements
def get_cachekey_from_blob(*args):
cachekey = sha256()
for blob in args:
if blob:
for chunk in wrap(blob, 4096):
cachekey.update(chunk)
return cachekey.hexdigest()
class AbstractConfig(object):
base = None
logo = None
mobile = None
favicon = None
primary_logo_scale = None
def __init__(self, **kwargs):
if 'base' not in kwargs:
raise ConfigurationError('A base svg is required')
self.base = Image(filename=kwargs['base'])
if 'logo' in kwargs:
self.logo = Image(filename=kwargs['logo'])
if 'mobile' in kwargs:
self.mobile = Image(filename=kwargs['mobile'])
if 'favicon' in kwargs:
self.favicon = Image(filename=kwargs['favicon'])
self.cachekey = get_cachekey_from_blob(
self.base.make_blob(),
self.logo and self.logo.make_blob() or None,
self.mobile and self.mobile.make_blob() or None,
self.favicon and self.favicon.make_blob() or None,)
self.scales = {}
self.collect_scales()
self.set_primary_logo_scale(**kwargs)
def add_scale(self, name, scale):
self.scales[name] = scale
def collect_scales(self):
raise NotImplemented() # pragma: no cover
def get_scale(self, name):
return self.scales[name]
def set_primary_logo_scale(self, **kwargs):
if 'primary_logo_scale' in kwargs:
self.primary_logo_scale = kwargs['primary_logo_scale']
class LogoConfig(AbstractConfig):
"""Logo config entry.
"""
implements(ILogoConfig)
def collect_scales(self):
for scale in SCALES['LOGOS']:
if getattr(self, scale.lower(), None):
self.add_scale(scale, convert(getattr(self, scale.lower()), scale))
else:
self.add_scale(scale, convert(self.base, scale))
class IconConfig(AbstractConfig):
"""Icon config entry.
"""
implements(IIconConfig)
def collect_scales(self):
for scale in SCALES['ICONS']:
if getattr(self, scale.lower(), None):
self.add_scale(scale, convert(getattr(self, scale.lower()), scale))
else:
self.add_scale(scale, convert(self.base, scale))
class AbstractConfigOverride(AbstractConfig):
def __init__(self, blobImage):
base_img = Image(blob=blobImage.data, format='svg')
self.cachekey = get_cachekey_from_blob(blobImage.data)
self.scales = {}
self.collect_scales(base_img)
class LogoConfigOverride(AbstractConfigOverride):
"""Logo config (TTW) overrides.
"""
implements(ILogoConfig)
def collect_scales(self, base_img):
for scale in SCALES['LOGOS']:
self.add_scale(scale, convert(base_img, scale))
class IconConfigOverride(AbstractConfigOverride):
"""Icon config (TTW) overrides.
"""
implements(IIconConfig)
def collect_scales(self, base_img):
for scale in SCALES['ICONS']:
self.add_scale(scale, convert(base_img, scale))