Beispiel #1
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))
 def prepare_package(self):
     pkg = self.prepare_basic_data()[0]
     groups = PackageGroup(name='c'), PackageGroup(name='xml')
     for group in groups:
         self.s.add(group)
         self.s.flush()
         self.s.add(
             PackageGroupRelation(group_id=group.id, package_id=pkg.id))
     self.s.commit()
     return pkg
Beispiel #3
0
def process_group_form(group=None):
    if request.method == 'GET':
        if group:
            obj = dict(name=group.name,
                       owners=[u.name for u in group.owners],
                       packages=[p.name for p in group.packages])
            form = GroupForm(**obj)
        else:
            form = GroupForm(owners=[g.user.name])
        return render_template('edit-group.html', group=group, form=form)
    form = GroupForm()
    # check permissions
    if group and not group.editable:
        flash("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)
    names = set(form.packages.data)
    users = [
        get_or_create(db, User, name=name) for name in set(form.owners.data)
    ]
    db.commit()
    user_ids = [u.id for u in users]
    packages = db.query(Package).filter(Package.name.in_(names))
    found_names = {p.name for p in packages}
    if len(found_names) != len(names):
        flash("Packages don't exist: " + ', '.join(names - found_names))
        return render_template('edit-group.html', group=group, form=form)
    created = not group
    if created:
        group = PackageGroup(namespace=g.user.name)
        db.add(group)
    group.name = form.name.data
    try:
        db.flush()
    except IntegrityError:
        db.rollback()
        flash("Group already exists")
        return render_template('edit-group.html', group=group, form=form)
    if not created:
        db.query(PackageGroupRelation)\
          .filter_by(group_id=group.id).delete()
        db.query(GroupACL)\
          .filter_by(group_id=group.id).delete()
    rels = [dict(group_id=group.id, package_name=name) for name in found_names]
    acls = [dict(group_id=group.id, user_id=user_id) for user_id in user_ids]
    db.execute(PackageGroupRelation.__table__.insert(), rels)
    db.execute(GroupACL.__table__.insert(), acls)
    db.commit()
    flash("Group created" if created else "Group modified")
    return redirect(
        url_for('group_detail', name=group.name, namespace=group.namespace))
Beispiel #4
0
 def execute(self, session, name, content_from_file, append):
     ns, name = PackageGroup.parse_name(name)
     group = session.db.query(PackageGroup)\
         .filter_by(name=name, namespace=ns or None).first()
     if group:
         sys.exit("Group already exists")
     group = PackageGroup(name=name, namespace=ns)
     session.db.add(group)
     session.db.flush()
     session.log_user_action("Group {} created".format(group.full_name))
     self.set_group_content(session, group, content_from_file, append)
Beispiel #5
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))
Beispiel #6
0
def process_group_form(group=None):
    if request.method == 'GET':
        if group:
            obj = dict(name=group.name, owners=[u.name for u in group.owners],
                       packages=[p.name for p in group.packages])
            form = GroupForm(**obj)
        else:
            form = GroupForm(owners=[g.user.name])
        return render_template('edit-group.html', group=group, form=form)
    form = GroupForm()
    # check permissions
    if group and not group.editable:
        flash("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)
    names = set(form.packages.data)
    users = [get_or_create(db, User, name=name) for name in set(form.owners.data)]
    db.commit()
    user_ids = [u.id for u in users]
    packages = db.query(Package).filter(Package.name.in_(names))
    found_names = {p.name for p in packages}
    if len(found_names) != len(names):
        flash("Packages don't exist: " + ', '.join(names - found_names))
        return render_template('edit-group.html', group=group, form=form)
    created = not group
    if created:
        group = PackageGroup(namespace=g.user.name)
        db.add(group)
    group.name = form.name.data
    try:
        db.flush()
    except IntegrityError:
        db.rollback()
        flash("Group already exists")
        return render_template('edit-group.html', group=group, form=form)
    if not created:
        db.query(PackageGroupRelation)\
          .filter_by(group_id=group.id).delete()
        db.query(GroupACL)\
          .filter_by(group_id=group.id).delete()
    rels = [dict(group_id=group.id, package_name=name) for name in found_names]
    acls = [dict(group_id=group.id, user_id=user_id) for user_id in user_ids]
    db.execute(PackageGroupRelation.__table__.insert(), rels)
    db.execute(GroupACL.__table__.insert(), acls)
    db.commit()
    flash("Group created" if created else "Group modified")
    return redirect(url_for('group_detail', name=group.name,
                            namespace=group.namespace))
Beispiel #7
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))
Beispiel #8
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)
Beispiel #9
0
 def execute(self, backend, name, content_from_file, append):
     ns, name = parse_group_name(name)
     group = backend.db.query(PackageGroup)\
         .filter_by(name=name, namespace=ns or None).first()
     if group:
         sys.exit("Group already exists")
     group = PackageGroup(name=name, namespace=ns)
     backend.db.add(group)
     backend.db.flush()
     self.set_group_content(backend, group, content_from_file, append)
     backend.db.commit()
