esdrt.content 1.74.5__zip → 1.75.0__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/PKG-INFO +11 -1
  2. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/docs/HISTORY.txt +10 -0
  3. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/statisticsview.py +24 -24
  4. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/inboxreviewfolderview.pt +22 -3
  5. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/reviewfolderview.pt +25 -2
  6. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/ldap_utils.py +2 -2
  7. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/utils.py +11 -3
  8. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/reviewfolder.py +65 -0
  9. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/subscriptionconfiguration.py +6 -0
  10. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/templates/subscriptionconfigurationreview.pt +34 -27
  11. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utils.py +18 -0
  12. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/PKG-INFO +11 -1
  13. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/SOURCES.txt +0 -1
  14. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/setup.py +1 -1
  15. esdrt.content-1.74.5/esdrt/.DS_Store +0 -0
  16. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/.editorconfig +0 -0
  17. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/.gitignore +0 -0
  18. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/MANIFEST.in +0 -0
  19. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/Makefile +0 -0
  20. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/README.txt +0 -0
  21. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/bootstrap.py +0 -0
  22. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/buildout.cfg +0 -0
  23. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/docs/INSTALL.txt +0 -0
  24. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/docs/LICENSE.GPL +0 -0
  25. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/docs/LICENSE.txt +0 -0
  26. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/__init__.py +0 -0
  27. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/INTEGRATION.txt +0 -0
  28. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/__init__.py +0 -0
  29. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/adapters/__init__.py +0 -0
  30. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/adapters/configure.zcml +0 -0
  31. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/adapters/reference_number.py +0 -0
  32. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/__init__.py +0 -0
  33. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/attachmentdownload.py +0 -0
  34. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/carryover.py +0 -0
  35. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/comments.py +0 -0
  36. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/configure.zcml +0 -0
  37. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/copyfiles.py +0 -0
  38. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/get_sample_xls.py +0 -0
  39. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/inbox_sections.py +0 -0
  40. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/interfaces.py +0 -0
  41. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/macros.py +0 -0
  42. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/observation_import.py +0 -0
  43. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/statechange.py +0 -0
  44. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/tableau.py +0 -0
  45. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/assign_answerer_form.pt +0 -0
  46. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/assign_conclusion_reviewer_form.pt +0 -0
  47. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/assign_counterpart_form.pt +0 -0
  48. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/carryover.pt +0 -0
  49. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/finalisedfolderview.pt +0 -0
  50. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/import_observation.pt +0 -0
  51. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/inbox2reviewfolderview.pt +0 -0
  52. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/macros.pt +0 -0
  53. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/multi_input.pt +0 -0
  54. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/reviewfolder_get_table.pt +0 -0
  55. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/statisticsview.pt +0 -0
  56. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/browser/templates/tableau_dashboard.pt +0 -0
  57. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/comment.py +0 -0
  58. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/commentanswer.py +0 -0
  59. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/commentextender.py +0 -0
  60. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/conclusion.py +0 -0
  61. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/conclusionsphase2.py +0 -0
  62. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/configure.zcml +0 -0
  63. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/constants.py +0 -0
  64. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/converter.py +0 -0
  65. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/crf_code_matching.py +0 -0
  66. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/crons.py +0 -0
  67. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/esdrtfile.py +0 -0
  68. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/indexers.py +0 -0
  69. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/locales/README.txt +0 -0
  70. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/__init__.py +0 -0
  71. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/answer_acknowledged.pt +0 -0
  72. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/answer_acknowledged.py +0 -0
  73. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/answer_to_msexperts.pt +0 -0
  74. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/answer_to_msexperts.py +0 -0
  75. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/conclusion_to_comment.pt +0 -0
  76. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/conclusion_to_comment.py +0 -0
  77. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/configure.zcml +0 -0
  78. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalisation_denied.pt +0 -0
  79. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalisation_denied.py +0 -0
  80. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalisation_request.pt +0 -0
  81. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalisation_request.py +0 -0
  82. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalised.pt +0 -0
  83. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalised.py +0 -0
  84. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalised_ms_remarks.pt +0 -0
  85. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_finalised_rev_msg.pt +0 -0
  86. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_to_phase2.pt +0 -0
  87. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_to_phase2.py +0 -0
  88. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/observation_to_phase2_rev_msg.pt +0 -0
  89. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_answered.py +0 -0
  90. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_answered_lr_msg.pt +0 -0
  91. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_answered_msexperts_msg.pt +0 -0
  92. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_answered_rev_msg.pt +0 -0
  93. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_ready_for_approval.pt +0 -0
  94. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_ready_for_approval.py +0 -0
  95. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_to_counterpart.pt +0 -0
  96. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_to_counterpart.py +0 -0
  97. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_to_ms.pt +0 -0
  98. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_to_ms.py +0 -0
  99. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/notifications/question_to_ms_rev_msg.pt +0 -0
  100. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/observation.py +0 -0
  101. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/overrides.zcml +0 -0
  102. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/patches.py +0 -0
  103. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/patches.zcml +0 -0
  104. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/permissions.zcml +0 -0
  105. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/catalog.xml +0 -0
  106. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/cssregistry.xml +0 -0
  107. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/diff_tool.xml +0 -0
  108. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrt.content_various.txt +0 -0
  109. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/conclusion_phase2_reasons.csv +0 -0
  110. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/conclusion_reasons.csv +0 -0
  111. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/crf_code.csv +0 -0
  112. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/eea_member_states.csv +0 -0
  113. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/fuel.csv +0 -0
  114. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/gas.csv +0 -0
  115. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/ghg_source_category.csv +0 -0
  116. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/ghg_source_sectors.csv +0 -0
  117. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/highlight.csv +0 -0
  118. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/esdrtvocabularies/parameter.csv +0 -0
  119. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/jsregistry.xml +0 -0
  120. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/metadata.xml +0 -0
  121. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/registry.xml +0 -0
  122. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/rolemap.xml +0 -0
  123. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/sharing.xml +0 -0
  124. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/tinymce.xml +0 -0
  125. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/Comment.xml +0 -0
  126. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/CommentAnswer.xml +0 -0
  127. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/Conclusion.xml +0 -0
  128. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/ConclusionsPhase2.xml +0 -0
  129. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/ESDRTFile.xml +0 -0
  130. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/Folder.xml +0 -0
  131. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/Observation.xml +0 -0
  132. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/Question.xml +0 -0
  133. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types/ReviewFolder.xml +0 -0
  134. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/types.xml +0 -0
  135. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-answer-workflow/definition.xml +0 -0
  136. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-comment-workflow/definition.xml +0 -0
  137. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-conclusion-phase2-workflow/definition.xml +0 -0
  138. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-conclusion-workflow/definition.xml +0 -0
  139. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-file-workflow/definition.xml +0 -0
  140. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-question-review-workflow/definition.xml +0 -0
  141. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-review-workflow/definition.xml +0 -0
  142. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows/esd-reviewtool-folder-workflow/definition.xml +0 -0
  143. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles/default/workflows.xml +0 -0
  144. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/profiles.zcml +0 -0
  145. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/question.py +0 -0
  146. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/roles/__init__.py +0 -0
  147. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/roles/configure.zcml +0 -0
  148. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/roles/localroles.py +0 -0
  149. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/roles/localrolesubscriber.py +0 -0
  150. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/setuphandlers.py +0 -0
  151. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/chosen-sprite.png +0 -0
  152. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/chosen-sprite@2x.png +0 -0
  153. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/chosen.jquery.js +0 -0
  154. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/chosen.min.css +0 -0
  155. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/cookies.js +0 -0
  156. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/eea-tabs.css +0 -0
  157. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/eea-tabs.js +0 -0
  158. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/esdrt.content.css +0 -0
  159. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/flags.css +0 -0
  160. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/flags.png +0 -0
  161. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/inbox_view.css +0 -0
  162. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/inbox_view.js +0 -0
  163. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/moment.min.js +0 -0
  164. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/phase-1.png +0 -0
  165. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/phase-12.png +0 -0
  166. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/phase-2.png +0 -0
  167. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/static/superlink.jquery.js +0 -0
  168. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/subscribers.py +0 -0
  169. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/subscriptions/__init__.py +0 -0
  170. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/subscriptions/configure.zcml +0 -0
  171. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/subscriptions/dexterity.py +0 -0
  172. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/subscriptions/interfaces.py +0 -0
  173. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/templates/diffedview.pt +0 -0
  174. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/templates/observationview.pt +0 -0
  175. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/templates/subscriptionconfiguration.pt +0 -0
  176. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/tests.py +0 -0
  177. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/timeit.py +0 -0
  178. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/10_11.py +0 -0
  179. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/11_12.py +0 -0
  180. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/12_13.py +0 -0
  181. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/13_14.py +0 -0
  182. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/14_15.py +0 -0
  183. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/15_16.py +0 -0
  184. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/16_17.py +0 -0
  185. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/17_18.py +0 -0
  186. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/18_19.py +0 -0
  187. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/19_20.py +0 -0
  188. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/1_2.py +0 -0
  189. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/20_21.py +0 -0
  190. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/21_22.py +0 -0
  191. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/22_23.py +0 -0
  192. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/23_24.py +0 -0
  193. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/24_25.py +0 -0
  194. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/25_26.py +0 -0
  195. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/26_27.py +0 -0
  196. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/27_28.py +0 -0
  197. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/28_29.py +0 -0
  198. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/29_30.py +0 -0
  199. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/2_3.py +0 -0
  200. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/30_31.py +0 -0
  201. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/31_32.py +0 -0
  202. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/32_33.py +0 -0
  203. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/33_34.py +0 -0
  204. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/34_35.py +0 -0
  205. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/35_36.py +0 -0
  206. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/36_37.py +0 -0
  207. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/37_38.py +0 -0
  208. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/38_39.py +0 -0
  209. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/39_40.py +0 -0
  210. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/3_4.py +0 -0
  211. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/40_41.py +0 -0
  212. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/41_42.py +0 -0
  213. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/42_43.py +0 -0
  214. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/43_44.py +0 -0
  215. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/44_45.py +0 -0
  216. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/45_46.py +0 -0
  217. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/46_47.py +0 -0
  218. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/48_49.py +0 -0
  219. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/49_50.py +0 -0
  220. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/4_5.py +0 -0
  221. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/50_51.py +0 -0
  222. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/51_52.py +0 -0
  223. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/52_53.py +0 -0
  224. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/54_55.py +0 -0
  225. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/55_56.py +0 -0
  226. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/56_57.py +0 -0
  227. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/57_58.py +0 -0
  228. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/58_59.py +0 -0
  229. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/59_60.py +0 -0
  230. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/5_6.py +0 -0
  231. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/60_61.py +0 -0
  232. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/63_64.py +0 -0
  233. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/64_65.py +0 -0
  234. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/65_66.py +0 -0
  235. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/6_7.py +0 -0
  236. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/7_8.py +0 -0
  237. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/8_9.py +0 -0
  238. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/9_10.py +0 -0
  239. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/__init__.py +0 -0
  240. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/configure.zcml +0 -0
  241. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/portal_workflow.py +0 -0
  242. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/upgrades/templates/portal_workflow_apply_and_reindex.pt +0 -0
  243. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utilities/__init__.py +0 -0
  244. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utilities/configure.zcml +0 -0
  245. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utilities/interfaces.py +0 -0
  246. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utilities/ldap_utils.py +0 -0
  247. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utilities/ms_user.py +0 -0
  248. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/utilities/roles.py +0 -0
  249. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/vocabularies.py +0 -0
  250. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt/content/vocabularies.zcml +0 -0
  251. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/dependency_links.txt +0 -0
  252. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/entry_points.txt +0 -0
  253. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/namespace_packages.txt +0 -0
  254. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/not-zip-safe +0 -0
  255. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/requires.txt +0 -0
  256. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/esdrt.content.egg-info/top_level.txt +0 -0
  257. {esdrt.content-1.74.5 → esdrt.content-1.75.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: esdrt.content
3
- Version: 1.74.5
3
+ Version: 1.75.0
4
4
  Summary: Content-types for ESD Review Tool
5
5
  Home-page: https://github.com/eea/esdrt.content/
6
6
  Author: Mikel Larreategi
@@ -15,6 +15,16 @@ Description: Introduction
15
15
  Changelog
16
16
  =========
17
17
 
18
+ 1.75.0 (2024-12-05)
19
+ -------------------
20
+ - Task: #277396 - Only notify author SE.
21
+ [batradav]
22
+
23
+ 1.74.6 (2024-07-01)
24
+ -------------------
25
+ - Task: #272010 - ESD EMRT extract error
26
+ [batradav]
27
+
18
28
  1.74.5 (2024-02-16)
19
29
  -------------------
20
30
  - Task: #265134 - Adding flags to the export function
@@ -1,6 +1,16 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 1.75.0 (2024-12-05)
5
+ -------------------
6
+ - Task: #277396 - Only notify author SE.
7
+ [batradav]
8
+
9
+ 1.74.6 (2024-07-01)
10
+ -------------------
11
+ - Task: #272010 - ESD EMRT extract error
12
+ [batradav]
13
+
4
14
  1.74.5 (2024-02-16)
5
15
  -------------------
6
16
  - Task: #265134 - Adding flags to the export function
@@ -20,7 +20,7 @@ class StatisticsView(grok.View):
20
20
  grok.require('cmf.ManagePortal')
21
21
 
22
22
  def update(self):
23
-
23
+
24
24
  self.observations = self.get_all_observations()
25
25
  self.questions = self.get_all_questions()
26
26
 
@@ -74,7 +74,7 @@ class StatisticsView(grok.View):
74
74
  return step
75
75
 
76
76
  def _generic_getter(self, objs, key, value, columns=[], filter_fun=None):
77
-
77
+
78
78
  """
79
79
  Generic function to get items for later rendering.
80
80
  Parameters:
@@ -258,7 +258,7 @@ class DownloadStatisticsView(grok.View):
258
258
  return step
259
259
 
260
260
  def _generic_getter(self, objs, key, value, columns=[], filter_fun=None):
261
-
261
+
262
262
  """
263
263
  Generic function to get items for later rendering.
264
264
  Parameters:
@@ -359,15 +359,15 @@ class DownloadStatisticsView(grok.View):
359
359
  columns=['SRRE', 'LRQE', 'MSC', 'answered', 'conclusions', 'finalised']
360
360
  )
