示例#1
0
 def test_set_group_contents_nonexistent(self):
     group = PackageGroup(name='foo')
     self.prepare_packages('bar')
     self.db.add(group)
     self.db.flush()
     with self.assertRaises(data.PackagesDontExist) as exc:
         data.set_group_content(self.session, group, ['bar', 'a1', 'a2'])
     self.assertCountEqual({'a1', 'a2'}, exc.exception.packages)
示例#2
0
 def test_set_group_contents_nonexistent(self):
     group = PackageGroup(name='foo')
     self.prepare_packages('bar')
     self.db.add(group)
     self.db.flush()
     with self.assertRaises(data.PackagesDontExist) as exc:
         data.set_group_content(self.session, group, ['bar', 'a1', 'a2'])
     self.assertCountEqual({'a1', 'a2'}, exc.exception.packages)
示例#3
0
def process_group_form(group=None):
    """
    Validate and process submitted group form.
    :param group:
    :return:
    """
    if request.method == 'GET':
        # construct new form
        if group:
            # edit form
            obj = dict(name=group.name,
                       owners=[u.name for u in group.owners],
                       packages=[p.name for p in group.packages])
            form = forms.GroupForm(**obj)
        else:
            # creation form
            form = forms.GroupForm(owners=[g.user.name])
        return render_template('edit-group.html', group=group, form=form)
    form = forms.GroupForm()
    # check permissions
    if group and not group.editable:
        flash_nak("You don't have permission to edit this group")
        return redirect(
            url_for('group_detail', name=group.name,
                    namespace=group.namespace))
    # check form validity
    if not form.validate_or_flash():
        return render_template('edit-group.html', group=group, form=form)

    # existing group being edited or None - to be sent into template
    existing_group = group

    if not group:
        group = PackageGroup(namespace=g.user.name)
        db.add(group)
    group.name = form.name.data
    try:
        db.flush()
    except IntegrityError:
        db.rollback()
        flash_nak("Group already exists")
        return render_template('edit-group.html',
                               group=existing_group,
                               form=form)
    try:
        data.set_group_content(session, group, form.packages.data)
        data.set_group_maintainers(session, group, form.owners.data)
    except data.PackagesDontExist as e:
        db.rollback()
        flash_nak(str(e))
        return render_template('edit-group.html',
                               group=existing_group,
                               form=form)
    db.commit()
    flash_ack("Group created" if not existing_group else "Group modified")
    return redirect(
        url_for('group_detail', name=group.name, namespace=group.namespace))
示例#4
0
文件: views.py 项目: msimacek/koschei
def edit_package(name):
    """
    Edit package attributes or groups. Everyone can edit attributes, group membership
    requires permissions.
    """
    form = forms.EditPackageForm()
    collection = g.collections_by_id.get(form.collection_id.data) or abort(400)
    if not form.validate_or_flash():
        return package_detail(name=name, form=form, collection=collection)
    package = db.query(Package)\
        .filter_by(name=name, collection_id=collection.id)\
        .first_or_404()

    # Interpret group checkboxes
    for key, prev_val in request.form.items():
        if key.startswith('group-prev-'):
            group = db.query(PackageGroup).get_or_404(int(key[len('group-prev-'):]))
            new_val = request.form.get('group-{}'.format(group.id))
            if bool(new_val) != (prev_val == 'true'):
                if not group.editable:
                    abort(403)
                if new_val:
                    data.set_group_content(session, group, [package.name], append=True)
                else:
                    data.set_group_content(session, group, [package.name], delete=True)

    # Using set_package_attribute to generate audit log events
    if form.tracked.data is not None:
        data.set_package_attribute(
            session, package, 'tracked',
            form.tracked.data,
        )
    if form.manual_priority.data is not None:
        data.set_package_attribute(
            session, package, 'manual_priority',
            form.manual_priority.data,
        )
    if form.arch_override.data is not None:
        data.set_package_attribute(
            session, package, 'arch_override',
            ' '.join(form.arch_override.data) or None,
        )
    if form.skip_resolution.data is not None:
        data.set_package_attribute(
            session, package, 'skip_resolution',
            form.skip_resolution.data,
        )
        if package.skip_resolution:
            package.resolved = None
            db.query(UnappliedChange).filter_by(package_id=package.id).delete()
    flash_ack("Package modified")

    db.commit()
    return redirect(url_for('package_detail', name=package.name) +
                    "?collection=" + collection.name)
