Browse Source

some code refactoring

Nonolost 8 years ago
parent
commit
a67179b68f

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

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
 from wsgidav.compat import to_bytes
1
 from wsgidav.compat import to_bytes
11
 
2
 
12
 from tracim.lib.content import ContentApi
3
 from tracim.lib.content import ContentApi
15
 from wsgidav import util
6
 from wsgidav import util
16
 
7
 
17
 import transaction
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
 class HistoryType(object):
10
 class HistoryType(object):
29
     Deleted = 'deleted'
11
     Deleted = 'deleted'
31
     Standard = 'standard'
13
     Standard = 'standard'
32
     All = 'all'
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
         self._content = content
21
         self._content = content
44
         self._api = content_api
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
     def close(self):
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
         transaction.commit()
64
         transaction.commit()

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

6
 from os.path import normpath, dirname, basename
6
 from os.path import normpath, dirname, basename
7
 from tracim.lib.content import ContentApi
7
 from tracim.lib.content import ContentApi
8
 from tracim.lib.webdav import HistoryType
8
 from tracim.lib.webdav import HistoryType
9
-from tracim.lib.webdav import MyFileStream, MyFileStream2
9
+from tracim.lib.webdav import FileStream
10
 from tracim.lib.user import UserApi
10
 from tracim.lib.user import UserApi
11
 from tracim.lib.workspace import WorkspaceApi
11
 from tracim.lib.workspace import WorkspaceApi
12
 from wsgidav import compat
12
 from wsgidav import compat
26
     ContentType.Thread: OtherFile
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
 class Encapsuler(object):
29
 class Encapsuler(object):
52
     def __init__(self, type: str, api: ContentApi, content: Content):
30
     def __init__(self, type: str, api: ContentApi, content: Content):
53
         self._api = api
31
         self._api = api
69
 
47
 
70
         transaction.commit()
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
 class Root(DAVCollection):
51
 class Root(DAVCollection):
99
     def __init__(self, path: str, environ: dict):
52
     def __init__(self, path: str, environ: dict):
304
             environ=self.environ
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
     def createCollection(self, label: str) -> Folder:
268
     def createCollection(self, label: str) -> Folder:
311
 
269
 
687
     def createCollection(self, name):
645
     def createCollection(self, name):
688
         raise DAVError(HTTP_FORBIDDEN)
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
     def getMemberNames(self) -> [str]:
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
     def getMember(self, item_id) -> DAVCollection:
660
     def getMember(self, item_id) -> DAVCollection:
697
 
661
 
883
         histHTML = '<table class="table table-striped table-hover">'
847
         histHTML = '<table class="table table-striped table-hover">'
884
         for event in hist:
848
         for event in hist:
885
             if isinstance(event, VirtualEvent):
849
             if isinstance(event, VirtualEvent):
886
-                date = create_readable_date(event.created)
850
+                date = event.create_readable_date()
887
                 _LABELS = {
851
                 _LABELS = {
888
                     'archiving': 'Item archived',
852
                     'archiving': 'Item archived',
889
                     'content-comment': 'Item commented',
853
                     'content-comment': 'Item commented',
995
                             %s
959
                             %s
996
                         </div>
960
                         </div>
997
                     </div>
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
                 if t.owner.display_name not in participants:
964
                 if t.owner.display_name not in participants:
1001
                     participants[t.owner.display_name] = [1, t.created]
965
                     participants[t.owner.display_name] = [1, t.created]
1032
                     </div>
996
                     </div>
1033
                     ''' % (t.type.icon,
997
                     ''' % (t.type.icon,
1034
                            t.owner.display_name,
998
                            t.owner.display_name,
1035
-                           create_readable_date(t.created),
999
+                           t.create_readable_date(),
1036
                            label,
1000
                            label,
1037
                            '''<span><a href="#">(View revision)</a></span>''' if t.type.id == 'revision' else '')
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
         page = '''
1003
         page = '''
1049
 <html>
1004
 <html>
1050
 <head>
1005
 <head>
1055
 	<script type="text/javascript" src="/home/arnaud/Documents/css/script.js"></script>
1010
 	<script type="text/javascript" src="/home/arnaud/Documents/css/script.js"></script>
1056
 </head>
1011
 </head>
1057
 <body>
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
         <div class="title thread">
1014
         <div class="title thread">
1060
             <div class="title-text">
1015
             <div class="title-text">
1061
                 <i class="fa fa-comments-o title-icon thread"></i>
1016
                 <i class="fa fa-comments-o title-icon thread"></i>
1080
             %s
1035
             %s
1081
         </div>
1036
         </div>
1082
     </div>
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
 </body>
1038
 </body>
1088
 </html>
1039
 </html>
1089
         ''' % (content.label,
1040
         ''' % (content.label,
1091
                self._content.created.strftime("%B %d, %Y at %H:%m"),
1042
                self._content.created.strftime("%B %d, %Y at %H:%m"),
1092
                self._content.owner.display_name,
1043
                self._content.owner.display_name,
1093
                content.description,
1044
                content.description,
1094
-               disc,
1095
-               descP)
1045
+               disc)
1096
 
1046
 
1097
         return page
1047
         return page
1098
 
1048
 

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

1244
         if not delta_from_datetime:
1244
         if not delta_from_datetime:
1245
             delta_from_datetime = datetime.now()
1245
             delta_from_datetime = datetime.now()
1246
         return format_timedelta(delta_from_datetime - self.created,
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