예제 #1
0
    def test_map_project_no_project_for_package(self):
        """ Test package duplicity when package is not associated to project """
        create_distro(self.session)
        create_project(self.session)

        pkg = models.Packages(distro_name="Fedora",
                              project_id=None,
                              package_name="geany")
        self.session.add(pkg)
        self.session.commit()

        distro_objs = self.session.query(models.Distro).all()
        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 0)
        self.assertEqual(distro_objs[0].name, "Fedora")

        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany",
            distribution="Fedora",
            user_id="*****@*****.**",
            old_package_name=None,
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        packages = self.session.query(models.Packages).all()
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 1)
        self.assertEqual(len(packages), 1)
        self.assertEqual(project_obj.packages[0].package_name, "geany")
        self.assertEqual(project_obj.packages[0].distro_name, "Fedora")
예제 #2
0
    def test_map_project_no_project_for_package(self):
        """ Test package duplicity when package is not associated to project """
        create_distro(self.session)
        create_project(self.session)

        pkg = models.Packages(
            distro_name="Fedora", project_id=None, package_name="geany"
        )
        self.session.add(pkg)
        self.session.commit()

        distro_objs = self.session.query(models.Distro).all()
        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 0)
        self.assertEqual(distro_objs[0].name, "Fedora")

        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany",
            distribution="Fedora",
            user_id="*****@*****.**",
            old_package_name=None,
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        packages = self.session.query(models.Packages).all()
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 1)
        self.assertEqual(len(packages), 1)
        self.assertEqual(project_obj.packages[0].package_name, "geany")
        self.assertEqual(project_obj.packages[0].distro_name, "Fedora")
예제 #3
0
def edit_project_mapping(project_id, pkg_id):

    project = models.Project.get(Session, project_id)
    if not project:
        flask.abort(404)

    package = models.Packages.by_id(Session, pkg_id)
    if not package:
        flask.abort(404)

    # Get all available distros name
    distros = models.Distro.all(Session)
    distro_names = []
    for distro in distros:
        distro_names.append(distro.name)

    form = anitya.forms.MappingForm(
        package_name=package.package_name,
        distro=package.distro_name,
        distros=distro_names,
    )

    if form.validate_on_submit():

        try:
            utilities.map_project(
                Session,
                project=project,
                package_name=form.package_name.data,
                distribution=form.distro.data,
                user_id=flask.g.user.username,
                old_package_name=package.package_name,
                old_distro_name=package.distro_name,
            )

            Session.commit()
            flask.flash("Mapping edited")
        except exceptions.AnityaInvalidMappingException as err:
            err.link = flask.url_for("anitya_ui.project",
                                     project_id=err.project_id)
            flask.flash(err.message, "error")
        except exceptions.AnityaException as err:
            flask.flash(str(err), "error")

        return flask.redirect(
            flask.url_for("anitya_ui.project", project_id=project_id))

    return flask.render_template("mapping.html",
                                 current="projects",
                                 project=project,
                                 package=package,
                                 form=form)
예제 #4
0
def map_project(project_id):

    project = models.Project.get(Session, project_id)
    if not project:
        flask.abort(404)

    # Get all available distros name
    distros = models.Distro.all(Session)
    distro_names = []
    for distro in distros:
        distro_names.append(distro.name)

    form = anitya.forms.MappingForm(distros=distro_names)

    if flask.request.method == 'GET':
        form.package_name.data = flask.request.args.get(
            'package_name', project.name)
        form.distro.data = flask.request.args.get('distro', '')

    if form.validate_on_submit():
        try:
            utilities.map_project(
                Session,
                project=project,
                package_name=form.package_name.data.strip(),
                distribution=form.distro.data.strip(),
                user_id=flask.g.user.username,
            )
            Session.commit()
            flask.flash('Mapping added')
        except exceptions.AnityaInvalidMappingException as err:
            err.link = flask.url_for('anitya_ui.project',
                                     project_id=err.project_id)
            flask.flash(err.message, 'error')
        except exceptions.AnityaException as err:
            flask.flash(str(err), 'error')

        return flask.redirect(
            flask.url_for('anitya_ui.project', project_id=project.id))

    return flask.render_template(
        'mapping.html',
        current='projects',
        project=project,
        form=form,
    )
