emrt.necd.content 2.5.46__zip → 2.5.48__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. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/PKG-INFO +10 -1
  2. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/HISTORY.txt +9 -0
  3. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/reminder.py +71 -7
  4. emrt.necd.content-2.5.48/emrt/necd/content/browser/templates/reminder.pt +109 -0
  5. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/reviewfolderview.pt +2 -2
  6. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/metadata.xml +1 -1
  7. emrt.necd.content-2.5.48/emrt/necd/content/profiles/default/necdvocabularies/highlight_2024_onwards.csv +17 -0
  8. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/reviewfolder.py +22 -12
  9. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/setuphandlers.py +5 -1
  10. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/configure.zcml +14 -0
  11. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utils.py +8 -0
  12. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/vocabularies.py +9 -4
  13. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/PKG-INFO +10 -1
  14. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/SOURCES.txt +1 -1
  15. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/setup.py +1 -1
  16. emrt.necd.content-2.5.46/TAGS +0 -1153
  17. emrt.necd.content-2.5.46/emrt/necd/content/browser/templates/reminder.pt +0 -80
  18. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/.editorconfig +0 -0
  19. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/.gitignore +0 -0
  20. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/MANIFEST.in +0 -0
  21. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/Makefile +0 -0
  22. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/README.txt +0 -0
  23. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/bootstrap.py +0 -0
  24. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/build_manylinux.sh +0 -0
  25. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/buildout.cfg +0 -0
  26. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/INSTALL.txt +0 -0
  27. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/LICENSE.GPL +0 -0
  28. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/LICENSE.txt +0 -0
  29. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/__init__.py +0 -0
  30. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/__init__.py +0 -0
  31. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/INTEGRATION.txt +0 -0
  32. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/__init__.py +0 -0
  33. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/adapters/__init__.py +0 -0
  34. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/adapters/configure.zcml +0 -0
  35. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/adapters/reference_number.py +0 -0
  36. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/__init__.py +0 -0
  37. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/attachmentdownload.py +0 -0
  38. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/bulk_update.py +0 -0
  39. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/carryover.py +0 -0
  40. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/comments.py +0 -0
  41. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/configure.zcml +0 -0
  42. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/copyfiles.py +0 -0
  43. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/flatten_json.so +0 -0
  44. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/get_sample_xls.py +0 -0
  45. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/interfaces.py +0 -0
  46. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/macros.py +0 -0
  47. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/observation_import.py +0 -0
  48. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/statechange.py +0 -0
  49. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/statisticsview.py +0 -0
  50. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/tableau.py +0 -0
  51. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/assign_answerer_form.pt +0 -0
  52. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/assign_conclusion_reviewer_form.pt +0 -0
  53. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/assign_counterpart_form.pt +0 -0
  54. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/bulk_update.pt +0 -0
  55. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/carryover.pt +0 -0
  56. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/finalisedfolderview.pt +0 -0
  57. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/import_observation.pt +0 -0
  58. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/inboxreviewfolderview.pt +0 -0
  59. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/macros.pt +0 -0
  60. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/multi_input.pt +0 -0
  61. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/reminder_default_content.pt +0 -0
  62. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/reviewfolder_get_table.pt +0 -0
  63. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/statisticsview.pt +0 -0
  64. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/tableau_connector.pt +0 -0
  65. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/tableau_dashboard.pt +0 -0
  66. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/xls_utils.py +0 -0
  67. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/comment.py +0 -0
  68. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/commentanswer.py +0 -0
  69. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/commentextender.py +0 -0
  70. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/conclusions.py +0 -0
  71. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/configure.zcml +0 -0
  72. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/constants.py +0 -0
  73. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/converter.py +0 -0
  74. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/crons.py +0 -0
  75. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/forms/__init__.py +0 -0
  76. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/forms/configure.zcml +0 -0
  77. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/forms/redraft.py +0 -0
  78. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/inbox_sections.py +0 -0
  79. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/indexers.py +0 -0
  80. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/locales/README.txt +0 -0
  81. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/necdfile.py +0 -0
  82. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/nfr_code_matching.py +0 -0
  83. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/__init__.py +0 -0
  84. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_acknowledged.pt +0 -0
  85. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_acknowledged.py +0 -0
  86. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_to_msexperts.pt +0 -0
  87. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_to_msexperts.py +0 -0
  88. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_added.py +0 -0
  89. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_added.zcml +0 -0
  90. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_to_msa.pt +0 -0
  91. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_to_mse.pt +0 -0
  92. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/conclusion_to_comment.pt +0 -0
  93. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/conclusion_to_comment.py +0 -0
  94. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/configure.zcml +0 -0
  95. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/new_comment.pt +0 -0
  96. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_denied.pt +0 -0
  97. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_denied.py +0 -0
  98. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_request.pt +0 -0
  99. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_request.py +0 -0
  100. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalised.pt +0 -0
  101. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalised.py +0 -0
  102. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalised_rev_msg.pt +0 -0
  103. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled.py +0 -0
  104. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled.zcml +0 -0
  105. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled_closed_msa.pt +0 -0
  106. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled_closed_se.pt +0 -0
  107. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled_denied_se.pt +0 -0
  108. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered.py +0 -0
  109. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered_lr_msg.pt +0 -0
  110. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered_msexperts_msg.pt +0 -0
  111. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered_rev_msg.pt +0 -0
  112. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_ready_for_approval.pt +0 -0
  113. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_ready_for_approval.py +0 -0
  114. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_redraft.pt +0 -0
  115. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_redraft.py +0 -0
  116. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_redraft.zcml +0 -0
  117. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_counterpart.pt +0 -0
  118. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_counterpart.py +0 -0
  119. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_ms.pt +0 -0
  120. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_ms.py +0 -0
  121. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_ms_rev_msg.pt +0 -0
  122. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/utils.py +0 -0
  123. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/observation.py +0 -0
  124. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/overrides.zcml +0 -0
  125. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/patches.py +0 -0
  126. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/patches.zcml +0 -0
  127. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/permissions.zcml +0 -0
  128. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/catalog.xml +0 -0
  129. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/cssregistry.xml +0 -0
  130. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/diff_tool.xml +0 -0
  131. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/emrt.necd.content_various.txt +0 -0
  132. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/jsregistry.xml +0 -0
  133. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/ldap_plugin.xml +0 -0
  134. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/conclusion_reasons.csv +0 -0
  135. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/eea_member_states.csv +0 -0
  136. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/fuel.csv +0 -0
  137. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/ghg_source_category.csv +0 -0
  138. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/ghg_source_sectors.csv +0 -0
  139. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/highlight.csv +0 -0
  140. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/highlight_projection.csv +0 -0
  141. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/parameter.csv +0 -0
  142. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/pollutants.csv +0 -0
  143. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/scenario_type.csv +0 -0
  144. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/registry.xml +0 -0
  145. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/rolemap.xml +0 -0
  146. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/sharing.xml +0 -0
  147. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/tinymce.xml +0 -0
  148. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Comment.xml +0 -0
  149. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/CommentAnswer.xml +0 -0
  150. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Conclusions.xml +0 -0
  151. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Folder.xml +0 -0
  152. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/NECDFile.xml +0 -0
  153. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Observation.xml +0 -0
  154. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Question.xml +0 -0
  155. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/ReviewFolder.xml +0 -0
  156. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types.xml +0 -0
  157. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-answer-workflow/definition.xml +0 -0
  158. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-comment-workflow/definition.xml +0 -0
  159. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-conclusion-workflow/definition.xml +0 -0
  160. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-file-workflow/definition.xml +0 -0
  161. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-question-review-workflow/definition.xml +0 -0
  162. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-review-workflow/definition.xml +0 -0
  163. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows/esd-reviewtool-folder-workflow/definition.xml +0 -0
  164. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows.xml +0 -0
  165. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles.zcml +0 -0
  166. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/question.py +0 -0
  167. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/__init__.py +0 -0
  168. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/configure.zcml +0 -0
  169. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/localroles.py +0 -0
  170. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/localrolesubscriber.py +0 -0
  171. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen-sprite.png +0 -0
  172. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen-sprite@2x.png +0 -0
  173. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen.jquery.js +0 -0
  174. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen.min.css +0 -0
  175. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/cookies.js +0 -0
  176. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/eea-tabs.css +0 -0
  177. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/eea-tabs.js +0 -0
  178. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/emrt.necd.content.css +0 -0
  179. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/flags.css +0 -0
  180. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/flags.png +0 -0
  181. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/inbox_view.css +0 -0
  182. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/inbox_view.js +0 -0
  183. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/moment.min.js +0 -0
  184. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/phase-1.png +0 -0
  185. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/phase-12.png +0 -0
  186. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/phase-2.png +0 -0
  187. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/tableauwdc-2.3.1.min.js +0 -0
  188. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/tableauwdc-2.3.latest.min.js +0 -0
  189. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscribers.py +0 -0
  190. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptionconfiguration.py +0 -0
  191. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/__init__.py +0 -0
  192. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/configure.zcml +0 -0
  193. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/dexterity.py +0 -0
  194. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/interfaces.py +0 -0
  195. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/conclusion_layout.pt +0 -0
  196. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/diffedview.pt +0 -0
  197. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/macro_qa_chat.pt +0 -0
  198. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/observationview.pt +0 -0
  199. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/subscriptionconfiguration.pt +0 -0
  200. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/subscriptionconfigurationreview.pt +0 -0
  201. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_activity.pt +0 -0
  202. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_activity_type.pt +0 -0
  203. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_highlight.pt +0 -0
  204. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_pollutants.pt +0 -0
  205. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/tests.py +0 -0
  206. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/timeit.py +0 -0
  207. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/transform_html_to_docx.py +0 -0
  208. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/__init__.py +0 -0
  209. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2010.py +0 -0
  210. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2015.py +0 -0
  211. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2016.py +0 -0
  212. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2022.py +0 -0
  213. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2024.py +0 -0
  214. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2025.py +0 -0
  215. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2029.py +0 -0
  216. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2032.py +0 -0
  217. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2037.py +0 -0
  218. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2038.py +0 -0
  219. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2042.py +0 -0
  220. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2044.py +0 -0
  221. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2045.py +0 -0
  222. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve205.py +0 -0
  223. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve206.py +0 -0
  224. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve207.py +0 -0
  225. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2201.py +0 -0
  226. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve230.py +0 -0
  227. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve235.py +0 -0
  228. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve236.py +0 -0
  229. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve237.py +0 -0
  230. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve240.py +0 -0
  231. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve243.py +0 -0
  232. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve252.py +0 -0
  233. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2524.py +0 -0
  234. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2537.py +0 -0
  235. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2538.py +0 -0
  236. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2540.py +0 -0
  237. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2542.py +0 -0
  238. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve258.py +0 -0
  239. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/portal_workflow.py +0 -0
  240. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/templates/portal_workflow_apply_and_reindex.pt +0 -0
  241. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/__init__.py +0 -0
  242. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/configure.zcml +0 -0
  243. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/interfaces.py +0 -0
  244. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/ldap_utils.py +0 -0
  245. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/ldap_wrapper.py +0 -0
  246. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/ms_user.py +0 -0
  247. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/question.py +0 -0
  248. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/roles.py +0 -0
  249. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/views.zcml +0 -0
  250. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/vocabularies.zcml +0 -0
  251. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/dependency_links.txt +0 -0
  252. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/entry_points.txt +0 -0
  253. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/namespace_packages.txt +0 -0
  254. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/not-zip-safe +0 -0
  255. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/requires.txt +0 -0
  256. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/top_level.txt +0 -0
  257. {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: emrt.necd.content
3
- Version: 2.5.46
3
+ Version: 2.5.48
4
4
  Summary: Content-types for EMRT-NECD Review Tool
5
5
  Home-page: https://github.com/eea/emrt.necd.content/
6
6
  Author: Mikel Larreategi
@@ -15,6 +15,15 @@ Description: Introduction
15
15
  Changelog
16
16
  =========
17
17
 
18
+ 2.5.48 (2024-04-11)
19
+
20
+ - Feature #260968 - Reminder button: allow user / country selection
21
+ - Task #260971 - Review if flags need updating/ all are still relevant
22
+
23
+ 2.5.47 (2024-04-11)
24
+
25
+ - Bug #268428 - Unable to take extract from test site
26
+
18
27
  2.5.46 (2024-02-09)
19
28
 
20
29
  - Feature #260974 - Possibility to recall obs after sending to approval
@@ -1,6 +1,15 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 2.5.48 (2024-04-11)
5
+
6
+ - Feature #260968 - Reminder button: allow user / country selection
7
+ - Task #260971 - Review if flags need updating/ all are still relevant
8
+
9
+ 2.5.47 (2024-04-11)
10
+
11
+ - Bug #268428 - Unable to take extract from test site
12
+
4
13
  2.5.46 (2024-02-09)
5
14
 
6
15
  - Feature #260974 - Possibility to recall obs after sending to approval
@@ -1,8 +1,12 @@
1
1
  import os
2
2
  from operator import attrgetter
3
3
  from collections import namedtuple
4
+ from collections import defaultdict
4
5
 
5
6
  from zope.component import getMultiAdapter
7
+ from zope.component import getUtility
8
+
9
+ from zope.schema.interfaces import IVocabularyFactory
6
10
 
7
11
  from chameleon.zpt.template import PageTextTemplate
8
12
 
@@ -34,8 +38,15 @@ with open(DEFAULT_CONTENT_PATH) as default_content:
34
38
 
35
39
 
36
40
 
37
- UserData = namedtuple("UserData", ["name", "email", "roles"])
41
+ UserData = namedtuple(
42
+ "UserData",
43
+ ["user_id", "name", "email", "roles", "country_a2", "country_name"]
44
+ )
38
45
 
46
+ CountryData = namedtuple(
47
+ "CountryData",
48
+ ["a2", "name", "user_count"]
49
+ )
39
50
 
40
51
  class ReminderView(BrowserView):
41
52
 
@@ -44,6 +55,10 @@ class ReminderView(BrowserView):
44
55
  ("tool_url", "The absolute URL of this review folder.", ),
45
56
  )
