Browse Source

Adds fs storage in addition to db storage for files

Adrien Panay 8 years ago
parent
commit
84b8f98bfe

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

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
     "unicode-slugify==0.1.3",
52
     "unicode-slugify==0.1.3",
53
     "pytz==2014.7",
53
     "pytz==2014.7",
54
     'rq==0.7.1',
54
     'rq==0.7.1',
55
+    'filedepot>=0.5.0',
55
     ]
56
     ]
56
 
57
 
57
 setup(
58
 setup(

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

38
 from tracim.model.data import ActionDescription
38
 from tracim.model.data import ActionDescription
39
 from tracim.model.data import ContentType
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
 base_config = TracimAppConfig()
47
 base_config = TracimAppConfig()
42
 base_config.renderers = []
48
 base_config.renderers = []
43
 base_config.use_toscawidgets = False
49
 base_config.use_toscawidgets = False

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

14
 from sqlalchemy.orm.exc import NoResultFound
14
 from sqlalchemy.orm.exc import NoResultFound
15
 from tg import abort
15
 from tg import abort
16
 
16
 
17
+from depot.manager import DepotManager
18
+
17
 from tracim.controllers import TIMRestController
19
 from tracim.controllers import TIMRestController
18
 from tracim.controllers import StandardController
20
 from tracim.controllers import StandardController
19
 from tracim.controllers import TIMRestPathContextSetup
21
 from tracim.controllers import TIMRestPathContextSetup
249
         file_name = get_valid_header_file_name(revision_to_send.file_name)
251
         file_name = get_valid_header_file_name(revision_to_send.file_name)
250
         tg.response.headers['Content-Disposition'] = \
252
         tg.response.headers['Content-Disposition'] = \
251
             str('attachment; filename="{}"'.format(file_name))
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
     def get_all_fake(self, context_workspace: Workspace, context_folder: Content):
257
     def get_all_fake(self, context_workspace: Workspace, context_folder: Content):

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

850
         item.file_name = new_filename
850
         item.file_name = new_filename
851
         item.file_mimetype = new_mimetype
851
         item.file_mimetype = new_mimetype
852
         item.file_content = new_file_content
852
         item.file_content = new_file_content
853
+        item.revision.depot_file_uid = new_file_content
853
         item.revision_type = ActionDescription.REVISION
854
         item.revision_type = ActionDescription.REVISION
854
         return item
855
         return item
855
 
856
 

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

25
 from sqlalchemy.types import Text
25
 from sqlalchemy.types import Text
26
 from sqlalchemy.types import Unicode
26
 from sqlalchemy.types import Unicode
27
 
27
 
28
+from depot.manager import DepotManager
29
+from depot.fields.sqlalchemy import UploadedFileField
30
+
28
 from tracim.lib.utils import lazy_ugettext as l_
31
 from tracim.lib.utils import lazy_ugettext as l_
29
 from tracim.lib.exception import ContentRevisionUpdateError
32
 from tracim.lib.exception import ContentRevisionUpdateError
30
 from tracim.model import DeclarativeBase, RevisionsIntegrity
33
 from tracim.model import DeclarativeBase, RevisionsIntegrity
544
     )
547
     )
545
     file_mimetype = Column(Unicode(255),  unique=False, nullable=False, default='')
548
     file_mimetype = Column(Unicode(255),  unique=False, nullable=False, default='')
546
     file_content = deferred(Column(LargeBinary(), unique=False, nullable=True))
549
     file_content = deferred(Column(LargeBinary(), unique=False, nullable=True))
550
+    depot_file_uid = Column(UploadedFileField, unique=False, nullable=True)
547
     properties = Column('properties', Text(), unique=False, nullable=False, default='')
551
     properties = Column('properties', Text(), unique=False, nullable=False, default='')
548
 
552
 
549
     type = Column(Unicode(32), unique=False, nullable=False)
553
     type = Column(Unicode(32), unique=False, nullable=False)
626
             setattr(new_rev, column_name, column_value)
630
             setattr(new_rev, column_name, column_value)
627
 
631
 
628
         new_rev.updated = datetime.utcnow()
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
         return new_rev
638
         return new_rev
631
 
639
 
1364
             else:
1372
             else:
1365
                 aff = '%d hour%s ago' % (delta.seconds/3600, 's' if delta.seconds/3600>=2 else '')
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
 import tg
12
 import tg
13
 from tg.i18n import ugettext as _
13
 from tg.i18n import ugettext as _
14
 from tg.util import LazyString
14
 from tg.util import LazyString
15
+
16
+from depot.manager import DepotManager
17
+
15
 from tracim.lib.base import logger
18
 from tracim.lib.base import logger
16
 from tracim.lib.user import CurrentUserGetterApi
19
 from tracim.lib.user import CurrentUserGetterApi
17
 from tracim.model.auth import Profile
20
 from tracim.model.auth import Profile
411
             result.label = content.label
414
             result.label = content.label
412
             result['file'] = DictLikeClass(
415
             result['file'] = DictLikeClass(
413
                 name = data_container.file_name,
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
                 mimetype = data_container.file_mimetype)
418
                 mimetype = data_container.file_mimetype)
416
         return result
419
         return result
417
 
420