emrt.necd.content 2.5.47__zip → 2.5.49__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.47 → emrt.necd.content-2.5.49}/PKG-INFO +10 -1
  2. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/docs/HISTORY.txt +9 -0
  3. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/carryover.py +48 -1
  4. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/reminder.py +71 -7
  5. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/carryover.pt +7 -0
  6. emrt.necd.content-2.5.49/emrt/necd/content/browser/templates/reminder.pt +109 -0
  7. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/reviewfolderview.pt +2 -2
  8. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/metadata.xml +1 -1
  9. emrt.necd.content-2.5.49/emrt/necd/content/profiles/default/necdvocabularies/highlight_2024_onwards.csv +17 -0
  10. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/reviewfolder.py +15 -11
  11. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/setuphandlers.py +5 -1
  12. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/observationview.pt +1 -1
  13. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/configure.zcml +14 -0
  14. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/vocabularies.py +9 -4
  15. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/PKG-INFO +10 -1
  16. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/SOURCES.txt +1 -1
  17. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/setup.py +1 -1
  18. emrt.necd.content-2.5.47/TAGS +0 -1153
  19. emrt.necd.content-2.5.47/emrt/necd/content/browser/templates/reminder.pt +0 -80
  20. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/.editorconfig +0 -0
  21. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/.gitignore +0 -0
  22. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/MANIFEST.in +0 -0
  23. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/Makefile +0 -0
  24. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/README.txt +0 -0
  25. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/bootstrap.py +0 -0
  26. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/build_manylinux.sh +0 -0
  27. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/buildout.cfg +0 -0
  28. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/docs/INSTALL.txt +0 -0
  29. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/docs/LICENSE.GPL +0 -0
  30. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/docs/LICENSE.txt +0 -0
  31. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/__init__.py +0 -0
  32. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/__init__.py +0 -0
  33. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/INTEGRATION.txt +0 -0
  34. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/__init__.py +0 -0
  35. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/adapters/__init__.py +0 -0
  36. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/adapters/configure.zcml +0 -0
  37. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/adapters/reference_number.py +0 -0
  38. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/__init__.py +0 -0
  39. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/attachmentdownload.py +0 -0
  40. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/bulk_update.py +0 -0
  41. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/comments.py +0 -0
  42. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/configure.zcml +0 -0
  43. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/copyfiles.py +0 -0
  44. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/flatten_json.so +0 -0
  45. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/get_sample_xls.py +0 -0
  46. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/interfaces.py +0 -0
  47. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/macros.py +0 -0
  48. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/observation_import.py +0 -0
  49. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/statechange.py +0 -0
  50. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/statisticsview.py +0 -0
  51. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/tableau.py +0 -0
  52. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/assign_answerer_form.pt +0 -0
  53. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/assign_conclusion_reviewer_form.pt +0 -0
  54. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/assign_counterpart_form.pt +0 -0
  55. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/bulk_update.pt +0 -0
  56. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/finalisedfolderview.pt +0 -0
  57. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/import_observation.pt +0 -0
  58. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/inboxreviewfolderview.pt +0 -0
  59. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/macros.pt +0 -0
  60. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/multi_input.pt +0 -0
  61. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/reminder_default_content.pt +0 -0
  62. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/reviewfolder_get_table.pt +0 -0
  63. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/statisticsview.pt +0 -0
  64. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/tableau_connector.pt +0 -0
  65. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/templates/tableau_dashboard.pt +0 -0
  66. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/browser/xls_utils.py +0 -0
  67. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/comment.py +0 -0
  68. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/commentanswer.py +0 -0
  69. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/commentextender.py +0 -0
  70. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/conclusions.py +0 -0
  71. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/configure.zcml +0 -0
  72. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/constants.py +0 -0
  73. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/converter.py +0 -0
  74. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/crons.py +0 -0
  75. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/forms/__init__.py +0 -0
  76. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/forms/configure.zcml +0 -0
  77. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/forms/redraft.py +0 -0
  78. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/inbox_sections.py +0 -0
  79. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/indexers.py +0 -0
  80. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/locales/README.txt +0 -0
  81. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/necdfile.py +0 -0
  82. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/nfr_code_matching.py +0 -0
  83. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/__init__.py +0 -0
  84. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/answer_acknowledged.pt +0 -0
  85. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/answer_acknowledged.py +0 -0
  86. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/answer_to_msexperts.pt +0 -0
  87. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/answer_to_msexperts.py +0 -0
  88. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/comment_added.py +0 -0
  89. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/comment_added.zcml +0 -0
  90. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/comment_to_msa.pt +0 -0
  91. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/comment_to_mse.pt +0 -0
  92. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/conclusion_to_comment.pt +0 -0
  93. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/conclusion_to_comment.py +0 -0
  94. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/configure.zcml +0 -0
  95. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/new_comment.pt +0 -0
  96. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalisation_denied.pt +0 -0
  97. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalisation_denied.py +0 -0
  98. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalisation_request.pt +0 -0
  99. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalisation_request.py +0 -0
  100. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalised.pt +0 -0
  101. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalised.py +0 -0
  102. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_finalised_rev_msg.pt +0 -0
  103. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_recalled.py +0 -0
  104. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_recalled.zcml +0 -0
  105. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_recalled_closed_msa.pt +0 -0
  106. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_recalled_closed_se.pt +0 -0
  107. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/observation_recalled_denied_se.pt +0 -0
  108. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_answered.py +0 -0
  109. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_answered_lr_msg.pt +0 -0
  110. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_answered_msexperts_msg.pt +0 -0
  111. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_answered_rev_msg.pt +0 -0
  112. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_ready_for_approval.pt +0 -0
  113. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_ready_for_approval.py +0 -0
  114. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_redraft.pt +0 -0
  115. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_redraft.py +0 -0
  116. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_redraft.zcml +0 -0
  117. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_to_counterpart.pt +0 -0
  118. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_to_counterpart.py +0 -0
  119. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_to_ms.pt +0 -0
  120. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_to_ms.py +0 -0
  121. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/question_to_ms_rev_msg.pt +0 -0
  122. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/notifications/utils.py +0 -0
  123. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/observation.py +0 -0
  124. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/overrides.zcml +0 -0
  125. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/patches.py +0 -0
  126. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/patches.zcml +0 -0
  127. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/permissions.zcml +0 -0
  128. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/catalog.xml +0 -0
  129. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/cssregistry.xml +0 -0
  130. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/diff_tool.xml +0 -0
  131. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/emrt.necd.content_various.txt +0 -0
  132. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/jsregistry.xml +0 -0
  133. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/ldap_plugin.xml +0 -0
  134. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/conclusion_reasons.csv +0 -0
  135. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/eea_member_states.csv +0 -0
  136. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/fuel.csv +0 -0
  137. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/ghg_source_category.csv +0 -0
  138. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/ghg_source_sectors.csv +0 -0
  139. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/highlight.csv +0 -0
  140. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/highlight_projection.csv +0 -0
  141. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/parameter.csv +0 -0
  142. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/pollutants.csv +0 -0
  143. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/necdvocabularies/scenario_type.csv +0 -0
  144. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/registry.xml +0 -0
  145. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/rolemap.xml +0 -0
  146. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/sharing.xml +0 -0
  147. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/tinymce.xml +0 -0
  148. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/Comment.xml +0 -0
  149. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/CommentAnswer.xml +0 -0
  150. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/Conclusions.xml +0 -0
  151. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/Folder.xml +0 -0
  152. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/NECDFile.xml +0 -0
  153. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/Observation.xml +0 -0
  154. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/Question.xml +0 -0
  155. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types/ReviewFolder.xml +0 -0
  156. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/types.xml +0 -0
  157. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-answer-workflow/definition.xml +0 -0
  158. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-comment-workflow/definition.xml +0 -0
  159. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-conclusion-workflow/definition.xml +0 -0
  160. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-file-workflow/definition.xml +0 -0
  161. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-question-review-workflow/definition.xml +0 -0
  162. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-review-workflow/definition.xml +0 -0
  163. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows/esd-reviewtool-folder-workflow/definition.xml +0 -0
  164. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles/default/workflows.xml +0 -0
  165. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/profiles.zcml +0 -0
  166. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/question.py +0 -0
  167. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/roles/__init__.py +0 -0
  168. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/roles/configure.zcml +0 -0
  169. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/roles/localroles.py +0 -0
  170. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/roles/localrolesubscriber.py +0 -0
  171. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/chosen-sprite.png +0 -0
  172. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/chosen-sprite@2x.png +0 -0
  173. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/chosen.jquery.js +0 -0
  174. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/chosen.min.css +0 -0
  175. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/cookies.js +0 -0
  176. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/eea-tabs.css +0 -0
  177. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/eea-tabs.js +0 -0
  178. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/emrt.necd.content.css +0 -0
  179. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/flags.css +0 -0
  180. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/flags.png +0 -0
  181. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/inbox_view.css +0 -0
  182. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/inbox_view.js +0 -0
  183. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/moment.min.js +0 -0
  184. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/phase-1.png +0 -0
  185. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/phase-12.png +0 -0
  186. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/phase-2.png +0 -0
  187. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/tableauwdc-2.3.1.min.js +0 -0
  188. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/static/tableauwdc-2.3.latest.min.js +0 -0
  189. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/subscribers.py +0 -0
  190. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/subscriptionconfiguration.py +0 -0
  191. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/subscriptions/__init__.py +0 -0
  192. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/subscriptions/configure.zcml +0 -0
  193. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/subscriptions/dexterity.py +0 -0
  194. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/subscriptions/interfaces.py +0 -0
  195. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/conclusion_layout.pt +0 -0
  196. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/diffedview.pt +0 -0
  197. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/macro_qa_chat.pt +0 -0
  198. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/subscriptionconfiguration.pt +0 -0
  199. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/subscriptionconfigurationreview.pt +0 -0
  200. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/widget_activity.pt +0 -0
  201. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/widget_activity_type.pt +0 -0
  202. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/widget_highlight.pt +0 -0
  203. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/templates/widget_pollutants.pt +0 -0
  204. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/tests.py +0 -0
  205. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/timeit.py +0 -0
  206. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/transform_html_to_docx.py +0 -0
  207. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/__init__.py +0 -0
  208. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2010.py +0 -0
  209. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2015.py +0 -0
  210. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2016.py +0 -0
  211. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2022.py +0 -0
  212. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2024.py +0 -0
  213. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2025.py +0 -0
  214. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2029.py +0 -0
  215. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2032.py +0 -0
  216. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2037.py +0 -0
  217. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2038.py +0 -0
  218. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2042.py +0 -0
  219. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2044.py +0 -0
  220. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2045.py +0 -0
  221. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve205.py +0 -0
  222. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve206.py +0 -0
  223. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve207.py +0 -0
  224. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2201.py +0 -0
  225. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve230.py +0 -0
  226. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve235.py +0 -0
  227. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve236.py +0 -0
  228. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve237.py +0 -0
  229. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve240.py +0 -0
  230. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve243.py +0 -0
  231. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve252.py +0 -0
  232. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2524.py +0 -0
  233. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2537.py +0 -0
  234. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2538.py +0 -0
  235. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2540.py +0 -0
  236. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve2542.py +0 -0
  237. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/evolve258.py +0 -0
  238. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/portal_workflow.py +0 -0
  239. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/upgrades/templates/portal_workflow_apply_and_reindex.pt +0 -0
  240. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/__init__.py +0 -0
  241. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/configure.zcml +0 -0
  242. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/interfaces.py +0 -0
  243. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/ldap_utils.py +0 -0
  244. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/ldap_wrapper.py +0 -0
  245. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/ms_user.py +0 -0
  246. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/question.py +0 -0
  247. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utilities/roles.py +0 -0
  248. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/utils.py +0 -0
  249. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/views.zcml +0 -0
  250. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt/necd/content/vocabularies.zcml +0 -0
  251. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/dependency_links.txt +0 -0
  252. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/entry_points.txt +0 -0
  253. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/namespace_packages.txt +0 -0
  254. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/not-zip-safe +0 -0
  255. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/requires.txt +0 -0
  256. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/emrt.necd.content.egg-info/top_level.txt +0 -0
  257. {emrt.necd.content-2.5.47 → emrt.necd.content-2.5.49}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: emrt.necd.content
