Browse Source

- fixes javascript notations (not working on Chrome)

Damien Accorsi 11 years ago
parent
commit
cdf3058861

+ 14 - 11
pboard/pboard/controllers/api.py View File

41
 
41
 
42
     menu = pcam.PODApiMenuController()
42
     menu = pcam.PODApiMenuController()
43
 
43
 
44
+    def on_off_to_boolean(self, on_or_off):
45
+        return True if on_or_off=='on' else False
46
+
44
     @expose()
47
     @expose()
45
-    def create_event(self, parent_id=None, data_label='', data_datetime=None, data_content='', data_reminder_datetime=None, add_reminder=False, **kw):
48
+    def create_event(self, parent_id=None, data_label='', data_datetime=None, data_content='', data_reminder_datetime=None, add_reminder=False, inherit_rights='off', **kw):
46
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
49
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
47
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
50
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
48
-      
49
-      loNewNode = loApiController.createNode(int(parent_id))
51
+
52
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(inherit_rights))
50
       loNewNode.node_type     = pmd.PBNodeType.Event
53
       loNewNode.node_type     = pmd.PBNodeType.Event
51
       loNewNode.data_label    = data_label
54
       loNewNode.data_label    = data_label
52
       loNewNode.data_content  = data_content
55
       loNewNode.data_content  = data_content
58
       redirect(lurl('/document/%i'%(loNewNode.parent_id)))
61
       redirect(lurl('/document/%i'%(loNewNode.parent_id)))
59
 
62
 
60
     @expose()
63
     @expose()
61
-    def create_contact(self, parent_id=None, data_label='', data_content='', **kw):
64
+    def create_contact(self, parent_id=None, data_label='', data_content='', inherit_rights='off', **kw):
62
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
65
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
63
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
66
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
64
       
67
       
65
-      loNewNode = loApiController.createNode(int(parent_id))
68
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(inherit_rights))
66
       loNewNode.node_type     = pmd.PBNodeType.Contact
69
       loNewNode.node_type     = pmd.PBNodeType.Contact
67
       loNewNode.data_label    = data_label
70
       loNewNode.data_label    = data_label
68
       loNewNode.data_content  = data_content
71
       loNewNode.data_content  = data_content
75
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
78
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
76
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
79
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
77
 
80
 
78
-      loNewNode = loApiController.createNode(int(parent_id))
81
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(is_shared))
79
       loNewNode.node_type     = pmd.PBNodeType.Comment
82
       loNewNode.node_type     = pmd.PBNodeType.Comment
80
       loNewNode.data_label    = data_label
83
       loNewNode.data_label    = data_label
81
       loNewNode.data_content  = data_content
84
       loNewNode.data_content  = data_content
86
       redirect(lurl('/document/%i'%(loNewNode.parent_id)))
89
       redirect(lurl('/document/%i'%(loNewNode.parent_id)))
87
 
90
 
88
     @expose()
91
     @expose()
89
-    def create_file(self, parent_id=None, data_label='', data_content='', data_file=None, **kw):
92
+    def create_file(self, parent_id=None, data_label='', data_content='', data_file=None, inherit_rights='off', **kw):
90
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
93
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
91
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
94
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
92
       
95
       
93
-      loNewNode = loApiController.createNode(int(parent_id))
96
+      loNewNode = loApiController.createNode(int(parent_id), self.on_off_to_boolean(inherit_rights))
94
       loNewNode.node_type     = pmd.PBNodeType.File
97
       loNewNode.node_type     = pmd.PBNodeType.File
95
       loNewNode.data_label    = data_label
98
       loNewNode.data_label    = data_label
96
       loNewNode.data_content  = data_content
99
       loNewNode.data_content  = data_content
194
       redirect(lurl('/document/%s'%(node_id)))
197
       redirect(lurl('/document/%s'%(node_id)))
195
 
198
 
196
     @expose()
199
     @expose()
197
-    def create_document(self, parent_id=None, data_label='', data_content=''):
200
+    def create_document(self, parent_id=None, data_label='', data_content='', inherit_rights='off'):
198
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
201
       loCurrentUser   = pld.PODStaticController.getCurrentUser()
