submitting jobs: handling user defined script
[qcg-portal.git] / qcg / utils.py
1 import string
2 import random
3
4 from django.core.paginator import Paginator
5 from django.utils.formats import date_format
6 from django.utils.timezone import localtime
7
8 from qcg import constants
9
10
11 def get_attributes(obj, attrs):
12     return {name: getattr(obj, name) for name in attrs if getattr(obj, name) is not None}
13
14
15 def username_from_dn(dn):
16     _, username = dn.rsplit('=', 1)
17
18     return username
19
20
21 def try_parse_int(s, default=None, base=10):
22     try:
23         return int(s, base)
24     except (TypeError, ValueError):
25         return default
26
27
28 def paginator_context(request, objects, per_page=constants.PER_PAGE):
29     paginator = Paginator(objects, per_page)
30
31     page_num = try_parse_int(request.GET.get('page'), 1)
32     if not (1 <= page_num <= paginator.num_pages):
33         page_num = 1
34
35     pages_range = range(max(2, min(page_num - 2, paginator.num_pages - 4)),
36                         min(max(page_num + 2, 5), paginator.num_pages) + 1)
37
38     return {'page': paginator.page(page_num), 'num_pages': paginator.num_pages, 'pages_range': pages_range}
39
40
41 def localtime_str(datetime):
42     return date_format(localtime(datetime), 'DATETIME_FORMAT')
43
44
45 def random_id(size=8, chars=string.ascii_uppercase + string.digits):
46     return ''.join(random.choice(chars) for _ in range(size))
47
48
49 def chunks(seq, size):
50     return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))