Completed
Push — master ( f497b5...ded176 )
by Andrew
26s
created

UrlCache   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 43
rs 10
c 0
b 0
f 0
wmc 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A md5url() 0 6 3
B get_file_url() 0 23 5
1
import hashlib
2
import threading
3
from os import path
4
5
from django import template
6
7
from chat.settings import STATIC_URL, STATIC_ROOT, logging, DEBUG
8
9
register = template.Library()
10
logger = logging.getLogger(__name__)
11
12
md5_cache = {}
13
14
15
@register.simple_tag
16
def md5url(file_name):
17
	value = md5_cache.get(file_name)
18
	if value is None or DEBUG:
19
		value = get_file_url(file_name)
20
	return value
21
22
23
def get_file_url(file_name):
24
	entry_name = file_name
25
	try:
26
		key = '#root#'
27
		if key in file_name:
28
			file_name = file_name.split(key, 1)[1]
29
			file_path = path.join(STATIC_ROOT, entry_name.replace(key, ''))
30
			prefix = ''
31
		else:
32
			file_path = path.join(STATIC_ROOT, file_name)
33
			prefix = STATIC_URL
34
35
		md5 = calculate_file_md5(path.join(STATIC_ROOT, file_path))[:8]
36
		value = '%s%s?v=%s' % (prefix, file_name, md5)
37
		logger.info("Caching url '%s' for file '%s'", value, file_name)
38
	except Exception as e:
39
		if hasattr(e, 'errno') and e.errno == 21:  # is a directory
40
			value = STATIC_URL + file_name
41
			logger.warning("Caching url '%s' for directory %s", value, file_name)
42
		else:
43
			raise Exception('Unable to calculate md5 for {} because {}', file_name, e)
44
	md5_cache[entry_name] = value
45
	return value
46
47
48
def calculate_file_md5(file_path):
49
	with open(file_path, 'rb') as fh:
50
		m = hashlib.md5()
51
		while True:
52
			data = fh.read(8192)
53
			if not data:
54
				break
55
			m.update(data)
56
		return m.hexdigest()
57