Source code for galaxy.model.mapping

"""
Details of how the data model objects are mapped onto the relational database
are encapsulated here.
"""

import logging
import pkg_resources

from sqlalchemy import and_, asc, Boolean, Column, DateTime, desc, ForeignKey, Integer, MetaData, not_, Numeric, select, String, Table, TEXT, Unicode, UniqueConstraint
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.orderinglist import ordering_list
from sqlalchemy.types import BigInteger
from sqlalchemy.orm import backref, object_session, relation, mapper, class_mapper
from sqlalchemy.orm.collections import attribute_mapped_collection

from galaxy import model
from galaxy.model.orm.engine_factory import build_engine
from galaxy.model.orm.now import now
from galaxy.model.custom_types import JSONType, MetadataType, TrimmedString, UUIDType
from galaxy.model.base import ModelMapping
from galaxy.security import GalaxyRBACAgent

log = logging.getLogger( __name__ )

metadata = MetaData()


model.User.table = Table( "galaxy_user", metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "email", TrimmedString( 255 ), index=True, nullable=False ),
    Column( "username", TrimmedString( 255 ), index=True, unique=True ),
    Column( "password", TrimmedString( 255 ), nullable=False ),
    Column( "external", Boolean, default=False ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ),
    Column( "disk_usage", Numeric( 15, 0 ), index=True ) ,
    Column( "active", Boolean, index=True, default=True, nullable=False ),
    Column( "activation_token", TrimmedString( 64 ), nullable=True, index=True ) )


model.UserAddress.table = Table( "user_address", metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "desc", TrimmedString( 255 )),
    Column( "name", TrimmedString( 255 ), nullable=False),
    Column( "institution", TrimmedString( 255 )),
    Column( "address", TrimmedString( 255 ), nullable=False),
    Column( "city", TrimmedString( 255 ), nullable=False),
    Column( "state", TrimmedString( 255 ), nullable=False),
    Column( "postal_code", TrimmedString( 255 ), nullable=False),
    Column( "country", TrimmedString( 255 ), nullable=False),
    Column( "phone", TrimmedString( 255 )),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ) )

model.UserOpenID.table = Table( "galaxy_user_openid", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "session_id", Integer, ForeignKey( "galaxy_session.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "openid", TEXT, index=True, unique=True ),
    Column( "provider", TrimmedString( 255 ) ),
    )

model.PasswordResetToken.table = Table("password_reset_token", metadata,
    Column( "token", String( 32 ), primary_key=True, unique=True, index=True ),
    Column( "expiration_time", DateTime ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ) )

model.History.table = Table( "history", metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "name", TrimmedString( 255 ) ),
    Column( "hid_counter", Integer, default=1 ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ),
    Column( "importing", Boolean, index=True, default=False ),
    Column( "genome_build", TrimmedString( 40 ) ),
    Column( "importable", Boolean, default=False ),
    Column( "slug", TEXT, index=True ),
    Column( "published", Boolean, index=True, default=False ) )

model.HistoryUserShareAssociation.table = Table( "history_user_share_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
    )

model.HistoryDatasetAssociation.table = Table( "history_dataset_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "dataset_id", Integer, ForeignKey( "dataset.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "state", TrimmedString( 64 ), index=True, key="_state" ),
    Column( "copied_from_history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), nullable=True ),
    Column( "copied_from_library_dataset_dataset_association_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), nullable=True ),
    Column( "name", TrimmedString( 255 ) ),
    Column( "info", TrimmedString( 255 ) ),
    Column( "blurb", TrimmedString( 255 ) ),
    Column( "peek" , TEXT ),
    Column( "tool_version" , TEXT ),
    Column( "extension", TrimmedString( 64 ) ),
    Column( "metadata", MetadataType(), key="_metadata" ),
    Column( "parent_id", Integer, ForeignKey( "history_dataset_association.id" ), nullable=True ),
    Column( "designation", TrimmedString( 255 ) ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "visible", Boolean ),
    Column( "extended_metadata_id", Integer, ForeignKey( "extended_metadata.id" ), index=True ),
    # differs from ldda
    Column( "hid", Integer ),
    Column( "purged", Boolean, index=True, default=False ),
    Column( "hidden_beneath_collection_instance_id", ForeignKey( "history_dataset_collection_association.id" ), nullable=True ),
)


model.Dataset.table = Table( "dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "state", TrimmedString( 64 ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ),
    Column( "purgable", Boolean, default=True ),
    Column( "object_store_id", TrimmedString( 255 ), index=True ),
    Column( "external_filename" , TEXT ),
    Column( "_extra_files_path", TEXT ),
    Column( 'file_size', Numeric( 15, 0 ) ),
    Column( 'total_size', Numeric( 15, 0 ) ),
    Column( 'uuid', UUIDType() ) )

# hda read access permission given by a user to a specific site (gen. for external display applications)
model.HistoryDatasetAssociationDisplayAtAuthorization.table = Table( "history_dataset_association_display_at_authorization", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "site", TrimmedString( 255 ) ) )

model.HistoryDatasetAssociationSubset.table = Table( "history_dataset_association_subset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "history_dataset_association_subset_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "location", Unicode(255), index=True) )

model.ImplicitlyConvertedDatasetAssociation.table = Table( "implicitly_converted_dataset_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "hda_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True, nullable=True ),
    Column( "ldda_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True, nullable=True ),
    Column( "hda_parent_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "ldda_parent_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "metadata_safe", Boolean, index=True, default=True ),
    Column( "type", TrimmedString( 255 ) ) )

model.ValidationError.table = Table( "validation_error", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "dataset_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "message", TrimmedString( 255 ) ),
    Column( "err_type", TrimmedString( 64 ) ),
    Column( "attributes", TEXT ) )