Beispiel #10
0
 def add_group(self, group, pkgs):
     group_obj = self.db.query(PackageGroup)\
                        .filter_by(name=group).first()
     if not group_obj:
         group_obj = PackageGroup(name=group)
         self.db.add(group_obj)
         self.db.flush()
     for pkg in pkgs:
         rel = PackageGroupRelation(group_id=group_obj.id,
                                    package_id=pkg.id)
         self.db.add(rel)
Beispiel #11
0
 def execute(self, session, name, content_from_file, append):
     ns, name = PackageGroup.parse_name(name)
     group = session.db.query(PackageGroup)\
         .filter_by(name=name, namespace=ns or None).first()
     if group:
         sys.exit("Group already exists")
     group = PackageGroup(name=name, namespace=ns)
     session.db.add(group)
     session.db.flush()
     session.log_user_action("Group {} created".format(group.full_name))
     self.set_group_content(session, group, content_from_file, append)
Beispiel #12
0
 def execute(self, session, current_name, new_name, new_namespace,
             make_global, content_from_file, append):
     ns, name = PackageGroup.parse_name(current_name)
     group = session.db.query(PackageGroup)\
         .filter_by(name=name, namespace=ns or None).first()
     if not group:
         sys.exit("Group {} not found".format(current_name))
     if new_name:
         group.name = new_name
     if new_namespace:
         group.namespace = new_namespace
     if make_global:
         group.namespace = None
     self.set_group_content(session, group, content_from_file, append)
Beispiel #13
0
 def execute(self, session, current_name, new_name, new_namespace,
             make_global, content_from_file, append):
     ns, name = PackageGroup.parse_name(current_name)
     group = session.db.query(PackageGroup)\
         .filter_by(name=name, namespace=ns or None).first()
     if not group:
         sys.exit("Group {} not found".format(current_name))
     if new_name:
         group.name = new_name
     if new_namespace:
         group.namespace = new_namespace
     if make_global:
         group.namespace = None
     self.set_group_content(session, group, content_from_file, append)
Beispiel #14
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))
Beispiel #15
0
 def prepare_group(self,
                   name,
                   content=(),
                   namespace=None,
                   owners=('john.doe', )):
     users = [self.prepare_user(name=username) for username in owners]
     packages = self.prepare_packages(*content)
     group = PackageGroup(name=name, namespace=namespace)
     self.db.add(group)
     self.db.commit()
     self.db.execute(PackageGroupRelation.__table__.insert(), [
         dict(group_id=group.id, base_id=package.base_id)
         for package in packages
     ])
     self.db.execute(
         GroupACL.__table__.insert(),
         [dict(group_id=group.id, user_id=user.id) for user in users])
     self.db.commit()
     return group
Beispiel #16
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",
        )
Beispiel #17
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)
Beispiel #18
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")
Beispiel #19
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)
Beispiel #20
0
 def test_group_name_parse(self):
     self.assertEqual((None, 'foo'), PackageGroup.parse_name('foo'))
     self.assertEqual(('ns', 'bar'), PackageGroup.parse_name('ns/bar'))