Browse Source

some code refactoring

Nonolost 8 years ago
parent
commit
a67179b68f

+ 39 - 57
tracim/tracim/lib/webdav/__init__.py View File

@@ -1,12 +1,3 @@
1
-from sqlalchemy import create_engine
2
-from sqlalchemy.ext.declarative import declarative_base
3
-from sqlalchemy.orm import sessionmaker
4
-
5
-Base = declarative_base()
6
-
7
-some_engine = create_engine('postgresql://arnaud:wxc@localhost/template1')
8
-Session = sessionmaker(bind=some_engine)
9
-
10 1
 from wsgidav.compat import to_bytes
11 2
 
12 3
 from tracim.lib.content import ContentApi
@@ -15,15 +6,6 @@ from tracim.model.data import ActionDescription, ContentType, Content
15 6
 from wsgidav import util
16 7
 
17 8
 import transaction
18
-Base.metadata.create_all(some_engine)
19
-
20
-role = {
21
-    'NOT_APPLICABLE': 0,
22
-    'READER': 1,
23
-    'CONTRIBUTOR': 2,
24
-    'CONTENT_MANAGER': 4,
25
-    'WORKSPACE_MANAGER': 8
26
-}
27 9
 
28 10
 class HistoryType(object):
29 11
     Deleted = 'deleted'
@@ -31,52 +13,52 @@ class HistoryType(object):
31 13
     Standard = 'standard'
32 14
     All = 'all'
33 15
 
34
-# not_applicable : nothing
35
-# reader : can only read everything in designed workspace
36
-# contributor : + create / modify files
37
-# content_manager : + delete files / create directory / delete directory
38
-# workspace_manager : + create workspace / delete workspace
39 16
 
40
-class MyFileStream(object):
41
-    def __init__(self, content: Content, content_api: ContentApi, file_name: str=''):
42
-        self.buflist = []
17
+class FileStream(object):
18
+    def __init__(self, file_name: str, content: Content, content_api: ContentApi, new_file: bool):
19
+        self._buffer = []
20
+        self._file_name = file_name if file_name != '' else self._content.file_name
43 21
         self._content = content
44 22
         self._api = content_api
45 23
 
46
-        self._file_name = file_name if file_name != '' else self._content.file_name
47
-
48
-    def write(self, s):
49
-        self.buflist.append(s)
24
+    def beginWrite(self, contentType) -> FileStream:
25
+        return self
50 26
 
51
-    def close(self):
52
-        tot = to_bytes('')
53
-        for buf in self.buflist:
54
-            tot += buf
27
+    def endWrite(self, withErrors: bool):
28
+        pass
55 29
 
56
-        with new_revision(self._content):
57
-            self._api.update_file_data(self._content, self._file_name, util.guessMimeType(self._content.file_name), tot)
58
-            self._api.save(self._content, ActionDescription.EDITION)
59
-
60
-        transaction.commit()
61
-
62
-
63
-class MyFileStream2(object):
64
-    def __init__(self, file_name: str, content: Content, content_api: ContentApi):
65
-        self.buflist = []
66
-        self._file_name = file_name
67
-        self._content = content
68
-        self._api = content_api
69
-
70
-    def write(self, s):
71
-        self.buflist.append(s)
30
+    def write(self, s: str):
31
+        self._buffer.append(s)
72 32
 
73 33
     def close(self):
74
-        tot = to_bytes('')
75
-        for buf in self.buflist:
76
-            tot += buf
77
-
78
-        file = self._api.create(ContentType.File, self._content.workspace, self._content)
79
-        self._api.update_file_data(file, self._file_name, util.guessMimeType(self._file_name), tot)
80
-        self._api.save(file, ActionDescription.CREATION)
34
+        item_content = b''
35
+
36
+        for part in self._buffer:
37
+            item_content += part
38
+
39
+        if new_file:
40
+            file = self._api.create(
41
+                content_type=ContentType.File,
42
+                workspace=self._content.workspace,
43
+                parent=self._content
44
+                )
45
+
46
+            self._api.update_file_data(
47
+                file,
48
+                self._file_name,
49
+                util.guessMimeType(self._file_name),
50
+                item_content
51
+                )
52
+
53
+            self._api.save(file, ActionDescription.CREATION)
54
+
55
+        else:
56
+            with new_revision(self._content):
57
+                self._api.update_file_data(
58
+                    self._content,
59
+                    self._file_name,
60
+                    util.guessMimeType(self._content.file_name),
61
+                    item_content)
62
+                self._api.save(self._content, ActionDescription.EDITION)
81 63
 
82 64
         transaction.commit()

+ 22 - 72
tracim/tracim/lib/webdav/sql_resources.py View File

