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.
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/PKG-INFO +10 -1
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/HISTORY.txt +9 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/reminder.py +71 -7
- emrt.necd.content-2.5.48/emrt/necd/content/browser/templates/reminder.pt +109 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/reviewfolderview.pt +2 -2
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/metadata.xml +1 -1
- emrt.necd.content-2.5.48/emrt/necd/content/profiles/default/necdvocabularies/highlight_2024_onwards.csv +17 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/reviewfolder.py +22 -12
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/setuphandlers.py +5 -1
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/configure.zcml +14 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utils.py +8 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/vocabularies.py +9 -4
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/PKG-INFO +10 -1
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/SOURCES.txt +1 -1
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/setup.py +1 -1
- emrt.necd.content-2.5.46/TAGS +0 -1153
- emrt.necd.content-2.5.46/emrt/necd/content/browser/templates/reminder.pt +0 -80
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/.editorconfig +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/.gitignore +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/MANIFEST.in +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/Makefile +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/README.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/bootstrap.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/build_manylinux.sh +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/buildout.cfg +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/INSTALL.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/LICENSE.GPL +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/docs/LICENSE.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/INTEGRATION.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/adapters/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/adapters/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/adapters/reference_number.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/attachmentdownload.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/bulk_update.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/carryover.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/comments.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/copyfiles.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/flatten_json.so +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/get_sample_xls.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/interfaces.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/macros.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/observation_import.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/statechange.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/statisticsview.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/tableau.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/assign_answerer_form.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/assign_conclusion_reviewer_form.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/assign_counterpart_form.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/bulk_update.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/carryover.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/finalisedfolderview.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/import_observation.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/inboxreviewfolderview.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/macros.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/multi_input.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/reminder_default_content.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/reviewfolder_get_table.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/statisticsview.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/tableau_connector.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/templates/tableau_dashboard.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/browser/xls_utils.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/comment.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/commentanswer.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/commentextender.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/conclusions.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/constants.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/converter.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/crons.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/forms/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/forms/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/forms/redraft.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/inbox_sections.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/indexers.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/locales/README.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/necdfile.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/nfr_code_matching.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_acknowledged.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_acknowledged.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_to_msexperts.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/answer_to_msexperts.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_added.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_added.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_to_msa.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/comment_to_mse.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/conclusion_to_comment.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/conclusion_to_comment.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/new_comment.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_denied.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_denied.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_request.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalisation_request.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalised.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalised.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_finalised_rev_msg.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled_closed_msa.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled_closed_se.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/observation_recalled_denied_se.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered_lr_msg.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered_msexperts_msg.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_answered_rev_msg.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_ready_for_approval.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_ready_for_approval.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_redraft.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_redraft.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_redraft.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_counterpart.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_counterpart.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_ms.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_ms.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/question_to_ms_rev_msg.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/notifications/utils.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/observation.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/overrides.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/patches.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/patches.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/permissions.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/catalog.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/cssregistry.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/diff_tool.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/emrt.necd.content_various.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/jsregistry.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/ldap_plugin.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/conclusion_reasons.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/eea_member_states.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/fuel.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/ghg_source_category.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/ghg_source_sectors.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/highlight.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/highlight_projection.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/parameter.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/pollutants.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/necdvocabularies/scenario_type.csv +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/registry.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/rolemap.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/sharing.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/tinymce.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Comment.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/CommentAnswer.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Conclusions.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Folder.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/NECDFile.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Observation.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/Question.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types/ReviewFolder.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/types.xml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles/default/workflows.xml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/profiles.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/question.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/localroles.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/roles/localrolesubscriber.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen-sprite.png +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen-sprite@2x.png +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen.jquery.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/chosen.min.css +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/cookies.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/eea-tabs.css +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/eea-tabs.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/emrt.necd.content.css +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/flags.css +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/flags.png +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/inbox_view.css +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/inbox_view.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/moment.min.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/phase-1.png +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/phase-12.png +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/phase-2.png +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/tableauwdc-2.3.1.min.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/static/tableauwdc-2.3.latest.min.js +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscribers.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptionconfiguration.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/dexterity.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/subscriptions/interfaces.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/conclusion_layout.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/diffedview.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/macro_qa_chat.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/observationview.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/subscriptionconfiguration.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/subscriptionconfigurationreview.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_activity.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_activity_type.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_highlight.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/templates/widget_pollutants.pt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/tests.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/timeit.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/transform_html_to_docx.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2010.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2015.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2016.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2022.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2024.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2025.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2029.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2032.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2037.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2038.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2042.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2044.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2045.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve205.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve206.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve207.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2201.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve230.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve235.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve236.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve237.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve240.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve243.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve252.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2524.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2537.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2538.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2540.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve2542.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/evolve258.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/portal_workflow.py +0 -0
- {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
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/__init__.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/configure.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/interfaces.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/ldap_utils.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/ldap_wrapper.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/ms_user.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/question.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/utilities/roles.py +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/views.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/vocabularies.zcml +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/dependency_links.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/entry_points.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/namespace_packages.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/not-zip-safe +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/requires.txt +0 -0
- {emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/top_level.txt +0 -0
- {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.
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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>
|
|
@@ -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
|
-
|
|
315
|
-
|
|
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
|
-
|
|
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': '
|
|
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',
|
{emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt/necd/content/upgrades/configure.zcml
RENAMED
|
@@ -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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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.
|
|
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
|
{emrt.necd.content-2.5.46 → emrt.necd.content-2.5.48}/emrt.necd.content.egg-info/SOURCES.txt
RENAMED
|
@@ -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
|