Beispiel #1
0
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')]
Beispiel #2
0
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')]
Beispiel #3
0
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()
Beispiel #4
0
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(), )
Beispiel #6
0
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')
Beispiel #7
0
        :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
Beispiel #8
0
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)
Beispiel #9
0
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')
Beispiel #10
0
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'})
    ]