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

Source Code for Module coprs.forms

  1  import re 
  2  import urlparse 
  3   
  4  import flask 
  5  import wtforms 
  6   
  7  from flask.ext import wtf 
  8   
  9  from coprs import constants 
 10  from coprs import helpers 
 11  from coprs import models 
 12  from coprs.logic import coprs_logic 
13 14 15 -class UrlListValidator(object):
16 - def __init__(self, message=None):
17 if not message: 18 message = 'A list of URLs separated by whitespace characters' 19 ' is needed ("{0}" doesn\'t seem to be a URL).' 20 self.message = message
21
22 - def __call__(self, form, field):
23 urls = field.data.split() 24 for u in urls: 25 if not self.is_url(u): 26 raise wtforms.ValidationError(self.message.format(u))
27
28 - def is_url(self, url):
29 parsed = urlparse.urlparse(url) 30 is_url = True 31 32 if not parsed.scheme.startswith('http'): 33 is_url = False 34 if not parsed.netloc: 35 is_url = False 36 37 return is_url
38
39 40 -class CoprUniqueNameValidator(object):
41 - def __init__(self, message=None):
42 if not message: 43 message = 'You already have project named "{0}".' 44 self.message = message
45
46 - def __call__(self, form, field):
47 existing = coprs_logic.CoprsLogic.exists_for_user( 48 flask.g.user, field.data).first() 49 50 if existing and str(existing.id) != form.id.data: 51 raise wtforms.ValidationError(self.message.format(field.data))
52
53 54 -class StringListFilter(object):
55 - def __call__(self, value):
56 if not value: 57 return '' 58 # Replace every whitespace string with one newline 59 # Formats ideally for html form filling, use replace('\n', ' ') 60 # to get space-separated values or split() to get list 61 result = value.strip() 62 regex = re.compile(r'\s+') 63 return regex.sub(lambda x: '\n', result)
64
65 66 -class ValueToPermissionNumberFilter(object):
67 - def __call__(self, value):
68 if value: 69 return helpers.PermissionEnum('request') 70 return helpers.PermissionEnum('nothing')
71
72 73 -class CoprFormFactory(object):
74 @staticmethod
75 - def create_form_cls(mock_chroots=None):
76 class F(wtf.Form): 77 # also use id here, to be able to find out whether user 78 # is updating a copr if so, we don't want to shout 79 # that name already exists 80 id = wtforms.HiddenField() 81 82 name = wtforms.TextField( 83 'Name', 84 validators=[ 85 wtforms.validators.Required(), 86 wtforms.validators.Regexp( 87 re.compile(r'^[\w.-]+$'), 88 message='Name must contain only letters,' 89 'digits, underscores, dashes and dots.'), 90 CoprUniqueNameValidator() 91 ]) 92 93 description = wtforms.TextAreaField('Description') 94 95 instructions = wtforms.TextAreaField('Instructions') 96 97 repos = wtforms.TextAreaField( 98 'Repos', 99 validators=[UrlListValidator()], 100 filters=[StringListFilter()]) 101 102 initial_pkgs = wtforms.TextAreaField( 103 'Initial packages to build', 104 validators=[UrlListValidator()], 105 filters=[StringListFilter()]) 106 107 @property 108 def selected_chroots(self): 109 selected = [] 110 for ch in self.chroots_list: 111 if getattr(self, ch).data: 112 selected.append(ch) 113 return selected
114 115 def validate(self): 116 if not super(F, self).validate(): 117 return False 118 119 if not self.validate_mock_chroots_not_empty(): 120 self._mock_chroots_error = 'At least one chroot' \ 121 ' must be selected' 122 return False 123 return True
124 125 def validate_mock_chroots_not_empty(self): 126 have_any = False 127 for c in self.chroots_list: 128 if getattr(self, c).data: 129 have_any = True 130 return have_any 131 132 F.chroots_list = map(lambda x: x.name, 133 models.MockChroot.query.filter( 134 models.MockChroot.is_active == True 135 ).all()) 136 F.chroots_list.sort() 137 # sets of chroots according to how we should print them in columns 138 F.chroots_sets = {} 139 for ch in F.chroots_list: 140 checkbox_default = False 141 if mock_chroots and ch in map(lambda x: x.name, 142 mock_chroots): 143 checkbox_default = True 144 145 setattr(F, ch, wtforms.BooleanField(ch, default=checkbox_default)) 146 if ch[0] in F.chroots_sets: 147 F.chroots_sets[ch[0]].append(ch) 148 else: 149 F.chroots_sets[ch[0]] = [ch] 150 151 return F 152
153 154 -class CoprDeleteForm(wtf.Form):
155 verify = wtforms.TextField( 156 'Confirm deleting by typing "yes"', 157 validators=[ 158 wtforms.validators.Required(), 159 wtforms.validators.Regexp( 160 r'^yes$', 161 message='Type "yes" - without the quotes, lowercase.') 162 ])
163
164 165 -class BuildForm(wtf.Form):
166 pkgs = wtforms.TextAreaField( 167 'Pkgs', 168 validators=[ 169 wtforms.validators.Required(), 170 UrlListValidator()], 171 filters=[StringListFilter()]) 172 173 memory_reqs = wtforms.IntegerField( 174 'Memory requirements', 175 validators=[ 176 wtforms.validators.NumberRange( 177 min=constants.MIN_BUILD_MEMORY, 178 max=constants.MAX_BUILD_MEMORY)], 179 default=constants.DEFAULT_BUILD_MEMORY) 180 181 timeout = wtforms.IntegerField( 182 'Timeout', 183 validators=[ 184 wtforms.validators.NumberRange( 185 min=constants.MIN_BUILD_TIMEOUT, 186 max=constants.MAX_BUILD_TIMEOUT)], 187 default=constants.DEFAULT_BUILD_TIMEOUT)
188
189 -class ChrootForm(wtf.Form):
190 """ Validator for editing chroots in project (adding packages to minimal chroot) """ 191 buildroot_pkgs = wtforms.TextField('Additional packages to be always present in minimal buildroot')
192
193 194 -class CoprLegalFlagForm(wtf.Form):
195 comment = wtforms.TextAreaField('Comment')
196
197 198 -class PermissionsApplierFormFactory(object):
199 @staticmethod
200 - def create_form_cls(permission=None):
201 class F(wtf.Form): 202 pass
203 204 builder_default = False 205 admin_default = False 206 207 if permission: 208 if permission.copr_builder != helpers.PermissionEnum('nothing'): 209 builder_default = True 210 if permission.copr_admin != helpers.PermissionEnum('nothing'): 211 admin_default = True 212 213 setattr(F, 'copr_builder', 214 wtforms.BooleanField( 215 default=builder_default, 216 filters=[ValueToPermissionNumberFilter()])) 217 218 setattr(F, 'copr_admin', 219 wtforms.BooleanField( 220 default=admin_default, 221 filters=[ValueToPermissionNumberFilter()])) 222 223 return F
224
225 226 -class PermissionsFormFactory(object):
227 """Creates a dynamic form for given set of copr permissions""" 228 @staticmethod
229 - def create_form_cls(permissions):
230 class F(wtf.Form): 231 pass
232 233 for perm in permissions: 234 builder_choices = helpers.PermissionEnum.choices_list() 235 admin_choices = helpers.PermissionEnum.choices_list() 236 237 builder_default = perm.copr_builder 238 admin_default = perm.copr_admin 239 240 setattr(F, 'copr_builder_{0}'.format(perm.user.id), 241 wtforms.SelectField( 242 choices=builder_choices, 243 default=builder_default, 244 coerce=int)) 245 246 setattr(F, 'copr_admin_{0}'.format(perm.user.id), 247 wtforms.SelectField( 248 choices=admin_choices, 249 default=admin_default, 250 coerce=int)) 251 252 return F
253