예제 #5
0
def edit_project_mapping(project_id, pkg_id):

    project = anitya.lib.model.Project.get(SESSION, project_id)
    if not project:
        flask.abort(404)

    package = anitya.lib.model.Packages.by_id(SESSION, pkg_id)
    if not package:
        flask.abort(404)

    form = anitya.forms.MappingForm(obj=package)

    if form.validate_on_submit():

        try:
            utilities.map_project(
                SESSION,
                project=project,
                package_name=form.package_name.data,
                distribution=form.distro.data,
                user_id=flask.g.auth.openid,
                old_package_name=package.package_name,
                old_distro_name=package.distro,
            )

            SESSION.commit()
            flask.flash('Mapping edited')
        except anitya.lib.exceptions.AnityaInvalidMappingException as err:
            err.link = flask.url_for('anitya_ui.project',
                                     project_id=err.project_id)
            flask.flash(err.message, 'error')
        except anitya.lib.exceptions.AnityaException as err:
            flask.flash(str(err), 'error')

        return flask.redirect(
            flask.url_for('anitya_ui.project', project_id=project_id))

    return flask.render_template(
        'mapping.html',
        current='projects',
        project=project,
        package=package,
        form=form,
    )
예제 #6
0
def map_project(project_id):

    project = anitya.lib.model.Project.get(SESSION, project_id)
    if not project:
        flask.abort(404)

    form = anitya.forms.MappingForm()

    if flask.request.method == 'GET':
        form.package_name.data = flask.request.args.get(
            'package_name', project.name)
        form.distro.data = flask.request.args.get('distro', '')

    if form.validate_on_submit():
        try:
            utilities.map_project(
                SESSION,
                project=project,
                package_name=form.package_name.data.strip(),
                distribution=form.distro.data.strip(),
                user_id=flask.g.auth.openid,
            )
            SESSION.commit()
            flask.flash('Mapping added')
        except anitya.lib.exceptions.AnityaInvalidMappingException as err:
            err.link = flask.url_for('anitya_ui.project',
                                     project_id=err.project_id)
            flask.flash(err.message, 'error')
        except anitya.lib.exceptions.AnityaException as err:
            flask.flash(str(err), 'error')

        return flask.redirect(
            flask.url_for('anitya_ui.project', project_id=project.id))

    return flask.render_template(
        'mapping.html',
        current='projects',
        project=project,
        form=form,
    )
예제 #7
0
    def test_map_project(self):
        """ Test the map_project function of Distro. """
        create_distro(self.session)
        create_project(self.session)

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 0)

        # Map `geany` project to CentOS
        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany",
            distribution="CentOS",
            user_id="*****@*****.**",
            old_package_name=None,
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 1)
        self.assertEqual(project_obj.packages[0].package_name, "geany")
        self.assertEqual(project_obj.packages[0].distro_name, "CentOS")

        # Map `geany` project to CentOS, exactly the same way
        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany2",
            distribution="CentOS",
            user_id="*****@*****.**",
            old_package_name=None,
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 2)
        self.assertEqual(project_obj.packages[0].package_name, "geany")
        self.assertEqual(project_obj.packages[0].distro_name, "CentOS")
        self.assertEqual(project_obj.packages[1].package_name, "geany2")
        self.assertEqual(project_obj.packages[1].distro_name, "CentOS")

        # Edit the mapping of the `geany` project to Fedora
        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany3",
            distribution="Fedora",
            user_id="*****@*****.**",
            old_package_name="geany",
            old_distro_name="CentOS",
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 2)
        pkgs = sorted(project_obj.packages, key=lambda x: x.package_name)
        self.assertEqual(pkgs[0].package_name, "geany2")
        self.assertEqual(pkgs[0].distro_name, "CentOS")
        self.assertEqual(pkgs[1].package_name, "geany3")
        self.assertEqual(pkgs[1].distro_name, "Fedora")

        # Edit the mapping of the `geany` project to Fedora
        project_obj = models.Project.get(self.session, 2)
        self.assertEqual(project_obj.name, "subsurface")
        self.assertEqual(len(project_obj.packages), 0)

        self.assertRaises(
            exceptions.AnityaInvalidMappingException,
            utilities.map_project,
            self.session,
            project=project_obj,
            package_name="geany2",
            distribution="CentOS",
            user_id="*****@*****.**",
        )
