Package coprs :: Package rest_api :: Module schemas
[hide private]
[frames] | no frames]

Source Code for Module coprs.rest_api.schemas

  1  # coding: utf-8 
  2   
  3  from collections import Iterable 
  4  from marshmallow import Schema, fields, ValidationError, validate 
  5  from six import string_types 
  6   
  7   
8 -def validate_any(fn_list):
9 """ 10 :param fn_list: list of callable functions, each takes one param 11 :return: None if at least one validation function exists without exceptions 12 :raises ValidationError: otherwise 13 """ 14 def func(value): 15 errors = [] 16 for fn in fn_list: 17 try: 18 fn(value) 19 except ValidationError as err: 20 errors.append(str(err)) 21 else: 22 return 23 else: 24 errors.insert(0, u"At least one validator should accept given value:") 25 raise ValidationError(errors)
26 27 return func 28 29
30 -class SpaceSeparatedList(fields.Field):
31 - def _serialize(self, value, attr, obj):
32 if value is None: 33 return [] 34 return value.split()
35
36 - def _deserialize(self, value, attr=None, data=None):
37 if value is None: 38 return "" 39 elif not isinstance(value, Iterable) or isinstance(value, string_types): 40 raise ValidationError("Value `{}` is not a list of strings" 41 .format(value)) 42 else: 43 return " ".join(value)
44 45
46 -class BuiltPackages(fields.Field):
47 """ stored in db as a string: 48 "python3-marshmallow 2.0.0b5\npython-marshmallow 2.0.0b5" 49 we would represent them as 50 { name: "pkg", version: "pkg version" } 51 we implement only the serialization, since field is read-only 52 """
53 - def _serialize(self, value, attr, obj):
54 if value is None: 55 return [] 56 result = [] 57 try: 58 for chunk in value.split("\n"): 59 pkg, version = chunk.split() 60 result.append({ 61 "name": pkg, 62 "version": version 63 }) 64 except: 65 pass 66 67 return result
68 69
70 -class AllowedMethodSchema(Schema):
71 method = fields.Str() 72 doc = fields.Str() 73 require_auth = fields.Bool() 74 params = fields.List(fields.Str())
75 76
77 -class MockChrootSchema(Schema):
78 - class Meta:
79 fields = ("name", "os_release", "os_version", "arch", "is_active") 80 ordered = True
81 82
83 -class ProjectSchema(Schema):
84 id = fields.Int(dump_only=True) 85 name = fields.Str(dump_only=True) 86 87 owner = fields.Str(attribute="owner_name", dump_only=True) 88 is_a_group_project = fields.Bool(dump_only=True) 89 group = fields.Str(attribute="group_name", dump_only=True) 90 91 description = fields.Str(allow_none=True) 92 instructions = fields.Str(allow_none=True) 93 homepage = fields.Url(allow_none=True) 94 contact = fields.Str(validate=validate_any([ 95 validate.URL(), 96 validate.Email(), 97 validate.OneOf(["", None]), 98 ]), allow_none=True) 99 100 disable_createrepo = fields.Bool(allow_none=True) 101 build_enable_net = fields.Bool(allow_none=True) 102 last_modified = fields.DateTime(dump_only=True) 103 104 repos = SpaceSeparatedList(allow_none=True)
105 106
107 -class ProjectCreateSchema(ProjectSchema):
108 name = fields.Str( 109 required=True, 110 validate=[ 111 validate.Regexp( 112 r"^[a-zA-Z][\w.-]*$", 113 error="Name must contain only letters," 114 "digits, underscores, dashes and dots." 115 "And starts with letter"), 116 ]) 117 group = fields.Str(load_only=True, allow_none=True) 118 chroots = SpaceSeparatedList(load_only=True, default=list)
119 120 121 # todo: rename to ProjectChrootSchema
122 -class CoprChrootSchema(Schema):
123 124 buildroot_pkgs = SpaceSeparatedList() 125 name = fields.Str(dump_only=True) 126 127 comps = fields.Str(allow_none=True) 128 comps_name = fields.Str(allow_none=True) 129 comps_len = fields.Int(dump_only=True)
130 131
132 -class CoprChrootCreateSchema(CoprChrootSchema):
133 name = fields.Str(required=True)
134 135
136 -class BuildTaskSchema(Schema):
137 # used only for presentation 138 state = fields.Str() 139 started_on = fields.Int(dump_only=True) 140 ended_on = fields.Int(dump_only=True) 141 git_hash = fields.Str(dump_only=True) 142 chroot_name = fields.Str(dump_only=True, attribute="name") 143 build_id = fields.Int(dump_only=True) 144 145 result_dir_url = fields.Str(dump_only=True)
146 147
148 -class BuildSchema(Schema):
149 150 id = fields.Int(dump_only=True) 151 state = fields.Str() 152 153 submitter = fields.Str(dump_only=True, attribute="user_name") 154 155 built_packages = BuiltPackages(dump_only=True) 156 package_version = fields.Str(dump_only=True, attribute="pkg_version") 157 package_name = fields.Str(dump_only=True) 158 159 repos = SpaceSeparatedList(dump_only=True) 160 161 submitted_on = fields.Int(dump_only=True) 162 163 # timeout = fields.Int(dump_only=True) # currently has no use 164 enable_net = fields.Bool(dump_only=True) 165 166 source_type = fields.Str(dump_only=True, attribute="source_type_text") 167 source_metadata = fields.Raw(dump_only=True)
168 169
170 -class BuildCreateSchema(BuildSchema):
171 project_id = fields.Int(required=True) 172 chroots = fields.List(fields.Str()) 173 enable_net = fields.Bool() 174 175 state = fields.Str(dump_only=True)
176 177
178 -class BuildCreateFromUrlSchema(BuildCreateSchema):
179 srpm_url = fields.Url(required=True, validate=lambda u: u.startswith("http"))
180