示例#5
0
文件: views.py 项目: msimacek/koschei
def process_group_form(group=None):
    """
    Validate and process submitted group form.
    :param group:
    :return:
    """
    if request.method == 'GET':
        # construct new form
        if group:
            # edit form
            obj = dict(name=group.name, owners=[u.name for u in group.owners],
                       packages=[p.name for p in group.packages])
            form = forms.GroupForm(**obj)
        else:
            # creation form
            form = forms.GroupForm(owners=[g.user.name])
        return render_template('edit-group.html', group=group, form=form)
    form = forms.GroupForm()
    # check permissions
    if group and not group.editable:
        flash_nak("You don't have permission to edit this group")
        return redirect(url_for('group_detail', name=group.name,
                                namespace=group.namespace))
    # check form validity
    if not form.validate_or_flash():
        return render_template('edit-group.html', group=group, form=form)

    # existing group being edited or None - to be sent into template
    existing_group = group

    if not group:
        group = PackageGroup(namespace=g.user.name)
        db.add(group)
    group.name = form.name.data
    try:
        db.flush()
    except IntegrityError:
        db.rollback()
        flash_nak("Group already exists")
        return render_template('edit-group.html', group=existing_group, form=form)
    try:
        data.set_group_content(session, group, form.packages.data)
        data.set_group_maintainers(session, group, form.owners.data)
    except data.PackagesDontExist as e:
        db.rollback()
        flash_nak(str(e))
        return render_template('edit-group.html', group=existing_group, form=form)
    db.commit()
    flash_ack("Group created" if not existing_group else "Group modified")
    return redirect(url_for('group_detail', name=group.name,
                            namespace=group.namespace))
示例#6
0
 def execute(self, session, group, pkgs, maintainer):
     namespace, name = PackageGroup.parse_name(group)
     if (session.db.query(PackageGroup).filter_by(namespace=namespace,
                                                  name=name).count()):
         sys.exit("Group already exists")
     group_obj = PackageGroup(name=name, namespace=namespace)
     session.db.add(group_obj)
     session.db.flush()
     session.log_user_action("Group {} created".format(group.full_name))
     try:
         data.set_group_content(session, group, pkgs)
         data.set_group_maintainers(session, group, maintainer)
     except data.PackagesDontExist as e:
         sys.exit(str(e))
示例#7
0
文件: admin.py 项目: msimacek/koschei
 def execute(self, session, group, pkgs, maintainer):
     namespace, name = PackageGroup.parse_name(group)
     if (session.db.query(PackageGroup)
             .filter_by(namespace=namespace, name=name)
             .count()):
         sys.exit("Group already exists")
     group_obj = PackageGroup(name=name, namespace=namespace)
     session.db.add(group_obj)
     session.db.flush()
     session.log_user_action("Group {} created".format(group.full_name))
     try:
         data.set_group_content(session, group, pkgs)
         data.set_group_maintainers(session, group, maintainer)
     except data.PackagesDontExist as e:
         sys.exit(str(e))
示例#8
0
    def test_append_group_content(self):
        group = PackageGroup(name='foo')
        self.db.add(group)
        self.db.flush()
        bar, a1, a2, a3 = self.prepare_packages('bar', 'a1', 'a2', 'a3', 'a4')[:4]
        rel = PackageGroupRelation(group_id=group.id, base_id=bar.base_id)
        self.db.add(rel)
        self.db.commit()
        content = ['a1', 'a2', 'a3']
        data.set_group_content(self.session, group, content, append=True)

        self.assertCountEqual([bar.base_id, a1.base_id, a2.base_id, a3.base_id],
                             self.db.query(PackageGroupRelation.base_id)
                             .filter_by(group_id=group.id).all_flat())
        self.assert_action_log(
            "Group foo modified: package a1 added",
            "Group foo modified: package a2 added",
            "Group foo modified: package a3 added",
        )