3
- Version: 2.5.47
3
+ Version: 2.5.49
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.49 (2024-04-25)
19
+
20
+ - Task #260971 - Add "Description flags" to carryover
21
+
22
+ 2.5.48 (2024-04-11)
23
+
24
+ - Feature #260968 - Reminder button: allow user / country selection
25
+ - Task #260971 - Review if flags need updating/ all are still relevant
26
+
18
27
  2.5.47 (2024-04-11)
19
28
 
20
29
  - Bug #268428 - Unable to take extract from test site
@@ -1,6 +1,15 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 2.5.49 (2024-04-25)
5
+
6
+ - Task #260971 - Add "Description flags" to carryover
7
+
8
+ 2.5.48 (2024-04-11)
9
+
10
+ - Feature #260968 - Reminder button: allow user / country selection
11
+ - Task #260971 - Review if flags need updating/ all are still relevant
12
+
4
13
  2.5.47 (2024-04-11)
5
14
 
6
15
  - Bug #268428 - Unable to take extract from test site
@@ -50,6 +50,14 @@ def get_vocabulary_values(context, name):
50
50
  except:
51
51
  return []
52
52
 
53
+ def get_vocabulary_titles(context, name):
54
+ try:
55
+ factory = getUtility(IVocabularyFactory, name)
56
+ vocabulary = factory(context)
57
+ return [x.title for x in vocabulary.by_value.values()]
58
+ except:
59
+ return []
60
+
53
61
 