361
361
  for observation in observations:
362
- data.append([observation['country'],
362
+ data.append([observation['country'],
363
363
  observation['SRRE'],
364
364
  observation['LRQE'],
365
365
  observation['MSC'],
366
- observation['answered'],
367
- observation['conclusions'],
368
- observation['finalised'],
366
+ observation['answered'],
367
+ observation['conclusions'],
368
+ observation['finalised'],
369
369
  observation['sum']])
370
- data.headers = ['Country', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
370
+ data.headers = ['Country', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
371
371
 
372
372
  return data
373
373
 
@@ -379,19 +379,19 @@ class DownloadStatisticsView(grok.View):
379
379
  key='sector',
380
380
  value='status',
381
381
  columns=['SRRE', 'LRQE', 'MSC', 'answered', 'conclusions', 'finalised']
382
- )
382
+ )
383
383
  for observation in observations:
384
- data.append([observation['sector'],
384
+ data.append([observation['sector'],
385
385
  observation['SRRE'],
386
386
  observation['LRQE'],
387
387
  observation['MSC'],
388
- observation['answered'],
389
- observation['conclusions'],
390
- observation['finalised'],
388
+ observation['answered'],
389
+ observation['conclusions'],
390
+ observation['finalised'],
391
391
  observation['sum']])
392
- data.headers = ['Sector', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
392
+ data.headers = ['Sector', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
393
393
 
394
- return data
394
+ return data
395
395
 
396
396
  def finalised_reason_per_country(self):
397
397
  data = tablib.Dataset()
@@ -401,19 +401,19 @@ class DownloadStatisticsView(grok.View):
401
401
  key='country',
402
402
  value='finalisation_reason',
403
403
  columns=['no-conclusion-yet', 'no-response-needed', 'partly-resolved', 'resolved', 'unresolved', 'significant-issue']
404
- )
404
+ )
405
405
  for observation in observations:
406
- data.append([observation['country'],
406
+ data.append([observation['country'],
407
407
  observation['no-conclusion-yet'],
408
408
  observation['no-response-needed'],
409
409
  observation['partly-resolved'],
410
- observation['resolved'],
410
+ observation['resolved'],
411
411
  observation['unresolved'],
412
412
  observation['significant-issue'],
413
413
  observation['sum']])
414
- data.headers = ['Country', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
414
+ data.headers = ['Country', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
415
415
 
416
- return data
416
+ return data
417
417
 
418
418
  def finalised_reason_per_sector(self):
419
419
  data = tablib.Dataset()
@@ -425,17 +425,17 @@ class DownloadStatisticsView(grok.View):
425
425
  columns=['no-conclusion-yet', 'no-response-needed', 'partly-resolved', 'resolved', 'unresolved', 'significant-issue']
426
426
  )
427
427
  for observation in observations:
428
- data.append([observation['sector'],
428
+ data.append([observation['sector'],
429
429
  observation['no-conclusion-yet'],
430
430
  observation['no-response-needed'],
431
431
  observation['partly-resolved'],
432
- observation['resolved'],
432
+ observation['resolved'],
433
433
  observation['unresolved'],
434
434
  observation['significant-issue'],
435
435
  observation['sum']])
436
- data.headers = ['Sector', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
436
+ data.headers = ['Sector', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
437
437
 
438
- return data
438
+ return data
439
439
 
440
440
 
441
441
  def observation_highlights_pgf(self):
@@ -8,6 +8,12 @@
8
8
  <tal:block metal:fill-slot="javascript_head_slot">
9
9
  <script tal:attributes="src string:${portal_url}/++resource++esdrt.content/cookies.js"></script>
10
10
  <script tal:attributes="src string:${portal_url}/++resource++esdrt.content/inbox_view.js"></script>
11
+ <script type="text/javascript" src="++resource++orderedselect_input.js"></script>
12
+ <script type="text/javascript">
13
+ $(document).ready(function(){
14
+ $(".chosen-select").chosen({width: "100%", allow_single_deselect: true});
15
+ })
16
+ </script>
11
17
  </tal:block>
12
18
  <tal:block metal:fill-slot="style_slot">
13
19
  <link rel="stylesheet" type="text/css" tal:attributes="href string:${portal_url}/++resource++esdrt.content/inbox_view.css" />
@@ -49,16 +55,29 @@
49
55
 
50
56
  <div id="filters">
51
57
  <div class="row" style="padding-top:30px">
52
- <div class="cell position-1 width-3 esdLabel">Free text</div>
58
+ <div class="cell position-1 width-9 esdLabel">Free text</div>
59
+ <div class="cell position-10 width-3 esdLabel">Author</div>
53
60
  </div>
54
61
  <div class="row">
55
62
  <form action="./inboxview" method="GET" tal:define="freeText request/freeText|nothing">
56
- <div class="cell position-1 width-12 esdLabel">
57
- <tal:params repeat="req_param python:[x for x in req_params if x[0] != 'freeText']">
63
+ <div class="cell position-1 width-9">
64
+ <tal:params repeat="req_param python:[x for x in req_params if x[0] not in ['freeText', 'obsAuthor']]">
58
65
  <input type="hidden" tal:attributes="name python:req_param[0]; value python:req_param[1]" />
59
66
  </tal:params>
60
67
  <input type="text" style="width:100%;border-radius:5px;height:21px" name="freeText" tal:attributes="value freeText" />
61
68
  </div>
69
+ <div class="cell position-10 width-3 esdLabel">
70
+ <select id="obsAuthorFilter" name="obsAuthor" class="chosen-select" data-placeholder="Select author"
71
+ tal:define="obsAuthor python:'';
72
+ obsAuthor request/obsAuthor | obsAuthor">
73
+ <option></option>
74
+ <tal:option repeat="author python:view.get_indexed_authors()">
75
+ <option
76
+ tal:attributes="value python:author[0]; selected python:author[0] == obsAuthor"
77
+ tal:content="python:author[1]"></option>
78
+ </tal:option>
79
+ </select>
80
+ </div>
62
81
  <div class="cell position-14 width-1">
63
82
  <input type="submit" class="standardButton" id="btnFilter" value="Search" />
64
83
  </div>
@@ -175,6 +175,16 @@
175
175
  }
176
176
  filter += "wfStatus=" + $('#wfStatusFilter').val();
177
177
  }
178
+ // Commented so that empty value cand be used to show all available if desired.
179
+ // This is handled in reviewfolder.py by checking if obsAuthorFilter is None.
180
+ // if ($('#obsAuthorFilter').val() != ""){
181
+ if (filter == ""){
182
+ filter += "?";
183
+ }else{
184
+ filter += "&";
185
+ }
186
+ filter += "obsAuthor=" + $('#obsAuthorFilter').val();
187
+ // }
178
188
  if ($('#crfFilter').val() != ""){
179
189
  if (filter == ""){
180
190
  filter += "?";
@@ -380,7 +390,8 @@
380
390
  </div>
381
391
  <div class="row" style="padding-top:20px">
382
392
  <div class="cell position-1 width-3 esdLabel" tal:condition="here/enable_steps">Step</div>
383
- <div class="cell position-4 width-6 esdLabel">Workflow</div>
393
+ <div class="cell position-4 width-3 esdLabel">Workflow</div>
394
+ <div class="cell position-7 width-3 esdLabel">Author</div>
384
395
  </div>
385
396
  <div class="row">
386
397
  <div class="cell position-1 width-3" tal:condition="here/enable_steps">
@@ -394,7 +405,7 @@
394
405
  value="step2">Step2</option>
395
406
  </select>
396
407
  </div>
397
- <div class="cell position-4 width-6">
408
+ <div class="cell position-4 width-3">
398
409
  <select id="wfStatusFilter" class="chosen-select" data-placeholder="Select status"
399
410
  tal:define="wfStatus python:'';
400
411
  wfStatus request/wfStatus | wfStatus">
@@ -415,6 +426,18 @@
415
426
  value="finalised">Finalised</option>
416
427
  </select>
417
428
  </div>
429
+ <div class="cell position-7 width-3">
430
+ <select id="obsAuthorFilter" class="chosen-select" data-placeholder="Select author"
431
+ tal:define="obsAuthor python:'';
432
+ obsAuthor request/obsAuthor | obsAuthor">
433
+ <option></option>
434
+ <tal:option repeat="author python:view.get_indexed_authors()">
435
+ <option
436
+ tal:attributes="value python:author[0]; selected python:author[0] == obsAuthor"
437
+ tal:content="python:author[1]"></option>
438
+ </tal:option>
439
+ </select>
440
+ </div>
418
441
  </div>
419
442
  <div class="row" style="padding-top:30px">
420
443
  <div class="cell position-1 width-1">
@@ -29,7 +29,7 @@ def query_group_members(portal, query):
29
29
  q_ldap.query_groups(query, ('uniqueMember', ))
30
30
  )
31
31
 
32
- unique_users = set(chain(*res_groups.values()))
32
+ unique_users = [v for v in set(chain(*res_groups.values())) if v]
33
33
  user_names = format_users(
34
34
  'cn',
35
35
  q_ldap.query_users(
@@ -38,6 +38,6 @@ def query_group_members(portal, query):
38
38
  )
39
39
 
40
40
  return {
41
- gname: [user_names[muid] for muid in muids]
41
+ gname: [user_names[muid] for muid in muids if muid]
42
42
  for gname, muids in res_groups.items()
43
43
  }
@@ -98,12 +98,20 @@ def get_users_in_context(observation, role, notification_name):
98
98
 
99
99
 
100
100
  def exclude_user_from_notification(observation, user, role, notification):
101
+ user_id = user.getId()
101
102
  adapted = INotificationUnsubscriptions(observation)
102
- data = adapted.get_user_data(user.getId())
103
+ data = adapted.get_user_data(user_id)
103
104
  if not data:
104
105
  area = aq_parent(aq_inner(observation))
105
106
  if IReviewFolder.providedBy(area):
106
107
  adapted = INotificationUnsubscriptions(area)
107
- data = adapted.get_user_data(user.getId())
108
+ data = adapted.get_user_data(user_id)
108
109
  excluded_notifications = data.get(role, [])
109
- return notification in excluded_notifications
110
+ exclude_based_on_notification = notification in excluded_notifications
111
+ if exclude_based_on_notification:
112
+ return exclude_based_on_notification
113
+
114
+ if role in ["ReviewerPhase1", "ReviewerPhase2"] and "config_only_where_author" not in excluded_notifications:
115
+ owner = observation.getOwner()
116
+ return user_id != owner.getId() if owner else False
117
+
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import operator
2
3
  import itertools
3
4
  import time
4
5
  from datetime import datetime
@@ -54,6 +55,7 @@ from esdrt.content.crf_code_matching import get_category_ldap_from_crf_code
54
55
  from esdrt.content.timeit import timeit
55
56
  from esdrt.content.utilities.interfaces import ISetupReviewFolderRoles
56
57
  from esdrt.content.utilities.ms_user import IUserIsMS
58
+ from esdrt.content.utils import get_userid_name
57
59
 
58
60
 
59
61
  LOG = logging.getLogger(__name__)
@@ -85,6 +87,31 @@ LDAP_QUERY_GROUPS = (
85
87
  )
86
88
 
87
89
 
90
+ def get_indexed_authors(context):
91
+ catalog = api.portal.get_tool("portal_catalog")
92
+ path = "/".join(context.getPhysicalPath())
93
+ query = {
94
+ "path": path,
95
+ "portal_type": "Observation",
96
+ }
97
+ authors = set([b.Creator for b in catalog.searchResults(query)])
98
+ return authors
99
+
100
+
101
+ def get_indexed_authors_with_names(context):
102
+ authors = get_indexed_authors(context)
103
+ return [(v, get_userid_name(v)) for v in authors]
104
+
105
+
106
+ def get_indexed_authors_for_select(context):
107
+ authors_with_names = get_indexed_authors_with_names(context)
108
+ user = api.user.get_current()
109
+ if (user):
110
+ userId = user.getId()
111
+ authors_with_names = [(uid, "Me ({})".format(uname)) if uid == userId else (uid, uname) for uid, uname in authors_with_names]
112
+ return sorted(authors_with_names, key=lambda x: float("-inf") if x[1][:2] == "Me" else x[1])
113
+
114
+
88
115
  def get_observation_phase(brain):
89
116
  result = ""
90
117
  state = brain["observation_questions_workflow"]
@@ -162,6 +189,22 @@ def _user_name(fun, self, userid):
162
189
  return (userid, time.time() // 86400)
163
190
 
164
191
 
192
+ def redirect_for_author(context, request):
193
+ obsAuthor = request.get("obsAuthor", None)
194
+ missing_author_filter = obsAuthor is None
195
+ user = api.user.get_current()
196
+ is_user = not api.user.is_anonymous() and "Manager" not in user.getRoles()
197
+ if missing_author_filter and is_user:
198
+ user_id = user.getId()
199
+ if user_id in get_indexed_authors(context):
200
+ new_url = "%s?%s&obsAuthor=%s" % (
201
+ request["ACTUAL_URL"],
202
+ request["QUERY_STRING"],
203
+ user_id,
204
+ )
205
+ return request.response.redirect(new_url)
206
+
207
+
165
208
  class IReviewFolder(plone.directives.form.Schema, IImageScaleTraversable):
166
209
  """
167
210
  Folder to have all observations together
@@ -235,6 +278,17 @@ class ReviewFolder(Container):
235
278
 
236
279
 
237
280
  class ReviewFolderMixin(BrowserView):
281
+
282
+ def get_current_user_id(self):
283
+ result = ""
284
+ user = api.user.get_current()
285
+ if user:
286
+ result = user.getId()
287
+ return result
288
+
289
+ def get_indexed_authors(self):
290
+ return get_indexed_authors_for_select(self.context)
291
+
238
292
  @memoize
239
293
  def get_questions(self, sort_on="modified", sort_order="reverse"):
240
294
  country = self.request.form.get("country", "")
@@ -245,6 +299,7 @@ class ReviewFolderMixin(BrowserView):
245
299
  freeText = self.request.form.get("freeText", "")
246
300
  step = self.request.form.get("step", "")
247
301
  wfStatus = self.request.form.get("wfStatus", "")
302
+ obsAuthor = self.request.form.get("obsAuthor", "")
248
303
  crfCode = self.request.form.get("crfCode", "")
249
304
  gas = self.request.form.get("gas", self.request.form.get("gas[]", []))
250
305
  gas = gas if isinstance(gas, list) else [gas]
@@ -289,6 +344,8 @@ class ReviewFolderMixin(BrowserView):
289
344
  query["observation_step"] = step
290
345
  if wfStatus != "":
291
346
  query["observation_status"] = wfStatus
347
+ if obsAuthor != "":
348
+ query["Creator"] = obsAuthor
292
349
  if crfCode != "":
293
350
  query["crf_code"] = crfCode
294
351
  if gas != "":
@@ -503,6 +560,7 @@ class ReviewFolderBrowserView(ReviewFolderMixin):
503
560
  return table.render(table)
504
561
 
505
562
  def render(self):
563
+ redirect_for_author(self.context, self.request)
506
564
  sort_on = self.request.get("sort_on", "modified")
507
565
  sort_order = self.request.get("sort_order", "reverse")
508
566
  pagenumber = self.request.get("pagenumber", "1")
@@ -988,6 +1046,9 @@ class InboxReviewFolderView(BrowserView):
988
1046
  def get_current_user(self):
989
1047
  return api.user.get_current()
990
1048
 
1049
+ def get_indexed_authors(self):
1050
+ return get_indexed_authors_for_select(self.context)
1051
+
991
1052
  def get_sections(self):
992
1053
  is_sec = self.is_secretariat()
993
1054
  viewable = [sec for sec in SECTIONS if is_sec or sec["check"](self)]
@@ -1015,6 +1076,7 @@ class InboxReviewFolderView(BrowserView):
1015
1076
 
1016
1077
  def __call__(self):
1017
1078
  self.rolemap_observations = {}
1079
+ redirect_for_author(self.context, self.request)
1018
1080
  return super(InboxReviewFolderView, self).__call__()
1019
1081
 
1020
1082
  def batch(self, observations, b_size, b_start, orphan, b_start_str):
@@ -1027,6 +1089,7 @@ class InboxReviewFolderView(BrowserView):
1027
1089
 
1028
1090
  def get_observations(self, rolecheck=None, **kw):
1029
1091
  freeText = self.request.form.get("freeText", "")
1092
+ obsAuthor = self.request.form.get("obsAuthor", "")
1030
1093
  catalog = api.portal.get_tool("portal_catalog")
1031
1094
  path = "/".join(self.context.getPhysicalPath())
1032
1095
  query = {
@@ -1037,6 +1100,8 @@ class InboxReviewFolderView(BrowserView):
1037
1100
  }
1038
1101
  if freeText:
1039
1102
  query["SearchableText"] = freeText
1103
+ if obsAuthor != "":
1104
+ query["Creator"] = obsAuthor
1040
1105
 
1041
1106
  query.update(kw)
1042
1107
  # from logging import getLogger
@@ -32,6 +32,7 @@ NOTIFICATIONS_PER_ROLE = {
32
32
  'observation_finalised': True,
33
33
  'question_answered': True,
34
34
  'question_to_ms': True,
35
+ 'config_only_where_author': True,
35
36
  },
36
37
  'ReviewerPhase2': {
37
38
  'observation_finalisation_denied': True,
@@ -39,6 +40,7 @@ NOTIFICATIONS_PER_ROLE = {
39
40
  'observation_to_phase2': True,
40
41
  'question_answered': True,
41
42
  'question_to_ms': True,
43
+ 'config_only_where_author': True,
42
44
  },
43
45
  'QualityExpert': {
44
46
  'conclusion_to_comment': True,
@@ -76,6 +78,7 @@ NOTIFICATION_NAMES = {
76
78
  'observation_finalised': 'Observation finalised by QE',
77
79
  'question_answered': 'Question answered by MS',
78
80
  'question_to_ms': 'Question sent to MS by QE',
81
+ 'config_only_where_author': 'Only notify me about observations I authored',
79
82
  },
80
83
  'ReviewerPhase2': {
81
84
  'observation_finalisation_denied': 'Observation finalisation denied by LR',
@@ -83,6 +86,7 @@ NOTIFICATION_NAMES = {
83
86
  'observation_to_phase2': 'Observation handed over to step 2',
84
87
  'question_answered': 'Question answered by MS',
85
88
  'question_to_ms': 'Question sent to MS by LR',
89
+ 'config_only_where_author': 'Only notify me about observations I authored',
86
90
  },
87
91
  'QualityExpert': {
88
92
  'conclusion_to_comment': 'Conclusion to comment by you as QE',
@@ -213,6 +217,8 @@ class SaveSubscriptionsReview(SubscriptionConfigurationMixin):
213
217
  grok.require('zope2.View')
214
218
  grok.name('save-subscriptions')
215
219
 
220
+
221
+
216
222
  def render(self):
217
223
  user_roles = []
218
224
  if self.request.get('REQUEST_METHOD') == 'POST':
@@ -66,33 +66,40 @@
66
66
  <input type="hidden" name="subscription_data.name:records"
67
67
  tal:attributes="value python:item[0]" />
68
68
 
69
- <table class="listing">
70
- <thead>
71
- <tr>
72
- <th>
73
- Notification
74
- </th>
75
- <th>
76
- Enabled?
77
- </th>
78
- </tr>
79
- </thead>
80
- <tbody>
81
- <tr tal:repeat="notification python:item[1].items()">
82
- <td>
83
- <span tal:replace="python:view.notification_name(item[0], notification[0])" />
84
- </td>
85
- <td>
86
- <input type="checkbox"
87
- tal:attributes="checked python:notification[1];
88
- name python:'subscription_data.' + notification[0] + ':records';
89
- " />
90
- </td>
91
- </tr>
92
- </tbody>
93
-
94
- </table>
95
-
69
+ <tal:block define="notifications python:[x for x in item[1].items() if not x[0].startswith('config_')]; settings python:[x for x in item[1].items() if x[0].startswith('config_')]">
70
+ <table class="listing">
71
+ <thead>
72
+ <tr>
73
+ <th>
74
+ Notification
75
+ </th>
76
+ <th>
77
+ Enabled?
78
+ </th>
79
+ </tr>
80
+ </thead>
81
+ <tbody>
82
+ <tr tal:repeat="notification notifications">
83
+ <td>
84
+ <span tal:replace="python:view.notification_name(item[0], notification[0])" />
85
+ </td>
86
+ <td>
87
+ <input type="checkbox"
88
+ tal:attributes="checked python:notification[1];
89
+ name python:'subscription_data.' + notification[0] + ':records'" />
90
+ </td>
91
+ </tr>
92
+ </tbody>
93
+
94
+ </table>
95
+
96
+ <div tal:repeat="setting settings">
97
+ <input type="checkbox" tal:attributes="id python:setting[0]; name python:'subscription_data.{}:records'.format(setting[0]); checked python:setting[1]" />
98
+ <label tal:attributes="for python:setting[0]" tal:content="python:view.notification_name(item[0], setting[0])"></label>
99
+ </div>
100
+
101
+ <br />
102
+ </tal:block>
96
103
  </div>
97
104
 
98
105
  <div class="subscription-actions">
@@ -3,6 +3,24 @@ import string
3
3
  from Products.CMFCore.interfaces._content import IContentish
4
4
  from zope.globalrequest import getRequest
5
5
 
6
+ import plone.api as api
7
+
8
+
9
+ def get_userid_name(userid):
10
+ result = userid
11
+
12
+ user = api.user.get(userid)
13
+ if (user):
14
+ result = user.getProperty("fullname", userid)
15
+
16
+ return result
17
+
18
+
19
+ def get_indexed_values_for_index(index_name):
20
+ catalog = api.portal.get_tool("portal_catalog")
21
+ indexes = catalog._catalog.indexes
22
+ return sorted(set(indexes[index_name]._unindex.itervalues()))
23
+
6
24
 
7
25
  def reduce_text(text, limit):
8
26
  if len(text) <= limit:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: esdrt.content
3
- Version: 1.74.5
3
+ Version: 1.75.0
4
4
  Summary: Content-types for ESD Review Tool
5
5
  Home-page: https://github.com/eea/esdrt.content/
6
6
  Author: Mikel Larreategi
@@ -15,6 +15,16 @@ Description: Introduction
15
15
  Changelog
16
16
  =========
17
17
 
18
+ 1.75.0 (2024-12-05)
19
+ -------------------
20
+ - Task: #277396 - Only notify author SE.
21
+ [batradav]
22
+
23
+ 1.74.6 (2024-07-01)
24
+ -------------------
25
+ - Task: #272010 - ESD EMRT extract error
26
+ [batradav]
27
+
18
28
  1.74.5 (2024-02-16)
19
29
  -------------------
20
30
  - Task: #265134 - Adding flags to the export function
@@ -11,7 +11,6 @@ docs/HISTORY.txt
11
11
  docs/INSTALL.txt
12
12
  docs/LICENSE.GPL
13
13
  docs/LICENSE.txt
14
- esdrt/.DS_Store
15
14
  esdrt/__init__.py
16
15
  esdrt.content.egg-info/PKG-INFO
17
16
  esdrt.content.egg-info/SOURCES.txt
@@ -3,7 +3,7 @@ import os
3
3
  from setuptools import find_packages
4
4
  from setuptools import setup
5
5
 
6
- version = "1.74.5"
6
+ version = "1.75.0"
7
7
 
8
8
  setup(
9
9
  name="esdrt.content",
Binary file
File without changes