199
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
202
       loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
200
 
203
 
203
         loParent = loApiController.getNode(parent_id)
206
         loParent = loApiController.getNode(parent_id)
204
         lsNodeName = 'Subdocument of (%s)' % loParent.data_label
207
         lsNodeName = 'Subdocument of (%s)' % loParent.data_label
205
 
208
 
206
-      loNewNode = loApiController.createDummyNode(parent_id)
209
+      loNewNode = loApiController.createDummyNode(parent_id, self.on_off_to_boolean(inherit_rights))
207
       loNewNode.data_label   = lsNodeName
210
       loNewNode.data_label   = lsNodeName
208
       loNewNode.data_content = 'insert content...'
211
       loNewNode.data_content = 'insert content...'
209
 
212
 
301
       redirect(lurl('/document/%s#tab-comments'%(loNode._oParent.node_id)))
304
       redirect(lurl('/document/%s#tab-comments'%(loNode._oParent.node_id)))
302
 
305
 
303
     @expose()
306
     @expose()
304
-    @require(can_read())
307
+    @require(can_write())
305
     def set_access_management(self, node_id, is_shared='off', read=[0], write=[0]):
308
     def set_access_management(self, node_id, is_shared='off', read=[0], write=[0]):
306
 
309
 
307
       llReadAccessGroupIds = [int(liGroupId) for liGroupId in read]
310
       llReadAccessGroupIds = [int(liGroupId) for liGroupId in read]

+ 1 - 1
pboard/pboard/controllers/apimenu.py View File

44
             print("Node not found: {0}".format(current_node_id))
44
             print("Node not found: {0}".format(current_node_id))
45
 
45
 
46
         allowed_nodes = api_controller.getListOfAllowedNodes()
46
         allowed_nodes = api_controller.getListOfAllowedNodes()
47
-        initial_menu_structure = api_controller.buildTreeListForMenu(current_node, pmd.PBNodeStatus.getVisibleIdsList(), allowed_nodes)
47
+        initial_menu_structure = api_controller.buildTreeListForMenu(current_node, allowed_nodes)
48
 
48
 
49
         return initial_menu_structure
49
         return initial_menu_structure
50
 
50
 

+ 46 - 31
pboard/pboard/lib/dbapi.py View File

94
     return self._iUserIdFilteringList
94
     return self._iUserIdFilteringList
95
 
95
 
96
 
96
 
97
-  def createNode(self, parent_id=0):
97
+  def createNode(self, parent_id=0, inherit_rights=True):
98
     loNode          = pbmd.PBNode()
98
     loNode          = pbmd.PBNode()
99
     loNode.owner_id = self._iCurrentUserId
99
     loNode.owner_id = self._iCurrentUserId
100
     if int(parent_id)!=0:
100
     if int(parent_id)!=0:
101
-      loNode.parent_id = parent_id
102
-    parent_rights = DBSession.query(pbma.Rights).filter(pbma.Rights.node_id==parent_id).all()
103
-    loNode.rights = parent_rights
104
-    loNode.rights = [pbma.Rights(group_id=r.group_id, rights=r.rights) for r in parent_rights]
101
+        loNode.parent_id = parent_id
102
+
103
+    if inherit_rights:
104
+        parent_node = DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.node_id==parent_id).one()
105
+        self.copy_rights(parent_node, loNode)
106
+
105
     DBSession.add(loNode)
107
     DBSession.add(loNode)
108
+
106
     return loNode
109
     return loNode
107
-  
108
-  def createDummyNode(self, parent_id):
109
-    loNewNode = self.createNode(parent_id)
110
+
111
+  def copy_rights(self, from_node: pbmd.PBNode, to_node: pbmd.PBNode, copy_also_is_shared=True):
112
+    """
113
+    copy rights from first node to second one
114
+    """
115
+    for parent_right in from_node._lRights:
116
+        new_right = self.createRight()
117
+        new_right.group_id = parent_right.group_id
118
+        new_right.rights = parent_right.rights
119
+        to_node._lRights.append(new_right)
120
+
121
+    if copy_also_is_shared:
122
+        to_node.is_shared = from_node.is_shared
123
+
124
+  def createDummyNode(self, parent_id, inherit_rights=True):
125
+    loNewNode = self.createNode(parent_id, inherit_rights)
110
     loNewNode.data_label   = ''
