Skip to content

Commit

Permalink
PackageExtraRevision not needed any more
Browse files Browse the repository at this point in the history
Also, remove continuity FK for package_extra.
  • Loading branch information
David Read committed Mar 15, 2019
1 parent 1a36dda commit 7778e15
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 25 deletions.
7 changes: 2 additions & 5 deletions ckan/lib/dictization/model_dictize.py
Expand Up @@ -225,11 +225,8 @@ def package_dictize(pkg, context):
assert not 'display_name' in tag
tag['display_name'] = tag['name']

#extras
if is_latest_revision:
extra = model.package_extra_table
else:
extra = model.extra_revision_table
#extras - no longer revisioned, so always provide latest
extra = model.package_extra_table
q = select([extra]).where(extra.c.package_id == pkg.id)
result = execute(q, extra, context)
result_dict["extras"] = extras_list_dictize(result, context)
Expand Down
2 changes: 0 additions & 2 deletions ckan/model/__init__.py
Expand Up @@ -64,9 +64,7 @@
)
from package_extra import (
PackageExtra,
PackageExtraRevision,
package_extra_table,
extra_revision_table,
)
from resource import (
Resource,
Expand Down
10 changes: 6 additions & 4 deletions ckan/model/core.py
Expand Up @@ -2,10 +2,12 @@

import datetime

from sqlalchemy import Column, DateTime, Text, Boolean
import vdm.sqlalchemy

import domain_object
import meta
import vdm.sqlalchemy
from sqlalchemy import Column, DateTime, Text, Boolean
import revision


__all__ = ['System', 'Revision', 'State', 'StatefulObjectMixin',
Expand Down Expand Up @@ -57,8 +59,8 @@ def is_active(self):
Revision = vdm.sqlalchemy.make_Revision(meta.mapper, revision_table)


def make_revisioned_table(table):
revision_table = vdm.sqlalchemy.make_revisioned_table(table)
def make_revisioned_table(table, frozen=False):
revision_table = revision.make_revisioned_table(table, frozen)
revision_table.append_column(Column('expired_id',
Text))
revision_table.append_column(Column('revision_timestamp', DateTime))
Expand Down
7 changes: 3 additions & 4 deletions ckan/model/package.py
Expand Up @@ -371,22 +371,21 @@ def set_license(self, license):
@property
def all_related_revisions(self):
'''Returns chronological list of all object revisions related to
this package. Includes PackageRevisions, PackageTagRevisions,
PackageExtraRevisions and ResourceRevisions.
this package. Includes PackageRevisions, PackageTagRevisions
and ResourceRevisions.
@return List of tuples (revision, [list of object revisions of this
revision])
Ordered by most recent first.
'''
from tag import PackageTag
from resource import Resource
from package_extra import PackageExtra

results = {} # revision:[PackageRevision1, PackageTagRevision1, etc.]
for pkg_rev in self.all_revisions:
if not results.has_key(pkg_rev.revision):
results[pkg_rev.revision] = []
results[pkg_rev.revision].append(pkg_rev)
for class_ in [Resource, PackageExtra, PackageTag]:
for class_ in [Resource, PackageTag]:
rev_class = class_.__revision_class__
obj_revisions = meta.Session.query(rev_class).filter_by(package_id=self.id).all()
for obj_rev in obj_revisions:
Expand Down
13 changes: 5 additions & 8 deletions ckan/model/package_extra.py
Expand Up @@ -15,8 +15,7 @@
import ckan.lib.dictization
import activity

__all__ = ['PackageExtra', 'package_extra_table', 'PackageExtraRevision',
'extra_revision_table']
__all__ = ['PackageExtra', 'package_extra_table']

package_extra_table = Table('package_extra', meta.metadata,
Column('id', types.UnicodeText, primary_key=True, default=_types.make_uuid),
Expand All @@ -27,8 +26,10 @@
Column('state', types.UnicodeText, default=core.State.ACTIVE),
)


extra_revision_table = core.make_revisioned_table(package_extra_table)
# Define the package_extra_revision table, but no need to map it, as it is only
# used by migrate_package_activity.py
extra_revision_table = \
core.make_revisioned_table(package_extra_table, frozen=True)


class PackageExtra(
Expand Down Expand Up @@ -65,10 +66,6 @@ def activity_stream_detail(self, activity_id, activity_type):
extension=[extension.PluginMapperExtension()],
)

# Keep the PackageExtraRevision table for now, but it no longer has .continuity
# foreign key constraint to PackageExtra (modify_base_object_mapper did that)
PackageExtraRevision = vdm.sqlalchemy.create_object_version(meta.mapper, PackageExtra,
extra_revision_table)

def _create_extra(key, value):
return PackageExtra(key=text_type(key), value=value)
Expand Down
44 changes: 44 additions & 0 deletions ckan/model/revision.py
@@ -0,0 +1,44 @@
# encoding: utf-8

from sqlalchemy import Table, Column, UnicodeText, ForeignKey

from vdm.sqlalchemy.sqla import copy_table


# This function is copied from vdm, but with the addition of the 'frozen' param
def make_revisioned_table(base_table, frozen=False):
'''Modify base_table and create correponding revision table.
A 'frozen' revision table is not written to any more - it's just there
as a record. It doesn't have the continuity foreign key relation.
@return revision table.
'''
base_table.append_column(
Column('revision_id', UnicodeText, ForeignKey('revision.id'))
)
newtable = Table(base_table.name + '_revision', base_table.metadata)
copy_table(base_table, newtable)

# create foreign key 'continuity' constraint
# remember base table primary cols have been exactly duplicated onto our
# table
pkcols = []
for col in base_table.c:
if col.primary_key:
pkcols.append(col)
assert len(pkcols) <= 1,\
'Do not support versioning objects with multiple primary keys'
fk_name = base_table.name + '.' + pkcols[0].name
newtable.append_column(
Column('continuity_id', pkcols[0].type,
None if frozen else ForeignKey(fk_name))
)

# TODO: why do we iterate all the way through rather than just using dict
# functionality ...? Surely we always have a revision here ...
for col in newtable.c:
if col.name == 'revision_id':
col.primary_key = True
newtable.primary_key.columns.add(col)
return newtable
3 changes: 1 addition & 2 deletions ckan/tests/logic/action/test_delete.py
Expand Up @@ -452,8 +452,7 @@ def test_purged_dataset_leaves_no_trace_in_the_model(self):
assert_equals(model.Session.query(model.PackageRevision).all(), [])
assert_equals(model.Session.query(model.ResourceRevision).all(), [])
assert_equals(model.Session.query(model.PackageTagRevision).all(), [])
assert_equals(model.Session.query(model.PackageExtraRevision).all(),
[])
# PackageExtraRevision is not revisioned
# Member is not revisioned

# No Revision objects were purged or created
Expand Down

0 comments on commit 7778e15

Please sign in to comment.