Package coprs :: Module helpers
[hide private]
[frames] | no frames]

Source Code for Module coprs.helpers

  1  import math 
  2  import random 
  3  import string 
  4  import urlparse 
  5  import flask 
  6   
  7  from coprs import constants 
  8   
  9  from rpmUtils.miscutils import splitFilename 
10 11 -def generate_api_token(size=30):
12 """ Generate a random string used as token to access the API 13 remotely. 14 15 :kwarg: size, the size of the token to generate, defaults to 30 16 chars. 17 :return: a string, the API token for the user. 18 """ 19 return ''.join(random.choice(string.ascii_lowercase) for x in range(size))
20
21 22 -class EnumType(type):
23 - def __call__(self, attr):
24 if isinstance(attr, int): 25 for k, v in self.vals.items(): 26 if v == attr: 27 return k 28 raise KeyError('num {0} is not mapped'.format(attr)) 29 else: 30 return self.vals[attr]
31
32 -class PermissionEnum(object):
33 __metaclass__ = EnumType 34 vals = {'nothing': 0, 'request': 1, 'approved': 2} 35 36 @classmethod
37 - def choices_list(cls, without = -1):
38 return [(n, k) for k, n in cls.vals.items() if n != without]
39
40 -class ActionTypeEnum(object):
41 __metaclass__ = EnumType 42 vals = {'delete': 0, 'rename': 1, 'legal-flag': 2}
43
44 -class BackendResultEnum(object):
45 __metaclass__ = EnumType 46 vals = {'waiting': 0, 'success': 1, 'failure': 2}
47
48 -class RoleEnum(object):
49 __metaclass__ = EnumType 50 vals = {'user': 0, 'admin': 1}
51
52 -class StatusEnum(object):
53 __metaclass__ = EnumType 54 vals = {'failed': 0, 55 'succeeded': 1, 56 'canceled': 2, 57 'running': 3, 58 'pending': 4}
59
60 -class Paginator(object):
61 - def __init__(self, query, total_count, page = 1, per_page_override = None, urls_count_override = None):
62 self.query = query 63 self.total_count = total_count 64 self.page = page 65 self.per_page = per_page_override or constants.ITEMS_PER_PAGE 66 self.urls_count = urls_count_override or constants.PAGES_URLS_COUNT 67 self._sliced_query = None
68
69 - def page_slice(self, page):
70 return (constants.ITEMS_PER_PAGE * (page - 1), constants.ITEMS_PER_PAGE * page)
71 72 @property
73 - def sliced_query(self):
74 if not self._sliced_query: 75 self._sliced_query = self.query[slice(*self.page_slice(self.page))] 76 return self._sliced_query
77 78 @property
79 - def pages(self):
80 return int(math.ceil(self.total_count / float(self.per_page)))
81
82 - def border_url(self, request, start):
83 if start: 84 if self.page - 1 > self.urls_count / 2: 85 return (self.url_for_other_page(request, 1), 1) 86 else: 87 if self.page < self.pages - self.urls_count / 2: 88 return (self.url_for_other_page(request, self.pages), self.pages) 89 90 return None
91
92 - def get_urls(self, request):
93 left_border = self.page - self.urls_count / 2 94 left_border = 1 if left_border < 1 else left_border 95 right_border = self.page + self.urls_count / 2 96 right_border = self.pages if right_border > self.pages else right_border 97 98 return [(self.url_for_other_page(request, i), i) for i in range(left_border, right_border + 1)]
99
100 - def url_for_other_page(self, request, page):
101 args = request.view_args.copy() 102 args['page'] = page 103 return flask.url_for(request.endpoint, **args)
104
105 106 -def parse_package_name(pkg):
107 """ 108 Parse package name from possibly incomplete nvra string. 109 """ 110 111 if pkg.count('.') >= 3 and pkg.count('-') >= 2: 112 return splitFilename(pkg)[0] 113 114 # doesn't seem like valid pkg string, try to guess package name 115 result = '' 116 pkg = pkg.replace('.rpm', '').replace('.src', '') 117 118 for delim in ['-', '.']: 119 if delim in pkg: 120 parts = pkg.split(delim) 121 for part in parts: 122 if any(map(lambda x: x.isdigit(), part)): 123 return result[:-1] 124 125 result += part + '-' 126 127 return result[:-1] 128 129 return pkg
130
131 -def render_repo(copr, mock_chroot, url):
132 """ Render .repo file. No checks if copr or mock_chroot exists. """ 133 if mock_chroot.os_release == "fedora": 134 if mock_chroot.os_version != "rawhide": 135 mock_chroot.os_version = '$releasever' 136 url = urlparse.urljoin(url, "%s-%s-%s/" % (mock_chroot.os_release, mock_chroot.os_version, '$basearch')) 137 #url = url.replace("http://", "https://") 138 return flask.render_template('coprs/copr.repo', copr=copr, url=url)
139
140 -def is_int(s):
141 """ Return True is argument is integer number. False otherwise. """ 142 try: 143 int(s) 144 return True 145 except ValueError: 146 return False
147