126
     loNewNode.data_label   = ''
111
     loNewNode.data_content = ''
127
     loNewNode.data_content = ''
112
     return loNewNode
128
     return loNewNode
171
             FROM
187
             FROM
172
                 pod_group_node AS pgn
188
                 pod_group_node AS pgn
173
                 join pod_user_group AS pug ON pug.group_id = pgn.group_id
189
                 join pod_user_group AS pug ON pug.group_id = pgn.group_id
174
-                join pod_nodes AS pn ON pgn.node_id=pn.node_id
190
+                join pod_nodes AS pn ON pgn.node_id=pn.node_id AND pn.is_shared='t'
175
             WHERE
191
             WHERE
176
                 pn.node_type='data'
192
                 pn.node_type='data'
177
                 AND pn.node_status NOT IN ('deleted', 'closed')
193
                 AND pn.node_status NOT IN ('deleted', 'closed')
178
                 AND pn.node_id=pgn.node_id
194
                 AND pn.node_id=pgn.node_id
179
                 AND pgn.rights > 0
195
                 AND pgn.rights > 0
180
-                AND pug.user_id = 3
196
+                AND pug.user_id = :owner_id
181
 
197
 
182
             UNION
198
             UNION
183
                 SELECT
199
                 SELECT
201
                 FROM
217
                 FROM
202
                     pod_nodes AS pn
218
                     pod_nodes AS pn
203
                 WHERE
219
                 WHERE
204
-                    pn.node_type='data'
220
+                    pn.node_type = 'data'
205
                     AND pn.node_status NOT IN ('deleted', 'closed')
221
                     AND pn.node_status NOT IN ('deleted', 'closed')
206
-                    AND pn.owner_id=:owner_id
222
+                    AND pn.owner_id = :owner_id
207
 
223
 
208
             ORDER BY node_id ASC
224
             ORDER BY node_id ASC
209
         """
225
         """
286
 
302
 
287
 
303
 
288
 
304
 
289
-  def buildTreeListForMenu(self, poCurrentNode: pbmd.PBNode, plViewableStatusId: [], plAllowedNodes: [pbmd.PBNode]) -> [pbmd.NodeTreeItem]:
305
+  def buildTreeListForMenu(self, current_node: pbmd.PBNode, allowed_nodes: [pbmd.PBNode]) -> [pbmd.NodeTreeItem]:
290
     # The algorithm is:
306
     # The algorithm is:
291
     # 1. build an intermediate tree containing only current node and parent path
307
     # 1. build an intermediate tree containing only current node and parent path
292
     #    + complete it with sibling at each level (except root)
308
     #    + complete it with sibling at each level (except root)
298
     previous_tree_item = None
314
     previous_tree_item = None
299
     tmp_children_nodes = []
315
     tmp_children_nodes = []
300
 
316
 
301
-    print("============================> ",poCurrentNode)
302
-    if poCurrentNode is not None:
303
-        breadcrumb_nodes = poCurrentNode.getBreadCrumbNodes()
304
-        print("====================> NODES", breadcrumb_nodes)
305
-        breadcrumb_nodes.append(poCurrentNode) # by default the current node is not included
317
+    if current_node is not None:
318
+        breadcrumb_nodes = current_node.getBreadCrumbNodes()
319
+        breadcrumb_nodes.append(current_node) # by default the current node is not included
306
 
320
 
307
         for breadcrumb_node in reversed(breadcrumb_nodes):
321
         for breadcrumb_node in reversed(breadcrumb_nodes):
308
             if previous_tree_item is None:
322
             if previous_tree_item is None:
309
                 # First iteration. We add all current_node children
323
                 # First iteration. We add all current_node children
310
                 for child_node in breadcrumb_node.getChildren():
324
                 for child_node in breadcrumb_node.getChildren():
