Browse Source

Migrates all files also on disk.

Adrien Panay 7 years ago
parent
commit
f86cf1afea
1 changed files with 151 additions and 0 deletions
  1. 151 0
      tracim/migration/versions/913efdf409e5_all_files_also_on_disk.py

+ 151 - 0
tracim/migration/versions/913efdf409e5_all_files_also_on_disk.py View File

@@ -0,0 +1,151 @@
1
+"""all files also on disk.
2
+
3
+Revision ID: 913efdf409e5
4
+Revises: 69fb10c3d6f0
5
+Create Date: 2017-07-12 15:44:20.568447
6
+
7
+"""
8
+
9
+import shutil
10
+
11
+from alembic import op
12
+from depot.fields.sqlalchemy import UploadedFileField
13
+from depot.fields.upload import UploadedFile
14
+from depot.io.utils import FileIntent
15
+from depot.manager import DepotManager
16
+import sqlalchemy as sa
17
+# from sqlalchemy.ext.declarative import declarative_base
18
+# from sqlalchemy.orm import sessionmaker
19
+
20
+# revision identifiers, used by Alembic.
21
+revision = '913efdf409e5'
22
+down_revision = '69fb10c3d6f0'
23
+
24
+
25
+# Session = sessionmaker()
26
+# DeclarativeBase = declarative_base()
27
+
28
+DepotManager.configure(
29
+    'default', {
30
+    'depot.storage_path': 'depot/',
31
+})
32
+# DepotManager.set_default('default')
33
+
34
+revision_helper = sa.Table(
35
+    'content_revisions',
36
+    sa.MetaData(),
37
+    sa.Column('revision_id', sa.Integer, primary_key=True),
38
+    sa.Column('label', sa.String(1024), nullable=False),
39
+    sa.Column('file_extension', sa.String(255), nullable=False),
40
+    sa.Column('file_mimetype', sa.String(255), nullable=False),
41
+    sa.Column('file_content', sa.LargeBinary),
42
+    sa.Column('depot_file', UploadedFileField, nullable=True),
43
+    sa.Column('type', sa.String(32), nullable=False),
44
+)
45
+
46
+
47
+# class RevisionForMigration(DeclarativeBase):
48
+#     """Revision of Content for this migration."""
49
+
50
+#     __tablename__ = 'content_revisions'
51
+
52
+#     revision_id = Column(Integer, primary_key=True)
53
+
54
+#     label = Column(Unicode(1024), unique=False, nullable=False)
55
+#     description = Column(Text(), unique=False, nullable=False, default='')
56
+#     file_extension = Column(
57
+#         Unicode(255),
58
+#         unique=False,
59
+#         nullable=False,
60
+#         server_default='',
61
+#     )
62
+#     file_mimetype = Column(Unicode(255),  unique=False, nullable=False, default='')
63
+#     file_content = deferred(Column(LargeBinary(), unique=False, nullable=True))
64
+#     depot_file = Column(UploadedFileField, unique=False, nullable=True)
65
+#     properties = Column('properties', Text(), unique=False, nullable=False, default='')
66
+#     type = Column(Unicode(32), unique=False, nullable=False)
67
+#     status = Column(Unicode(32), unique=False, nullable=False, default=ContentStatus.OPEN)
68
+#     created = Column(DateTime, unique=False, nullable=False, default=datetime.utcnow)
69
+#     updated = Column(DateTime, unique=False, nullable=False, default=datetime.utcnow)
70
+#     is_deleted = Column(Boolean, unique=False, nullable=False, default=False)
71
+#     is_archived = Column(Boolean, unique=False, nullable=False, default=False)
72
+#     is_temporary = Column(Boolean, unique=False, nullable=False, default=False)
73
+#     revision_type = Column(Unicode(32), unique=False, nullable=False, default='')
74
+
75
+#     def file_name(self) -> str:
76
+#         return '{0}{1}'.format(
77
+#             self.revision.label,
78
+#             self.revision.file_extension,
79
+#         )
80
+
81
+
82
+# def fill_depot_file_fields()
83
+#     """fills depot file fields when they are null."""
84
+#     connection = op.get_bind()
85
+#     session = Session(bind=connection)
86
+
87
+#     all_files_wo_depot = session.query(RevisionForMigration) \
88
+#         .filter_by(type='file', depot_file=None) \
89
+#         .all()
90
+#     for one_file_wo_depot in all_files_wo_depot:
91
+#         # with tempfile.TemporaryFile() as tmp_file:
92
+#         #     tmp_file.write(one_file_wo_depot.content)
93
+#         #     one_file_wo_depot.depot_file = tmp_file
94
+#         one_file_wo_depot.depot_file = (
95
+#             one_file_wo_depot.content,
96
+#             one_file_wo_depot.file_name(),
97
+#             one_file_wo_depot.file_mimetype,
98
+#         )
99
+#     session.commit()
100
+
101
+
102
+def upgrade():
103
+    """Sets depot file for file typed revisions."""
104
+    import pudb; pu.db
105
+
106
+    # fill_depot_file_fields()
107
+
108
+    connection = op.get_bind()
109
+    depot = DepotManager.get()
110
+
111
+    file_revision_query = revision_helper.select() \
112
+        .where(revision_helper.c.type == 'file')
113
+    all_file_revisions = connection.execute(file_revision_query)
114
+    for one_revision in all_file_revisions:
115
+        one_revision_filename = '{0}{1}'.format(
116
+            one_revision.label,
117
+            one_revision.file_extension,
118
+        )
119
+        if not one_revision.depot_file:
120
+            depot_file_intent = FileIntent(
121
+                one_revision.file_content,
122
+                one_revision_filename,
123
+                one_revision.file_mimetype,
124
+            )
125
+            depot_file_field = UploadedFile(depot_file_intent)
126
+            one_revision_update = revision_helper.update() \
127
+                .where(revision_helper.c.type == 'file') \
128
+                .where(revision_helper.c.revision_id == one_revision.revision_id) \
129
+                .values(depot_file=depot_file_field) \
130
+                .return_defaults()
131
+            result = connection.execute(one_revision_update)
132
+        else:
133
+            # TODO - A.P - makes the field in DB to be updated as well
134
+            depot_file_uid = depot.replace(
135
+                one_revision.depot_file.file_id,
136
+                one_revision.file_content,
137
+                one_revision_filename,
138
+                one_revision.file_mimetype,
139
+            )
140
+
141
+
142
+def downgrade():
143
+    """Resets depot file for file typed revisions."""
144
+    connection = op.get_bind()
145
+    file_revision_query = revision_helper.update() \
146
+        .where(revision_helper.c.type == 'file') \
147
+        .where(revision_helper.c.depot_file.isnot(None)) \
148
+        .values(depot_file=None) \
149
+        .return_defaults()
150
+    result = connection.execute(file_revision_query)
151
+    shutil.rmtree('depot/', ignore_errors=True)