54
62
  def read_int(value):
55
63
  result = 0
@@ -100,6 +108,7 @@ EXTRA_FIELDS = (
100
108
  ("year", read_inventory_year),
101
109
  ("nfr_code", read_unicode),
102
110
  ("pollutants", read_list),
111
+ ("highlight", read_list),
103
112
  )
104
113
 
105
114
  EXTRA_FIELDS_PROJECTION = (
@@ -108,6 +117,31 @@ EXTRA_FIELDS_PROJECTION = (
108
117
  ("year", read_projection_year),
109
118
  ("nfr_code", read_unicode),
110
119
  ("pollutants", read_list),
120
+ ("highlight", read_list),
121
+ )
122
+
123
+
124
+ def transform_title_to_vocabulary_value(vocab_name):
125
+ def context_aware(context):
126
+ factory = getUtility(IVocabularyFactory, vocab_name)
127
+ vocabulary = factory(context)
128
+ title_to_value = dict([(v.title, k) for k, v in vocabulary.by_value.items()])
129
+ def vocab_aware(title):
130
+ return title_to_value.get(title, title)
131
+ return vocab_aware
132
+ return context_aware
133
+
134
+
135
+ def transform_higlight_value_from_title(context):
136
+ context_aware = transform_title_to_vocabulary_value("emrt.necd.content.highlight")
137
+ vocab_aware = context_aware(context)
138
+ def title_list_to_values(titles):
139
+ return [vocab_aware(title) for title in titles]
140
+ return title_list_to_values
141
+
142
+
143
+ TRANSFORM_EXTRA_FIELDS = (
144
+ ("highlight", transform_higlight_value_from_title),
111
145
  )
112
146
 
113
147
 
@@ -255,11 +289,20 @@ def read_extra_fields(row, row_nr, start_at, context):
255
289
  if context.type == "projection"
256
290
  else EXTRA_FIELDS
257
291
  )