311
-                    child_item = pbmd.NodeTreeItem(child_node, [])
312
-                    assert(isinstance(child_item, pbmd.NodeTreeItem))
313
-                    tmp_children_nodes.append(child_item)
325
+                    if child_node in allowed_nodes:
326
+                        child_item = pbmd.NodeTreeItem(child_node, [])
327
+                        tmp_children_nodes.append(child_item)
328
+
314
                 previous_tree_item = pbmd.NodeTreeItem(breadcrumb_node, tmp_children_nodes)
329
                 previous_tree_item = pbmd.NodeTreeItem(breadcrumb_node, tmp_children_nodes)
330
+
315
             else:
331
             else:
316
                 tmp_children_nodes = []
332
                 tmp_children_nodes = []
317
                 for child_node in breadcrumb_node.getChildren():
333
                 for child_node in breadcrumb_node.getChildren():
318
-                    if child_node == previous_tree_item.node:
319
-                        assert(isinstance(previous_tree_item, pbmd.NodeTreeItem))
320
-                        tmp_children_nodes.append(previous_tree_item)
321
-                    else:
322
-                        sibling_node = pbmd.NodeTreeItem(child_node, [])
323
-                        assert(isinstance(sibling_node, pbmd.NodeTreeItem))
324
-                        tmp_children_nodes.append(sibling_node)
334
+                    if child_node in allowed_nodes:
335
+                        if child_node == previous_tree_item.node:
336
+                            tmp_children_nodes.append(previous_tree_item)
337
+                        else:
338
+                            sibling_node = pbmd.NodeTreeItem(child_node, [])
339
+                            tmp_children_nodes.append(sibling_node)
325
 
340
 
326
                 previous_tree_item = pbmd.NodeTreeItem(breadcrumb_node, tmp_children_nodes)
341
                 previous_tree_item = pbmd.NodeTreeItem(breadcrumb_node, tmp_children_nodes)
327
 
342
 
328
-    for node in plAllowedNodes:
343
+    for node in allowed_nodes:
329
         # This part of the algorithm insert root items
344
         # This part of the algorithm insert root items
330
         if node.parent_id==0 or node.parent_id is None:
345
         if node.parent_id==0 or node.parent_id is None:
331
             if previous_tree_item is not None and node == previous_tree_item.node:
346
             if previous_tree_item is not None and node == previous_tree_item.node:
337
             # Try to add nodes shared with me but with a parent which is not shared
352
             # Try to add nodes shared with me but with a parent which is not shared
338
             if node.owner_id!=self._iCurrentUserId:
353
             if node.owner_id!=self._iCurrentUserId:
339
                 # this is a node shared with me
354
                 # this is a node shared with me
340
-                if node._oParent!=None and node._oParent not in plAllowedNodes:
355
+                if node._oParent!=None and node._oParent not in allowed_nodes:
341
                     # the node is shared but not the parent => put it in the root
356
                     # the node is shared but not the parent => put it in the root
342
-                    node_tree.append(pbmd.NodeTreeItem(node))
357
+                    node_tree.append(pbmd.NodeTreeItem(node, []))
343
 
358
 
344
 
359
 
345
     return node_tree
360
     return node_tree

+ 4 - 1
pboard/pboard/public/javascript/pod.js View File