46
57
 
58
+ @property
59
+ def mail_from_address(self):
60
+ return api.portal.get().email_from_address
61
+
47
62
  @property
48
63
  def default_content(self):
49
64
  return DEFAULT_CONTENT
@@ -60,31 +75,76 @@ class ReminderView(BrowserView):
60
75
 
61
76
  @property
62
77
  def manager_users_to_notify(self):
78
+ v_ms = getUtility(
79
+ IVocabularyFactory,
80
+ name='emrt.necd.content.eea_member_states')(self.context)
81
+
63
82
  if "Manager" in api.user.get_roles():
64
83
  result = []
65
- for user in self._get_users_to_notify():
84
+ for user, country_a2 in self._get_users_to_notify():
66
85
  roles = api.user.get_roles(user=user, obj=self.context)
67
86
  user_data = (
87
+ user.getId(),
68
88
  safer_unicode(user.getProperty("fullname", user.getId())),
69
89
  user.getProperty("email", "-"),
70
90
  [r for r in roles if r != "Authenticated"],
91
+ country_a2,
92
+ v_ms.getTerm(country_a2).title
71
93
  )
72
94
  result.append(UserData(*user_data))
73
95
  return sorted(result, key=attrgetter("name"))
74
96
 
75
97
 
98
+ @property
99
+ def countries_to_notify(self):
100
+ v_ms = getUtility(
101
+ IVocabularyFactory,
102
+ name='emrt.necd.content.eea_member_states')(self.context)
103
+
104
+ result = defaultdict(set)
105
+ for user, country_a2 in self._get_users_to_notify():
106
+ result[country_a2].add(user.getId())
107
+
108
+ return sorted(
109
+ [
110
+ CountryData(a2, v_ms.getTerm(a2).title, len(users))
111
+ for a2, users
112
+ in result.items()
113
+ ],
114
+ key=attrgetter("name")
115
+ )
116
+
117
+
76
118
  def send_reminder(self):