292
+ transform_extra_fields = {
293
+ fname: transform(context)
294
+ for fname, transform
295
+ in TRANSFORM_EXTRA_FIELDS
296
+ }
258
297
  result = dict()
259
298
  for idx, (fname, reader) in enumerate(extra_fields):
260
299
  col_idx = start_at + idx
261
300
  try:
262
- result[fname] = reader(_read_col(row, col_idx))
301
+ read_value = reader(_read_col(row, col_idx))
302
+ if fname in transform_extra_fields:
303
+ result[fname] = transform_extra_fields[fname](read_value)
304
+ else:
305
+ result[fname] = read_value
263
306
  except IndexError:
264
307
  msg = "Cannot read field {} on column {}, row {}.".format(
265
308
  fname, col_idx + 1, row_nr
@@ -332,9 +375,13 @@ class CarryOverView(BrowserView):
332
375
  values_for_nfr_code = get_vocabulary_values(
333
376
  self.context, "emrt.necd.content.nfr_code"
334
377
  )
378
+ titles_for_highlight = get_vocabulary_titles(
379
+ self.context, "emrt.necd.content.highlight"
380
+ )
335
381
  return self.index(
336
382
  values_for_nfr_code=u", ".join(values_for_nfr_code),
337
383
  values_for_pollutants=u", ".join(values_for_pollutants),
384
+ titles_for_highlight=u", ".join(titles_for_highlight),
338
385
  is_projection=self.context.type == "projection",
339
386
  )
340
387
 
@@ -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
+ ]
@@ -36,6 +36,7 @@
36
36
  <th tal:condition="is_projection">Projection year</th>
37
37
  <th>NFR Code</th>
38
38
  <th>Pollutants</th>
39
+ <th>Description flags</th>
39
40
  </tr>
40
41
  </thead>
41
42
  <tbody><tr>
@@ -48,6 +49,7 @@
48
49
  <td tal:condition="is_projection">2025<br />2030<br />2040<br />2050</td>
49
50
  <td>1A2d</td>
50
51
  <td>PCBs<br />HCB<br />SO2</td>
52
+ <td>Adjustment<br />Revised Estimate</td>
51
53
  </tr></tbody>
52
54
  </table>
53
55
 
@@ -66,6 +68,7 @@
66
68
  <li tal:condition="is_projection">Field: Projection year (list) - multiple values, separated by newline. Valid values: 2025, 2030, 2040, 2050</li>