1
-  function generateStringId(charNb = 32, allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") {
1
+  function generateStringId(charNb, allowedChars) {
2
+    if (typeof charNb === 'undefined') { charNb = 32; }
3
+    if (typeof allowedChars === 'undefined') { allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; }
4
+  
2
     var text = "";
5
     var text = "";
3
 
6
 
4
     for( var i=0; i < charNb; i++ ) {
7
     for( var i=0; i < charNb; i++ ) {

+ 27 - 19
pboard/pboard/templates/document-widgets-tabs.mak View File

119
           <div id="document-share-people-selector">
119
           <div id="document-share-people-selector">
120
             <p>${_('Select read and write access for each group or people...')}</p>
120
             <p>${_('Select read and write access for each group or people...')}</p>
121
             <script>
121
             <script>
122
-            function updateRights(psUserId, piNewValue = -1) {
122
+            function updateRights(psUserId, piNewValue) {
123
+              if (typeof piNewValue === 'undefined') { piNewValue = -1; }
123
               var ACCESS_UNDEFINED = -1;
124
               var ACCESS_UNDEFINED = -1;
124
               var ACCESS_NONE = 0;
125
               var ACCESS_NONE = 0;
125
               var ACCESS_READ = 1;
126
               var ACCESS_READ = 1;
485
   % endfor
486
   % endfor
486
 </%def>
487
 </%def>
487
 
488
 
488
-<%def name="CommentTabContent(poNode)">
489
+<%def name="CommentTabContent(current_user, poNode)">
489
   <h4>${_('Comment thread')}</h4>
490
   <h4>${_('Comment thread')}</h4>
490
   
491
   
491
   % if len(poNode.getComments())<=0:
492
   % if len(poNode.getComments())<=0:
501
     % endif
502
     % endif
502
     <div>
503
     <div>
503
       % for comment in poNode.getComments():
504
       % for comment in poNode.getComments():
504
-        <p>
505
-          <a href="${tg.url('/api/toggle_share_status', dict(node_id=comment.node_id))}">
506
-            % if comment.is_shared:
507
-              <span class="label label-warning" title="${_('Shared comment. Click to make private.')}">${h.ICON.Shared|n}</span>
508
-            % else:
509
-              <span class="label label-info" title="${_('Private comment. Click to share.')}">${h.ICON.Private|n}</span>
510
-            % endif
511
-          </a>
512
-          <strong>${comment._oOwner.display_name}</strong>
513
-          <i class="pull-right">
514
-            The ${comment.getFormattedDate(comment.updated_at)} 
515
-            at ${comment.getFormattedTime(comment.updated_at)}
516
-          </i>
517
-          <br/>
518
-          ${comment.data_content|n}
519
-          <hr style="border-top: 1px dotted #ccc; margin: 0;"/>
520
-        </p>
505
+         % if comment.is_shared or comment.owner_id==current_user.user_id:
506
+##
507
+## FIXME - 2014-05-29
508
+## We do not check specific rights on comment but on document instead
509
+## In the future full-API architecture, it should be fixed
510
+##
511
+          <p>
512
+            <a href="${tg.url('/api/toggle_share_status', dict(node_id=comment.node_id))}">
513
+              % if comment.is_shared:
514
+                <span class="label label-warning" title="${_('Shared comment. Click to make private.')}">${h.ICON.Shared|n}</span>
515
+              % else:
516
+                <span class="label label-info" title="${_('Private comment. Click to share.')}">${h.ICON.Private|n}</span>
517
+              % endif
518
+            </a>
519
+            <strong>${comment._oOwner.display_name}</strong>
520
+            <i class="pull-right">
521
+              The ${comment.getFormattedDate(comment.updated_at)} 
522
+              at ${comment.getFormattedTime(comment.updated_at)}
523
+            </i>
524
+            <br/>
525
+            ${comment.data_content|n}
526
+            <hr style="border-top: 1px dotted #ccc; margin: 0;"/>
527
+          </p>
528
+        % endif
521
       % endfor
529
       % endfor
522
     </div>
530
     </div>
523
   % endif
531
   % endif

+ 53 - 13
pboard/pboard/templates/document-widgets.mak View File

125
   </div>
125
   </div>
126
 </%def>
126
 </%def>
127
 
127
 
128
-<%def name="BreadCrumb(poNode)">
128
+<%def name="BreadCrumb(poNode, allowed_nodes)">
129
   <ul class="breadcrumb span12">
129
   <ul class="breadcrumb span12">
130
     <li>
130
     <li>
131
       <span class="divider">/</span>
131
       <span class="divider">/</span>
133
     </li>
133
     </li>
134
     % if poNode!=None:
134
     % if poNode!=None:
135
       % for breadcrumb_node in poNode.getBreadCrumbNodes():
135
       % for breadcrumb_node in poNode.getBreadCrumbNodes():
136
-      <li>
137
-        <span class="divider">/</span>
138
-        <a href="${tg.url('/document/%s'%(breadcrumb_node.node_id))}">${breadcrumb_node.getTruncatedLabel(30)}</a>
139
-      </li>
136
+##
137
+## HACK - D.A - 2014-05-29
138
+## Here we remove forbidden nodes from the breadcrumb
139
+## This should not be done in the templates!
140
+##
141
+        % if breadcrumb_node in allowed_nodes:
142
+          <li>
143
+            <span class="divider">/</span>
144
+            <a href="${tg.url('/document/%s'%(breadcrumb_node.node_id))}">${breadcrumb_node.getTruncatedLabel(30)}</a>
145
+          </li>
146
+        % endif
140
       % endfor
147
       % endfor
141
       <li class="active">
148
       <li class="active">
142
         <span class="divider">/</span>
149
         <span class="divider">/</span>
275
   </div>
282
   </div>
276
 </%def>
283
 </%def>
277
 
284
 
278
-<%def name="DocumentEditModalDialog(piParentNodeId, poNode, psPostUrl, psModalId, psTitle)">
285
+<%def name="DocumentEditModalDialog(poParentNode, poNode, psPostUrl, psModalId, psTitle)">
279
   <div
286
   <div
280
     id="${psModalId}"
287
     id="${psModalId}"
281
     class="modal hide"
288
     class="modal hide"
298
           % if poNode!=None:
305
           % if poNode!=None:
299
             <input type="hidden" name="node_id" value="${poNode.node_id}"/>
306
             <input type="hidden" name="node_id" value="${poNode.node_id}"/>
300
           % endif
307
           % endif
301
-          <input type="hidden" name="parent_id" value="${piParentNodeId if piParentNodeId else 0}"/>
308
+          <input type="hidden" name="parent_id" value="${poParentNode.node_id if poParentNode else 0}"/>
302
           
309
           
303
           <input type="hidden" name="data_content" id="${psModalId}-textarea" />
310
           <input type="hidden" name="data_content" id="${psModalId}-textarea" />
304
           <input
311
           <input
312
         <div>
319
         <div>
313
           ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '')}
320
           ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '')}
314
         </div>
321
         </div>
322
+        % if poParentNode and poParentNode.is_shared:
323
+          <p>
324
+            <input type="checkbox" name="inherit_rights" checked="checked"/> 
325
+            ${_('Share:')}
326
+            <span class="pod-grey">${_('if checked, then copy share properties from current item')}</span>
327
+          </p>
328
+        % endif
315
       </form>
329
       </form>
316
 
330
 
317
 ## MODAL BODY [END]
331
 ## MODAL BODY [END]
338
 </%def>
352
 </%def>
339
 
353
 
340
 
354
 
341
-<%def name="FileEditModalDialog(piParentNodeId, poNode, psPostUrl, psModalId, psTitle)">
355
+<%def name="FileEditModalDialog(poParentNode, poNode, psPostUrl, psModalId, psTitle)">
342
   <div
356
   <div
343
     id="${psModalId}"
357
     id="${psModalId}"
344
     class="modal hide"
358
     class="modal hide"
360
           % if poNode!=None:
374
           % if poNode!=None:
361
             <input type="hidden" name="node_id" value="${poNode.node_id}"/>
375
             <input type="hidden" name="node_id" value="${poNode.node_id}"/>
362
           % endif
376
           % endif
363
-          <input type="hidden" name="parent_id" value="${piParentNodeId if piParentNodeId else 0}"/>
377
+          <input type="hidden" name="parent_id" value="${poParentNode.node_id if poParentNode else 0}"/>
364
           <input type="hidden" name="data_content" id="${psModalId}-textarea" />
378
           <input type="hidden" name="data_content" id="${psModalId}-textarea" />
365
         <div>
379
         <div>
366
           <label>
380
           <label>
383
           <label>${_('File description (optionnal)')}</label>
397
           <label>${_('File description (optionnal)')}</label>
384
           ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '', '')}