77
119
  subject = self.request.get("subject", self.default_subject)
78
120
  content = self.request.get("content", self.default_content)
121
+ countries_a2 = self.request.get("countries_a2", [])
122
+ user_ids = (
123
+ self.request.get("user_ids", [])
124
+ if "Manager" in api.user.get_roles()
125
+ else []
126
+ )
79
127
 
80
128
  template = PageTextTemplate(content)
81
129
 
82
- to_notify = self._get_users_to_notify()
130
+ if user_ids:
131
+ to_notify = [
132
+ user for user, _ in self._get_users_to_notify()
133
+ if user.getId() in user_ids
134
+ ]
135
+ else:
136
+ to_notify = [
137
+ user for user, a2 in self._get_users_to_notify()
138
+ if a2 in countries_a2
139
+ ]
83
140
 
84
141
  for user in to_notify:
85
142
  self._send_email(subject, template, user)
86
143
 
87
- portal_message = "Notified {} users.".format(len(to_notify))
144
+ if to_notify:
145
+ portal_message = "Notified {} users.".format(len(to_notify))
146
+ else:
147
+ portal_message = "Nothing selected, nobody was notified."
88
148
  api.portal.show_message(portal_message, request=self.request)
89
149
 
90
150
  return self.request.RESPONSE.redirect(self.context.absolute_url())