67
69
  <li>Field: NFR category code (string) - single value.</li>
68
70
  <li>Field: Pollutants (list) - multiple values, separated by newline.</li>
71
+ <li>Field: Description flags (list) - multiple values, separated by newline.</li>
69
72
  </ul>
70
73
  If provided, the conclusion text will replace the existing conclusion text.
71
74
  </p>
@@ -82,6 +85,7 @@
82
85
  <th tal:condition="is_projection">Projection year</th>
83
86
  <th>NFR Code</th>
84
87
  <th>Pollutants</th>
88
+ <th>Description flags</th>
85
89
  </tr>
86
90
  </thead>
87
91
  <tbody><tr>
@@ -95,6 +99,7 @@
95
99
  <td tal:condition="is_projection">2025<br />2030<br />2040<br />2050</td>
96
100
  <td>1A2d</td>
97
101
  <td>PCBs<br />HCB<br />SO2</td>
102
+ <td>Adjustment<br />Revised Estimate</td>
98
103
  </tr></tbody>
99
104
  </table>
100
105
 
@@ -107,6 +112,8 @@
107
112
  <dd>${python:options.get('values_for_nfr_code')}</dd>
108
113
  <dt>Pollutants</dt>
109
114
  <dd>${python:options.get('values_for_pollutants')}</dd>
115
+ <dt>Description flags</dt>
116
+ <dd>${python:options.get('titles_for_highlight')}</dd>
110
117
  </dl>
111
118
  </div>
112
119
 
@@ -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.47</version>
2
+ <version>2.5.49</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)
@@ -79,6 +79,12 @@ REVIEWFOLDER_TYPES = SimpleVocabulary.fromItems((
79
79
  (u'Projection', 'projection')))
80
80
 
81
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
+
82
88
  # Cache helper methods
83
89
  def _user_name(fun, self, userid):
84
90
  return (userid, time.time() // 86400)
@@ -201,6 +207,13 @@ class IReviewFolder(directives.form.Schema, IImageScaleTraversable):
201
207
  required=True,
202
208
  )
203
209
 
210
+ highlight_vocabulary = schema.Choice(
211
+ title=u"Highlight vocabulary",
212
+ source=HIGHLIGHT_VOCABULARY_TYPES,
213
+ required=True,
214
+ default='',
215
+ )
216
+
204
217
  tableau_statistics = schema.Text(
205
218
  title=u'Tableau statistics embed code',
206
219
  required=False,
@@ -313,17 +326,8 @@ class ReviewFolderMixin(BrowserView):
313
326
  return countries
314
327
 
315
328
  def get_highlights(self):
316
- vtool = getToolByName(self, 'portal_vocabularies')
317
- if self.context.type == 'inventory':
318
- voc = vtool.getVocabularyByName('highlight')
319
- else:
320
- voc = vtool.getVocabularyByName('highlight_projection')
321
- highlights = []
322
- voc_terms = voc.getDisplayList(self).items()
323
- for term in voc_terms:
324
- highlights.append((term[0], term[1]))
325
-
326
- return highlights
329
+ factory = getUtility(IVocabularyFactory, name='emrt.necd.content.highlight')
330
+ return [[term.value, term.title] for term in factory(self.context)]
327
331
 
328
332
  def get_review_years(self):
329
333
  catalog = api.portal.get_tool('portal_catalog')
@@ -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',
@@ -376,7 +376,7 @@
376
376
  <span class="eea-icon eea-icon-lg wfRole"><!-- --></span>
377
377
  <span tal:content="item/role"></span><br/>
378
378
  <a
379
- tal:attributes="href python:'http://www.eionet.europa.eu/directory/user?uid='+item['actor']"
379
+ tal:attributes="href python:'http://www.eionet.europa.eu/directory/user?uid=' + (item['actor'] or '')"
380
380
  tal:content="item/author"></a>
381
381
  <br/>
382
382
  <span
@@ -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>
@@ -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.47
3
+ Version: 2.5.49
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.49 (2024-04-25)
19
+
20
+ - Task #260971 - Add "Description flags" to carryover
21
+
22
+ 2.5.48 (2024-04-11)
23
+
24
+ - Feature #260968 - Reminder button: allow user / country selection
25
+ - Task #260971 - Review if flags need updating/ all are still relevant
26
+
18
27
  2.5.47 (2024-04-11)
19
28
 
20
29
  - Bug #268428 - Unable to take extract from test site
@@ -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.47"
6
+ VERSION = "2.5.49"
7
7
 
8
8
 
9
9
  setup(