@@ -6,7 +6,7 @@ import transaction
6 6
 from os.path import normpath, dirname, basename
7 7
 from tracim.lib.content import ContentApi
8 8
 from tracim.lib.webdav import HistoryType
9
-from tracim.lib.webdav import MyFileStream, MyFileStream2
9
+from tracim.lib.webdav import FileStream
10 10
 from tracim.lib.user import UserApi
11 11
 from tracim.lib.workspace import WorkspaceApi
12 12
 from wsgidav import compat
@@ -26,28 +26,6 @@ _CONTENTS = {
26 26
     ContentType.Thread: OtherFile
27 27
 }
28 28
 
29
-def create_readable_date(some_date):
30
-    aff = ''
31
-
32
-    delta = datetime.now() - some_date
33
-
34
-    if delta.days > 0:
35
-        if delta.days >= 365:
36
-            aff = '%d year%s ago' % (delta.days/365, 's' if delta.days/365>=2 else '')
37
-        elif delta.days >= 30:
38
-            aff = '%d month%s ago' % (delta.days/30, 's' if delta.days/30>=2 else '')
39
-        else:
40
-            aff = '%d day%s ago' % (delta.days, 's' if delta.days>=2 else '')
41
-    else:
42
-        if delta.seconds < 60:
43
-            aff = '%d second%s ago' % (delta.seconds, 's' if delta.seconds>1 else '')
44
-        elif delta.seconds/60 < 60:
45
-            aff = '%d minute%s ago' % (delta.seconds/60, 's' if delta.seconds/60>=2 else '')
46
-        else:
47
-            aff = '%d hour%s ago' % (delta.seconds/3600, 's' if delta.seconds/3600>=2 else '')
48
-
49
-    return aff
50
-
51 29
 class Encapsuler(object):
52 30
     def __init__(self, type: str, api: ContentApi, content: Content):
53 31
         self._api = api
@@ -69,31 +47,6 @@ class Encapsuler(object):
69 47
 
70 48
         transaction.commit()
71 49
 
72
-class DummyResource(object):
73
-    def __init__(self, file_name: str, content: Content, content_api: ContentApi):
74
-        self._file_name = file_name
75
-        self._content = content
76
-        self._api = content_api
77
-
78
-    def beginWrite(self, contentType) -> MyFileStream2:
79
-        return MyFileStream2(file_name=self._file_name, content=self._content, content_api=self._api)
80
-
81
-    def endWrite(self, withErrors):
82
-        pass
83
-
84
-
85
-class DummyResource2(object):
86
-    def __init__(self, content: Content, content_api: ContentApi, file_name: str=''):
87
-        self._content = content
88
-        self._api = content_api
89
-        self._file_name = file_name
90
-
91
-    def beginWrite(self, contentType) -> MyFileStream:
92
-        return MyFileStream(content=self._content, content_api=self._api, file_name=self._file_name)
93
-
94
-    def endWrite(self, withErrors: bool):
95
-        pass
96
-
97 50
 
98 51
 class Root(DAVCollection):
99 52
     def __init__(self, path: str, environ: dict):
@@ -304,8 +257,13 @@ class Folder(DAVCollection):
304 257
             environ=self.environ
305 258
             )
306 259
 
307
-    def createEmptyResource(self, file_name: str) -> DummyResource:
308
-        return DummyResource(file_name=file_name, content=self._content, content_api=self._api)
260
+    def createEmptyResource(self, file_name: str) -> FileStream:
261
+        return FileStream(
262
+            file_name=file_name,
263
+            content=self._content,
264
+            content_api=self._api,
265
+            new_file=True
266
+            )
309 267
 
310 268
     def createCollection(self, label: str) -> Folder:
311 269
 
@@ -687,11 +645,17 @@ class HistoryFileFolder(HistoryFolder):
687 645
     def createCollection(self, name):
688 646
         raise DAVError(HTTP_FORBIDDEN)
689 647
 
690
-    def createEmptyResource(self, name) -> DummyResource2:
691
-        return DummyResource2(content=self._content, content_api=self._api, file_name=name)
648
+    def createEmptyResource(self, name) -> FileStream:
649
+        return FileStream(
650
+            content=self._content,
651
+            content_api=self._api,
652
+            file_name=name,
653
+            new_file=False
654
+            )
692 655
 
693 656
     def getMemberNames(self) -> [str]:
694
-        return [content.revision_id for content in self._content.revisions]
657
+        return [content.revision_id for content in self._content.revisions \
658
+                if content.revision_type in [ActionDescription.CREATION, ActionDescription.EDITION, ActionDescription.REVISION]]
695 659
 
696 660
     def getMember(self, item_id) -> DAVCollection:
697 661
 