@@ -116,10 +176,14 @@ class ReminderView(BrowserView):
116
176
  to_notify = set()
117
177
 
118
178
  for obs in observations:
119
- msa_users = get_users_in_context(obs, ROLE_MSA, "reminder")
179
+ msa_users = [
180
+ (user, obs.country)
181
+ for user
182
+ in get_users_in_context(obs, ROLE_MSA, "reminder")
183
+ ]
120
184
  to_notify.update(msa_users)
121
185
 
122
186
  return [
123
- user for user in to_notify
187
+ (user, a2) for user, a2 in to_notify
124
188
  if "Manager" not in api.user.get_roles(user=user)
125
- ]
189
+ ]
@@ -0,0 +1,109 @@
1
+ <metal:page use-macro="here/main_template/macros/master">
2
+ <tal:block metal:fill-slot="style_slot">
3
+ <style type="text/css">
4
+ .field input[type="text"] {
5
+ padding: 0.5em 0.3em;
6
+ width: 100%;
7
+ }
8
+ .field textarea {
9
+ padding: 1em;
10
+ }
11
+
12
+ form button[disabled] {
13
+ background-color: #b3b3b3;
14
+ border-color: #f3f3f3;
15
+ }
16
+ form button[disabled]:hover {
17
+ cursor: not-allowed;
18
+ }
19
+ </style>
20
+ </tal:block>
21
+ <metal:content fill-slot="main"
22
+ tal:define="is_projection python:options.get('is_projection');
23
+ will_notify_num python:view.will_notify_num_users;
24
+ countries_to_notify python:view.countries_to_notify;
25
+ manager_users_to_notify python:view.manager_users_to_notify;">
26
+ <h1 class="documentFirstHeading">Send reminder</h1>
27
+ <p class="discreet">Send email reminder to MS coordinators</p>
28
+
29
+ <p>Submitting this form will send an email to <strong>${will_notify_num}</strong> MS coordinators which have outstanding questions.</p>
30
+
31
+ <form action="./reminder" method="POST" enctype="multipart/form-data">
32
+ <tal:manager condition="manager_users_to_notify">
33
+ <p><strong>NOTE:</strong> The table below displays the users that will be notified and <strong>is only visible to Secretariat</strong></p>
34
+ <table class="listing">
35
+ <thead>
36
+ <tr>
37
+ <th>Notify?</th>
38
+ <th>Name</th>
39
+ <th>e-Mail</th>
40
+ <th>Roles</th>
41
+ <th>Country</th>
42
+ </tr>
43
+ </thead>
44
+ <tbody>
45
+ <tr tal:repeat="user_data manager_users_to_notify">
46
+ <td><input type="checkbox" name="user_ids:list" value="${python:user_data.user_id}" checked="checked" /></td>
47
+ <td>${python:user_data.name}</td>
48
+ <td>${python:user_data.email}</td>
49
+ <td>${python:", ".join(user_data.roles)}</td>
50
+ <td>${python:user_data.country_name}</td>
51
+ </tr>
52
+ </tbody>
53
+ </table>
54
+ </tal:manager>
55
+
56
+ <tal:user condition="not:manager_users_to_notify">
57
+ <p><strong>NOTE:</strong> The table below displays the countries that will be notified, and the number of users for each country.</p>
58
+ <table class="listing">
59
+ <thead>
60
+ <tr>
61
+ <th>Notify?</th>
62
+ <th>Name</th>
63
+ <th>Number of users</th>
64
+ </tr>
65
+ </thead>
66
+ <tbody>
67
+ <tr tal:repeat="country_data countries_to_notify">
68
+ <td><input type="checkbox" name="countries_a2:list" value="${python:country_data.a2}" checked="checked" /></td>
69
+ <td>${python:country_data.name}</td>
70
+ <td>${python:country_data.user_count}</td>
71
+ </tr>
72
+ </tbody>
73
+ </table>
74
+ </tal:user>
75
+
76
+ <div class="field">
77
+ <label for="mailFrom">From</label>
78
+ <div class="formHelp">The email address from which the email will be sent. <strong>This cannot be changed.</strong></div>
79
+ <input id="mailFrom" type="text" value="${python:view.mail_from_address}" disabled="disabled" readonly="readonly" />
80
+ </div>
81
+
82
+ <div class="field">
83
+ <label for="mailSubject">Message subject</label>
84
+ <div class="formHelp">The subject that will be used in the email.</div>
85
+ <input id="mailSubject" type="text" name="subject" value="${python:view.default_subject}" disabled="${python:not(will_notify_num) and 'disabled' or None}" />
86
+ </div>
87
+
88
+ <div class="field">
89
+ <label for="mailContent">Message content</label>
90
+ <div class="formHelp">
91
+ You can customise the message being sent, below. There are some parameters that you can use, described below:
92
+ <dl>
93
+ <tal:ditem repeat="param python:view.known_parameters">
94
+ <dt>${python:param[0]}</dt>
95
+ <dd>${python:param[1]}</dd>
96
+ </tal:ditem>
97
+ </dl>
98
+ </div>
99
+ <textarea id="mailContent" name="content" rows="15" disabled="${python:not(will_notify_num) and 'disabled' or None}">${python:view.default_content}</textarea>
100
+ </div>
101
+
102
+ <button type="submit" class="standardButton" disabled="${python:not(will_notify_num) and 'disabled' or None}">Confirm sending reminder</button>
103
+ <strong tal:condition="python:not(will_notify_num)">Sending disabled as it will not notify anyone (there are no observations in the required state).</strong>
104
+
105
+ </form>
106
+
107
+ </metal:content>
108
+
109
+ </metal:page>
@@ -321,8 +321,8 @@
321
321
  id python:item[0]"/>