예제 #8
0
def new_project():
    """
    View for creating a new project.

    This function accepts GET and POST requests. POST requests can result in
    a HTTP 400 for invalid forms, a HTTP 409 if the request conflicts with an
    existing project, or a HTTP 302 redirect to the new project.
    """
    backend_plugins = anitya_plugins.load_plugins(Session)
    plg_names = [plugin.name for plugin in backend_plugins]
    version_plugins = anitya_plugins.load_plugins(Session, family="versions")
    version_plg_names = [plugin.name for plugin in version_plugins]
    # Get all available distros name
    distros = models.Distro.all(Session)
    distro_names = []
    for distro in distros:
        distro_names.append(distro.name)

    form = anitya.forms.ProjectForm(backends=plg_names,
                                    version_schemes=version_plg_names,
                                    distros=distro_names)

    if flask.request.method == "GET":
        form.name.data = flask.request.args.get("name", "")
        form.homepage.data = flask.request.args.get("homepage", "")
        form.backend.data = flask.request.args.get("backend", "")
        form.version_scheme.data = flask.request.args.get("version_scheme", "")
        form.distro.data = flask.request.args.get("distro", "")
        form.package_name.data = flask.request.args.get("package_name", "")
        return flask.render_template(
            "project_new.html",
            context="Add",
            current="Add projects",
            form=form,
            plugins=backend_plugins,
        )
    elif form.validate_on_submit():
        project = None
        try:
            project = utilities.create_project(
                Session,
                name=form.name.data.strip(),
                homepage=form.homepage.data.strip(),
                backend=form.backend.data.strip(),
                version_scheme=form.version_scheme.data.strip(),
                version_url=form.version_url.data.strip() or None,
                version_prefix=form.version_prefix.data.strip() or None,
                pre_release_filter=form.pre_release_filter.data.strip()
                or None,
                version_filter=form.version_filter.data.strip() or None,
                regex=form.regex.data.strip() or None,
                user_id=flask.g.user.username,
                releases_only=form.releases_only.data,
            )
            Session.commit()

            # Optionally, the user can also map a distro when creating a proj.
            if form.distro.data and form.package_name.data:
                utilities.map_project(
                    Session,
                    project=project,
                    package_name=form.package_name.data,
                    distribution=form.distro.data,
                    user_id=flask.g.user.username,
                )
                Session.commit()

            flask.flash("Project created")
        except exceptions.AnityaException as err:
            flask.flash(str(err))
            return (
                flask.render_template(
                    "project_new.html",
                    context="Add",
                    current="Add projects",
                    form=form,
                    plugins=backend_plugins,
                ),
                409,
            )

        if form.check_release.data is True:
            try:
                utilities.check_project_release(project, Session)
            except exceptions.AnityaException:
                flask.flash("Check failed")

        return flask.redirect(
            flask.url_for("anitya_ui.project", project_id=project.id))

    return (
        flask.render_template(
            "project_new.html",
            context="Add",
            current="Add projects",
            form=form,
            plugins=backend_plugins,
        ),
        400,
    )