@@ -883,7 +847,7 @@ class OtherFile(File):
883 847
         histHTML = '<table class="table table-striped table-hover">'
884 848
         for event in hist:
885 849
             if isinstance(event, VirtualEvent):
886
-                date = create_readable_date(event.created)
850
+                date = event.create_readable_date()
887 851
                 _LABELS = {
888 852
                     'archiving': 'Item archived',
889 853
                     'content-comment': 'Item commented',
@@ -995,7 +959,7 @@ class OtherFile(File):
995 959
                             %s
996 960
                         </div>
997 961
                     </div>
998
-                    ''' % (t.owner.display_name, create_readable_date(t.created), t.description)
962
+                    ''' % (t.owner.display_name, t.create_readable_date(), t.description)
999 963
 
1000 964
                 if t.owner.display_name not in participants:
1001 965
                     participants[t.owner.display_name] = [1, t.created]
@@ -1032,19 +996,10 @@ class OtherFile(File):
1032 996
                     </div>
1033 997
                     ''' % (t.type.icon,
1034 998
                            t.owner.display_name,
1035
-                           create_readable_date(t.created),
999
+                           t.create_readable_date(),
1036 1000
                            label,
1037 1001
                            '''<span><a href="#">(View revision)</a></span>''' if t.type.id == 'revision' else '')
1038 1002
 
1039
-        descP = ''
1040
-        for name, infos in participants.items():
1041
-            descP = '''
1042
-            <div><b>%s</b> - %d message%s - last %s</div>
1043
-            ''' % (name,
1044
-                 infos[0],
1045
-                 's' if infos[0]>1 else '',
1046
-                   create_readable_date(infos[1]))
1047
-
1048 1003
         page = '''
1049 1004
 <html>
1050 1005
 <head>
@@ -1055,7 +1010,7 @@ class OtherFile(File):
1055 1010
 	<script type="text/javascript" src="/home/arnaud/Documents/css/script.js"></script>
1056 1011
 </head>
1057 1012
 <body>
1058
-    <div id="left" class="col-lg-8 col-md-12 col-sm-12 col-xs-12">
1013
+    <div id="left" class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
1059 1014
         <div class="title thread">
1060 1015
             <div class="title-text">
1061 1016
                 <i class="fa fa-comments-o title-icon thread"></i>
@@ -1080,10 +1035,6 @@ class OtherFile(File):
1080 1035
             %s
1081 1036
         </div>
1082 1037
     </div>
1083
-    <div id="right" class="col-lg-4 col-md-12 col-sm-12 col-xs-12">
1084
-        <h4>Participants</h4>
1085
-        %s
1086
-    </div>
1087 1038
 </body>
1088 1039
 </html>
1089 1040
         ''' % (content.label,
@@ -1091,8 +1042,7 @@ class OtherFile(File):
1091 1042
                self._content.created.strftime("%B %d, %Y at %H:%m"),
1092 1043
                self._content.owner.display_name,
1093 1044
                content.description,
1094
-               disc,
1095
-               descP)
1045
+               disc)
1096 1046
 
1097 1047
         return page
1098 1048
 

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

@@ -1244,4 +1244,29 @@ class VirtualEvent(object):
1244 1244
         if not delta_from_datetime:
1245 1245
             delta_from_datetime = datetime.now()
1246 1246
         return format_timedelta(delta_from_datetime - self.created,
1247
-                                locale=tg.i18n.get_lang()[0])
1247
+                                locale=tg.i18n.get_lang()[0])
1248
+
1249
+    def create_readable_date(self, delta_from_datetime:datetime=None):
1250
+        aff = ''
1251
+
1252
+        if not delta_from_datetime:
1253
+            delta_from_datetime = datetime.now()
1254
+
1255
+        delta = delta_from_datetime - self.created
1256
+        
1257
+        if delta.days > 0:
1258
+            if delta.days >= 365:
1259
+                aff = '%d year%s ago' % (delta.days/365, 's' if delta.days/365>=2 else '')
1260
+            elif delta.days >= 30:
1261
+                aff = '%d month%s ago' % (delta.days/30, 's' if delta.days/30>=2 else '')
1262
+            else:
1263
+                aff = '%d day%s ago' % (delta.days, 's' if delta.days>=2 else '')
1264
+        else:
1265
+            if delta.seconds < 60:
1266
+                aff = '%d second%s ago' % (delta.seconds, 's' if delta.seconds>1 else '')
1267
+            elif delta.seconds/60 < 60:
1268
+                aff = '%d minute%s ago' % (delta.seconds/60, 's' if delta.seconds/60>=2 else '')
1269
+            else:
1270
+                aff = '%d hour%s ago' % (delta.seconds/3600, 's' if delta.seconds/3600>=2 else '')
1271
+
1272
+        return aff