model.Group.table = Table( "galaxy_group", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", String( 255 ), index=True, unique=True ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.UserGroupAssociation.table = Table( "user_group_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "group_id", Integer, ForeignKey( "galaxy_group.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ) )

model.UserRoleAssociation.table = Table( "user_role_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ) )

model.GroupRoleAssociation.table = Table( "group_role_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "group_id", Integer, ForeignKey( "galaxy_group.id" ), index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ) )

model.Role.table = Table( "role", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", String( 255 ), index=True, unique=True ),
    Column( "description", TEXT ),
    Column( "type", String( 40 ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.UserQuotaAssociation.table = Table( "user_quota_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "quota_id", Integer, ForeignKey( "quota.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ) )

model.GroupQuotaAssociation.table = Table( "group_quota_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "group_id", Integer, ForeignKey( "galaxy_group.id" ), index=True ),
    Column( "quota_id", Integer, ForeignKey( "quota.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ) )

model.Quota.table = Table( "quota", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", String( 255 ), index=True, unique=True ),
    Column( "description", TEXT ),
    Column( "bytes", BigInteger ),
    Column( "operation", String( 8 ) ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.DefaultQuotaAssociation.table = Table( "default_quota_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "type", String( 32 ), index=True, unique=True ),
    Column( "quota_id", Integer, ForeignKey( "quota.id" ), index=True ) )

model.DatasetPermissions.table = Table( "dataset_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "action", TEXT ),
    Column( "dataset_id", Integer, ForeignKey( "dataset.id" ), index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.LibraryPermissions.table = Table( "library_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "action", TEXT ),
    Column( "library_id", Integer, ForeignKey( "library.id" ), nullable=True, index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.LibraryFolderPermissions.table = Table( "library_folder_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "action", TEXT ),
    Column( "library_folder_id", Integer, ForeignKey( "library_folder.id" ), nullable=True, index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.LibraryDatasetPermissions.table = Table( "library_dataset_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "action", TEXT ),
    Column( "library_dataset_id", Integer, ForeignKey( "library_dataset.id" ), nullable=True, index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.LibraryDatasetDatasetAssociationPermissions.table = Table( "library_dataset_dataset_association_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "action", TEXT ),
    Column( "library_dataset_dataset_association_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), nullable=True, index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.DefaultUserPermissions.table = Table( "default_user_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "action", TEXT ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.DefaultHistoryPermissions.table = Table( "default_history_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "action", TEXT ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.LibraryDataset.table = Table( "library_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_dataset_dataset_association_id", Integer, ForeignKey( "library_dataset_dataset_association.id", use_alter=True, name="library_dataset_dataset_association_id_fk" ), nullable=True, index=True ),#current version of dataset, if null, there is not a current version selected
    Column( "folder_id", Integer, ForeignKey( "library_folder.id" ), index=True ),
    Column( "order_id", Integer ), #not currently being used, but for possible future use
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), key="_name", index=True ), #when not None/null this will supercede display in library (but not when imported into user's history?)
    Column( "info", TrimmedString( 255 ),  key="_info" ), #when not None/null this will supercede display in library (but not when imported into user's history?)
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ) )

model.LibraryDatasetDatasetAssociation.table = Table( "library_dataset_dataset_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_dataset_id", Integer, ForeignKey( "library_dataset.id" ), index=True ),
    Column( "dataset_id", Integer, ForeignKey( "dataset.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "state", TrimmedString( 64 ), index=True, key="_state" ),
    Column( "copied_from_history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id", use_alter=True, name='history_dataset_association_dataset_id_fkey' ), nullable=True ),
    Column( "copied_from_library_dataset_dataset_association_id", Integer, ForeignKey( "library_dataset_dataset_association.id", use_alter=True, name='library_dataset_dataset_association_id_fkey' ), nullable=True ),
    Column( "name", TrimmedString( 255 ), index=True ),
    Column( "info", TrimmedString( 255 ) ),
    Column( "blurb", TrimmedString( 255 ) ),
    Column( "peek" , TEXT ),
    Column( "tool_version" , TEXT ),
    Column( "extension", TrimmedString( 64 ) ),
    Column( "metadata", MetadataType(), key="_metadata" ),
    Column( "parent_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), nullable=True ),
    Column( "designation", TrimmedString( 255 ) ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "visible", Boolean ),
    Column( "extended_metadata_id", Integer, ForeignKey( "extended_metadata.id" ), index=True ),
    # differs from hda
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "message", TrimmedString( 255 ) ),
)


model.ExtendedMetadata.table = Table("extended_metadata", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "data", JSONType ) )

model.ExtendedMetadataIndex.table = Table("extended_metadata_index", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "extended_metadata_id", Integer, ForeignKey("extended_metadata.id",
                                                        onupdate="CASCADE",
                                                        ondelete="CASCADE" ),
                                             index=True ),
    Column( "path", String( 255 )),
    Column( "value", TEXT))

model.Library.table = Table( "library", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "root_folder_id", Integer, ForeignKey( "library_folder.id" ), index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", String( 255 ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ),
    Column( "description", TEXT ),
    Column( "synopsis", TEXT ) )

model.LibraryFolder.table = Table( "library_folder", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "parent_id", Integer, ForeignKey( "library_folder.id" ), nullable = True, index=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TEXT, index=True ),
    Column( "description", TEXT ),
    Column( "order_id", Integer ), #not currently being used, but for possible future use
    Column( "item_count", Integer ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ),
    Column( "genome_build", TrimmedString( 40 ) ) )

model.LibraryInfoAssociation.table = Table( 'library_info_association', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_id", Integer, ForeignKey( "library.id" ), index=True ),
    Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "inheritable", Boolean, index=True, default=False ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.LibraryFolderInfoAssociation.table = Table( 'library_folder_info_association', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_folder_id", Integer, ForeignKey( "library_folder.id" ), nullable=True, index=True ),
    Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "inheritable", Boolean, index=True, default=False ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.LibraryDatasetDatasetInfoAssociation.table = Table( 'library_dataset_dataset_info_association', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_dataset_dataset_association_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), nullable=True, index=True ),
    Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.Job.table = Table( "job", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "library_folder_id", Integer, ForeignKey( "library_folder.id" ), index=True ),
    Column( "tool_id", String( 255 ) ),
    Column( "tool_version", TEXT, default="1.0.0" ),
    Column( "state", String( 64 ), index=True ),
    Column( "info", TrimmedString( 255 ) ),
    Column( "command_line", TEXT ),
    Column( "param_filename", String( 1024 ) ),
    Column( "runner_name", String( 255 ) ),
    Column( "stdout", TEXT ),
    Column( "stderr", TEXT ),
    Column( "exit_code", Integer, nullable=True ),
    Column( "traceback", TEXT ),
    Column( "session_id", Integer, ForeignKey( "galaxy_session.id" ), index=True, nullable=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True, nullable=True ),
    Column( "job_runner_name", String( 255 ) ),
    Column( "job_runner_external_id", String( 255 ) ),
    Column( "destination_id", String( 255 ), nullable=True ),
    Column( "destination_params", JSONType, nullable=True ),
    Column( "object_store_id", TrimmedString( 255 ), index=True ),
    Column( "imported", Boolean, default=False, index=True ),
    Column( "params", TrimmedString(255), index=True ),
    Column( "handler", TrimmedString( 255 ), index=True ) )

model.JobStateHistory.table = Table( "job_state_history", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "state", String( 64 ), index=True ),
    Column( "info", TrimmedString( 255 ) ) )

model.JobParameter.table = Table( "job_parameter", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "name", String(255) ),
    Column( "value", TEXT ) )

model.JobToInputDatasetAssociation.table = Table( "job_to_input_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "dataset_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "name", String(255) ) )

model.JobToOutputDatasetAssociation.table = Table( "job_to_output_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "dataset_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "name", String(255) ) )

model.JobToInputDatasetCollectionAssociation.table = Table( "job_to_input_dataset_collection", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "name", Unicode(255) ) )

model.JobToImplicitOutputDatasetCollectionAssociation.table = Table( "job_to_implicit_output_dataset_collection", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "dataset_collection_id", Integer, ForeignKey( "dataset_collection.id" ), index=True ),
    Column( "name", Unicode(255) ) )

model.JobToOutputDatasetCollectionAssociation.table = Table( "job_to_output_dataset_collection", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "name", Unicode(255) ) )

model.JobToInputLibraryDatasetAssociation.table = Table( "job_to_input_library_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "ldda_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True ),
    Column( "name", String(255) ) )

model.JobToOutputLibraryDatasetAssociation.table = Table( "job_to_output_library_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "ldda_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True ),
    Column( "name", String(255) ) )

model.ImplicitlyCreatedDatasetCollectionInput.table = Table( "implicitly_created_dataset_collection_inputs", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "input_dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "name", Unicode(255) ) )

model.JobExternalOutputMetadata.table = Table( "job_external_output_metadata", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True, nullable=True ),
    Column( "library_dataset_dataset_association_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True, nullable=True ),
    Column( "is_valid", Boolean, default=True ),
    Column( "filename_in", String( 255 ) ),
    Column( "filename_out", String( 255 ) ),
    Column( "filename_results_code", String( 255 ) ),
    Column( "filename_kwds", String( 255 ) ),
    Column( "filename_override_metadata", String( 255 ) ),
    Column( "job_runner_external_pid", String( 255 ) ) )

model.JobExportHistoryArchive.table = Table( "job_export_history_archive", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "dataset_id", Integer, ForeignKey( "dataset.id" ), index=True ),
    Column( "compressed", Boolean, index=True, default=False ),
    Column( "history_attrs_filename", TEXT ),
    Column( "datasets_attrs_filename", TEXT ),
    Column( "jobs_attrs_filename", TEXT )
    )

model.JobImportHistoryArchive.table = Table( "job_import_history_archive", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "archive_dir", TEXT )
    )


JOB_METRIC_MAX_LENGTH = 1023

model.JobMetricText.table = Table(
    "job_metric_text",
    metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "plugin", Unicode(255), ),
    Column( "metric_name", Unicode(255), ),
    Column( "metric_value", Unicode(JOB_METRIC_MAX_LENGTH), ),
)

model.TaskMetricText.table = Table(
    "task_metric_text",
    metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "task_id", Integer, ForeignKey( "task.id" ), index=True ),
    Column( "plugin", Unicode(255), ),
    Column( "metric_name", Unicode(255), ),
    Column( "metric_value", Unicode(JOB_METRIC_MAX_LENGTH), ),
)


model.JobMetricNumeric.table = Table(
    "job_metric_numeric",
    metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "plugin", Unicode(255), ),
    Column( "metric_name", Unicode(255), ),
    Column( "metric_value", Numeric( 22, 7 ), ),
)


model.TaskMetricNumeric.table = Table(
    "task_metric_numeric",
    metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "task_id", Integer, ForeignKey( "task.id" ), index=True ),
    Column( "plugin", Unicode(255), ),
    Column( "metric_name", Unicode(255), ),
    Column( "metric_value", Numeric( 22, 7 ), ),
)


model.GenomeIndexToolData.table = Table( "genome_index_tool_data", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "deferred_job_id", Integer, ForeignKey( "deferred_job.id" ), index=True ),
    Column( "transfer_job_id", Integer, ForeignKey( "transfer_job.id" ), index=True ),
    Column( "dataset_id", Integer, ForeignKey( "dataset.id" ), index=True ),
    Column( "fasta_path", String( 255 ) ),
    Column( "created_time", DateTime, default=now ),
    Column( "modified_time", DateTime, default=now, onupdate=now ),
    Column( "indexer", String( 64 ) ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    )

model.Task.table = Table( "task", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "execution_time", DateTime ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "state", String( 64 ), index=True ),
    Column( "command_line", TEXT ),
    Column( "param_filename", String( 1024 ) ),
    Column( "runner_name", String( 255 ) ),
    Column( "stdout", TEXT ),
    Column( "stderr", TEXT ),
    Column( "exit_code", Integer, nullable=True ),
    Column( "info", TrimmedString ( 255 ) ),
    Column( "traceback", TEXT ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True, nullable=False ),
    Column( "working_directory", String(1024)),
    Column( "task_runner_name", String( 255 ) ),
    Column( "task_runner_external_id", String( 255 ) ),
    Column( "prepare_input_files_cmd", TEXT ) )

model.PostJobAction.table = Table("post_job_action", metadata,
    Column("id", Integer, primary_key=True),
    Column("workflow_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True, nullable=False),
    Column("action_type", String(255), nullable=False),
    Column("output_name", String(255), nullable=True),
    Column("action_arguments", JSONType, nullable=True))

model.PostJobActionAssociation.table = Table("post_job_action_association", metadata,
    Column("id", Integer, primary_key=True),
    Column("job_id", Integer, ForeignKey( "job.id" ), index=True, nullable=False),
    Column("post_job_action_id", Integer, ForeignKey( "post_job_action.id" ), index=True, nullable=False))

model.DeferredJob.table = Table( "deferred_job", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "state", String( 64 ), index=True ),
    Column( "plugin", String( 128 ), index=True ),
    Column( "params", JSONType ) )

model.TransferJob.table = Table( "transfer_job", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "state", String( 64 ), index=True ),
    Column( "path", String( 1024 ) ),
    Column( "info", TEXT ),
    Column( "pid", Integer ),
    Column( "socket", Integer ),
    Column( "params", JSONType ) )

model.DatasetCollection.table = Table( "dataset_collection", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "collection_type", Unicode(255), nullable=False ),
    Column( "populated_state", TrimmedString( 64 ), default='ok', nullable=False ),
    Column( "populated_state_message", TEXT ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
)

model.HistoryDatasetCollectionAssociation.table = Table( "history_dataset_collection_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "collection_id", Integer, ForeignKey( "dataset_collection.id" ), index=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "name", TrimmedString( 255 ) ),
    Column( "hid", Integer ),
    Column( "visible", Boolean ),
    Column( "deleted", Boolean, default=False ),
    Column( "copied_from_history_dataset_collection_association_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), nullable=True ),
    Column( "implicit_output_name", Unicode(255), nullable=True ),
)

model.LibraryDatasetCollectionAssociation.table = Table( "library_dataset_collection_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "collection_id", Integer, ForeignKey( "dataset_collection.id" ), index=True ),
    Column( "folder_id", Integer, ForeignKey( "library_folder.id" ), index=True ),
    Column( "name", TrimmedString( 255 ) ),
    Column( "deleted", Boolean, default=False ),
)

model.DatasetCollectionElement.table = Table( "dataset_collection_element", metadata,
    Column( "id", Integer, primary_key=True ),
    # Parent collection id describing what collection this element belongs to.
    Column( "dataset_collection_id", Integer, ForeignKey( "dataset_collection.id" ), index=True, nullable=False ),
    # Child defined by this association - HDA, LDDA, or another dataset association...
    Column( "hda_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True, nullable=True ),
    Column( "ldda_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True, nullable=True ),
    Column( "child_collection_id", Integer, ForeignKey( "dataset_collection.id" ), index=True, nullable=True ),
    # Element index and identifier to define this parent-child relationship.
    Column( "element_index", Integer ),
    Column( "element_identifier", Unicode(255), ),
)

model.Event.table = Table( "event", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True, nullable=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True, nullable=True ),
    Column( "message", TrimmedString( 1024 ) ),
    Column( "session_id", Integer, ForeignKey( "galaxy_session.id" ), index=True, nullable=True ),
    Column( "tool_id", String( 255 ) ) )

model.GalaxySession.table = Table( "galaxy_session", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True, nullable=True ),
    Column( "remote_host", String( 255 ) ),
    Column( "remote_addr", String( 255 ) ),
    Column( "referer", TEXT ),
    Column( "current_history_id", Integer, ForeignKey( "history.id" ), nullable=True ),
    Column( "session_key", TrimmedString( 255 ), index=True, unique=True ), # unique 128 bit random number coerced to a string
    Column( "is_valid", Boolean, default=False ),
    Column( "prev_session_id", Integer ), # saves a reference to the previous session so we have a way to chain them together
    Column( "disk_usage", Numeric( 15, 0 ), index=True ),
    Column( "last_action", DateTime) )

model.GalaxySessionToHistoryAssociation.table = Table( "galaxy_session_to_history", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "session_id", Integer, ForeignKey( "galaxy_session.id" ), index=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ) )