398
           ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '', '')}
385
         </div>
399
         </div>
400
+        % if poParentNode and poParentNode.is_shared:
401
+          <p>
402
+            <input type="checkbox" name="inherit_rights" checked="checked"/>
403
+            ${_('Share:')}
404
+            <span class="pod-grey">${_('if checked, then copy share properties from current item')}</span>
405
+          </p>
406
+        % endif
386
       </form>
407
       </form>
387
     ## MODAL BODY [END]
408
     ## MODAL BODY [END]
388
     </div>
409
     </div>
407
   </div>
428
   </div>
408
 </%def>
429
 </%def>
409
 
430
 
410
-<%def name="EventEditModalDialog(piParentNodeId, poNode, psPostUrl, psModalId, psTitle)">
431
+<%def name="EventEditModalDialog(poParentNode, poNode, psPostUrl, psModalId, psTitle)">
411
   <div
432
   <div
412
     id="${psModalId}"
433
     id="${psModalId}"
413
     class="modal hide"
434
     class="modal hide"
428
     <div class="modal-body">
449
     <div class="modal-body">
429
     ###### MODAL BODY
450
     ###### MODAL BODY
430
       <form id='${psModalId}-form' action='${psPostUrl}' method='POST'>
451
       <form id='${psModalId}-form' action='${psPostUrl}' method='POST'>