322
322
  <label tal:attributes="for python:item[0];"
323
323
  tal:content="python:item[1]"></label><br/>
324
- <br tal:condition="python:item[0] in ['unece','acc']"/>
325
- <div tal:condition="python:item[0] in ['unece','acc']" class="esdLabel">Draft/final conclusion flags</div>
324
+ <br tal:condition="python:item[0] in ['unece', 'acc', 'comparability']"/>
325
+ <div tal:condition="python:item[0] in ['unece', 'acc', 'comparability']" class="esdLabel">Draft/final conclusion flags</div>
326
326
 
327
327
  </tal:block>
328
328
  </tal:block>
@@ -1,5 +1,5 @@
1
1
  <metadata>
2
- <version>2.5.46</version>
2
+ <version>2.5.48</version>
3
3
  <dependencies>
4
4
  <dependency>profile-plone.app.dexterity:default</dependency>
5
5
  <dependency>profile-plone.app.ldap:ldap</dependency>
@@ -0,0 +1,17 @@
1
+ rec-fu,Recommendation follow-up
2
+ re-fu,RE follow-up
3
+ tc-fu,TC follow-up
4
+ adjustment,Adjustment
5
+ guidebook-2019,Guidebook 2019 Finding
6
+ ptc,Potential technical correction (PTC)
7
+ transparency,Transparency
8
+ cccuracy,Accuracy
9
+ completeness,Completeness
10
+ consistency,Consistency
11
+ comparability,Comparability
12
+ nsms,Not sent to Member State
13
+ tc,Technical Correction (TC)
14
+ rev-est,Revised Estimate
15
+ recommendation,Recommendation
16
+ unquantified-potential-technical-correction,Unquantified Potential Technical Correction
17
+ proxy-solution,Proxy Solution (PS)
@@ -9,6 +9,7 @@ from AccessControl import getSecurityManager, Unauthorized
9
9
  from DateTime import DateTime
