esdrt.content 1.74.6__zip → 1.75.1__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.6 → esdrt_content-1.75.1}/PKG-INFO +11 -1
  2. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/HISTORY.txt +10 -0
  3. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/carryover.py +13 -0
  4. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/get_sample_xls.py +1 -0
  5. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/observation_import.py +17 -3
  6. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/statisticsview.py +24 -24
  7. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/carryover.pt +48 -17
  8. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/import_observation.pt +4 -1
  9. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/inboxreviewfolderview.pt +22 -3
  10. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/reviewfolderview.pt +25 -2
  11. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/utils.py +11 -3
  12. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/reviewfolder.py +65 -0
  13. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptionconfiguration.py +6 -0
  14. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/subscriptionconfigurationreview.pt +34 -27
  15. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utils.py +18 -0
  16. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/PKG-INFO +11 -1
  17. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/SOURCES.txt +0 -1
  18. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/setup.py +1 -1
  19. esdrt.content-1.74.6/esdrt/.DS_Store +0 -0
  20. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/.editorconfig +0 -0
  21. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/.gitignore +0 -0
  22. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/MANIFEST.in +0 -0
  23. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/Makefile +0 -0
  24. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/README.txt +0 -0
  25. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/bootstrap.py +0 -0
  26. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/buildout.cfg +0 -0
  27. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/INSTALL.txt +0 -0
  28. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/LICENSE.GPL +0 -0
  29. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/LICENSE.txt +0 -0
  30. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/__init__.py +0 -0
  31. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/INTEGRATION.txt +0 -0
  32. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/__init__.py +0 -0
  33. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/adapters/__init__.py +0 -0
  34. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/adapters/configure.zcml +0 -0
  35. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/adapters/reference_number.py +0 -0
  36. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/__init__.py +0 -0
  37. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/attachmentdownload.py +0 -0
  38. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/comments.py +0 -0
  39. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/configure.zcml +0 -0
  40. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/copyfiles.py +0 -0
  41. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/inbox_sections.py +0 -0
  42. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/interfaces.py +0 -0
  43. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/macros.py +0 -0
  44. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/statechange.py +0 -0
  45. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/tableau.py +0 -0
  46. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/assign_answerer_form.pt +0 -0
  47. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/assign_conclusion_reviewer_form.pt +0 -0
  48. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/assign_counterpart_form.pt +0 -0
  49. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/finalisedfolderview.pt +0 -0
  50. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/inbox2reviewfolderview.pt +0 -0
  51. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/macros.pt +0 -0
  52. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/multi_input.pt +0 -0
  53. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/reviewfolder_get_table.pt +0 -0
  54. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/statisticsview.pt +0 -0
  55. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/tableau_dashboard.pt +0 -0
  56. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/comment.py +0 -0
  57. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/commentanswer.py +0 -0
  58. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/commentextender.py +0 -0
  59. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/conclusion.py +0 -0
  60. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/conclusionsphase2.py +0 -0
  61. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/configure.zcml +0 -0
  62. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/constants.py +0 -0
  63. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/converter.py +0 -0
  64. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/crf_code_matching.py +0 -0
  65. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/crons.py +0 -0
  66. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/esdrtfile.py +0 -0
  67. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/indexers.py +0 -0
  68. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/ldap_utils.py +0 -0
  69. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/locales/README.txt +0 -0
  70. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/__init__.py +0 -0
  71. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_acknowledged.pt +0 -0
  72. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_acknowledged.py +0 -0
  73. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_to_msexperts.pt +0 -0
  74. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_to_msexperts.py +0 -0
  75. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/conclusion_to_comment.pt +0 -0
  76. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/conclusion_to_comment.py +0 -0
  77. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/configure.zcml +0 -0
  78. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_denied.pt +0 -0
  79. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_denied.py +0 -0
  80. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_request.pt +0 -0
  81. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_request.py +0 -0
  82. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised.pt +0 -0
  83. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised.py +0 -0
  84. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised_ms_remarks.pt +0 -0
  85. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised_rev_msg.pt +0 -0
  86. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_to_phase2.pt +0 -0
  87. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_to_phase2.py +0 -0
  88. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_to_phase2_rev_msg.pt +0 -0
  89. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered.py +0 -0
  90. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered_lr_msg.pt +0 -0
  91. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered_msexperts_msg.pt +0 -0
  92. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered_rev_msg.pt +0 -0
  93. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_ready_for_approval.pt +0 -0
  94. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_ready_for_approval.py +0 -0
  95. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_counterpart.pt +0 -0
  96. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_counterpart.py +0 -0
  97. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_ms.pt +0 -0
  98. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_ms.py +0 -0
  99. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_ms_rev_msg.pt +0 -0
  100. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/observation.py +0 -0
  101. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/overrides.zcml +0 -0
  102. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/patches.py +0 -0
  103. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/patches.zcml +0 -0
  104. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/permissions.zcml +0 -0
  105. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/catalog.xml +0 -0
  106. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/cssregistry.xml +0 -0
  107. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/diff_tool.xml +0 -0
  108. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrt.content_various.txt +0 -0
  109. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/conclusion_phase2_reasons.csv +0 -0
  110. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/conclusion_reasons.csv +0 -0
  111. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/crf_code.csv +0 -0
  112. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/eea_member_states.csv +0 -0
  113. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/fuel.csv +0 -0
  114. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/gas.csv +0 -0
  115. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/ghg_source_category.csv +0 -0
  116. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/ghg_source_sectors.csv +0 -0
  117. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/highlight.csv +0 -0
  118. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/parameter.csv +0 -0
  119. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/jsregistry.xml +0 -0
  120. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/metadata.xml +0 -0
  121. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/registry.xml +0 -0
  122. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/rolemap.xml +0 -0
  123. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/sharing.xml +0 -0
  124. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/tinymce.xml +0 -0
  125. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Comment.xml +0 -0
  126. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/CommentAnswer.xml +0 -0
  127. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Conclusion.xml +0 -0
  128. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/ConclusionsPhase2.xml +0 -0
  129. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/ESDRTFile.xml +0 -0
  130. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Folder.xml +0 -0
  131. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Observation.xml +0 -0
  132. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Question.xml +0 -0
  133. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/ReviewFolder.xml +0 -0
  134. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types.xml +0 -0
  135. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-answer-workflow/definition.xml +0 -0
  136. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-comment-workflow/definition.xml +0 -0
  137. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-conclusion-phase2-workflow/definition.xml +0 -0
  138. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-conclusion-workflow/definition.xml +0 -0
  139. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-file-workflow/definition.xml +0 -0
  140. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-question-review-workflow/definition.xml +0 -0
  141. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-review-workflow/definition.xml +0 -0
  142. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-reviewtool-folder-workflow/definition.xml +0 -0
  143. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows.xml +0 -0
  144. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles.zcml +0 -0
  145. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/question.py +0 -0
  146. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/__init__.py +0 -0
  147. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/configure.zcml +0 -0
  148. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/localroles.py +0 -0
  149. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/localrolesubscriber.py +0 -0
  150. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/setuphandlers.py +0 -0
  151. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen-sprite.png +0 -0
  152. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen-sprite@2x.png +0 -0
  153. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen.jquery.js +0 -0
  154. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen.min.css +0 -0
  155. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/cookies.js +0 -0
  156. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/eea-tabs.css +0 -0
  157. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/eea-tabs.js +0 -0
  158. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/esdrt.content.css +0 -0
  159. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/flags.css +0 -0
  160. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/flags.png +0 -0
  161. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/inbox_view.css +0 -0
  162. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/inbox_view.js +0 -0
  163. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/moment.min.js +0 -0
  164. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/phase-1.png +0 -0
  165. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/phase-12.png +0 -0
  166. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/phase-2.png +0 -0
  167. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/superlink.jquery.js +0 -0
  168. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscribers.py +0 -0
  169. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/__init__.py +0 -0
  170. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/configure.zcml +0 -0
  171. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/dexterity.py +0 -0
  172. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/interfaces.py +0 -0
  173. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/diffedview.pt +0 -0
  174. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/observationview.pt +0 -0
  175. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/subscriptionconfiguration.pt +0 -0
  176. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/tests.py +0 -0
  177. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/timeit.py +0 -0
  178. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/10_11.py +0 -0
  179. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/11_12.py +0 -0
  180. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/12_13.py +0 -0
  181. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/13_14.py +0 -0
  182. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/14_15.py +0 -0
  183. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/15_16.py +0 -0
  184. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/16_17.py +0 -0
  185. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/17_18.py +0 -0
  186. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/18_19.py +0 -0
  187. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/19_20.py +0 -0
  188. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/1_2.py +0 -0
  189. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/20_21.py +0 -0
  190. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/21_22.py +0 -0
  191. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/22_23.py +0 -0
  192. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/23_24.py +0 -0
  193. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/24_25.py +0 -0
  194. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/25_26.py +0 -0
  195. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/26_27.py +0 -0
  196. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/27_28.py +0 -0
  197. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/28_29.py +0 -0
  198. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/29_30.py +0 -0
  199. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/2_3.py +0 -0
  200. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/30_31.py +0 -0
  201. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/31_32.py +0 -0
  202. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/32_33.py +0 -0
  203. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/33_34.py +0 -0
  204. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/34_35.py +0 -0
  205. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/35_36.py +0 -0
  206. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/36_37.py +0 -0
  207. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/37_38.py +0 -0
  208. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/38_39.py +0 -0
  209. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/39_40.py +0 -0
  210. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/3_4.py +0 -0
  211. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/40_41.py +0 -0
  212. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/41_42.py +0 -0
  213. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/42_43.py +0 -0
  214. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/43_44.py +0 -0
  215. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/44_45.py +0 -0
  216. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/45_46.py +0 -0
  217. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/46_47.py +0 -0
  218. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/48_49.py +0 -0
  219. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/49_50.py +0 -0
  220. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/4_5.py +0 -0
  221. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/50_51.py +0 -0
  222. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/51_52.py +0 -0
  223. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/52_53.py +0 -0
  224. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/54_55.py +0 -0
  225. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/55_56.py +0 -0
  226. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/56_57.py +0 -0
  227. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/57_58.py +0 -0
  228. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/58_59.py +0 -0
  229. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/59_60.py +0 -0
  230. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/5_6.py +0 -0
  231. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/60_61.py +0 -0
  232. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/63_64.py +0 -0
  233. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/64_65.py +0 -0
  234. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/65_66.py +0 -0
  235. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/6_7.py +0 -0
  236. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/7_8.py +0 -0
  237. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/8_9.py +0 -0
  238. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/9_10.py +0 -0
  239. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/__init__.py +0 -0
  240. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/configure.zcml +0 -0
  241. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/portal_workflow.py +0 -0
  242. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/templates/portal_workflow_apply_and_reindex.pt +0 -0
  243. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/__init__.py +0 -0
  244. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/configure.zcml +0 -0
  245. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/interfaces.py +0 -0
  246. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/ldap_utils.py +0 -0
  247. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/ms_user.py +0 -0
  248. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/roles.py +0 -0
  249. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/vocabularies.py +0 -0
  250. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/vocabularies.zcml +0 -0
  251. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/dependency_links.txt +0 -0
  252. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/entry_points.txt +0 -0
  253. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/namespace_packages.txt +0 -0
  254. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/not-zip-safe +0 -0
  255. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/requires.txt +0 -0
  256. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/top_level.txt +0 -0
  257. {esdrt.content-1.74.6 → esdrt_content-1.75.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esdrt.content
3
- Version: 1.74.6
3
+ Version: 1.75.1
4
4
  Summary: Content-types for ESD Review Tool
5
5
  Home-page: https://github.com/eea/esdrt.content/
6
6
  Author: Mikel Larreategi
@@ -37,6 +37,16 @@ Review Tool
37
37
  Changelog
38
38
  =========
39
39
 
40
+ 1.75.1 (2024-12-06)
41
+ -------------------
42
+ - Task: #277396 - Author support in carryover and bulk import.
43
+ [batradav]
44
+
45
+ 1.75.0 (2024-12-05)
46
+ -------------------
47
+ - Task: #277396 - Only notify author SE.
48
+ [batradav]
49
+
40
50
  1.74.6 (2024-07-01)
41
51
  -------------------
42
52
  - Task: #272010 - ESD EMRT extract error
@@ -1,6 +1,16 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 1.75.1 (2024-12-06)
5
+ -------------------
6
+ - Task: #277396 - Author support in carryover and bulk import.
7
+ [batradav]
8
+
9
+ 1.75.0 (2024-12-05)
10
+ -------------------
11
+ - Task: #277396 - Only notify author SE.
12
+ [batradav]
13
+
4
14
  1.74.6 (2024-07-01)
5
15
  -------------------
6
16
  - Task: #272010 - ESD EMRT extract error
@@ -13,6 +13,7 @@ from Products.CMFCore.utils import getToolByName
13
13
  import openpyxl
14
14
  from DateTime import DateTime
15
15
  from esdrt.content.roles.localrolesubscriber import grant_local_roles
16
+ import plone.api as api
16
17
 
17
18
  LOG = getLogger("esdrt.content.carryover")
18
19
 
@@ -140,14 +141,24 @@ def reopen_with_qa(workflows, obj, actor):
140
141
  if conclusion:
141
142
  add_to_wh(wf_conclusion, conclusion, "redraft", "draft", actor)
142
143
 
144
+ def override_owner(obj, owner):
145
+ if owner:
146
+ user = api.user.get(owner)
147
+ if user:
148
+ userid = user.getId()
149
+ obj.changeOwnership(user)
150
+ obj.setCreators([userid])
151
+ obj.manage_setLocalRoles(userid, ["Owner", ])
143
152
 
144
153
  def copy_direct(context, catalog, workflows, obj_from_url, row):
145
154
  source = _read_col(row, 0)
146
155
  conclusion_text = _read_col(row, 1)
147
156
  actor = _read_col(row, 2)
157
+ owner = _read_col(row, 3)
148
158
 
149
159
  obj = obj_from_url(source)
150
160
  ob = _copy_and_flag(context, obj)
161
+ override_owner(ob, owner)
151
162
 
152
163
  replace_conclusion_text(workflows, ob, conclusion_text)
153
164
  clear_and_grant_roles(ob)
@@ -161,11 +172,13 @@ def copy_complex(context, catalog, workflows, obj_from_url, row):
161
172
  older_source = _read_col(row, 1)
162
173
  conclusion_text = _read_col(row, 2)
163
174
  actor = _read_col(row, 3)
175
+ owner = _read_col(row, 4)
164
176
 
165
177
  obj = obj_from_url(source)
166
178
  older_obj = obj_from_url(older_source)
167
179
 
168
180
  ob = _copy_and_flag(context, obj, older_obj.getId())
181
+ override_owner(ob, owner)
169
182
 
170
183
  replace_conclusion_text(workflows, ob, conclusion_text)
171
184
  prepend_qa(ob, older_obj)
@@ -15,6 +15,7 @@ XLS_SAMPLE_HEADER = (
15
15
  'Inventory year', 'Gas', 'Review year', 'Fuel',
16
16
  'MS key category', 'EU key category',
17
17
  'Parameter', 'Description flags', 'Initial question text',
18
+ 'Author override',
18
19
  )
19
20
 
20
21
  DESC = 'Description of the observation'
@@ -1,7 +1,6 @@
1
1
  import re
2
2
  from functools import partial
3
3
  from itertools import islice
4
- from itertools import chain
5
4
  from operator import itemgetter
6
5
 
7
6
  from zope.component import getUtility
@@ -17,6 +16,7 @@ from plone import api
17
16
 
18
17
  import openpyxl
19
18
 
19
+ from esdrt.content.browser.carryover import override_owner
20
20
  from esdrt.content.observation import create_comment
21
21
  from esdrt.content.question import create_question
22
22
 
@@ -26,6 +26,7 @@ PORTAL_TYPE = 'Observation'
26
26
  UNUSED_FIELDS = (
27
27
  'closing_comments', 'closing_deny_comments',
28
28
  'closing_comments_phase2', 'closing_deny_comments_phase2',
29
+ 'author',
29
30
  )
30
31
 
31
32
  UNCOMPLETED_ERR = (
@@ -101,8 +102,13 @@ def get_constants(context):
101
102
  for idx, col in enumerate(filtered_inventory_cols, start=next_col):
102
103
  XLS_COLS[col] = partial(_read_row, idx)
103
104
 
104
- # last column always the initial Q&A question
105
- XLS_COLS['question'] = partial(_read_row, idx + 1)
105
+ # 2nd to last column always the initial Q&A question
106
+ idx_qa_text = idx + 1
107
+ XLS_COLS['question'] = partial(_read_row, idx_qa_text)
108
+
109
+ # last column is the Author override (optional)
110
+ idx_author = idx_qa_text + 1
111
+ XLS_COLS['author'] = partial(_read_row, idx_author)
106
112
 
107
113
  return XLS_COLS
108
114
 
@@ -256,6 +262,11 @@ class Entry(object):
256
262
  if val is not None:
257
263
  return val.strip()
258
264
 
265
+ @property
266
+ def author(self):
267
+ value = self.constants['author'](self.row)
268
+ return value if value else None
269
+
259
270
  def get_fields(self):
260
271
  fields = self.constants.keys()
261
272
  return {
@@ -302,6 +313,9 @@ def _create_observation(entry, context, request, portal_type, obj):
302
313
  **fields
303
314
  )
304
315
 
316
+ # change ownership if given
317
+ override_owner(content, entry.author)
318
+
305
319
  question_text = entry.question
306
320
  if question_text:
307
321
  question = create_question(content)
@@ -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):
@@ -13,6 +13,7 @@
13
13
  <strong>Please note that the first row of the XLS file will be ignored.</strong>
14
14
  </li>
15
15
  <li>The <strong>userid</strong> column needs to be a valid EIONET user id. It used for the Obsevation History.</li>
16
+ <li>The <strong>Author override</strong> column needs to be a valid EIONET user id. <strong>If given</strong>, it will override the observation author, thus reassigning ownership of the observation.</li>
16
17
  </ul>
17
18
  </div>
18
19
  </div>
@@ -24,14 +25,27 @@
24
25
  Observations are copied as-is, the ID will be preserved.
25
26
  If provided, the conclusion text will replace the existing conclusion text.
26
27
  </p>
27
- <table class="listing">
28
- <thead><tr><th>Source observation</th><th>Conclusion text</th><th>userid</th></tr></thead>
29
- <tbody><tr>
30
- <td><tal:url replace="portal_url"/>/2018/AT-1A-2018-0000</td>
31
- <td>Conclusion text that will replace the existing one.</td>
32
- <td>someuserid</td>
33
- </tr></tbody>
34
- </table>
28
+ <table class="listing">
29
+ <thead>
30
+ <tr>
31
+ <th>Source observation</th>
32
+ <th>Conclusion text</th>
33
+ <th>userid</th>
34
+ <th>Author override (userid)</th>
35
+ </tr>
36
+ </thead>
37
+ <tbody>
38
+ <tr>
39
+ <td>
40
+ <tal:url replace="portal_url"/>
41
+ /2018/AT-1A-2018-0000
42
+ </td>
43
+ <td>Conclusion text that will replace the existing one.</td>
44
+ <td>someuserid</td>
45
+ <td>someuserid</td>
46
+ </tr>
47
+ </tbody>
48
+ </table>
35
49
 
36
50
  </div>
37
51
 
@@ -46,15 +60,32 @@
46
60
  </ul>
47
61
  If provided, the conclusion text will replace the existing conclusion text.
48
62
  </div>
49
- <table class="listing">
50
- <thead><tr><th>Source observation</th><th>Older source</th><th>Conclusion text</th><th>userid</th></tr></thead>
51
- <tbody><tr>
52
- <td><tal:url replace="portal_url"/>/2018/AT-1A-2018-0000</td>
53
- <td><tal:url replace="portal_url"/>/2018/AT-1A-2017-0000</td>
54
- <td>Conclusion text that will replace the existing one.</td>
55
- <td>someuserid</td>
56
- </tr></tbody>
57
- </table>
63
+ <table class="listing">
64
+ <thead>
65
+ <tr>
66
+ <th>Source observation</th>
67
+ <th>Older source</th>
68
+ <th>Conclusion text</th>
69
+ <th>userid</th>
70
+ <th>Author override (userid)</th>
71
+ </tr>
72
+ </thead>
73
+ <tbody>
74
+ <tr>
75
+ <td>
76
+ <tal:url replace="portal_url"/>
77
+ /2018/AT-1A-2018-0000
78
+ </td>
79
+ <td>
80
+ <tal:url replace="portal_url"/>
81
+ /2018/AT-1A-2017-0000
82
+ </td>
83
+ <td>Conclusion text that will replace the existing one.</td>
84
+ <td>someuserid</td>
85
+ <td>someuserid</td>
86
+ </tr>
87
+ </tbody>
88
+ </table>
58
89
 
59
90
  </div>
60
91
 
@@ -9,9 +9,12 @@
9
9
  if your observation has multiple values, please write them one per line, as in the sample import file.
10
10
  <br/> The "Fuel" and 'Description Flags' fields can be left empty as they are not mandatory fields.
11
11
  <tal:key_categ condition="here/enable_key_category">
12
- <br /> The MS/EU Key Category field can be set to 'True' if the observation belongs to this category
12
+ <br /> The MS/EU Key Category field can be set to 'True' if the observation belongs to this category,
13
13
  or it can be left empty if it doesn't.
14
14
  </tal:key_categ>
15
+ <br />
16
+ The last column is the <strong>Author override</strong> and requires a valid EIONET userid.
17
+ You can leave it empty, in which case the default is to assign yourself as the Author.
15
18
  </p>
16
19
  <p>You can download a sample import file by clicking <a href="./get_sample_xls">here</a>.</p>
17
20
 
@@ -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">
@@ -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