class TagFormSchema(validators.Schema): id = validators.Int() tag = validators.UnicodeString(not_empty=True, max=20, strip=True) default = validators.StringBool(if_empty=False) expire_in_days = validators.Int() needs_product = validators.StringBool(if_empty=False) chained_validators = [UniqueRetentionTag('id', 'tag')]
class UserFormSchema(validators.Schema): user_id = validators.Int() user_name = validators.UnicodeString(not_empty=True, strip=True) display_name = validators.UnicodeString(not_empty=True, strip=True) disabled = validators.StringBool(if_empty=False) email_address = validators.Email(not_empty=True, strip=True) chained_validators = [beaker_validators.UniqueUserName('user_id', 'user_name')]
class AclName(validators.Schema): '''Validator for the acls.name method''' # validator schemas don't have methods (R0903, W0232) #pylint:disable-msg=R0903,W0232 packageName = validators.UnicodeString(not_empty=True, strip=True) collectionName = validators.UnicodeString(not_empty=False, strip=True) collectionVersion = validators.UnicodeString(not_empty=False, strip=True) eol = validators.StringBool()
class GroupFormSchema(validators.Schema): display_name = validators.UnicodeString( not_empty=True, max=Group.display_name.property.columns[0].type.length, strip=True) group_name = validators.UnicodeString( not_empty=True, max=Group.group_name.property.columns[0].type.length, strip=True) root_password = StrongPassword() ldap = validators.StringBool(if_empty=False)
class NotifyList(validators.Schema): '''Validator schema for the notify method.''' # validator schemas don't have methods (R0903, W0232) #pylint:disable-msg=R0903,W0232 # We don't use a more specific validator for collection or version because # the chained validator does it for us and we don't want to hit the # database multiple times name = validators.UnicodeString(not_empty=False, strip=True) version = validators.UnicodeString(not_empty=False, strip=True) eol = validators.StringBool() chained_validators = (CollectionNameVersion(), )
class JobForm(widgets.Form): template = 'bkr.server.templates.job_form' name = 'job' submit_text = _(u'Queue') fields = [widgets.TextArea(name='textxml')] hidden_fields = [ widgets.HiddenField(name='confirmed', validator=validators.StringBool()) ] params = ['xsd_errors'] xsd_errors = None def update_params(self, d): super(JobForm, self).update_params(d) if 'xsd_errors' in d['options']: d['xsd_errors'] = d['options']['xsd_errors'] d['submit_text'] = _(u'Queue despite validation errors')
:type ignore_missing_tasks: bool """ # xml.sax (and thus, xmltramp) expect raw bytes, not unicode if isinstance(jobxml, unicode): jobxml = jobxml.encode('utf8') xml = xmltramp_parse_untrusted(jobxml) xmljob = XmlJob(xml) job = self.process_xmljob(xmljob, identity.current.user, ignore_missing_tasks=ignore_missing_tasks) session.flush() # so that we get an id return "J:%s" % job.id @identity.require(identity.not_anonymous()) @expose(template="bkr.server.templates.form-post") @validate(validators={'confirmed': validators.StringBool()}) def clone(self, job_id=None, recipe_id=None, recipeset_id=None, textxml=None, filexml=None, confirmed=False, **kw): """ Review cloned xml before submitting it. """ title = 'Clone Job' if job_id: # Clone from Job ID title = 'Clone Job %s' % job_id
class KeyTypes(AdminPage): # For XMLRPC methods in this class. exposed = False id = widgets.HiddenField(name='id') key_name = widgets.TextField(name='key_name', label=_(u'Name')) numeric = widgets.CheckBox(name='numeric', label=_(u'Numeric'), default=False, validator=validators.StringBool(if_empty=False)) form = HorizontalForm( 'keytypes', fields=[id, key_name, numeric], action='save_data', submit_text=_(u'Submit Data'), ) def __init__(self, *args, **kw): kw['search_url'] = url("/keytypes/by_name?anywhere=1"), kw['search_name'] = 'key' super(KeyTypes, self).__init__(*args, **kw) self.search_col = Key.key_name self.search_mapper = Key @identity.require(identity.in_group("admin")) @expose(template='bkr.server.templates.form') def new(self, **kw): return dict( title=_(u'New Key Type'), form=self.form, action='./save', options={}, value=kw, ) @identity.require(identity.in_group("admin")) @expose(template='bkr.server.templates.form') def edit(self, **kw): values = [] if kw.get('id'): key = Key.by_id(kw['id']) values = dict(id=key.id, key_name=key.key_name, numeric=key.numeric) return dict( form=self.form, action='./save', options={}, value=values, ) @identity.require(identity.in_group("admin")) @expose() @validate(form=form) @error_handler(edit) def save(self, **kw): if kw['id']: key = Key.by_id(kw['id']) key.key_name = kw['key_name'] else: if Key.query.filter_by(key_name=kw['key_name']).first(): flash(u"Key Type exists: %s" % kw['key_name']) redirect(".") key = Key(key_name=kw['key_name']) session.add(key) key.numeric = kw['numeric'] flash(_(u"OK")) redirect(".") @expose(template="bkr.server.templates.admin_grid") @paginate('list') def index(self, *args, **kw): keytypes = session.query(Key) list_by_letters = set( [elem.key_name[0].capitalize() for elem in keytypes]) results = self.process_search(**kw) if results: keytypes = results.order_by(Key.key_name) can_edit = identity.current.user and identity.current.user.is_admin() keytypes_grid = myPaginateDataGrid( fields=[ ('Key', lambda x: make_edit_link(x.key_name, x.id) if can_edit else x.key_name), ('Numeric', lambda x: x.numeric), (' ', lambda x: make_remove_link(x.id) if can_edit else None), ], add_action='./new' if can_edit else None) return dict(title="Key Types", grid=keytypes_grid, search_widget=self.search_widget_form, alpha_nav_bar=AlphaNavBar(list_by_letters, self.search_name), list=keytypes) @identity.require(identity.in_group("admin")) @expose() def remove(self, **kw): remove = Key.by_id(kw['id']) session.delete(remove) flash(_(u"%s Deleted") % remove.key_name) raise redirect(".") @expose(format='json') def by_name(self, input, *args, **kw): if 'anywhere' in kw: search = Key.list_by_name(input, find_anywhere=True) else: search = Key.list_by_name(input) keys = [elem.key_name for elem in search] return dict(matches=keys)
class BuildRootOverrideController(Controller): @identity.require(identity.not_anonymous()) @expose() def index(self): raise redirect('/override/list') @identity.require(identity.not_anonymous()) @expose(template="bodhi.templates.overrides", allow_json=True) @validate( validators={ 'build': validators.UnicodeString(), 'mine': validators.StringBool(), 'release': validators.UnicodeString(), 'show_expired': validators.StringBool() }) @paginate('overrides', default_order='-date_submitted', limit=20, max_limit=1000) def list(self, build=None, tg_errors=None, mine=False, release=None, show_expired=False, **kw): query = [] title = '%d Buildroot Overrides' if mine: query.append( BuildRootOverride.q.submitter == identity.current.user_name) title += ' submitted by %s' % identity.current.user_name if release: rel = Release.byName(release) query.append(BuildRootOverride.q.releaseID == rel.id) title += ' for %s' % rel.long_name if not show_expired: query.append(BuildRootOverride.q.date_expired == None) overrides = BuildRootOverride.select(AND(*query)) if request_format() == 'json': overrides = [o.__json__() for o in overrides] num_items = len(overrides) else: num_items = overrides.count() return dict(overrides=overrides, title=title % num_items, num_items=num_items, show_expired=show_expired, mine=mine) @identity.require(identity.not_anonymous()) @expose(template="bodhi.templates.form") def new(self, tg_errors=None, *args, **kw): if tg_errors: flash(str(tg_errors)) expiration = datetime.utcnow() + \ timedelta(days=config.get('buildroot_overrides.expire_after', 1)) return dict(form=override_form, values={'expiration': expiration}, action=url('/override/save'), title='Buildroot Overrides') @identity.require(identity.not_anonymous()) @expose(allow_json=True) def expire(self, build, *args, **kw): """ Expire a given override """ override = BuildRootOverride.byBuild(build) if override.date_expired: flash('Override %s already expired!' % build) if request_format() == 'json': return dict() raise redirect('/override') override.date_expired = datetime.utcnow() try: override.untag() except Exception, e: log.error(str(e)) flash(str(e)) raise redirect('/override') log.info('Buildroot override %s manually expired by %s' % (build, identity.current.user_name)) flash('Buildroot override for %s successful untagged' % build) if request_format() == 'json': return dict() raise redirect('/override')
class NewUpdateForm(Form): template = "bodhi.templates.new" submit_text = "Save Update" update_types = config.get('update_types').split() request_types = ['Testing', 'Stable', 'None', None] fields = [ AutoCompleteField('builds', label='Package', search_controller=url('/new/search'), search_param='name', result_name='pkgs', template='bodhi.templates.packagefield', validator=AutoCompleteValidator()), CheckBox('inheritance', label='Follow Build inheritance', validator=validators.StringBool(), default=False, attrs={'title' : 'Build Inheritance - ' 'TODO'}), SingleSelectField('type_', label='Type', options=update_types, validator=validators.OneOf(update_types)), SingleSelectField('request', options=request_types, validator=validators.OneOf(request_types + [r.lower() for r in request_types if r]), default='testing'), TextField('bugs', validator=BugValidator(), attrs={'title' : 'Bug Numbers - A space or comma ' 'delimited list of bug numbers or ' 'aliases. Example: #1234, 789 ' 'CVE-2008-0001'}), TextArea('notes', validator=validators.UnicodeString(), rows=13, cols=65, attrs={'title' : 'Advisory Notes - <p>Some details ' 'about this update that will appear in ' 'the notice.</p>' '<p><strong>Example:</strong><br />' 'This is an update that fixes problems with ' '**<strong>connecting to a share</strong>**.</p>' '<p>The following things *<em>break</em>*:</p>' '<p>* Browsing with `<code>gnome-app-install</code>`<br />' '* Emailing</p>'}), CheckBox(name='close_bugs', help_text='Automatically close bugs', validator=validators.StringBool(), default=True, attrs={'title' : 'Close Bugs - ' 'Automatically close bugs ' 'when this update is ' 'pushed as stable'}), HiddenField('edited', default=None), CheckBox(name='suggest_reboot', label='Suggest Reboot', validator=validators.StringBool(), default=False, attrs={'title': 'Suggest Reboot - ' 'Recommend that the user ' 'restarts their machine ' 'after installing this ' 'update'}), CheckBox(name='autokarma', label='Enable karma automatism', default=True, validator=validators.StringBool(), attrs={'onchange': 'if ($("#form_autokarma").attr("checked")) {' '$("#form_stable_karma").attr("disabled", false);' 'if ($("#form_stable_karma").attr("value") == 0) $("#form_stable_karma").attr("value", 3);' '$("#form_unstable_karma").attr("disabled", false);' 'if ($("#form_unstable_karma").attr("value") == 0) $("#form_unstable_karma").attr("value", -3);' ' } else { ' '$("#form_stable_karma").attr("disabled", true);' '$("#form_unstable_karma").attr("disabled", true);' '}', 'title': 'Karma Automatism - Enable update request ' 'automation based on user feedback', }), TextField('stable_karma', label='Threshold for pushing to stable', validator=validators.Int(), default='3', attrs={'title' : 'Stable Karma - The threshold for ' 'automatically pushing this update to stable', 'size' : '1'}), TextField('unstable_karma', label='Threshold for unpushing', validator=validators.Int(), default='-3', attrs={'title' : 'Unstable Karma - The threshold for ' 'automatically unpushing an unstable update', 'size' : '1'}) ]