10
10
  from plone import api
11
11
  from plone import directives
12
+ from plone.app.textfield.value import RichTextValue
12
13
  from plone.app.content.browser.tableview import Table
13
14
  from plone.batching import Batch
14
15
  from plone.dexterity.content import Container
@@ -44,6 +45,7 @@ import html2text
44
45
  from emrt.necd.content.utils import get_vocabulary_value
45
46
  from emrt.necd.content.utils import user_has_ldap_role
46
47
  from emrt.necd.content.utils import reduce_text
48
+ from emrt.necd.content.utils import richtext2text
47
49
  from emrt.necd.content.utilities.interfaces import IUserIsMS
48
50
  from emrt.necd.content.utilities.interfaces import ISetupReviewFolderRoles
49
51
  from emrt.necd.content.utilities.interfaces import IGetLDAPWrapper
@@ -77,6 +79,12 @@ REVIEWFOLDER_TYPES = SimpleVocabulary.fromItems((
77
79
  (u'Projection', 'projection')))
78
80
 
79
81
 
82
+ HIGHLIGHT_VOCABULARY_TYPES = SimpleVocabulary.fromItems((
83
+ (u'Default: Projection or Inventory pre 2024', ''),
84
+ (u'Inventory 2024 onwards', 'highlight_2024_onwards'),
85
+ (u'Inventory pre 2024', 'highlight'),
86
+ (u'Projection', 'highlight_projection')))
87
+
80
88
  # Cache helper methods
