/src/mobyle2/core/schemas_migrations/versions/018_modify_links.py

https://github.com/mobyle2-legacy/mobyle2.core
Python | 144 lines | 117 code | 21 blank | 6 comment | 8 complexity | 0b78c8bb0c049ea917f28ba4c2a75858 MD5 | raw file
  1. from mobyle2.core.schemas_migrations import (
  2. recreate_table_fkeys,
  3. )
  4. from sqlalchemy import *
  5. from sqlalchemy import (
  6. Column,
  7. Integer,
  8. ForeignKey,
  9. Unicode,
  10. String,
  11. Enum
  12. )
  13. from copy import deepcopy
  14. import sqlalchemy as s
  15. import migrate as m
  16. from sqlalchemy.orm import relationship
  17. from migrate.changeset.constraint import ForeignKeyConstraint, PrimaryKeyConstraint
  18. from mobyle2.core.basemodel import (
  19. DBSession, MigrateBase as Base, metadata as metadata,
  20. MDBSession as session,
  21. R, P, default_permissions, default_roles, default_acls)
  22. def upgrade(migrate_engine):
  23. """r_meta must be reflected from the current database
  24. whereas metadata is the current constructed metadata for the migration purpose"""
  25. # Upgrade operations go here. Don't create your own engine; bind
  26. # migrate_engine to your metadata
  27. class Acl(Base):
  28. __tablename__ = 'authentication_acl'
  29. role = Column(Integer, ForeignKey("authentication_role.id", name="fk_acl_role", use_alter=True, ondelete="CASCADE", onupdate="CASCADE"), primary_key=True)
  30. permission = Column(Integer, ForeignKey("authentication_permission.id", name="fk_acl_permission", use_alter=True, ondelete="CASCADE", onupdate="CASCADE"), primary_key=True)
  31. class Role(Base):
  32. __tablename__ = 'authentication_role'
  33. id = Column(Integer, primary_key=True)
  34. name = Column(Unicode(50), unique=True)
  35. description = Column(Unicode(2500))
  36. global_permissions = relationship(
  37. "Permission", uselist=True,
  38. secondary="authentication_acl",
  39. secondaryjoin="Acl.permission==Permission.id")
  40. def __init__(self, id=None, name=None, description=None, global_permissions=None):
  41. self.id = id
  42. self.description = description
  43. self.name = name
  44. if global_permissions is not None:
  45. self.global_permissions.extend(global_permissions)
  46. class Project(Base):
  47. __tablename__ = 'projects'
  48. id = Column(Integer, primary_key=True)
  49. name = Column(Unicode(50), unique=True)
  50. description = Column(Unicode(255))
  51. directory = Column(Unicode(2550))
  52. user_id = Column(Integer, )
  53. class Permission(Base):
  54. __tablename__ = 'authentication_permission'
  55. id = Column(Integer, primary_key=True)
  56. name = Column(Unicode(50), unique=True)
  57. description = Column(Unicode(2500))
  58. roles = relationship(
  59. "Role", uselist=True,
  60. secondary="authentication_acl",
  61. secondaryjoin="Acl.permission==Role.id")
  62. def __init__(self, id=None, name=None, description=None, roles=None):
  63. self.id = id
  64. self.name = name
  65. self.description=description
  66. if roles is not None:
  67. self.roles.extends(roles)
  68. class ProjectServer(Base):
  69. __tablename__ = 'projects_servers'
  70. project_id = Column(Integer, ForeignKey("servers.id", name="fk_projectserver_server", use_alter=True, ondelete="CASCADE", onupdate="CASCADE"), primary_key=True)
  71. server_id = Column(Integer, ForeignKey("projects.id", name="fk_projectserver_project", use_alter=True, ondelete="CASCADE", onupdate="CASCADE"), primary_key=True)
  72. class Server(Base):
  73. __tablename__ = 'servers'
  74. id = Column(Integer, primary_key=True)
  75. name = Column(Unicode(50), unique=True)
  76. url = Column(Unicode(255))
  77. help_mail = Column(Unicode(255))
  78. def __init__(self,
  79. name=None,
  80. url=None,
  81. help_mail=None,
  82. ):
  83. self.name = name
  84. self.url = url
  85. self.help_mail = help_mail
  86. class Service(Base):
  87. __tablename__ = 'services'
  88. __table_args__ = (
  89. UniqueConstraint('name', 'server_id', name='unique_server_service'),
  90. Index('search_classification', 'classification'),
  91. Index('search_package', 'package'),
  92. )
  93. id = Column(Integer, primary_key=True)
  94. name = Column(Unicode(100), unique=True)
  95. server_id = Column(Integer, ForeignKey("servers.id", name="fk_service_server", use_alter=True), nullable=False)
  96. package = Column(Unicode(2500), default='not read', nullable=False)
  97. classification = Column(Unicode(2500), default='not read', nullable=False)
  98. enable = Column(Boolean(), default=True, nullable=False)
  99. exportable = Column(Boolean(), default=False, nullable=False)
  100. type = Column(Enum('program', 'workflow', 'viewer', name='service_type'), default='program', nullable=False)
  101. debug = True
  102. session.configure(bind=migrate_engine)
  103. migrate_engine.echo=debug
  104. metadata.bind = migrate_engine
  105. """ Create services table """
  106. r_meta = s.MetaData(migrate_engine, True)
  107. Base.metadata.bind = migrate_engine
  108. for o in [Service]:
  109. t = o.__table__
  110. if not t.name in r_meta.tables: t.create(migrate_engine)
  111. r_meta = s.MetaData(migrate_engine, True)
  112. for c in ['server_id',]:
  113. if not c in r_meta.tables[t.name].c:
  114. t.c[c].create(table=t)
  115. recreate_table_fkeys(o, session)
  116. for o in [ProjectServer]:
  117. t = o.__table__
  118. if not t.name in r_meta.tables: t.create(migrate_engine)
  119. r_meta = s.MetaData(migrate_engine, True)
  120. recreate_table_fkeys(o, session)
  121. def downgrade(migrate_engine):
  122. # Operations to reverse the above upgrade go here.
  123. pass