431
-        <input type="hidden" name='parent_id' value='${current_node.node_id}'/>
452
+        <input type="hidden" name='parent_id' value="${poParentNode.node_id if poParentNode else 0}"/>
432
         <fieldset>
453
         <fieldset>
433
           <label>
454
           <label>
434
             ${_('Event')}
455
             ${_('Event')}
448
               ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '', 'boldanditalic')}
469
               ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '', 'boldanditalic')}
449
             </div>
470
             </div>
450
           </label>
471
           </label>
472
+          % if poParentNode and poParentNode.is_shared:
473
+            <label>
474
+              <p>
475
+                <input type="checkbox" name="inherit_rights" checked="checked"/>
476
+                ${_('Share:')}
477
+                <span class="pod-grey">${_('if checked, then copy share properties from current item')}</span>
478
+              </p>
479
+            <label>
480
+          % endif
451
         </fieldset>
481
         </fieldset>
452
       </form>
482
       </form>
453
     ###### MODAL BODY [END]
483
     ###### MODAL BODY [END]
473
   </div>
503
   </div>
474
 </%def>
504
 </%def>
475
 
505
 
476
-<%def name="ContactEditModalDialog(piParentNodeId, poNode, psPostUrl, psModalId, psTitle)">
506
+<%def name="ContactEditModalDialog(poParentNode, poNode, psPostUrl, psModalId, psTitle)">
477
   <div
507
   <div
478
     id="${psModalId}"
508
     id="${psModalId}"
479
     class="modal hide"
509
     class="modal hide"
495
           % if poNode!=None:
525
           % if poNode!=None:
496
             <input type="hidden" name="node_id" value="${poNode.node_id}"/>
526
             <input type="hidden" name="node_id" value="${poNode.node_id}"/>
497
           % endif
527
           % endif
498
-          <input type="hidden" name="parent_id" value="${piParentNodeId if piParentNodeId else 0}"/>
528
+          <input type="hidden" name="parent_id" value="${poParentNode.node_id if poParentNode else 0}"/>
499
           <input type="hidden" name="data_content" id="${psModalId}-textarea" />
529
           <input type="hidden" name="data_content" id="${psModalId}-textarea" />
500
         <div>
530
         <div>
501
           <label>
531
           <label>
513
           <label>${_('Address, phone, email, company...')}</label>
543
           <label>${_('Address, phone, email, company...')}</label>
514
           ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '', 'boldanditalic')}
544
           ${POD.RichTextEditor(psModalId+'-textarea-wysiwyg', poNode.data_content if poNode!=None else '', 'boldanditalic')}
515
         </div>
545
         </div>
546
+        % if poParentNode and poParentNode.is_shared:
547
+          <label>
548
+            <p>
549
+              <input type="checkbox" name="inherit_rights" checked="checked"/>
550
+              ${_('Share:')}
551
+              <span class="pod-grey">${_('if checked, then copy share properties from current item')}</span>
552
+            </p>
553
+          <label>
554
+        % endif
555
+
516
       </form>
556
       </form>
517
     ## MODAL BODY [END]
557
     ## MODAL BODY [END]
518
     </div>
558
     </div>

+ 6 - 6
pboard/pboard/templates/document.mak View File

65
 ## HERE COMES THE BREADCRUMB
65
 ## HERE COMES THE BREADCRUMB
