Browse Source

Adds fs storage in addition to db storage for files

Adrien Panay 7 years ago
parent
commit
84b8f98bfe

+ 23 - 0
tracim/migration/versions/69fb10c3d6f0_files_on_disk.py View File

@@ -0,0 +1,23 @@
1
+"""files on disk
2
+
3
+Revision ID: 69fb10c3d6f0
4
+Revises: c1cea4bbae16
5
+Create Date: 2017-06-07 17:25:47.306472
6
+
7
+"""
8
+
9
+# revision identifiers, used by Alembic.
10
+revision = '69fb10c3d6f0'
11
+down_revision = 'c1cea4bbae16'
12
+
13
+from alembic import op
14
+import sqlalchemy as sa
15
+from depot.fields.sqlalchemy import UploadedFileField
16
+
17
+
18
+def upgrade():
19
+    op.add_column('content_revisions', sa.Column('depot_file_uid', UploadedFileField))
20
+
21
+
22
+def downgrade():
23
+    op.drop_column('content_revisions', 'depot_file_uid')

+ 1 - 0
tracim/setup.py View File

@@ -52,6 +52,7 @@ install_requires=[
52 52
     "unicode-slugify==0.1.3",
53 53
     "pytz==2014.7",
54 54
     'rq==0.7.1',
55
+    'filedepot>=0.5.0',
55 56
     ]
56 57
 
57 58
 setup(

+ 6 - 0
tracim/tracim/config/app_cfg.py View File

@@ -38,6 +38,12 @@ from tracim.lib.daemons import WsgiDavDaemon
38 38
 from tracim.model.data import ActionDescription
39 39
 from tracim.model.data import ContentType
40 40
 
41
+from depot.manager import DepotManager
42
+DepotManager.configure(
43
+    'default',
44
+    {'depot.storage_path': '/tmp/depot_storage_path/'}
45
+)
46
+
41 47
 base_config = TracimAppConfig()
42 48
 base_config.renderers = []
43 49
 base_config.use_toscawidgets = False

+ 3 - 1
tracim/tracim/controllers/content.py View File

@@ -14,6 +14,8 @@ from tg.predicates import not_anonymous
14 14
 from sqlalchemy.orm.exc import NoResultFound
15 15
 from tg import abort
16 16
 
17
+from depot.manager import DepotManager
18
+
17 19
 from tracim.controllers import TIMRestController
18 20
 from tracim.controllers import StandardController
19 21
 from tracim.controllers import TIMRestPathContextSetup
@@ -249,7 +251,7 @@ class UserWorkspaceFolderFileRestController(TIMWorkspaceContentRestController):
249 251
         file_name = get_valid_header_file_name(revision_to_send.file_name)
250 252
         tg.response.headers['Content-Disposition'] = \
251 253
             str('attachment; filename="{}"'.format(file_name))
252
-        return revision_to_send.file_content
254
+        return DepotManager.get().get(revision_to_send.depot_file_uid)
253 255
 
254 256
 
255 257
     def get_all_fake(self, context_workspace: Workspace, context_folder: Content):

+ 1 - 0
tracim/tracim/lib/content.py View File

@@ -850,6 +850,7 @@ class ContentApi(object):
850 850
         item.file_name = new_filename
851 851
         item.file_mimetype = new_mimetype
852 852
         item.file_content = new_file_content
853
+        item.revision.depot_file_uid = new_file_content
853 854
         item.revision_type = ActionDescription.REVISION
854 855
         return item
855 856
 

+ 9 - 1
tracim/tracim/model/data.py View File

@@ -25,6 +25,9 @@ from sqlalchemy.types import LargeBinary
25 25
 from sqlalchemy.types import Text
26 26
 from sqlalchemy.types import Unicode
27 27
 
28
+from depot.manager import DepotManager
29
+from depot.fields.sqlalchemy import UploadedFileField
30
+
28 31
 from tracim.lib.utils import lazy_ugettext as l_
29 32
 from tracim.lib.exception import ContentRevisionUpdateError
30 33
 from tracim.model import DeclarativeBase, RevisionsIntegrity
@@ -544,6 +547,7 @@ class ContentRevisionRO(DeclarativeBase):
544 547
     )
545 548
     file_mimetype = Column(Unicode(255),  unique=False, nullable=False, default='')
546 549
     file_content = deferred(Column(LargeBinary(), unique=False, nullable=True))
550
+    depot_file_uid = Column(UploadedFileField, unique=False, nullable=True)
547 551
     properties = Column('properties', Text(), unique=False, nullable=False, default='')
548 552
 
549 553
     type = Column(Unicode(32), unique=False, nullable=False)
@@ -626,6 +630,10 @@ class ContentRevisionRO(DeclarativeBase):
626 630
             setattr(new_rev, column_name, column_value)
627 631
 
628 632
         new_rev.updated = datetime.utcnow()
633
+        # TODO APY tweaks here depot_file_uid
634
+        # import pudb; pu.db
635
+        # new_rev.depot_file_uid = DepotManager.get().get(revision.depot_file_uid)
636
+        new_rev.depot_file_uid = revision.file_content
629 637
 
630 638
         return new_rev
631 639
 
@@ -1364,4 +1372,4 @@ class VirtualEvent(object):
1364 1372
             else:
1365 1373
                 aff = '%d hour%s ago' % (delta.seconds/3600, 's' if delta.seconds/3600>=2 else '')
1366 1374
 
1367
-        return aff
1375
+        return aff

+ 4 - 1
tracim/tracim/model/serializers.py View File

@@ -12,6 +12,9 @@ from datetime import datetime
12 12
 import tg
13 13
 from tg.i18n import ugettext as _
14 14
 from tg.util import LazyString
15
+
16
+from depot.manager import DepotManager
17
+
15 18
 from tracim.lib.base import logger
16 19
 from tracim.lib.user import CurrentUserGetterApi
17 20
 from tracim.model.auth import Profile
@@ -411,7 +414,7 @@ def serialize_node_for_page(content: Content, context: Context):
411 414
             result.label = content.label
412 415
             result['file'] = DictLikeClass(
413 416
                 name = data_container.file_name,
414
-                size = len(data_container.file_content),
417
+                size = DepotManager.get().get(data_container.revision.depot_file_uid).content_length,
415 418
                 mimetype = data_container.file_mimetype)
416 419
         return result
417 420