示例#9
0
    def test_append_group_content(self):
        group = PackageGroup(name='foo')
        self.db.add(group)
        self.db.flush()
        bar, a1, a2, a3 = self.prepare_packages('bar', 'a1', 'a2', 'a3', 'a4')[:4]
        rel = PackageGroupRelation(group_id=group.id, base_id=bar.base_id)
        self.db.add(rel)
        self.db.commit()
        content = ['a1', 'a2', 'a3']
        data.set_group_content(self.session, group, content, append=True)

        self.assertCountEqual([bar.base_id, a1.base_id, a2.base_id, a3.base_id],
                             self.db.query(PackageGroupRelation.base_id)
                             .filter_by(group_id=group.id).all_flat())
        self.assert_action_log(
            "Group foo modified: package a1 added",
            "Group foo modified: package a2 added",
            "Group foo modified: package a3 added",
        )
示例#10
0
def add_packages():
    """
    Mark multiple packages as tracked. Optionally add them to a group.
    """
    form = forms.AddPackagesForm()
    if request.method == 'POST':
        if not form.validate_or_flash():
            return render_template("add-packages.html", form=form)
        names = set(form.packages.data)
        try:
            collection = [
                c for c in g.collections if c.name == form.collection.data
            ][0]
        except IndexError:
            abort(404)

        try:
            added = data.track_packages(session, collection, names)
        except data.PackagesDontExist as e:
            db.rollback()
            flash_nak(str(e))
            # frontend doesn't have Koji access, so it needs to rely on backend's polling
            flash_nak(
                dedent("""
                If a package has been just created, it is possible that it
                hasn't been propagated to our database yet. In that case,
                please, try again later.
            """))
            return render_template("add-packages.html", form=form)

        if form.group.data:
            namespace, name = PackageGroup.parse_name(form.group.data)
            group = db.query(PackageGroup)\
                      .filter_by(namespace=namespace, name=name)\
                      .first_or_404()
            if not group.editable:
                abort(400)
            data.set_group_content(session, group, names, append=True)

        flash_ack("Packages added: {}".format(','.join(p.name for p in added)))
        db.commit()
        return redirect(request.form.get('next') or url_for('frontpage'))
    return render_template("add-packages.html", form=form)
示例#11
0
    def test_delete_group_content(self):
        group = PackageGroup(name='foo')
        self.db.add(group)
        self.db.flush()
        bar, a1, = self.prepare_packages('bar', 'a1', 'a2', 'a3')[:2]
        rel = PackageGroupRelation(group_id=group.id, base_id=bar.base_id)
        self.db.add(rel)
        self.db.commit()
        rel = PackageGroupRelation(group_id=group.id, base_id=a1.base_id)
        self.db.add(rel)
        self.db.commit()
        content = ['a1']
        data.set_group_content(self.session, group, content, delete=True)

        self.assertCountEqual([bar.base_id],
                              self.db.query(
                                  PackageGroupRelation.base_id).filter_by(
                                      group_id=group.id).all_flat())
        self.assert_action_log("Group foo modified: package a1 removed")
示例#12
0
    def test_delete_group_content(self):
        group = PackageGroup(name='foo')
        self.db.add(group)
        self.db.flush()
        bar, a1, = self.prepare_packages('bar', 'a1', 'a2', 'a3')[:2]
        rel = PackageGroupRelation(group_id=group.id, base_id=bar.base_id)
        self.db.add(rel)
        self.db.commit()
        rel = PackageGroupRelation(group_id=group.id, base_id=a1.base_id)
        self.db.add(rel)
        self.db.commit()
        content = ['a1']
        data.set_group_content(self.session, group, content, delete=True)

        self.assertCountEqual([bar.base_id],
                             self.db.query(PackageGroupRelation.base_id)
                             .filter_by(group_id=group.id).all_flat())
        self.assert_action_log(
            "Group foo modified: package a1 removed"
        )