66
 ##
66
 ##
67
   <div class="row">
67
   <div class="row">
68
-    ${DOC.BreadCrumb(current_node)}
68
+    ${DOC.BreadCrumb(current_node, allowed_nodes)}
69
   </div>
69
   </div>
70
 
70
 
71
   <div class="row">
71
   <div class="row">
150
           ##
150
           ##
151
           ## HERE WE INCLUDE ALL MODAL DIALOG WHICH WILL BE ACCESSIBLE THROUGH TABS OR MENU
151
           ## HERE WE INCLUDE ALL MODAL DIALOG WHICH WILL BE ACCESSIBLE THROUGH TABS OR MENU
152
           ##
152
           ##
153
-          ${DOC.DocumentEditModalDialog(current_node.node_id, None, tg.url('/api/create_document'), h.ID.AddDocumentModalForm(current_node), _('New Sub-document'))}
154
-          ${DOC.EventEditModalDialog(current_node.node_id, None, tg.url('/api/create_event'), h.ID.AddEventModalForm(current_node), _('Add an event'))}
155
-          ${DOC.ContactEditModalDialog(current_node.node_id, None, tg.url('/api/create_contact'), h.ID.AddContactModalForm(current_node), _('Add a new contact'))}
156
-          ${DOC.FileEditModalDialog(current_node.node_id, None, tg.url('/api/create_file'), h.ID.AddFileModalForm(current_node), _('Add a new file'))}
153
+          ${DOC.DocumentEditModalDialog(current_node, None, tg.url('/api/create_document'), h.ID.AddDocumentModalForm(current_node), _('New Sub-document'))}
154
+          ${DOC.EventEditModalDialog(current_node, None, tg.url('/api/create_event'), h.ID.AddEventModalForm(current_node), _('Add an event'))}
155
+          ${DOC.ContactEditModalDialog(current_node, None, tg.url('/api/create_contact'), h.ID.AddContactModalForm(current_node), _('Add a new contact'))}
156
+          ${DOC.FileEditModalDialog(current_node, None, tg.url('/api/create_file'), h.ID.AddFileModalForm(current_node), _('Add a new file'))}
157
           ${DOC.MoveDocumentModalDialog(current_node, tg.url('/api/set_parent_node'), h.ID.MoveDocumentModalForm(current_node), _('Move the document'))}
157
           ${DOC.MoveDocumentModalDialog(current_node, tg.url('/api/set_parent_node'), h.ID.MoveDocumentModalForm(current_node), _('Move the document'))}
158
 
158
 
159
           <div class="tabbable">
159
           <div class="tabbable">
175
               <div class="tab-pane" id="subdocuments">${DOCTABS.SubdocumentContent(current_node)}</div>
175
               <div class="tab-pane" id="subdocuments">${DOCTABS.SubdocumentContent(current_node)}</div>
176
               <div class="tab-pane active" id="events">${DOCTABS.EventTabContent(current_node)}</div>
176
               <div class="tab-pane active" id="events">${DOCTABS.EventTabContent(current_node)}</div>
177
               <div class="tab-pane" id="contacts">${DOCTABS.ContactTabContent(current_node)}</div>
177
               <div class="tab-pane" id="contacts">${DOCTABS.ContactTabContent(current_node)}</div>
178
-              <div class="tab-pane" id="comments">${DOCTABS.CommentTabContent(current_node)}</div>
178
+              <div class="tab-pane" id="comments">${DOCTABS.CommentTabContent(current_user, current_node)}</div>
179
               <div class="tab-pane" id="files">${DOCTABS.FileTabContent(current_node)}</div>
179
               <div class="tab-pane" id="files">${DOCTABS.FileTabContent(current_node)}</div>
180
               <div class="tab-pane" id="history">${DOCTABS.HistoryTabContent(current_node)}</div>
180
               <div class="tab-pane" id="history">${DOCTABS.HistoryTabContent(current_node)}</div>
181
               <div class="tab-pane" id="accessmanagement">${DOCTABS.AccessManagementTab(current_node)}</div>
181
               <div class="tab-pane" id="accessmanagement">${DOCTABS.AccessManagementTab(current_node)}</div>