model.StoredWorkflow.table = Table( "stored_workflow", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True, nullable=False ),
    Column( "latest_workflow_id", Integer,
            ForeignKey( "workflow.id", use_alter=True, name='stored_workflow_latest_workflow_id_fk' ), index=True ),
    Column( "name", TEXT ),
    Column( "deleted", Boolean, default=False ),
    Column( "importable", Boolean, default=False ),
    Column( "slug", TEXT, index=True ),
    Column( "published", Boolean, index=True, default=False )
    )

model.Workflow.table = Table( "workflow", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True, nullable=False ),
    Column( "name", TEXT ),
    Column( "has_cycles", Boolean ),
    Column( "has_errors", Boolean ),
    Column( "uuid", UUIDType, nullable=True )
    )

model.WorkflowStep.table = Table( "workflow_step", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "workflow_id", Integer, ForeignKey( "workflow.id" ), index=True, nullable=False ),
    Column( "type", String(64) ),
    Column( "tool_id", TEXT ),
    Column( "tool_version", TEXT ), # Reserved for future
    Column( "tool_inputs", JSONType ),
    Column( "tool_errors", JSONType ),
    Column( "position", JSONType ),
    Column( "config", JSONType ),
    Column( "order_index", Integer ),
    Column( "uuid", UUIDType ),
    Column( "label", Unicode(255) ),
    ## Column( "input_connections", JSONType )
    )


model.WorkflowRequestStepState.table = Table(
    "workflow_request_step_states", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "workflow_invocation_id", Integer, ForeignKey("workflow_invocation.id", onupdate="CASCADE", ondelete="CASCADE" )),
    Column( "workflow_step_id", Integer, ForeignKey("workflow_step.id" )),
    Column( "value", JSONType ),
)


model.WorkflowRequestInputParameter.table = Table(
    "workflow_request_input_parameters", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "workflow_invocation_id", Integer, ForeignKey("workflow_invocation.id", onupdate="CASCADE", ondelete="CASCADE" )),
    Column( "name", Unicode(255) ),
    Column( "value", TEXT ),
    Column( "type", Unicode(255) ),
)


model.WorkflowRequestToInputDatasetAssociation.table = Table(
    "workflow_request_to_input_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "name", String(255) ),
    Column( "workflow_invocation_id", Integer, ForeignKey( "workflow_invocation.id" ), index=True ),
    Column( "workflow_step_id", Integer, ForeignKey("workflow_step.id") ),
    Column( "dataset_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
)


model.WorkflowRequestToInputDatasetCollectionAssociation.table = Table(
    "workflow_request_to_input_collection_dataset", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "name", String(255) ),
    Column( "workflow_invocation_id", Integer, ForeignKey( "workflow_invocation.id" ), index=True ),
    Column( "workflow_step_id", Integer, ForeignKey("workflow_step.id") ),
    Column( "dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
)


model.WorkflowStepConnection.table = Table( "workflow_step_connection", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "output_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True ),
    Column( "input_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True ),
    Column( "output_name", TEXT ),
    Column( "input_name", TEXT)
    )

model.WorkflowOutput.table = Table( "workflow_output", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "workflow_step_id", Integer, ForeignKey("workflow_step.id"), index=True, nullable=False),
    Column( "output_name", String(255), nullable=True)
    )

model.WorkflowInvocation.table = Table( "workflow_invocation", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "workflow_id", Integer, ForeignKey( "workflow.id" ), index=True, nullable=False ),
    Column( "state", TrimmedString( 64 ), index=True ),
    Column( "scheduler", TrimmedString( 255 ), index=True ),
    Column( "handler", TrimmedString( 255 ), index=True ),
    Column( 'uuid', UUIDType() ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
)

model.WorkflowInvocationStep.table = Table( "workflow_invocation_step", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "workflow_invocation_id", Integer, ForeignKey( "workflow_invocation.id" ), index=True, nullable=False ),
    Column( "workflow_step_id",  Integer, ForeignKey( "workflow_step.id" ), index=True, nullable=False ),
    Column( "job_id",  Integer, ForeignKey( "job.id" ), index=True, nullable=True ),
    Column( "action", JSONType, nullable=True ),
)

model.StoredWorkflowUserShareAssociation.table = Table( "stored_workflow_user_share_connection", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
    )

model.StoredWorkflowMenuEntry.table = Table( "stored_workflow_menu_entry", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "order_index", Integer ) )

model.MetadataFile.table = Table( "metadata_file", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "name", TEXT ),
    Column( "hda_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True, nullable=True ),
    Column( "lda_id", Integer, ForeignKey( "library_dataset_dataset_association.id" ), index=True, nullable=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "object_store_id", TrimmedString( 255 ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "purged", Boolean, index=True, default=False ) )

model.FormDefinitionCurrent.table = Table('form_definition_current', metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "latest_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ))

model.FormDefinition.table = Table('form_definition', metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "desc", TEXT ),
    Column( "form_definition_current_id",
            Integer,
            ForeignKey( "form_definition_current.id", name='for_def_form_def_current_id_fk', use_alter=True ),
            index=True ),
    Column( "fields", JSONType() ),
    Column( "type", TrimmedString( 255 ), index=True ),
    Column( "layout", JSONType() ), )

model.ExternalService.table = Table( 'external_service', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "description", TEXT ),
    Column( "external_service_type_id", TrimmedString( 255 ), nullable=False ),
    Column( "version", TrimmedString( 255 ) ),
    Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.RequestType.table = Table('request_type', metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "desc", TEXT ),
    Column( "request_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "sample_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.RequestTypeExternalServiceAssociation.table = Table( "request_type_external_service_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ),
    Column( "external_service_id", Integer, ForeignKey( "external_service.id" ), index=True ) )

model.RequestTypePermissions.table = Table( "request_type_permissions", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "action", TEXT ),
    Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), nullable=True, index=True ),
    Column( "role_id", Integer, ForeignKey( "role.id" ), index=True ) )

model.FormValues.table = Table('form_values', metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "content", JSONType()) )

model.Request.table = Table('request', metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "desc", TEXT ),
    Column( "notification", JSONType() ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ) )

model.RequestEvent.table = Table('request_event', metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "request_id", Integer, ForeignKey( "request.id" ), index=True ),
    Column( "state", TrimmedString( 255 ),  index=True ),
    Column( "comment", TEXT ) )

model.Sample.table = Table('sample', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "desc", TEXT ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "request_id", Integer, ForeignKey( "request.id" ), index=True ),
    Column( "bar_code", TrimmedString( 255 ), index=True ),
    Column( "library_id", Integer, ForeignKey( "library.id" ), index=True ),
    Column( "folder_id", Integer, ForeignKey( "library_folder.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "workflow", JSONType, nullable=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), nullable=True) )

model.SampleState.table = Table('sample_state', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "desc", TEXT ),
    Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ) )

model.SampleEvent.table = Table('sample_event', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "sample_id", Integer, ForeignKey( "sample.id" ), index=True ),
    Column( "sample_state_id", Integer, ForeignKey( "sample_state.id" ), index=True ),
    Column( "comment", TEXT ) )

model.SampleDataset.table = Table('sample_dataset', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "sample_id", Integer, ForeignKey( "sample.id" ), index=True ),
    Column( "name", TrimmedString( 255 ), nullable=False ),
    Column( "file_path", TEXT ),
    Column( "status", TrimmedString( 255 ), nullable=False ),
    Column( "error_msg", TEXT ),
    Column( "size", TrimmedString( 255 ) ),
    Column( "external_service_id", Integer, ForeignKey( "external_service.id" ), index=True ) )

model.Run.table = Table( 'run', metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
    Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "subindex", TrimmedString( 255 ), index=True ) )

model.RequestTypeRunAssociation.table = Table( "request_type_run_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True, nullable=False ),
    Column( "run_id", Integer, ForeignKey( "run.id" ), index=True, nullable=False ) )

model.SampleRunAssociation.table = Table( "sample_run_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "sample_id", Integer, ForeignKey( "sample.id" ), index=True, nullable=False ),
    Column( "run_id", Integer, ForeignKey( "run.id" ), index=True, nullable=False ) )

model.Page.table = Table( "page", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True, nullable=False ),
    Column( "latest_revision_id", Integer,
            ForeignKey( "page_revision.id", use_alter=True, name='page_latest_revision_id_fk' ), index=True ),
    Column( "title", TEXT ),
    Column( "deleted", Boolean, index=True, default=False ),
    Column( "importable", Boolean, index=True, default=False ),
    Column( "slug", TEXT, unique=True, index=True ),
    Column( "published", Boolean, index=True, default=False ),
    )

model.PageRevision.table = Table( "page_revision", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "page_id", Integer, ForeignKey( "page.id" ), index=True, nullable=False ),
    Column( "title", TEXT ),
    Column( "content", TEXT )
    )

model.PageUserShareAssociation.table = Table( "page_user_share_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "page_id", Integer, ForeignKey( "page.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
    )

model.Visualization.table = Table( "visualization", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True, nullable=False ),
    Column( "latest_revision_id", Integer,
            ForeignKey( "visualization_revision.id", use_alter=True, name='visualization_latest_revision_id_fk' ), index=True ),
    Column( "title", TEXT ),
    Column( "type", TEXT ),
    Column( "dbkey", TEXT, index=True ),
    Column( "deleted", Boolean, default=False, index=True ),
    Column( "importable", Boolean, default=False, index=True ),
    Column( "slug", TEXT, index=True ),
    Column( "published", Boolean, default=False, index=True )
    )

model.VisualizationRevision.table = Table( "visualization_revision", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, default=now, onupdate=now ),
    Column( "visualization_id", Integer, ForeignKey( "visualization.id" ), index=True, nullable=False ),
    Column( "title", TEXT ),
    Column( "dbkey", TEXT, index=True ),
    Column( "config", JSONType )
    )

model.VisualizationUserShareAssociation.table = Table( "visualization_user_share_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "visualization_id", Integer, ForeignKey( "visualization.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
    )

#Data Manager tables
model.DataManagerHistoryAssociation.table = Table( "data_manager_history_association", metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
    )

model.DataManagerJobAssociation.table = Table( "data_manager_job_association", metadata,
    Column( "id", Integer, primary_key=True),
    Column( "create_time", DateTime, default=now ),
    Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
    Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
    Column( "data_manager_id", TEXT, index=True )
    )

# Tagging tables.

model.Tag.table = Table( "tag", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "type", Integer ),
    Column( "parent_id", Integer, ForeignKey( "tag.id" ) ),
    Column( "name", TrimmedString(255) ),
    UniqueConstraint( "name" ) )

