diff --git a/ckan/migration/versions/077_add_revisions_to_system_info.py b/ckan/migration/versions/077_add_revisions_to_system_info.py index 9516a9127c0..daa979164a2 100644 --- a/ckan/migration/versions/077_add_revisions_to_system_info.py +++ b/ckan/migration/versions/077_add_revisions_to_system_info.py @@ -1,6 +1,6 @@ # encoding: utf-8 -import vdm.sqlalchemy +from ckan import model def upgrade(migrate_engine): @@ -21,5 +21,5 @@ def upgrade(migrate_engine): ALTER TABLE system_info_revision DROP CONSTRAINT "system_info_revision_key_key"; - '''.format(state=vdm.sqlalchemy.State.ACTIVE) + '''.format(state=model.State.ACTIVE) ) diff --git a/ckan/model/core.py b/ckan/model/core.py index 4147f9c34c5..97af8cc831f 100644 --- a/ckan/model/core.py +++ b/ckan/model/core.py @@ -8,7 +8,9 @@ from sqlalchemy import Column, DateTime, Text, Boolean -__all__ = ['System', 'Revision', 'State', 'revision_table'] +__all__ = ['System', 'Revision', 'State', 'StatefulObjectMixin', + 'revision_table'] +log = __import__('logging').getLogger(__name__) # VDM-specific tables revision_table = vdm.sqlalchemy.make_revision_table(meta.metadata) @@ -31,8 +33,27 @@ def by_name(cls, name): # VDM-specific domain objects -State = vdm.sqlalchemy.State -State.all = [State.ACTIVE, State.DELETED] +class State(object): + ACTIVE = u'active' + DELETED = u'deleted' + PENDING = u'pending' + + +class StatefulObjectMixin(object): + __stateful__ = True + + def delete(self): + log.debug('Running delete on %s', self) + self.state = State.DELETED + + def undelete(self): + self.state = State.ACTIVE + + def is_active(self): + # also support None in case this object is not yet refreshed ... + return self.state is None or self.state == State.ACTIVE + + Revision = vdm.sqlalchemy.make_Revision(meta.mapper, revision_table) diff --git a/ckan/model/domain_object.py b/ckan/model/domain_object.py index 9761042a553..c7b5ae1cf16 100644 --- a/ckan/model/domain_object.py +++ b/ckan/model/domain_object.py @@ -79,7 +79,7 @@ def remove(self): def delete(self): # stateful objects have this method overridden - see - # vmd.base.StatefulObjectMixin + # core.StatefulObjectMixin self.Session.delete(self) def purge(self): diff --git a/ckan/model/group.py b/ckan/model/group.py index 469d0669329..a27a00e1503 100644 --- a/ckan/model/group.py +++ b/ckan/model/group.py @@ -27,9 +27,11 @@ Column('capacity', types.UnicodeText, nullable=False), Column('group_id', types.UnicodeText, - ForeignKey('group.id')),) + ForeignKey('group.id')), + Column('state', types.UnicodeText, + default=core.State.ACTIVE), + ) -vdm.sqlalchemy.make_table_stateful(member_table) member_revision_table = core.make_revisioned_table(member_table) group_table = Table('group', meta.metadata, @@ -47,14 +49,17 @@ default=datetime.datetime.now), Column('is_organization', types.Boolean, default=False), Column('approval_status', types.UnicodeText, - default=u"approved")) + default=u"approved"), + Column('state', types.UnicodeText, + default=core.State.ACTIVE), + ) + -vdm.sqlalchemy.make_table_stateful(group_table) group_revision_table = core.make_revisioned_table(group_table) class Member(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, + core.StatefulObjectMixin, domain_object.DomainObject): '''A Member object represents any other object being a 'member' of a particular Group. @@ -112,7 +117,7 @@ def __unicode__(self): class Group(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, + core.StatefulObjectMixin, domain_object.DomainObject): def __init__(self, name=u'', title=u'', description=u'', image_url=u'', diff --git a/ckan/model/group_extra.py b/ckan/model/group_extra.py index 331c4c66d08..fd4fb9ba6ea 100644 --- a/ckan/model/group_extra.py +++ b/ckan/model/group_extra.py @@ -1,7 +1,6 @@ # encoding: utf-8 import vdm.sqlalchemy -import vdm.sqlalchemy.stateful from sqlalchemy import orm, types, Column, Table, ForeignKey from six import text_type @@ -19,15 +18,15 @@ Column('group_id', types.UnicodeText, ForeignKey('group.id')), Column('key', types.UnicodeText), Column('value', types.UnicodeText), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(group_extra_table) group_extra_revision_table = core.make_revisioned_table(group_extra_table) class GroupExtra(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, - domain_object.DomainObject): + core.StatefulObjectMixin, + domain_object.DomainObject): pass meta.mapper(GroupExtra, group_extra_table, properties={ diff --git a/ckan/model/package.py b/ckan/model/package.py index e267d712f59..337b33ef460 100644 --- a/ckan/model/package.py +++ b/ckan/model/package.py @@ -52,18 +52,18 @@ Column('metadata_created', types.DateTime, default=datetime.datetime.utcnow), Column('metadata_modified', types.DateTime, default=datetime.datetime.utcnow), Column('private', types.Boolean, default=False), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(package_table) package_revision_table = core.make_revisioned_table(package_table) ## ------------------- ## Mapped classes class Package(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, - domain_object.DomainObject): + core.StatefulObjectMixin, + domain_object.DomainObject): text_search_fields = ['name', 'title'] diff --git a/ckan/model/package_extra.py b/ckan/model/package_extra.py index 55c5188ba2b..9d717779b33 100644 --- a/ckan/model/package_extra.py +++ b/ckan/model/package_extra.py @@ -23,13 +23,14 @@ Column('package_id', types.UnicodeText, ForeignKey('package.id')), Column('key', types.UnicodeText), Column('value', types.UnicodeText), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(package_extra_table) + extra_revision_table= core.make_revisioned_table(package_extra_table) class PackageExtra(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, + core.StatefulObjectMixin, domain_object.DomainObject): def related_packages(self): diff --git a/ckan/model/package_relationship.py b/ckan/model/package_relationship.py index 5aaeea0e60c..fd28b11e0f6 100644 --- a/ckan/model/package_relationship.py +++ b/ckan/model/package_relationship.py @@ -27,13 +27,14 @@ def _(txt): Column('object_package_id', types.UnicodeText, ForeignKey('package.id')), Column('type', types.UnicodeText), Column('comment', types.UnicodeText), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(package_relationship_table) + package_relationship_revision_table = core.make_revisioned_table(package_relationship_table) class PackageRelationship(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, + core.StatefulObjectMixin, domain_object.DomainObject): '''The rule with PackageRelationships is that they are stored in the model always as the "forward" relationship - i.e. "child_of" but never diff --git a/ckan/model/resource.py b/ckan/model/resource.py index effcd135b30..52bdaaf31f0 100644 --- a/ckan/model/resource.py +++ b/ckan/model/resource.py @@ -55,14 +55,15 @@ Column('cache_last_updated', types.DateTime), Column('url_type', types.UnicodeText), Column('extras', _types.JsonDictType), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(resource_table) + resource_revision_table = core.make_revisioned_table(resource_table) class Resource(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, + core.StatefulObjectMixin, domain_object.DomainObject): extra_columns = None diff --git a/ckan/model/system_info.py b/ckan/model/system_info.py index 5ccf852dd16..365e452257b 100644 --- a/ckan/model/system_info.py +++ b/ckan/model/system_info.py @@ -23,14 +23,14 @@ Column('id', types.Integer(), primary_key=True, nullable=False), Column('key', types.Unicode(100), unique=True, nullable=False), Column('value', types.UnicodeText), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(system_info_table) system_info_revision_table = core.make_revisioned_table(system_info_table) class SystemInfo(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, + core.StatefulObjectMixin, domain_object.DomainObject): def __init__(self, key, value): diff --git a/ckan/model/tag.py b/ckan/model/tag.py index c1be31eb2c3..ab240cf0bd4 100644 --- a/ckan/model/tag.py +++ b/ckan/model/tag.py @@ -35,9 +35,9 @@ Column('id', types.UnicodeText, primary_key=True, default=_types.make_uuid), Column('package_id', types.UnicodeText, ForeignKey('package.id')), Column('tag_id', types.UnicodeText, ForeignKey('tag.id')), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(package_tag_table) # TODO: this has a composite primary key ... package_tag_revision_table = core.make_revisioned_table(package_tag_table) @@ -218,8 +218,8 @@ def __repr__(self): return '' % self.name class PackageTag(vdm.sqlalchemy.RevisionedObjectMixin, - vdm.sqlalchemy.StatefulObjectMixin, - domain_object.DomainObject): + core.StatefulObjectMixin, + domain_object.DomainObject): def __init__(self, package=None, tag=None, state=None, **kwargs): self.package = package self.tag = tag diff --git a/ckan/model/user.py b/ckan/model/user.py index fb1b36e61a4..e524355a34f 100644 --- a/ckan/model/user.py +++ b/ckan/model/user.py @@ -11,7 +11,6 @@ from sqlalchemy.orm import synonym from sqlalchemy import types, Column, Table, func from six import text_type -import vdm.sqlalchemy import meta import core @@ -33,12 +32,11 @@ Column('activity_streams_email_notifications', types.Boolean, default=False), Column('sysadmin', types.Boolean, default=False), + Column('state', types.UnicodeText, default=core.State.ACTIVE), ) -vdm.sqlalchemy.make_table_stateful(user_table) - -class User(vdm.sqlalchemy.StatefulObjectMixin, +class User(core.StatefulObjectMixin, domain_object.DomainObject): VALID_NAME = re.compile(r"^[a-zA-Z0-9_\-]{3,255}$")