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