model.HistoryTagAssociation.table = Table( "history_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.DatasetTagAssociation.table = Table( "dataset_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "dataset_id", Integer, ForeignKey( "dataset.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.HistoryDatasetAssociationTagAssociation.table = Table( "history_dataset_association_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.StoredWorkflowTagAssociation.table = Table( "stored_workflow_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", Unicode(255), index=True),
    Column( "value", Unicode(255), index=True),
    Column( "user_value", Unicode(255), index=True) )

model.PageTagAssociation.table = Table( "page_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "page_id", Integer, ForeignKey( "page.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.WorkflowStepTagAssociation.table = Table( "workflow_step_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "workflow_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", Unicode(255), index=True),
    Column( "value", Unicode(255), index=True),
    Column( "user_value", Unicode(255), index=True) )

model.VisualizationTagAssociation.table = Table( "visualization_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "visualization_id", Integer, ForeignKey( "visualization.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.HistoryDatasetCollectionTagAssociation.table = Table( "history_dataset_collection_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.LibraryDatasetCollectionTagAssociation.table = Table( "library_dataset_collection_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_dataset_collection_id", Integer, ForeignKey( "library_dataset_collection_association.id" ), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

model.ToolTagAssociation.table = Table( "tool_tag_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "tool_id", TrimmedString(255), index=True ),
    Column( "tag_id", Integer, ForeignKey( "tag.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "user_tname", TrimmedString(255), index=True),
    Column( "value", TrimmedString(255), index=True),
    Column( "user_value", TrimmedString(255), index=True) )

# Annotation tables.

model.HistoryAnnotationAssociation.table = Table( "history_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.HistoryDatasetAssociationAnnotationAssociation.table = Table( "history_dataset_association_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.StoredWorkflowAnnotationAssociation.table = Table( "stored_workflow_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.WorkflowStepAnnotationAssociation.table = Table( "workflow_step_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "workflow_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.PageAnnotationAssociation.table = Table( "page_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "page_id", Integer, ForeignKey( "page.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.VisualizationAnnotationAssociation.table = Table( "visualization_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "visualization_id", Integer, ForeignKey( "visualization.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.HistoryDatasetCollectionAnnotationAssociation.table = Table( "history_dataset_collection_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

model.LibraryDatasetCollectionAnnotationAssociation.table = Table( "library_dataset_collection_annotation_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_dataset_collection_id", Integer, ForeignKey( "library_dataset_collection_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "annotation", TEXT, index=True) )

# Ratings tables.
model.HistoryRatingAssociation.table = Table( "history_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

model.HistoryDatasetAssociationRatingAssociation.table = Table( "history_dataset_association_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

model.StoredWorkflowRatingAssociation.table = Table( "stored_workflow_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

model.PageRatingAssociation.table = Table( "page_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "page_id", Integer, ForeignKey( "page.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

model.VisualizationRatingAssociation.table = Table( "visualization_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "visualization_id", Integer, ForeignKey( "visualization.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

model.HistoryDatasetCollectionRatingAssociation.table = Table( "history_dataset_collection_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "history_dataset_collection_id", Integer, ForeignKey( "history_dataset_collection_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

model.LibraryDatasetCollectionRatingAssociation.table = Table( "library_dataset_collection_rating_association", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "library_dataset_collection_id", Integer, ForeignKey( "library_dataset_collection_association.id" ), index=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "rating", Integer, index=True) )

# User tables.

model.UserPreference.table = Table( "user_preference", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "name", Unicode( 255 ), index=True),
    Column( "value", Unicode( 1024 ) ) )

model.UserAction.table = Table( "user_action", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "session_id", Integer, ForeignKey( "galaxy_session.id" ), index=True ),
    Column( "action", Unicode( 255 ) ),
    Column( "context", Unicode( 512 ) ),
    Column( "params", Unicode( 1024 ) ) )

model.APIKeys.table = Table( "api_keys", metadata,
    Column( "id", Integer, primary_key=True ),
    Column( "create_time", DateTime, default=now ),
    Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
    Column( "key", TrimmedString( 32 ), index=True, unique=True ) )


# With the tables defined we can define the mappers and setup the
# relationships between the model objects.
[docs]def simple_mapping( model, **kwds ): mapper( model, model.table, properties=kwds )
mapper( model.Sample, model.Sample.table, properties=dict( events=relation( model.SampleEvent, backref="sample", order_by=desc( model.SampleEvent.table.c.update_time ) ), datasets=relation( model.SampleDataset, backref="sample", order_by=desc( model.SampleDataset.table.c.update_time ) ), values=relation( model.FormValues, primaryjoin=( model.Sample.table.c.form_values_id == model.FormValues.table.c.id ) ), request=relation( model.Request, primaryjoin=( model.Sample.table.c.request_id == model.Request.table.c.id ) ), folder=relation( model.LibraryFolder, primaryjoin=( model.Sample.table.c.folder_id == model.LibraryFolder.table.c.id ) ), library=relation( model.Library, primaryjoin=( model.Sample.table.c.library_id == model.Library.table.c.id ) ), history=relation( model.History, primaryjoin=( model.Sample.table.c.history_id == model.History.table.c.id ) ), ) ) mapper( model.FormValues, model.FormValues.table, properties=dict( form_definition=relation( model.FormDefinition, primaryjoin=( model.FormValues.table.c.form_definition_id == model.FormDefinition.table.c.id ) ) ) ) mapper( model.Request, model.Request.table, properties=dict( values=relation( model.FormValues, primaryjoin=( model.Request.table.c.form_values_id == model.FormValues.table.c.id ) ), type=relation( model.RequestType, primaryjoin=( model.Request.table.c.request_type_id == model.RequestType.table.c.id ) ), user=relation( model.User, primaryjoin=( model.Request.table.c.user_id == model.User.table.c.id ), backref="requests" ), samples=relation( model.Sample, primaryjoin=( model.Request.table.c.id == model.Sample.table.c.request_id ), order_by=asc( model.Sample.table.c.id ) ), events=relation( model.RequestEvent, backref="request", order_by=desc( model.RequestEvent.table.c.update_time ) ) ) ) mapper( model.RequestEvent, model.RequestEvent.table, properties=None ) mapper( model.ExternalService, model.ExternalService.table, properties=dict( form_definition=relation( model.FormDefinition, primaryjoin=( model.ExternalService.table.c.form_definition_id == model.FormDefinition.table.c.id ) ), form_values=relation( model.FormValues, primaryjoin=( model.ExternalService.table.c.form_values_id == model.FormValues.table.c.id ) ) ) ) mapper( model.RequestType, model.RequestType.table, properties=dict( states=relation( model.SampleState, backref="request_type", primaryjoin=( model.RequestType.table.c.id == model.SampleState.table.c.request_type_id ), order_by=asc( model.SampleState.table.c.update_time ) ), request_form=relation( model.FormDefinition, primaryjoin=( model.RequestType.table.c.request_form_id == model.FormDefinition.table.c.id ) ), sample_form=relation( model.FormDefinition, primaryjoin=( model.RequestType.table.c.sample_form_id == model.FormDefinition.table.c.id ) ), ) ) mapper( model.RequestTypeExternalServiceAssociation, model.RequestTypeExternalServiceAssociation.table, properties=dict( request_type=relation( model.RequestType, primaryjoin=( ( model.RequestTypeExternalServiceAssociation.table.c.request_type_id == model.RequestType.table.c.id ) ), backref="external_service_associations" ), external_service=relation( model.ExternalService, primaryjoin=( model.RequestTypeExternalServiceAssociation.table.c.external_service_id == model.ExternalService.table.c.id ) ) ) ) mapper( model.RequestTypePermissions, model.RequestTypePermissions.table, properties=dict( request_type=relation( model.RequestType, backref="actions" ), role=relation( model.Role, backref="request_type_actions" ) ) ) mapper( model.FormDefinition, model.FormDefinition.table, properties=dict( current=relation( model.FormDefinitionCurrent, primaryjoin=( model.FormDefinition.table.c.form_definition_current_id == model.FormDefinitionCurrent.table.c.id ) ) ) ) mapper( model.FormDefinitionCurrent, model.FormDefinitionCurrent.table, properties=dict( forms=relation( model.FormDefinition, backref='form_definition_current', cascade="all, delete-orphan", primaryjoin=( model.FormDefinitionCurrent.table.c.id == model.FormDefinition.table.c.form_definition_current_id ) ), latest_form=relation( model.FormDefinition, post_update=True, primaryjoin=( model.FormDefinitionCurrent.table.c.latest_form_id == model.FormDefinition.table.c.id ) ) ) ) mapper( model.SampleEvent, model.SampleEvent.table, properties=dict( state=relation( model.SampleState, primaryjoin=( model.SampleEvent.table.c.sample_state_id == model.SampleState.table.c.id ) ), ) ) mapper( model.SampleState, model.SampleState.table, properties=None ) mapper( model.SampleDataset, model.SampleDataset.table, properties=dict( external_service=relation( model.ExternalService, primaryjoin=( model.SampleDataset.table.c.external_service_id == model.ExternalService.table.c.id ) ) ) ) mapper( model.SampleRunAssociation, model.SampleRunAssociation.table, properties=dict( sample=relation( model.Sample, backref="runs", order_by=desc( model.Run.table.c.update_time ) ), run=relation( model.Run, backref="samples", order_by=asc( model.Sample.table.c.id ) ) ) ) mapper( model.RequestTypeRunAssociation, model.RequestTypeRunAssociation.table, properties=dict( request_type=relation( model.RequestType, backref="run" ), run=relation( model.Run, backref="request_type" ) ) ) mapper( model.Run, model.Run.table, properties=dict( template=relation( model.FormDefinition, primaryjoin=( model.Run.table.c.form_definition_id == model.FormDefinition.table.c.id ) ), info=relation( model.FormValues, primaryjoin=( model.Run.table.c.form_values_id == model.FormValues.table.c.id ) ) ) ) mapper( model.UserAddress, model.UserAddress.table, properties=dict( user=relation( model.User, primaryjoin=( model.UserAddress.table.c.user_id == model.User.table.c.id ), backref='addresses', order_by=desc(model.UserAddress.table.c.update_time)), ) ) mapper( model.UserOpenID, model.UserOpenID.table, properties=dict( session=relation( model.GalaxySession, primaryjoin=( model.UserOpenID.table.c.session_id == model.GalaxySession.table.c.id ), backref='openids', order_by=desc( model.UserOpenID.table.c.update_time ) ), user=relation( model.User, primaryjoin=( model.UserOpenID.table.c.user_id == model.User.table.c.id ), backref='openids', order_by=desc( model.UserOpenID.table.c.update_time ) ) ) ) mapper( model.ValidationError, model.ValidationError.table ) simple_mapping( model.HistoryDatasetAssociation, dataset=relation( model.Dataset, primaryjoin=( model.Dataset.table.c.id == model.HistoryDatasetAssociation.table.c.dataset_id ), lazy=False ), # .history defined in History mapper copied_from_history_dataset_association=relation( model.HistoryDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociation.table.c.copied_from_history_dataset_association_id == model.HistoryDatasetAssociation.table.c.id ), remote_side=[model.HistoryDatasetAssociation.table.c.id], uselist=False ), copied_to_history_dataset_associations=relation( model.HistoryDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociation.table.c.copied_from_history_dataset_association_id == model.HistoryDatasetAssociation.table.c.id ) ), copied_from_library_dataset_dataset_association=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociation.table.c.copied_from_library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ), uselist=False ), copied_to_library_dataset_dataset_associations=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociation.table.c.copied_from_library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), implicitly_converted_datasets=relation( model.ImplicitlyConvertedDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.hda_parent_id == model.HistoryDatasetAssociation.table.c.id ) ), implicitly_converted_parent_datasets=relation( model.ImplicitlyConvertedDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.hda_id == model.HistoryDatasetAssociation.table.c.id ) ), children=relation( model.HistoryDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociation.table.c.parent_id == model.HistoryDatasetAssociation.table.c.id ), backref=backref( "parent", primaryjoin=( model.HistoryDatasetAssociation.table.c.parent_id == model.HistoryDatasetAssociation.table.c.id ), remote_side=[model.HistoryDatasetAssociation.table.c.id], uselist=False ) ), visible_children=relation( model.HistoryDatasetAssociation, primaryjoin=( ( model.HistoryDatasetAssociation.table.c.parent_id == model.HistoryDatasetAssociation.table.c.id ) & ( model.HistoryDatasetAssociation.table.c.visible == True ) ), remote_side=[model.HistoryDatasetAssociation.table.c.id] ), tags=relation( model.HistoryDatasetAssociationTagAssociation, order_by=model.HistoryDatasetAssociationTagAssociation.table.c.id, backref='history_tag_associations' ), annotations=relation( model.HistoryDatasetAssociationAnnotationAssociation, order_by=model.HistoryDatasetAssociationAnnotationAssociation.table.c.id, backref="hdas" ), ratings=relation( model.HistoryDatasetAssociationRatingAssociation, order_by=model.HistoryDatasetAssociationRatingAssociation.table.c.id, backref="hdas" ), extended_metadata=relation( model.ExtendedMetadata, primaryjoin=( ( model.HistoryDatasetAssociation.table.c.extended_metadata_id == model.ExtendedMetadata.table.c.id ) ) ), hidden_beneath_collection_instance=relation( model.HistoryDatasetCollectionAssociation, primaryjoin=( ( model.HistoryDatasetAssociation.table.c.hidden_beneath_collection_instance_id == model.HistoryDatasetCollectionAssociation.table.c.id ) ), uselist=False, backref="hidden_dataset_instances", ) ) simple_mapping( model.Dataset, history_associations=relation( model.HistoryDatasetAssociation, primaryjoin=( model.Dataset.table.c.id == model.HistoryDatasetAssociation.table.c.dataset_id ) ), active_history_associations=relation( model.HistoryDatasetAssociation, primaryjoin=( ( model.Dataset.table.c.id == model.HistoryDatasetAssociation.table.c.dataset_id ) & ( model.HistoryDatasetAssociation.table.c.deleted == False ) & ( model.HistoryDatasetAssociation.table.c.purged == False ) ) ), purged_history_associations=relation( model.HistoryDatasetAssociation, primaryjoin=( ( model.Dataset.table.c.id == model.HistoryDatasetAssociation.table.c.dataset_id ) & ( model.HistoryDatasetAssociation.table.c.purged == True ) ) ), library_associations=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.Dataset.table.c.id == model.LibraryDatasetDatasetAssociation.table.c.dataset_id ) ), active_library_associations=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( ( model.Dataset.table.c.id == model.LibraryDatasetDatasetAssociation.table.c.dataset_id ) & ( model.LibraryDatasetDatasetAssociation.table.c.deleted == False ) ) ), tags=relation(model.DatasetTagAssociation, order_by=model.DatasetTagAssociation.table.c.id, backref='datasets') ) mapper( model.HistoryDatasetAssociationDisplayAtAuthorization, model.HistoryDatasetAssociationDisplayAtAuthorization.table, properties=dict( history_dataset_association = relation( model.HistoryDatasetAssociation ), user = relation( model.User ) ) ) mapper( model.HistoryDatasetAssociationSubset, model.HistoryDatasetAssociationSubset.table, properties=dict( hda = relation( model.HistoryDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociationSubset.table.c.history_dataset_association_id == model.HistoryDatasetAssociation.table.c.id ) ), subset = relation( model.HistoryDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociationSubset.table.c.history_dataset_association_subset_id == model.HistoryDatasetAssociation.table.c.id ) ) ) ) mapper( model.ImplicitlyConvertedDatasetAssociation, model.ImplicitlyConvertedDatasetAssociation.table, properties=dict( parent_hda=relation( model.HistoryDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.hda_parent_id == model.HistoryDatasetAssociation.table.c.id ) ), parent_ldda=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.ldda_parent_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), dataset_ldda=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.ldda_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), dataset=relation( model.HistoryDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.hda_id == model.HistoryDatasetAssociation.table.c.id ) ) ) ) mapper( model.History, model.History.table, properties=dict( galaxy_sessions=relation( model.GalaxySessionToHistoryAssociation ), datasets=relation( model.HistoryDatasetAssociation, backref="history", order_by=asc(model.HistoryDatasetAssociation.table.c.hid) ), exports=relation( model.JobExportHistoryArchive, primaryjoin=( model.JobExportHistoryArchive.table.c.history_id == model.History.table.c.id ), order_by=desc( model.JobExportHistoryArchive.table.c.id ) ), active_datasets=relation( model.HistoryDatasetAssociation, primaryjoin=( ( model.HistoryDatasetAssociation.table.c.history_id == model.History.table.c.id ) & not_( model.HistoryDatasetAssociation.table.c.deleted ) ), order_by=asc( model.HistoryDatasetAssociation.table.c.hid ), viewonly=True ), active_dataset_collections=relation( model.HistoryDatasetCollectionAssociation, primaryjoin=( ( model.HistoryDatasetCollectionAssociation.table.c.history_id ) == model.History.table.c.id ) & not_( model.HistoryDatasetCollectionAssociation.table.c.deleted ), order_by=asc( model.HistoryDatasetCollectionAssociation.table.c.hid ), viewonly=True, ), visible_datasets=relation( model.HistoryDatasetAssociation, primaryjoin=( ( model.HistoryDatasetAssociation.table.c.history_id == model.History.table.c.id ) & not_( model.HistoryDatasetAssociation.table.c.deleted ) & model.HistoryDatasetAssociation.table.c.visible ), order_by=asc( model.HistoryDatasetAssociation.table.c.hid ), viewonly=True, ), visible_dataset_collections=relation( model.HistoryDatasetCollectionAssociation, primaryjoin=( ( model.HistoryDatasetCollectionAssociation.table.c.history_id == model.History.table.c.id ) & not_( model.HistoryDatasetCollectionAssociation.table.c.deleted ) & model.HistoryDatasetCollectionAssociation.table.c.visible ), order_by=asc( model.HistoryDatasetCollectionAssociation.table.c.hid ), viewonly=True, ), tags=relation( model.HistoryTagAssociation, order_by=model.HistoryTagAssociation.table.c.id, backref="histories" ), annotations=relation( model.HistoryAnnotationAssociation, order_by=model.HistoryAnnotationAssociation.table.c.id, backref="histories" ), ratings=relation( model.HistoryRatingAssociation, order_by=model.HistoryRatingAssociation.table.c.id, backref="histories" ) ) ) # Set up proxy so that # History.users_shared_with # returns a list of users that history is shared with. model.History.users_shared_with_dot_users = association_proxy( 'users_shared_with', 'user' ) mapper( model.HistoryUserShareAssociation, model.HistoryUserShareAssociation.table, properties=dict( user=relation( model.User, backref='histories_shared_by_others' ), history=relation( model.History, backref='users_shared_with' ) ) ) mapper( model.User, model.User.table, properties=dict( histories=relation( model.History, backref="user", order_by=desc(model.History.table.c.update_time) ), active_histories=relation( model.History, primaryjoin=( ( model.History.table.c.user_id == model.User.table.c.id ) & ( not_( model.History.table.c.deleted ) ) ), order_by=desc( model.History.table.c.update_time ) ), galaxy_sessions=relation( model.GalaxySession, order_by=desc( model.GalaxySession.table.c.update_time ) ), stored_workflow_menu_entries=relation( model.StoredWorkflowMenuEntry, backref="user", cascade="all, delete-orphan", collection_class=ordering_list( 'order_index' ) ), _preferences=relation( model.UserPreference, backref="user", collection_class=attribute_mapped_collection('name')), # addresses=relation( UserAddress, # primaryjoin=( User.table.c.id == UserAddress.table.c.user_id ) ) values=relation( model.FormValues, primaryjoin=( model.User.table.c.form_values_id == model.FormValues.table.c.id ) ), api_keys=relation( model.APIKeys, backref="user", order_by=desc( model.APIKeys.table.c.create_time ) ), ) ) mapper( model.PasswordResetToken, model.PasswordResetToken.table, properties=dict( user=relation( model.User, backref="reset_tokens") ) ) # Set up proxy so that this syntax is possible: # <user_obj>.preferences[pref_name] = pref_value model.User.preferences = association_proxy('_preferences', 'value', creator=model.UserPreference) mapper( model.Group, model.Group.table, properties=dict( users=relation( model.UserGroupAssociation ) ) ) mapper( model.UserGroupAssociation, model.UserGroupAssociation.table, properties=dict( user=relation( model.User, backref = "groups" ), group=relation( model.Group, backref = "members" ) ) ) mapper( model.DefaultUserPermissions, model.DefaultUserPermissions.table, properties=dict( user=relation( model.User, backref = "default_permissions" ), role=relation( model.Role ) ) ) mapper( model.DefaultHistoryPermissions, model.DefaultHistoryPermissions.table, properties=dict( history=relation( model.History, backref = "default_permissions" ), role=relation( model.Role ) ) ) mapper( model.Role, model.Role.table, properties=dict( users=relation( model.UserRoleAssociation ), groups=relation( model.GroupRoleAssociation ) ) ) mapper( model.UserRoleAssociation, model.UserRoleAssociation.table, properties=dict( user=relation( model.User, backref="roles" ), non_private_roles=relation( model.User, backref="non_private_roles", primaryjoin=( ( model.User.table.c.id == model.UserRoleAssociation.table.c.user_id ) & ( model.UserRoleAssociation.table.c.role_id == model.Role.table.c.id ) & not_( model.Role.table.c.name == model.User.table.c.email ) ) ), role=relation( model.Role ) ) ) mapper( model.GroupRoleAssociation, model.GroupRoleAssociation.table, properties=dict( group=relation( model.Group, backref="roles" ), role=relation( model.Role ) ) ) mapper( model.Quota, model.Quota.table, properties=dict( users=relation( model.UserQuotaAssociation ), groups=relation( model.GroupQuotaAssociation ) ) ) mapper( model.UserQuotaAssociation, model.UserQuotaAssociation.table, properties=dict( user=relation( model.User, backref="quotas" ), quota=relation( model.Quota ) ) ) mapper( model.GroupQuotaAssociation, model.GroupQuotaAssociation.table, properties=dict( group=relation( model.Group, backref="quotas" ), quota=relation( model.Quota ) ) ) mapper( model.DefaultQuotaAssociation, model.DefaultQuotaAssociation.table, properties=dict( quota=relation( model.Quota, backref="default" ) ) ) mapper( model.DatasetPermissions, model.DatasetPermissions.table, properties=dict( dataset=relation( model.Dataset, backref="actions" ), role=relation( model.Role, backref="dataset_actions" ) ) ) mapper( model.LibraryPermissions, model.LibraryPermissions.table, properties=dict( library=relation( model.Library, backref="actions" ), role=relation( model.Role, backref="library_actions" ) ) ) mapper( model.LibraryFolderPermissions, model.LibraryFolderPermissions.table, properties=dict( folder=relation( model.LibraryFolder, backref="actions" ), role=relation( model.Role, backref="library_folder_actions" ) ) ) mapper( model.LibraryDatasetPermissions, model.LibraryDatasetPermissions.table, properties=dict( library_dataset=relation( model.LibraryDataset, backref="actions" ), role=relation( model.Role, backref="library_dataset_actions" ) ) ) mapper( model.LibraryDatasetDatasetAssociationPermissions, model.LibraryDatasetDatasetAssociationPermissions.table, properties=dict( library_dataset_dataset_association = relation( model.LibraryDatasetDatasetAssociation, backref="actions" ), role=relation( model.Role, backref="library_dataset_dataset_actions" ) ) ) mapper( model.Library, model.Library.table, properties=dict( root_folder=relation( model.LibraryFolder, backref=backref( "library_root" ) ) ) ) mapper( model.ExtendedMetadata, model.ExtendedMetadata.table, properties=dict( children=relation( model.ExtendedMetadataIndex, primaryjoin=( model.ExtendedMetadataIndex.table.c.extended_metadata_id == model.ExtendedMetadata.table.c.id ), backref=backref("parent", primaryjoin=( model.ExtendedMetadataIndex.table.c.extended_metadata_id == model.ExtendedMetadata.table.c.id ) ) ) ) ) mapper( model.ExtendedMetadataIndex, model.ExtendedMetadataIndex.table, properties=dict( extended_metadata=relation( model.ExtendedMetadata, primaryjoin=( ( model.ExtendedMetadataIndex.table.c.extended_metadata_id == model.ExtendedMetadata.table.c.id ) ) ) ) ) mapper( model.LibraryInfoAssociation, model.LibraryInfoAssociation.table, properties=dict( library=relation( model.Library, primaryjoin=( ( model.LibraryInfoAssociation.table.c.library_id == model.Library.table.c.id ) & ( not_( model.LibraryInfoAssociation.table.c.deleted ) ) ), backref="info_association" ), template=relation( model.FormDefinition, primaryjoin=( model.LibraryInfoAssociation.table.c.form_definition_id == model.FormDefinition.table.c.id ) ), info=relation( model.FormValues, primaryjoin=( model.LibraryInfoAssociation.table.c.form_values_id == model.FormValues.table.c.id ) ) ) ) mapper( model.LibraryFolder, model.LibraryFolder.table, properties=dict( folders=relation( model.LibraryFolder, primaryjoin=( model.LibraryFolder.table.c.parent_id == model.LibraryFolder.table.c.id ), order_by=asc( model.LibraryFolder.table.c.name ), backref=backref( "parent", primaryjoin=( model.LibraryFolder.table.c.parent_id == model.LibraryFolder.table.c.id ), remote_side=[model.LibraryFolder.table.c.id] ) ), active_folders=relation( model.LibraryFolder, primaryjoin=( ( model.LibraryFolder.table.c.parent_id == model.LibraryFolder.table.c.id ) & ( not_( model.LibraryFolder.table.c.deleted ) ) ), order_by=asc( model.LibraryFolder.table.c.name ), lazy=True, #"""sqlalchemy.exc.ArgumentError: Error creating eager relationship 'active_folders' on parent class '<class 'galaxy.model.LibraryFolder'>' to child class '<class 'galaxy.model.LibraryFolder'>': Cant use eager loading on a self referential relationship.""" viewonly=True ), datasets=relation( model.LibraryDataset, primaryjoin=( ( model.LibraryDataset.table.c.folder_id == model.LibraryFolder.table.c.id ) ), order_by=asc( model.LibraryDataset.table.c._name ), lazy=True, viewonly=True ), active_datasets=relation( model.LibraryDataset, primaryjoin=( ( model.LibraryDataset.table.c.folder_id == model.LibraryFolder.table.c.id ) & ( not_( model.LibraryDataset.table.c.deleted ) ) ), order_by=asc( model.LibraryDataset.table.c._name ), lazy=True, viewonly=True ) ) ) mapper( model.LibraryFolderInfoAssociation, model.LibraryFolderInfoAssociation.table, properties=dict( folder=relation( model.LibraryFolder, primaryjoin=( ( model.LibraryFolderInfoAssociation.table.c.library_folder_id == model.LibraryFolder.table.c.id ) & ( not_( model.LibraryFolderInfoAssociation.table.c.deleted ) ) ), backref="info_association" ), template=relation( model.FormDefinition, primaryjoin=( model.LibraryFolderInfoAssociation.table.c.form_definition_id == model.FormDefinition.table.c.id ) ), info=relation( model.FormValues, primaryjoin=( model.LibraryFolderInfoAssociation.table.c.form_values_id == model.FormValues.table.c.id ) ) ) ) mapper( model.LibraryDataset, model.LibraryDataset.table, properties=dict( folder=relation( model.LibraryFolder ), library_dataset_dataset_association=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.LibraryDataset.table.c.library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), expired_datasets = relation( model.LibraryDatasetDatasetAssociation, foreign_keys=[model.LibraryDataset.table.c.id,model.LibraryDataset.table.c.library_dataset_dataset_association_id ], primaryjoin=( ( model.LibraryDataset.table.c.id == model.LibraryDatasetDatasetAssociation.table.c.library_dataset_id ) & ( not_( model.LibraryDataset.table.c.library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ) ), viewonly=True, uselist=True ) ) ) mapper( model.LibraryDatasetDatasetAssociation, model.LibraryDatasetDatasetAssociation.table, properties=dict( dataset=relation( model.Dataset ), library_dataset = relation( model.LibraryDataset, primaryjoin=( model.LibraryDatasetDatasetAssociation.table.c.library_dataset_id == model.LibraryDataset.table.c.id ) ), #user=relation( model.User.mapper ), user=relation( model.User ), copied_from_library_dataset_dataset_association=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.LibraryDatasetDatasetAssociation.table.c.copied_from_library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ), remote_side=[model.LibraryDatasetDatasetAssociation.table.c.id], uselist=False ), copied_to_library_dataset_dataset_associations=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.LibraryDatasetDatasetAssociation.table.c.copied_from_library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), copied_from_history_dataset_association=relation( model.HistoryDatasetAssociation, primaryjoin=( model.LibraryDatasetDatasetAssociation.table.c.copied_from_history_dataset_association_id == model.HistoryDatasetAssociation.table.c.id ), uselist=False ), copied_to_history_dataset_associations=relation( model.HistoryDatasetAssociation, primaryjoin=( model.HistoryDatasetAssociation.table.c.copied_from_library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), implicitly_converted_datasets=relation( model.ImplicitlyConvertedDatasetAssociation, primaryjoin=( model.ImplicitlyConvertedDatasetAssociation.table.c.ldda_parent_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), children=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.LibraryDatasetDatasetAssociation.table.c.parent_id == model.LibraryDatasetDatasetAssociation.table.c.id ), backref=backref( "parent", primaryjoin=( model.LibraryDatasetDatasetAssociation.table.c.parent_id == model.LibraryDatasetDatasetAssociation.table.c.id ), remote_side=[model.LibraryDatasetDatasetAssociation.table.c.id] ) ), visible_children=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( ( model.LibraryDatasetDatasetAssociation.table.c.parent_id == model.LibraryDatasetDatasetAssociation.table.c.id ) & ( model.LibraryDatasetDatasetAssociation.table.c.visible == True ) ), remote_side=[model.LibraryDatasetDatasetAssociation.table.c.id]), extended_metadata=relation( model.ExtendedMetadata, primaryjoin=( ( model.LibraryDatasetDatasetAssociation.table.c.extended_metadata_id == model.ExtendedMetadata.table.c.id ) ) ) )) mapper( model.LibraryDatasetDatasetInfoAssociation, model.LibraryDatasetDatasetInfoAssociation.table, properties=dict( library_dataset_dataset_association=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( ( model.LibraryDatasetDatasetInfoAssociation.table.c.library_dataset_dataset_association_id == model.LibraryDatasetDatasetAssociation.table.c.id ) & ( not_( model.LibraryDatasetDatasetInfoAssociation.table.c.deleted ) ) ), backref="info_association" ), template=relation( model.FormDefinition, primaryjoin=( model.LibraryDatasetDatasetInfoAssociation.table.c.form_definition_id == model.FormDefinition.table.c.id ) ), info=relation( model.FormValues, primaryjoin=( model.LibraryDatasetDatasetInfoAssociation.table.c.form_values_id == model.FormValues.table.c.id ) ) ) ) mapper( model.JobToInputDatasetAssociation, model.JobToInputDatasetAssociation.table, properties=dict( job=relation( model.Job ), dataset=relation( model.HistoryDatasetAssociation, lazy=False, backref="dependent_jobs" ) ) ) mapper( model.JobToOutputDatasetAssociation, model.JobToOutputDatasetAssociation.table, properties=dict( job=relation( model.Job ), dataset=relation( model.HistoryDatasetAssociation, lazy=False ) ) ) mapper( model.JobToInputDatasetCollectionAssociation, model.JobToInputDatasetCollectionAssociation.table, properties=dict( job=relation( model.Job ), dataset_collection=relation( model.HistoryDatasetCollectionAssociation, lazy=False, backref="dependent_jobs" ) ) ) mapper( model.JobToOutputDatasetCollectionAssociation, model.JobToOutputDatasetCollectionAssociation.table, properties=dict( job=relation( model.Job ), dataset_collection_instance=relation( model.HistoryDatasetCollectionAssociation, lazy=False, backref="output_dataset_collection_instances" ) ) ) mapper( model.JobToImplicitOutputDatasetCollectionAssociation, model.JobToImplicitOutputDatasetCollectionAssociation.table, properties=dict( job=relation( model.Job ), dataset_collection=relation( model.DatasetCollection, backref="output_dataset_collections" ) ) ) mapper( model.JobToInputLibraryDatasetAssociation, model.JobToInputLibraryDatasetAssociation.table, properties=dict( job=relation( model.Job ), dataset=relation( model.LibraryDatasetDatasetAssociation, lazy=False, backref="dependent_jobs" ) ) ) mapper( model.JobToOutputLibraryDatasetAssociation, model.JobToOutputLibraryDatasetAssociation.table, properties=dict( job=relation( model.Job ), dataset=relation( model.LibraryDatasetDatasetAssociation, lazy=False ) ) ) simple_mapping( model.JobStateHistory, job=relation( model.Job, backref="state_history" ), ) simple_mapping( model.JobMetricText, job=relation( model.Job, backref="text_metrics" ), ) simple_mapping( model.TaskMetricText, task=relation( model.Task, backref="text_metrics" ), ) simple_mapping( model.JobMetricNumeric, job=relation( model.Job, backref="numeric_metrics" ), ) simple_mapping( model.TaskMetricNumeric, task=relation( model.Task, backref="numeric_metrics" ), ) simple_mapping( model.ImplicitlyCreatedDatasetCollectionInput, input_dataset_collection=relation( model.HistoryDatasetCollectionAssociation, primaryjoin=( ( model.HistoryDatasetCollectionAssociation.table.c.id == model.ImplicitlyCreatedDatasetCollectionInput.table.c.input_dataset_collection_id ) ), # backref="implicitly_created_dataset_collections", ), ) mapper( model.JobParameter, model.JobParameter.table ) mapper( model.JobExternalOutputMetadata, model.JobExternalOutputMetadata.table, properties=dict( job = relation( model.Job ), history_dataset_association = relation( model.HistoryDatasetAssociation, lazy = False ), library_dataset_dataset_association = relation( model.LibraryDatasetDatasetAssociation, lazy = False ) ) ) mapper( model.JobExportHistoryArchive, model.JobExportHistoryArchive.table, properties=dict( job = relation( model.Job ), history = relation( model.History ), dataset = relation( model.Dataset ) ) ) mapper( model.JobImportHistoryArchive, model.JobImportHistoryArchive.table, properties=dict( job = relation( model.Job ), history = relation( model.History ) ) ) mapper( model.GenomeIndexToolData, model.GenomeIndexToolData.table, properties=dict( job = relation( model.Job, backref='job' ), dataset = relation( model.Dataset ), user = relation( model.User ), deferred = relation( model.DeferredJob, backref='deferred_job' ), transfer = relation( model.TransferJob, backref='transfer_job' ) ) ) mapper(model.PostJobAction, model.PostJobAction.table, properties=dict(workflow_step = relation( model.WorkflowStep, backref='post_job_actions', primaryjoin=(model.WorkflowStep.table.c.id == model.PostJobAction.table.c.workflow_step_id)))) mapper( model.PostJobActionAssociation, model.PostJobActionAssociation.table, properties=dict( job = relation( model.Job ), post_job_action = relation( model.PostJobAction) ) ) mapper( model.Job, model.Job.table, #properties=dict( user=relation( model.User.mapper ), properties=dict( user=relation( model.User ), galaxy_session=relation( model.GalaxySession ), history=relation( model.History ), library_folder=relation( model.LibraryFolder ), parameters=relation( model.JobParameter, lazy=False ), input_datasets=relation( model.JobToInputDatasetAssociation ), output_datasets=relation( model.JobToOutputDatasetAssociation ), output_dataset_collection_instances=relation( model.JobToOutputDatasetCollectionAssociation ), output_dataset_collections=relation( model.JobToImplicitOutputDatasetCollectionAssociation ), post_job_actions=relation( model.PostJobActionAssociation, lazy=False ), input_library_datasets=relation( model.JobToInputLibraryDatasetAssociation ), output_library_datasets=relation( model.JobToOutputLibraryDatasetAssociation ), external_output_metadata = relation( model.JobExternalOutputMetadata, lazy = False ), tasks = relation(model.Task) ) ) mapper( model.Task, model.Task.table, properties=dict( job = relation( model.Job ) ) ) mapper( model.DeferredJob, model.DeferredJob.table, properties = {} ) mapper( model.TransferJob, model.TransferJob.table, properties = {} ) simple_mapping( model.DatasetCollection, elements=relation( model.DatasetCollectionElement, primaryjoin=( model.DatasetCollection.table.c.id == model.DatasetCollectionElement.table.c.dataset_collection_id ), remote_side=[ model.DatasetCollectionElement.table.c.dataset_collection_id ], backref="collection", order_by=model.DatasetCollectionElement.table.c.element_index, ), ) simple_mapping( model.HistoryDatasetCollectionAssociation, collection=relation( model.DatasetCollection ), history=relation( model.History, backref='dataset_collections' ), copied_from_history_dataset_collection_association=relation( model.HistoryDatasetCollectionAssociation, primaryjoin=( model.HistoryDatasetCollectionAssociation.table.c.copied_from_history_dataset_collection_association_id == model.HistoryDatasetCollectionAssociation.table.c.id ), remote_side=[model.HistoryDatasetCollectionAssociation.table.c.id], uselist=False ), copied_to_history_dataset_collection_associations=relation( model.HistoryDatasetCollectionAssociation, primaryjoin=( model.HistoryDatasetCollectionAssociation.table.c.copied_from_history_dataset_collection_association_id == model.HistoryDatasetCollectionAssociation.table.c.id ) ), implicit_input_collections=relation( model.ImplicitlyCreatedDatasetCollectionInput, primaryjoin=( ( model.HistoryDatasetCollectionAssociation.table.c.id == model.ImplicitlyCreatedDatasetCollectionInput.table.c.dataset_collection_id ) ), backref="dataset_collection", ), tags=relation( model.HistoryDatasetCollectionTagAssociation, order_by=model.HistoryDatasetCollectionTagAssociation.table.c.id, backref='dataset_collections' ), annotations=relation( model.HistoryDatasetCollectionAnnotationAssociation, order_by=model.HistoryDatasetCollectionAnnotationAssociation.table.c.id, backref="dataset_collections" ), ratings=relation( model.HistoryDatasetCollectionRatingAssociation, order_by=model.HistoryDatasetCollectionRatingAssociation.table.c.id, backref="dataset_collections" ), ) simple_mapping( model.LibraryDatasetCollectionAssociation, collection=relation( model.DatasetCollection ), folder=relation( model.LibraryFolder, backref='dataset_collections' ), tags=relation( model.LibraryDatasetCollectionTagAssociation, order_by=model.LibraryDatasetCollectionTagAssociation.table.c.id, backref='dataset_collections' ), annotations=relation( model.LibraryDatasetCollectionAnnotationAssociation, order_by=model.LibraryDatasetCollectionAnnotationAssociation.table.c.id, backref="dataset_collections" ), ratings=relation( model.LibraryDatasetCollectionRatingAssociation, order_by=model.LibraryDatasetCollectionRatingAssociation.table.c.id, backref="dataset_collections" ), ) simple_mapping( model.DatasetCollectionElement, hda=relation( model.HistoryDatasetAssociation, primaryjoin=( model.DatasetCollectionElement.table.c.hda_id == model.HistoryDatasetAssociation.table.c.id ) ), ldda=relation( model.LibraryDatasetDatasetAssociation, primaryjoin=( model.DatasetCollectionElement.table.c.ldda_id == model.LibraryDatasetDatasetAssociation.table.c.id ) ), child_collection=relation( model.DatasetCollection, primaryjoin=( model.DatasetCollectionElement.table.c.child_collection_id == model.DatasetCollection.table.c.id ), ), ) mapper( model.Event, model.Event.table, properties=dict( history=relation( model.History ), galaxy_session=relation( model.GalaxySession ), #user=relation( model.User.mapper ) ) ) user=relation( model.User ) ) ) mapper( model.GalaxySession, model.GalaxySession.table, properties=dict( histories=relation( model.GalaxySessionToHistoryAssociation ), current_history=relation( model.History ), #user=relation( model.User.mapper ) ) ) user=relation( model.User ) ) ) mapper( model.GalaxySessionToHistoryAssociation, model.GalaxySessionToHistoryAssociation.table, properties=dict( galaxy_session=relation( model.GalaxySession ), history=relation( model.History ) ) ) mapper( model.Workflow, model.Workflow.table, properties=dict( steps=relation( model.WorkflowStep, backref='workflow', order_by=asc(model.WorkflowStep.table.c.order_index), cascade="all, delete-orphan", lazy=False ), ) ) mapper( model.WorkflowStep, model.WorkflowStep.table, properties=dict( tags=relation(model.WorkflowStepTagAssociation, order_by=model.WorkflowStepTagAssociation.table.c.id, backref="workflow_steps"), annotations=relation( model.WorkflowStepAnnotationAssociation, order_by=model.WorkflowStepAnnotationAssociation.table.c.id, backref="workflow_steps" ) ) ) mapper( model.WorkflowOutput, model.WorkflowOutput.table, properties=dict(workflow_step = relation( model.WorkflowStep, backref='workflow_outputs', primaryjoin=(model.WorkflowStep.table.c.id == model.WorkflowOutput.table.c.workflow_step_id)))) mapper( model.WorkflowStepConnection, model.WorkflowStepConnection.table, properties=dict( input_step=relation( model.WorkflowStep, backref="input_connections", cascade="all", primaryjoin=( model.WorkflowStepConnection.table.c.input_step_id == model.WorkflowStep.table.c.id ) ), output_step=relation( model.WorkflowStep, backref="output_connections", cascade="all", primaryjoin=( model.WorkflowStepConnection.table.c.output_step_id == model.WorkflowStep.table.c.id ) ) ) ) mapper( model.StoredWorkflow, model.StoredWorkflow.table, properties=dict( user=relation( model.User, primaryjoin=( model.User.table.c.id == model.StoredWorkflow.table.c.user_id ), backref='stored_workflows' ), workflows=relation( model.Workflow, backref='stored_workflow', cascade="all, delete-orphan", primaryjoin=( model.StoredWorkflow.table.c.id == model.Workflow.table.c.stored_workflow_id ) ), latest_workflow=relation( model.Workflow, post_update=True, primaryjoin=( model.StoredWorkflow.table.c.latest_workflow_id == model.Workflow.table.c.id ), lazy=False ), tags=relation( model.StoredWorkflowTagAssociation, order_by=model.StoredWorkflowTagAssociation.table.c.id, backref="stored_workflows" ), owner_tags=relation( model.StoredWorkflowTagAssociation, primaryjoin=and_( model.StoredWorkflow.table.c.id == model.StoredWorkflowTagAssociation.table.c.stored_workflow_id, model.StoredWorkflow.table.c.user_id == model.StoredWorkflowTagAssociation.table.c.user_id ), order_by=model.StoredWorkflowTagAssociation.table.c.id ), annotations=relation( model.StoredWorkflowAnnotationAssociation, order_by=model.StoredWorkflowAnnotationAssociation.table.c.id, backref="stored_workflows" ), ratings=relation( model.StoredWorkflowRatingAssociation, order_by=model.StoredWorkflowRatingAssociation.table.c.id, backref="stored_workflows" ) ) ) # Set up proxy so that # StoredWorkflow.users_shared_with # returns a list of users that workflow is shared with. model.StoredWorkflow.users_shared_with_dot_users = association_proxy( 'users_shared_with', 'user' ) mapper( model.StoredWorkflowUserShareAssociation, model.StoredWorkflowUserShareAssociation.table, properties=dict( user=relation( model.User, backref='workflows_shared_by_others' ), stored_workflow=relation( model.StoredWorkflow, backref='users_shared_with' ) ) ) mapper( model.StoredWorkflowMenuEntry, model.StoredWorkflowMenuEntry.table, properties=dict( stored_workflow=relation( model.StoredWorkflow ) ) ) mapper( model.WorkflowInvocation, model.WorkflowInvocation.table, properties=dict( history=relation( model.History ), input_parameters=relation( model.WorkflowRequestInputParameter ), step_states=relation( model.WorkflowRequestStepState ), input_datasets=relation( model.WorkflowRequestToInputDatasetAssociation ), input_dataset_collections=relation( model.WorkflowRequestToInputDatasetCollectionAssociation ), steps=relation( model.WorkflowInvocationStep, backref='workflow_invocation', lazy=False ), workflow=relation( model.Workflow ) ) ) mapper( model.WorkflowInvocationStep, model.WorkflowInvocationStep.table, properties=dict( workflow_step = relation( model.WorkflowStep ), job = relation( model.Job, backref=backref( 'workflow_invocation_step', uselist=False ) ) ) ) simple_mapping( model.WorkflowRequestInputParameter, workflow_invocation=relation( model.WorkflowInvocation ), ) simple_mapping( model.WorkflowRequestStepState, workflow_invocation=relation( model.WorkflowInvocation ), workflow_step=relation( model.WorkflowStep ), ) simple_mapping( model.WorkflowRequestToInputDatasetAssociation, workflow_invocation=relation( model.WorkflowInvocation ), workflow_step=relation( model.WorkflowStep ), dataset=relation( model.HistoryDatasetAssociation ), ) simple_mapping( model.WorkflowRequestToInputDatasetCollectionAssociation, workflow_invocation=relation( model.WorkflowInvocation ), workflow_step=relation( model.WorkflowStep ), dataset_collection=relation( model.HistoryDatasetCollectionAssociation ), ) mapper( model.MetadataFile, model.MetadataFile.table, properties=dict( history_dataset=relation( model.HistoryDatasetAssociation ), library_dataset=relation( model.LibraryDatasetDatasetAssociation ) ) ) mapper( model.PageRevision, model.PageRevision.table ) mapper( model.Page, model.Page.table, properties=dict( user=relation( model.User ), revisions=relation( model.PageRevision, backref='page', cascade="all, delete-orphan", primaryjoin=( model.Page.table.c.id == model.PageRevision.table.c.page_id ) ), latest_revision=relation( model.PageRevision, post_update=True, primaryjoin=( model.Page.table.c.latest_revision_id == model.PageRevision.table.c.id ), lazy=False ), tags=relation(model.PageTagAssociation, order_by=model.PageTagAssociation.table.c.id, backref="pages"), annotations=relation( model.PageAnnotationAssociation, order_by=model.PageAnnotationAssociation.table.c.id, backref="pages" ), ratings=relation( model.PageRatingAssociation, order_by=model.PageRatingAssociation.table.c.id, backref="pages" ) ) ) # Set up proxy so that # Page.users_shared_with # returns a list of users that page is shared with. model.Page.users_shared_with_dot_users = association_proxy( 'users_shared_with', 'user' ) mapper( model.PageUserShareAssociation, model.PageUserShareAssociation.table, properties=dict( user=relation( model.User, backref='pages_shared_by_others' ), page=relation( model.Page, backref='users_shared_with' ) ) ) mapper( model.VisualizationRevision, model.VisualizationRevision.table ) mapper( model.Visualization, model.Visualization.table, properties=dict( user=relation( model.User ), revisions=relation( model.VisualizationRevision, backref='visualization', cascade="all, delete-orphan", primaryjoin=( model.Visualization.table.c.id == model.VisualizationRevision.table.c.visualization_id ) ), latest_revision=relation( model.VisualizationRevision, post_update=True, primaryjoin=( model.Visualization.table.c.latest_revision_id == model.VisualizationRevision.table.c.id ), lazy=False ), tags=relation( model.VisualizationTagAssociation, order_by=model.VisualizationTagAssociation.table.c.id, backref="visualizations" ), annotations=relation( model.VisualizationAnnotationAssociation, order_by=model.VisualizationAnnotationAssociation.table.c.id, backref="visualizations" ), ratings=relation( model.VisualizationRatingAssociation, order_by=model.VisualizationRatingAssociation.table.c.id, backref="visualizations" ) ) ) # Set up proxy so that # Visualization.users_shared_with # returns a list of users that visualization is shared with. model.Visualization.users_shared_with_dot_users = association_proxy( 'users_shared_with', 'user' ) mapper( model.VisualizationUserShareAssociation, model.VisualizationUserShareAssociation.table, properties=dict( user=relation( model.User, backref='visualizations_shared_by_others' ), visualization=relation( model.Visualization, backref='users_shared_with' ) ) ) # Tag tables. simple_mapping( model.Tag, children=relation(model.Tag, backref=backref( 'parent', remote_side=[model.Tag.table.c.id] ) ) )
[docs]def tag_mapping( tag_association_class, backref_name ): simple_mapping( tag_association_class, tag=relation( model.Tag, backref=backref_name), user=relation( model.User ) )
tag_mapping( model.HistoryTagAssociation, "tagged_histories" ) tag_mapping( model.DatasetTagAssociation, "tagged_datasets" ) tag_mapping( model.HistoryDatasetAssociationTagAssociation, "tagged_history_dataset_associations" ) tag_mapping( model.PageTagAssociation, "tagged_pages" ) tag_mapping( model.StoredWorkflowTagAssociation, "tagged_workflows" ) tag_mapping( model.WorkflowStepTagAssociation, "tagged_workflow_steps" ) tag_mapping( model.VisualizationTagAssociation, "tagged_visualizations" ) tag_mapping( model.HistoryDatasetCollectionTagAssociation, "tagged_history_dataset_collections" ) tag_mapping( model.LibraryDatasetCollectionTagAssociation, "tagged_library_dataset_collections" ) tag_mapping( model.ToolTagAssociation, "tagged_tools" ) # Annotation tables.
[docs]def annotation_mapping( annotation_class, **kwds ): kwds = dict( [ (key, relation( value ) ) for key, value in kwds.iteritems() ] ) simple_mapping( annotation_class, **dict(user=relation( model.User ), **kwds ) )
annotation_mapping( model.HistoryAnnotationAssociation, history=model.History ) annotation_mapping( model.HistoryDatasetAssociationAnnotationAssociation, hda=model.HistoryDatasetAssociation ) annotation_mapping( model.StoredWorkflowAnnotationAssociation, stored_workflow=model.StoredWorkflow ) annotation_mapping( model.WorkflowStepAnnotationAssociation, workflow_step=model.WorkflowStep ) annotation_mapping( model.PageAnnotationAssociation, page=model.Page ) annotation_mapping( model.VisualizationAnnotationAssociation, visualization=model.Visualization ) annotation_mapping( model.HistoryDatasetCollectionAnnotationAssociation, history_dataset_collection=model.HistoryDatasetCollectionAssociation ) annotation_mapping( model.LibraryDatasetCollectionAnnotationAssociation, library_dataset_collection=model.LibraryDatasetCollectionAssociation ) # Rating tables.
[docs]def rating_mapping( rating_class, **kwds ): kwds = dict( [ (key, relation( value ) ) for key, value in kwds.iteritems() ] ) simple_mapping( rating_class, **dict(user=relation( model.User ), **kwds ) )
rating_mapping( model.HistoryRatingAssociation, history=model.History ) rating_mapping( model.HistoryDatasetAssociationRatingAssociation, hda=model.HistoryDatasetAssociation ) rating_mapping( model.StoredWorkflowRatingAssociation, stored_workflow=model.StoredWorkflow ) rating_mapping( model.PageRatingAssociation, page=model.Page ) rating_mapping( model.VisualizationRatingAssociation, visualizaiton=model.Visualization ) rating_mapping( model.HistoryDatasetCollectionRatingAssociation, history_dataset_collection=model.HistoryDatasetCollectionAssociation ) rating_mapping( model.LibraryDatasetCollectionRatingAssociation, libary_dataset_collection=model.LibraryDatasetCollectionAssociation ) #Data Manager tables mapper( model.DataManagerHistoryAssociation, model.DataManagerHistoryAssociation.table, properties=dict( history=relation( model.History ), user=relation( model.User, backref='data_manager_histories' ) ) ) mapper( model.DataManagerJobAssociation, model.DataManagerJobAssociation.table, properties=dict( job=relation( model.Job, backref=backref('data_manager_association', uselist=False ), uselist=False ) ) ) # User tables. mapper( model.UserPreference, model.UserPreference.table, properties = {} ) mapper( model.UserAction, model.UserAction.table, #properties = dict( user=relation( model.User.mapper ) ) properties = dict( user=relation( model.User ) ) ) mapper( model.APIKeys, model.APIKeys.table, properties = {} ) #model.HistoryDatasetAssociation.mapper.add_property( "creating_job_associations", relation( model.JobToOutputDatasetAssociation ) ) #model.LibraryDatasetDatasetAssociation.mapper.add_property( "creating_job_associations", relation( model.JobToOutputLibraryDatasetAssociation ) ) class_mapper(model.HistoryDatasetAssociation).add_property( "creating_job_associations", relation( model.JobToOutputDatasetAssociation ) ) class_mapper(model.LibraryDatasetDatasetAssociation).add_property( "creating_job_associations", relation( model.JobToOutputLibraryDatasetAssociation ) ) class_mapper(model.HistoryDatasetCollectionAssociation).add_property( "creating_job_associations", relation( model.JobToOutputDatasetCollectionAssociation ) ) # Helper methods.
[docs]def db_next_hid( self ): """ db_next_hid( self ) Override __next_hid to generate from the database in a concurrency safe way. Loads the next history ID from the DB and returns it. It also saves the future next_id into the DB. :rtype: int :returns: the next history id """ conn = object_session( self ).connection() table = self.table trans = conn.begin() try: next_hid = select( [table.c.hid_counter], table.c.id == self.id, for_update=True ).scalar() table.update( table.c.id == self.id ).execute( hid_counter = ( next_hid + 1 ) ) trans.commit() return next_hid except: trans.rollback() raise
model.History._next_hid = db_next_hid
[docs]def init( file_path, url, engine_options={}, create_tables=False, map_install_models=False, database_query_profiling_proxy=False, object_store=None, trace_logger=None, use_pbkdf2=True ): """Connect mappings to the database""" # Connect dataset to the file path model.Dataset.file_path = file_path # Connect dataset to object store model.Dataset.object_store = object_store # Use PBKDF2 password hashing? model.User.use_pbkdf2 = use_pbkdf2 # Load the appropriate db module engine = build_engine( url, engine_options, database_query_profiling_proxy, trace_logger ) # Connect the metadata to the database. metadata.bind = engine model_modules = [model] if map_install_models: import galaxy.model.tool_shed_install.mapping from galaxy.model import tool_shed_install model_modules.append(tool_shed_install) result = ModelMapping(model_modules, engine=engine) # Create tables if needed if create_tables: metadata.create_all() # metadata.engine.commit() result.create_tables = create_tables #load local galaxy security policy result.security_agent = GalaxyRBACAgent( result ) return result