da12239d9da0_delete_content_view.py 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. """delete_content_view
  2. Revision ID: da12239d9da0
  3. Revises: b73e57760b36
  4. Create Date: 2016-03-04 15:59:05.828757
  5. """
  6. # revision identifiers, used by Alembic.
  7. revision = 'da12239d9da0'
  8. down_revision = 'b73e57760b36'
  9. import sqlalchemy as sa
  10. from alembic import op
  11. from sqlalchemy.dialects import postgresql
  12. def set_field_where_null(field_name, value="''"):
  13. op.execute("UPDATE content_revisions SET %s = %s WHERE %s IS NULL" % (field_name, value, field_name))
  14. def set_field_to_null_where_empty_string(field_name):
  15. op.execute("UPDATE content_revisions SET %s = NULL WHERE %s = ''" % (field_name, field_name))
  16. fields_names_to_empty_string = ('file_mimetype', 'file_name', 'label', 'properties',
  17. 'revision_type', 'status', 'description', 'label')
  18. def upgrade():
  19. ### commands auto generated by Alembic - please adjust! ###
  20. # Drop triggers
  21. op.execute("DROP TRIGGER trg__contents__on_insert__set_created ON content_revisions")
  22. op.execute("DROP TRIGGER trg__contents__on_update__set_updated ON content_revisions")
  23. op.execute("DROP TRIGGER trg__contents__on_update On contents")
  24. op.execute("DROP TRIGGER trg__workspaces__on_insert__set_created ON workspaces")
  25. op.execute("DROP TRIGGER trg__workspaces__on_update__set_updated ON workspaces")
  26. op.execute("DROP VIEW contents")
  27. # Set empty string on future non null fields
  28. for field_name in fields_names_to_empty_string:
  29. set_field_where_null(field_name)
  30. op.create_table('content',
  31. sa.Column('id', sa.Integer(), nullable=False),
  32. sa.PrimaryKeyConstraint('id', name=op.f('pk__content'))
  33. )
  34. # Create contents and reinit auto increment
  35. op.execute("INSERT INTO content (id) SELECT DISTINCT(content_id) FROM content_revisions;")
  36. op.execute("select setval('content_id_seq', (select max(id)+1 from content), false)")
  37. op.alter_column('content_revisions', 'created',
  38. existing_type=postgresql.TIMESTAMP(),
  39. nullable=False,
  40. server_default=sa.func.now())
  41. op.alter_column('content_revisions', 'file_mimetype',
  42. existing_type=sa.VARCHAR(length=255),
  43. nullable=False,
  44. server_default='')
  45. op.alter_column('content_revisions', 'file_name',
  46. existing_type=sa.VARCHAR(length=255),
  47. nullable=False,
  48. server_default='')
  49. op.alter_column('content_revisions', 'label',
  50. existing_type=sa.VARCHAR(length=1024),
  51. nullable=False,
  52. server_default='')
  53. op.alter_column('content_revisions', 'properties',
  54. existing_type=sa.TEXT(),
  55. nullable=False,
  56. server_default='')
  57. op.alter_column('content_revisions', 'revision_type',
  58. existing_type=sa.VARCHAR(length=32),
  59. nullable=False,
  60. server_default='')
  61. op.alter_column('content_revisions', 'status',
  62. existing_type=sa.VARCHAR(length=32),
  63. nullable=False,
  64. existing_server_default=sa.text("'new'::character varying"),
  65. server_default='')
  66. op.alter_column('content_revisions', 'updated',
  67. existing_type=postgresql.TIMESTAMP(),
  68. nullable=False,
  69. server_default=sa.func.now())
  70. op.create_foreign_key(op.f('fk__content_revisions__content_id__content'), 'content_revisions', 'content',
  71. ['content_id'], ['id'])
  72. op.create_foreign_key(op.f('fk__content_revisions__workspace_id__workspaces'), 'content_revisions', 'workspaces',
  73. ['workspace_id'], ['workspace_id'])
  74. op.create_foreign_key(op.f('fk__content_revisions__parent_id__content'), 'content_revisions', 'content',
  75. ['parent_id'], ['id'])
  76. op.alter_column('user_workspace', 'role',
  77. existing_type=sa.INTEGER(),
  78. nullable=False)
  79. op.drop_constraint('fk__user_workspace__user_id', 'user_workspace', type_='foreignkey')
  80. op.drop_constraint('fk__user_workspace__workspace_id', 'user_workspace', type_='foreignkey')
  81. op.create_foreign_key(op.f('fk__user_workspace__user_id__users'), 'user_workspace', 'users', ['user_id'],
  82. ['user_id'])
  83. op.create_foreign_key(op.f('fk__user_workspace__workspace_id__workspaces'), 'user_workspace', 'workspaces',
  84. ['workspace_id'], ['workspace_id'])
  85. op.alter_column('workspaces', 'created',
  86. existing_type=postgresql.TIMESTAMP(),
  87. nullable=False,
  88. server_default=sa.func.now())
  89. op.alter_column('workspaces', 'description',
  90. existing_type=sa.TEXT(),
  91. nullable=False,
  92. server_default='')
  93. op.alter_column('workspaces', 'label',
  94. existing_type=sa.VARCHAR(length=1024),
  95. nullable=False,
  96. server_default='')
  97. op.alter_column('workspaces', 'updated',
  98. existing_type=postgresql.TIMESTAMP(),
  99. nullable=False,
  100. server_default=sa.func.now())
  101. ### end Alembic commands ###
  102. def downgrade():
  103. ### commands auto generated by Alembic - please adjust! ###
  104. op.alter_column('workspaces', 'updated',
  105. existing_type=postgresql.TIMESTAMP(),
  106. nullable=True)
  107. op.alter_column('workspaces', 'label',
  108. existing_type=sa.VARCHAR(length=1024),
  109. nullable=True)
  110. op.alter_column('workspaces', 'description',
  111. existing_type=sa.TEXT(),
  112. nullable=True)
  113. op.alter_column('workspaces', 'created',
  114. existing_type=postgresql.TIMESTAMP(),
  115. nullable=True)
  116. op.drop_constraint(op.f('fk__user_workspace__workspace_id__workspaces'), 'user_workspace', type_='foreignkey')
  117. op.drop_constraint(op.f('fk__user_workspace__user_id__users'), 'user_workspace', type_='foreignkey')
  118. op.create_foreign_key('fk__user_workspace__workspace_id', 'user_workspace', 'workspaces', ['workspace_id'],
  119. ['workspace_id'], onupdate='CASCADE', ondelete='CASCADE')
  120. op.create_foreign_key('fk__user_workspace__user_id', 'user_workspace', 'users', ['user_id'], ['user_id'],
  121. onupdate='CASCADE', ondelete='CASCADE')
  122. op.alter_column('user_workspace', 'role',
  123. existing_type=sa.INTEGER(),
  124. nullable=True)
  125. op.drop_constraint(op.f('fk__content_revisions__parent_id__content'), 'content_revisions', type_='foreignkey')
  126. op.drop_constraint(op.f('fk__content_revisions__workspace_id__workspaces'), 'content_revisions', type_='foreignkey')
  127. op.drop_constraint(op.f('fk__content_revisions__content_id__content'), 'content_revisions', type_='foreignkey')
  128. op.alter_column('content_revisions', 'updated',
  129. existing_type=postgresql.TIMESTAMP(),
  130. nullable=True)
  131. op.alter_column('content_revisions', 'status',
  132. existing_type=sa.VARCHAR(length=32),
  133. nullable=True,
  134. existing_server_default=sa.text("'new'::character varying"))
  135. op.alter_column('content_revisions', 'revision_type',
  136. existing_type=sa.VARCHAR(length=32),
  137. nullable=True)
  138. op.alter_column('content_revisions', 'properties',
  139. existing_type=sa.TEXT(),
  140. nullable=True)
  141. op.alter_column('content_revisions', 'label',
  142. existing_type=sa.VARCHAR(length=1024),
  143. nullable=True)
  144. op.alter_column('content_revisions', 'file_name',
  145. existing_type=sa.VARCHAR(length=255),
  146. nullable=True)
  147. op.alter_column('content_revisions', 'file_mimetype',
  148. existing_type=sa.VARCHAR(length=255),
  149. nullable=True)
  150. op.alter_column('content_revisions', 'created',
  151. existing_type=postgresql.TIMESTAMP(),
  152. nullable=True)
  153. op.drop_table('content')
  154. for field_name in fields_names_to_empty_string:
  155. set_field_to_null_where_empty_string(field_name)
  156. op.execute("""
  157. CREATE VIEW contents AS
  158. SELECT DISTINCT ON (content_revisions.content_id) content_revisions.content_id, content_revisions.parent_id, content_revisions.type, content_revisions.created, content_revisions.updated, content_revisions.label, content_revisions.description, content_revisions.status, content_revisions.file_name, content_revisions.file_content, content_revisions.file_mimetype, content_revisions.owner_id, content_revisions.workspace_id, content_revisions.is_deleted, content_revisions.is_archived, content_revisions.properties, content_revisions.revision_type FROM content_revisions ORDER BY content_revisions.content_id, content_revisions.updated DESC, content_revisions.created DESC;
  159. CREATE TRIGGER trg__contents__on_insert__set_created BEFORE INSERT ON content_revisions FOR EACH ROW EXECUTE PROCEDURE set_created();
  160. CREATE TRIGGER trg__contents__on_update__set_updated BEFORE UPDATE ON content_revisions FOR EACH ROW EXECUTE PROCEDURE set_updated();
  161. CREATE TRIGGER trg__contents__on_update INSTEAD OF UPDATE ON contents FOR EACH ROW EXECUTE PROCEDURE update_node();
  162. CREATE TRIGGER trg__workspaces__on_insert__set_created BEFORE INSERT ON workspaces FOR EACH ROW EXECUTE PROCEDURE set_created();
  163. CREATE TRIGGER trg__workspaces__on_update__set_updated BEFORE UPDATE ON workspaces FOR EACH ROW EXECUTE PROCEDURE set_updated();
  164. """)
  165. ### end Alembic commands ###