[copr] master: Use a factory for copr forms to generate the chroots dynamically from DB. (d4837c3)

bkabrda at fedoraproject.org bkabrda at fedoraproject.org
Tue Jan 15 11:06:24 UTC 2013


Repository : http://git.fedorahosted.org/cgit/copr.git

On branch  : master

>---------------------------------------------------------------

commit d4837c37d42fda3773d1fc2f49ae5d7d629e43d2
Author: Bohuslav Kabrda <bkabrda at redhat.com>
Date:   Mon Jan 14 14:45:59 2013 +0100

    Use a factory for copr forms to generate the chroots dynamically from DB.


>---------------------------------------------------------------

 coprs_frontend/coprs/forms.py |   77 +++++++++++++++++++++-------------------
 1 files changed, 40 insertions(+), 37 deletions(-)

diff --git a/coprs_frontend/coprs/forms.py b/coprs_frontend/coprs/forms.py
index 461e7c0..3a8fc59 100644
--- a/coprs_frontend/coprs/forms.py
+++ b/coprs_frontend/coprs/forms.py
@@ -34,19 +34,6 @@ class UrlListValidator(object):
         return is_url
 
 
-class AllowedArchesValidator(object):
-    def __init__(self, message = None):
-        if not message:
-            message = '"{0}" is not an allowed architecture for "{1}".'
-        self.message = message
-
-    def __call__(self, form, field):
-        arches = field.data
-        for a in arches:
-            if a not in constants.CHROOTS[form.release.data]:
-                raise wtf.ValidationError(self.message.format(a))
-
-
 class CoprUniqueNameValidator(object):
     def __init__(self, message = None):
         if not message:
@@ -77,30 +64,46 @@ class ValueToPermissionNumberFilter(object):
             return helpers.PermissionEnum.num('request')
         return helpers.PermissionEnum.num('nothing')
 
-class CoprForm(wtf.Form):
-    # also use id here, to be able to find out whether user is updating a copr
-    # if so, we don't want to shout that name already exists
-    id = wtf.HiddenField()
-    name = wtf.TextField('Name',
-                         validators = [wtf.Required(),
-                         wtf.Regexp(re.compile(r'^[\w.-]+$'), message = 'Name must contain only letters, digits, underscores, dashes and dots.'),
-                         CoprUniqueNameValidator()])
-    # choices must be list of tuples
-    # => make list like [(fedora-18, fedora-18), ...]
-    release = wtf.SelectField('Release', choices = [(x, x) for x in sorted(constants.CHROOTS)])
-    arches = wtf.SelectMultipleField('Architectures',
-                                     choices = [(x, x) for x in constants.DEFAULT_ARCHES],
-                                     validators = [wtf.Required(), AllowedArchesValidator()])
-    repos = wtf.TextAreaField('Repos',
-                              validators = [UrlListValidator()],
-                              filters = [StringListFilter()])
-    initial_pkgs = wtf.TextAreaField('Initial packages to build',
-                                     validators = [UrlListValidator()],
-                                     filters = [StringListFilter()])
-
-    @property
-    def chroots(self):
-        return ['{0}-{1}'.format(self.release.data, arch) for arch in self.arches.data ]
+class CoprFormFactory(object):
+    @staticmethod
+    def create_form_cls(mock_chroots=None):
+        class F(wtf.Form):
+            # also use id here, to be able to find out whether user is updating a copr
+            # if so, we don't want to shout that name already exists
+            id = wtf.HiddenField()
+            name = wtf.TextField('Name',
+                                 validators = [wtf.Required(),
+                                 wtf.Regexp(re.compile(r'^[\w.-]+$'), message='Name must contain only letters, digits, underscores, dashes and dots.'),
+                                 CoprUniqueNameValidator()])
+            repos = wtf.TextAreaField('Repos',
+                                      validators = [UrlListValidator()],
+                                      filters = [StringListFilter()])
+            initial_pkgs = wtf.TextAreaField('Initial packages to build',
+                                             validators = [UrlListValidator()],
+                                             filters = [StringListFilter()])
+
+            @property
+            def selected_chroots(self):
+                selected = []
+                for ch in self.chroots_list:
+                    if getattr(self, ch).data:
+                        selected.append(ch)
+                return selected
+
+        F.chroots_list = map(lambda x: x.chroot_name, models.MockChroot.query.filter(models.MockChroot.is_active==True).all())
+        F.chroots_list.sort()
+        F.chroots_sets = {} # sets of chroots according to how we should print them in columns
+        for ch in F.chroots_list:
+            checkbox_default = False
+            if mock_chroots and ch in map(lambda x:x.chroot_name, mock_chroots):
+                checkbox_default = True
+            setattr(F, ch, wtf.BooleanField(ch, default=checkbox_default))
+            if ch[0] in F.chroots_sets:
+                F.chroots_sets[ch[0]].append(ch)
+            else:
+                F.chroots_sets[ch[0]] = [ch]
+
+        return F
 
 
 class BuildForm(wtf.Form):



More information about the copr-devel mailing list