示例#13
0
文件: views.py 项目: msimacek/koschei
def add_packages():
    """
    Mark multiple packages as tracked. Optionally add them to a group.
    """
    form = forms.AddPackagesForm()
    if request.method == 'POST':
        if not form.validate_or_flash():
            return render_template("add-packages.html", form=form)
        names = set(form.packages.data)
        try:
            collection = [c for c in g.collections
                          if c.name == form.collection.data][0]
        except IndexError:
            abort(404)

        try:
            added = data.track_packages(session, collection, names)
        except data.PackagesDontExist as e:
            db.rollback()
            flash_nak(str(e))
            # frontend doesn't have Koji access, so it needs to rely on backend's polling
            flash_nak(dedent("""
                If a package has been just created, it is possible that it
                hasn't been propagated to our database yet. In that case,
                please, try again later.
            """))
            return render_template("add-packages.html", form=form)

        if form.group.data:
            namespace, name = PackageGroup.parse_name(form.group.data)
            group = db.query(PackageGroup)\
                      .filter_by(namespace=namespace, name=name)\
                      .first_or_404()
            if not group.editable:
                abort(400)
            data.set_group_content(session, group, names, append=True)

        flash_ack("Packages added: {}".format(','.join(p.name for p in added)))
        db.commit()
        return redirect(request.form.get('next') or url_for('frontpage'))
    return render_template("add-packages.html", form=form)
示例#14
0
def edit_package(name):
    """
    Edit package attributes or groups. Everyone can edit attributes, group membership
    requires permissions.
    """
    form = forms.EditPackageForm()
    collection = g.collections_by_id.get(form.collection_id.data) or abort(400)
    if not form.validate_or_flash():
        return package_detail(name=name, form=form, collection=collection)
    package = db.query(Package)\
        .filter_by(name=name, collection_id=collection.id)\
        .first_or_404()

    # Interpret group checkboxes
    for key, prev_val in request.form.items():
        if key.startswith('group-prev-'):
            group = db.query(PackageGroup).get_or_404(
                int(key[len('group-prev-'):]))
            new_val = request.form.get('group-{}'.format(group.id))
            if bool(new_val) != (prev_val == 'true'):
                if not group.editable:
                    abort(403)
                if new_val:
                    data.set_group_content(session,
                                           group, [package.name],
                                           append=True)
                else:
                    data.set_group_content(session,
                                           group, [package.name],
                                           delete=True)

    # Using set_package_attribute to generate audit log events
    if form.tracked.data is not None:
        data.set_package_attribute(
            session,
            package,
            'tracked',
            form.tracked.data,
        )
    if form.manual_priority.data is not None:
        data.set_package_attribute(
            session,
            package,
            'manual_priority',
            form.manual_priority.data,
        )
    if form.arch_override.data is not None:
        data.set_package_attribute(
            session,
            package,
            'arch_override',
            ' '.join(form.arch_override.data) or None,
        )
    if form.skip_resolution.data is not None:
        data.set_package_attribute(
            session,
            package,
            'skip_resolution',
            form.skip_resolution.data,
        )
        if package.skip_resolution:
            package.resolved = None
            db.query(UnappliedChange).filter_by(package_id=package.id).delete()
    flash_ack("Package modified")

    db.commit()
    return redirect(
        url_for('package_detail', name=package.name) + "?collection=" +
        collection.name)
示例#15
0
文件: admin.py 项目: msimacek/koschei
 def from_fo(fo):
     content = [x for x in fo.read().split() if x]
     if not content:
         sys.exit("Group content empty")
     data.set_group_content(session, group, content, append)
示例#16
0
 def from_fo(fo):
     content = [x for x in fo.read().split() if x]
     if not content:
         sys.exit("Group content empty")
     data.set_group_content(session, group, content, append)