Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add delete cascade on DB models #608

Merged
merged 1 commit into from
Oct 30, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions anitya/api_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,14 +127,14 @@ def get(self):
distro = args.pop('distribution')
name = args.pop('name')
if distro:
q = q.filter_by(distro=distro)
q = q.filter_by(distro_name=distro)
if name:
q = q.filter_by(package_name=name)
page = q.paginate(order_by=models.Packages.package_name, **args)
return {
u'items': [
{
u'distribution': package.distro,
u'distribution': package.distro_name,
u'name': package.package_name,
u'project': package.project.name,
u'ecosystem': package.project.ecosystem_name,
Expand Down Expand Up @@ -229,7 +229,7 @@ def post(self):

try:
package = models.Packages(
distro=distro.name,
distro_name=distro.name,
project=project,
package_name=args.package_name,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""Add cascade delete

Revision ID: c8735fa14a0a
Revises: 34b9bb5fa388
Create Date: 2018-09-04 13:54:40.031238
"""

from alembic import op


# revision identifiers, used by Alembic.
revision = 'c8735fa14a0a'
down_revision = '34b9bb5fa388'


def upgrade():
''' Rename column `distro` in packages table. '''
op.alter_column(
'packages',
'distro',
new_column_name='distro_name')


def downgrade():
pass
40 changes: 23 additions & 17 deletions anitya/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
try:
# The Python 3.6+ API
from secrets import choice as random_choice
except ImportError:
except ImportError: # pragma: no cover
# Fall back to random with os.urandom
import random
random = random.SystemRandom()
Expand Down Expand Up @@ -230,7 +230,7 @@ class Packages(Base):
__tablename__ = 'packages'

id = sa.Column(sa.Integer, primary_key=True)
distro = sa.Column(
distro_name = sa.Column(
sa.String(200),
sa.ForeignKey(
"distros.name",
Expand All @@ -247,46 +247,52 @@ class Packages(Base):
package_name = sa.Column(sa.String(200))

__table_args__ = (
sa.UniqueConstraint('distro', 'package_name'),
sa.UniqueConstraint('distro_name', 'package_name'),
)

project = sa.orm.relation('Project')
project = sa.orm.relationship(
'Project', backref=sa.orm.backref('package', cascade='all, delete-orphan')
)

distro = sa.orm.relationship(
'Distro', backref=sa.orm.backref('package', cascade='all, delete-orphan')
)

def __repr__(self):
return '<Packages(%s, %s: %s)>' % (
self.project_id, self.distro, self.package_name)
self.project_id, self.distro_name, self.package_name)

def __json__(self):
return dict(
package_name=self.package_name,
distro=self.distro,
distro=self.distro_name,
)

@classmethod
def by_id(cls, session, pkg_id):
return session.query(cls).filter_by(id=pkg_id).first()

@classmethod
def get(cls, session, project_id, distro, package_name):
def get(cls, session, project_id, distro_name, package_name):
query = session.query(
cls
).filter(
cls.project_id == project_id
).filter(
sa.func.lower(cls.distro) == sa.func.lower(distro)
sa.func.lower(cls.distro_name) == sa.func.lower(distro_name)
).filter(
cls.package_name == package_name
)
return query.first()

@classmethod
def by_package_name_distro(cls, session, package_name, distro):
def by_package_name_distro(cls, session, package_name, distro_name):
query = session.query(
cls
).filter(
cls.package_name == package_name
).filter(
sa.func.lower(cls.distro) == sa.func.lower(distro)
sa.func.lower(cls.distro_name) == sa.func.lower(distro_name)
)
return query.first()

Expand Down Expand Up @@ -343,7 +349,7 @@ class Project(Base):
onupdate=sa.func.current_timestamp())
created_on = sa.Column(sa.DateTime, default=datetime.datetime.utcnow)

packages = sa.orm.relation('Packages')
packages = sa.orm.relationship('Packages', cascade='all, delete-orphan')

__table_args__ = (
sa.UniqueConstraint('name', 'homepage'),
Expand Down Expand Up @@ -640,10 +646,6 @@ def search(cls, session, pattern, distro=None, page=None, count=False):
sa.func.lower(Packages.distro) == sa.func.lower(distro)
)

query2 = query2.filter(
sa.func.lower(Packages.distro) == sa.func.lower(distro)
)

query = query1.distinct().union(
query2.distinct()
).order_by(
Expand Down Expand Up @@ -672,7 +674,9 @@ class ProjectVersion(Base):
version = sa.Column(sa.String(50), primary_key=True)
created_on = sa.Column(sa.DateTime, default=datetime.datetime.utcnow)

project = sa.orm.relation('Project', backref='versions_obj')
project = sa.orm.relationship(
'Project', backref=sa.orm.backref('versions_obj', cascade='all, delete-orphan')
)


class ProjectFlag(Base):
Expand All @@ -695,7 +699,9 @@ class ProjectFlag(Base):
updated_on = sa.Column(sa.DateTime, server_default=sa.func.now(),
onupdate=sa.func.current_timestamp())

project = sa.orm.relation('Project', backref='flags')
project = sa.orm.relationship(
'Project', backref=sa.orm.backref('flags', cascade='all, delete-orphan')
)

def __repr__(self):
return '<ProjectFlag(%s, %s, %s)>' % (self.project.name, self.user,
Expand Down
24 changes: 17 additions & 7 deletions anitya/lib/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,15 @@ def map_project(

if not distro_obj:
distro_obj = models.Distro(name=distribution)
session.add(distro_obj)
try:
session.flush()
except SQLAlchemyError:
session.rollback()
raise exceptions.AnityaException(
'Could not add the distribution %s to the database, '
'please inform an admin.' % distribution, 'errors')

log(
session,
distro=distro_obj,
Expand Down Expand Up @@ -404,10 +413,12 @@ def map_project(
# See if the new mapping would clash with an existing mapping
try:
other_pkg = models.Packages.query.filter_by(
distro=distribution, package_name=package_name).one()
distro_name=distribution, package_name=package_name).one()
except NoResultFound:
other_pkg = None
if other_pkg:
# Only raise exception if the package is already associated
# to project
if other_pkg and other_pkg.project:
raise exceptions.AnityaInvalidMappingException(
pkgname, distro, package_name, distribution,
other_pkg.project.id, other_pkg.project.name)
Expand All @@ -417,7 +428,7 @@ def map_project(
topic = 'project.map.new'
if not other_pkg:
pkg = models.Packages(
distro=distro_obj.name,
distro_name=distro_obj.name,
project_id=project.id,
package_name=package_name
)
Expand All @@ -427,8 +438,8 @@ def map_project(
else:
topic = 'project.map.update'
edited = []
if pkg.distro != distro_obj.name:
pkg.distro = distro_obj.name
if pkg.distro_name != distro_obj.name:
pkg.distro_name = distro_obj.name
edited.append('distribution')
if pkg.package_name != package_name:
pkg.package_name = package_name
Expand All @@ -437,9 +448,8 @@ def map_project(
session.add(pkg)
try:
session.flush()
except SQLAlchemyError as err: # pragma: no cover
except SQLAlchemyError as err:
_log.exception(err)
# We cannot test this situation
session.rollback()
raise exceptions.AnityaException(
'Could not add the mapping of %s to %s, please inform an '
Expand Down
4 changes: 2 additions & 2 deletions anitya/templates/project.html
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ <h3 class="panel-title">Mappings</h3>

{% for package in project.packages %}
<tr>
<td>{{ package.distro }}</td>
<td>{{ package.distro_name }}</td>
<td>{{ package.package_name }}</td>
<td>
<a href="{{
Expand All @@ -156,7 +156,7 @@ <h3 class="panel-title">Mappings</h3>
<a href="{{
url_for('anitya_ui.delete_project_mapping',
project_id=project.id,
distro_name=package.distro,
distro_name=package.distro_name,
pkg_name=package.package_name) }}">
<button type="submit" class="btn btn-warning btn-sm pull-right"
tabindex=7>
Expand Down
2 changes: 1 addition & 1 deletion anitya/templates/project_delete.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ <h3 class="panel-title">

{% for package in project.packages %}
<tr>
<td>{{ package.distro }}</td>
<td>{{ package.distro_name }}</td>
<td>{{ package.package_name }}</td>
{% if package.regex %}
<td>
Expand Down
4 changes: 2 additions & 2 deletions anitya/templates/regex_delete.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ <h1>Project: {{ project.name }} - Delete package</h1>
<form method="POST" action="{{
url_for('anitya_ui.delete_project_mapping',
project_id=project.id,
distro_name=package.distro,
distro_name=package.distro_name,
pkg_name=package.package_name) }}" >
{{ form.csrf_token }}
<table id="input_table">
<tr>
<th>Linux distribution</th>
<td>
{{ package.distro }}
{{ package.distro_name }}
</td>
</tr>
<tr>
Expand Down
4 changes: 2 additions & 2 deletions anitya/tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,14 +245,14 @@ def create_package(session):
""" Create some basic packages to work with. """
package = models.Packages(
project_id=1,
distro='Fedora',
distro_name='Fedora',
package_name='geany',
)
session.add(package)

package = models.Packages(
project_id=2,
distro='Fedora',
distro_name='Fedora',
package_name='subsurface',
)
session.add(package)
Expand Down
Loading