81
89
  def _user_name(fun, self, userid):
82
90
  return (userid, time.time() // 86400)
@@ -199,6 +207,13 @@ class IReviewFolder(directives.form.Schema, IImageScaleTraversable):
199
207
  required=True,
200
208
  )
201
209
 
210
+ highlight_vocabulary = schema.Choice(
211
+ title=u"Highlight vocabulary",
212
+ source=HIGHLIGHT_VOCABULARY_TYPES,
213
+ required=True,
214
+ default='',
215
+ )
216
+
202
217
  tableau_statistics = schema.Text(
203
218
  title=u'Tableau statistics embed code',
204
219
  required=False,
@@ -311,17 +326,8 @@ class ReviewFolderMixin(BrowserView):
311
326
  return countries
312
327
 
313
328
  def get_highlights(self):
314
- vtool = getToolByName(self, 'portal_vocabularies')
315
- if self.context.type == 'inventory':
316
- voc = vtool.getVocabularyByName('highlight')
317
- else:
318
- voc = vtool.getVocabularyByName('highlight_projection')
319
- highlights = []
320
- voc_terms = voc.getDisplayList(self).items()
321
- for term in voc_terms:
322
- highlights.append((term[0], term[1]))
323
-
324
- return highlights
329
+ factory = getUtility(IVocabularyFactory, name='emrt.necd.content.highlight')
330
+ return [[term.value, term.title] for term in factory(self.context)]
325
331
 
326
332
  def get_review_years(self):
327
333
  catalog = api.portal.get_tool('portal_catalog')
@@ -723,7 +729,11 @@ class ExportReviewFolderForm(form.Form, ReviewFolderMixin):
723
729
  last_question_id = comment_ids[-1] if comment_ids else "-"
724
730
  row.append(last_question_id)
725
731
  else:
726
- row.append(safe_unicode(observation[key]))
732
+ field_value = observation[key]
733
+ if isinstance(field_value, RichTextValue):
734
+ row.append(richtext2text(field_value, self.context))
735
+ else:
736
+ row.append(safe_unicode(field_value))
727
737
 
728
738
  if base_len == 0:
729
739
  base_len = len(row)
@@ -41,9 +41,13 @@ VOCABULARIES = [
41
41
  'filename': 'scenario_type.csv',
42
42
  },
43
43
  {'id': 'highlight',
44
- 'title': 'Highligt',
44
+ 'title': 'Highlight',
45
45
  'filename': 'highlight.csv',
46
46
  },
47
+ {'id': 'highlight_2024_onwards',
48
+ 'title': 'Highlight 2024 onwards',
49
+ 'filename': 'highlight_2024_onwards.csv',
50
+ },
47
51
  {'id': 'highlight_projection',
48
52
  'title': 'Highlight Projection',
49
53
  'filename': 'highlight_projection.csv',
@@ -797,4 +797,18 @@
797
797
 
798
798
  </genericsetup:upgradeSteps>
799
799
 
800
+ <genericsetup:upgradeSteps
801
+ source="2.5.47"
802
+ destination="2.5.48"
803
+ profile="emrt.necd.content:default">
804
+
805
+ <genericsetup:upgradeDepends
806
+ title="Reimport missing vocabularies."
807
+ description="[refs #260971] Import new highlight_2024_onwards vocabulary"
808
+ import_steps="emrt.necd.content.setup.vocabularies"
809
+ />
810
+
811
+ </genericsetup:upgradeSteps>
812
+
813
+
800
814
  </configure>
@@ -5,6 +5,8 @@ from itertools import chain
5
5
  from operator import itemgetter
6
6
  import concurrent.futures
7
7
 
8
+ import html2text
9
+
8
10
  import plone.api as api
9
11
 
10
12
  from zope.component import getUtility
@@ -139,6 +141,12 @@ def render_rich_text_value(context, obj):
139
141
  return obj.text
140
142
 
141
143
 
144
+ def richtext2text(value, context):
145
+ html_value = value.output_relative_to(context)
146
+ output_text = html2text.html2text(html_value)
147
+ return safe_unicode(output_text)
148
+
149
+
142
150
  def safer_unicode(text):
143
151
  """ Attempt to fix mixed latin1 + utf-8. """
144
152
  try:
@@ -201,10 +201,15 @@ class Highlight(object):
201
201
 
202
202
  def __call__(self, context):
203
203
  pvoc = api.portal.get_tool('portal_vocabularies')
204
- voc_name = (
205
- 'highlight' if context.type == 'inventory'
206
- else 'highlight_projection'
207
- )
204
+
205
+ if context.highlight_vocabulary:
206
+ voc_name = context.highlight_vocabulary
207
+ else:
208
+ voc_name = (
209
+ 'highlight' if context.type == 'inventory'
210
+ else 'highlight_projection'
211
+ )
212
+
208
213
  voc = pvoc.getVocabularyByName(voc_name)
209
214
  if voc is None:
210
215
  return SimpleVocabulary([])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: emrt.necd.content
3
- Version: 2.5.46
3
+ Version: 2.5.48
4
4
  Summary: Content-types for EMRT-NECD Review Tool
5
5
  Home-page: https://github.com/eea/emrt.necd.content/
6
6
  Author: Mikel Larreategi
@@ -15,6 +15,15 @@ Description: Introduction
15
15
  Changelog
16
16
  =========
17
17
 
18
+ 2.5.48 (2024-04-11)
19
+
20
+ - Feature #260968 - Reminder button: allow user / country selection
21
+ - Task #260971 - Review if flags need updating/ all are still relevant
22
+
23
+ 2.5.47 (2024-04-11)
24
+
25
+ - Bug #268428 - Unable to take extract from test site
26
+
18
27
  2.5.46 (2024-02-09)
19
28
 
20
29
  - Feature #260974 - Possibility to recall obs after sending to approval
@@ -3,7 +3,6 @@
3
3
  MANIFEST.in
4
4
  Makefile
5
5
  README.txt
6
- TAGS
7
6
  bootstrap.py
8
7
  build_manylinux.sh
9
8
  buildout.cfg
@@ -155,6 +154,7 @@ emrt/necd/content/profiles/default/necdvocabularies/fuel.csv
155
154
  emrt/necd/content/profiles/default/necdvocabularies/ghg_source_category.csv
156
155
  emrt/necd/content/profiles/default/necdvocabularies/ghg_source_sectors.csv
157
156
  emrt/necd/content/profiles/default/necdvocabularies/highlight.csv
157
+ emrt/necd/content/profiles/default/necdvocabularies/highlight_2024_onwards.csv
158
158
  emrt/necd/content/profiles/default/necdvocabularies/highlight_projection.csv
159
159
  emrt/necd/content/profiles/default/necdvocabularies/parameter.csv
160
160
  emrt/necd/content/profiles/default/necdvocabularies/pollutants.csv
@@ -3,7 +3,7 @@ import os
3
3
  from setuptools import find_packages
4
4
  from setuptools import setup
5
5
 
6
- VERSION = "2.5.46"
6
+ VERSION = "2.5.48"
7
7
 
8
8
 
9
9
  setup(