예제 #9
0
    def test_map_project(self):
        """ Test the map_project function of Distro. """
        create_distro(self.session)
        create_project(self.session)

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 0)

        # Map `geany` project to CentOS
        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany",
            distribution="CentOS",
            user_id="*****@*****.**",
            old_package_name=None,
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 1)
        self.assertEqual(project_obj.packages[0].package_name, "geany")
        self.assertEqual(project_obj.packages[0].distro_name, "CentOS")

        # Map `geany` project to CentOS, exactly the same way
        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany2",
            distribution="CentOS",
            user_id="*****@*****.**",
            old_package_name=None,
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 2)
        self.assertEqual(project_obj.packages[0].package_name, "geany")
        self.assertEqual(project_obj.packages[0].distro_name, "CentOS")
        self.assertEqual(project_obj.packages[1].package_name, "geany2")
        self.assertEqual(project_obj.packages[1].distro_name, "CentOS")

        # Edit the mapping of the `geany` project to Fedora
        utilities.map_project(
            self.session,
            project=project_obj,
            package_name="geany3",
            distribution="Fedora",
            user_id="*****@*****.**",
            old_package_name="geany",
            old_distro_name="CentOS",
        )
        self.session.commit()

        project_obj = models.Project.get(self.session, 1)
        self.assertEqual(project_obj.name, "geany")
        self.assertEqual(len(project_obj.packages), 2)
        pkgs = sorted(project_obj.packages, key=lambda x: x.package_name)
        self.assertEqual(pkgs[0].package_name, "geany2")
        self.assertEqual(pkgs[0].distro_name, "CentOS")
        self.assertEqual(pkgs[1].package_name, "geany3")
        self.assertEqual(pkgs[1].distro_name, "Fedora")

        # Edit the mapping of the `geany` project to Fedora
        project_obj = models.Project.get(self.session, 2)
        self.assertEqual(project_obj.name, "subsurface")
        self.assertEqual(len(project_obj.packages), 0)

        self.assertRaises(
            exceptions.AnityaInvalidMappingException,
            utilities.map_project,
            self.session,
            project=project_obj,
            package_name="geany2",
            distribution="CentOS",
            user_id="*****@*****.**",
        )
예제 #10
0
def new_project():
    """
    View for creating a new project.

    This function accepts GET and POST requests. POST requests can result in
    a HTTP 400 for invalid forms, a HTTP 409 if the request conflicts with an
    existing project, or a HTTP 302 redirect to the new project.
    """
    backend_plugins = anitya_plugins.load_plugins(Session)
    plg_names = [plugin.name for plugin in backend_plugins]
    version_plugins = anitya_plugins.load_plugins(Session, family='versions')
    version_plg_names = [plugin.name for plugin in version_plugins]
    form = anitya.forms.ProjectForm(backends=plg_names,
                                    version_schemes=version_plg_names)

    if flask.request.method == 'GET':
        form.name.data = flask.request.args.get('name', '')
        form.homepage.data = flask.request.args.get('homepage', '')
        form.backend.data = flask.request.args.get('backend', '')
        form.version_scheme.data = flask.request.args.get('version_scheme', '')
        form.distro.data = flask.request.args.get('distro', '')
        form.package_name.data = flask.request.args.get('package_name', '')
        return flask.render_template(
            'project_new.html',
            context='Add',
            current='Add projects',
            form=form,
            plugins=backend_plugins,
        )
    elif form.validate_on_submit():
        project = None
        try:
            project = utilities.create_project(
                Session,
                name=form.name.data.strip(),
                homepage=form.homepage.data.strip(),
                backend=form.backend.data.strip(),
                version_scheme=form.version_scheme.data.strip(),
                version_url=form.version_url.data.strip() or None,
                version_prefix=form.version_prefix.data.strip() or None,
                regex=form.regex.data.strip() or None,
                user_id=flask.g.user.username,
                check_release=form.check_release.data,
            )
            Session.commit()

            # Optionally, the user can also map a distro when creating a proj.
            if form.distro.data and form.package_name.data:
                utilities.map_project(
                    Session,
                    project=project,
                    package_name=form.package_name.data,
                    distribution=form.distro.data,
                    user_id=flask.g.user.username,
                )
                Session.commit()

            flask.flash('Project created')
        except exceptions.AnityaException as err:
            flask.flash(str(err))
            return flask.render_template('project_new.html',
                                         context='Add',
                                         current='Add projects',
                                         form=form,
                                         plugins=backend_plugins), 409

        return flask.redirect(
            flask.url_for('anitya_ui.project', project_id=project.id))

    return flask.render_template('project_new.html',
                                 context='Add',
                                 current='Add projects',
                                 form=form,
                                 plugins=backend_plugins), 400