esdrt.content 1.74.6__zip → 1.75.1__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/PKG-INFO +11 -1
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/HISTORY.txt +10 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/carryover.py +13 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/get_sample_xls.py +1 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/observation_import.py +17 -3
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/statisticsview.py +24 -24
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/carryover.pt +48 -17
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/import_observation.pt +4 -1
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/inboxreviewfolderview.pt +22 -3
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/reviewfolderview.pt +25 -2
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/utils.py +11 -3
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/reviewfolder.py +65 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptionconfiguration.py +6 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/subscriptionconfigurationreview.pt +34 -27
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utils.py +18 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/PKG-INFO +11 -1
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/SOURCES.txt +0 -1
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/setup.py +1 -1
- esdrt.content-1.74.6/esdrt/.DS_Store +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/.editorconfig +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/.gitignore +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/MANIFEST.in +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/Makefile +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/README.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/bootstrap.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/buildout.cfg +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/INSTALL.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/LICENSE.GPL +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/docs/LICENSE.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/INTEGRATION.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/adapters/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/adapters/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/adapters/reference_number.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/attachmentdownload.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/comments.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/copyfiles.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/inbox_sections.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/interfaces.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/macros.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/statechange.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/tableau.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/assign_answerer_form.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/assign_conclusion_reviewer_form.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/assign_counterpart_form.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/finalisedfolderview.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/inbox2reviewfolderview.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/macros.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/multi_input.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/reviewfolder_get_table.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/statisticsview.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/tableau_dashboard.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/comment.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/commentanswer.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/commentextender.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/conclusion.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/conclusionsphase2.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/constants.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/converter.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/crf_code_matching.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/crons.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/esdrtfile.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/indexers.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/ldap_utils.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/locales/README.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_acknowledged.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_acknowledged.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_to_msexperts.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/answer_to_msexperts.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/conclusion_to_comment.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/conclusion_to_comment.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_denied.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_denied.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_request.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalisation_request.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised_ms_remarks.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_finalised_rev_msg.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_to_phase2.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_to_phase2.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/observation_to_phase2_rev_msg.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered_lr_msg.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered_msexperts_msg.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_answered_rev_msg.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_ready_for_approval.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_ready_for_approval.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_counterpart.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_counterpart.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_ms.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_ms.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/notifications/question_to_ms_rev_msg.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/observation.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/overrides.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/patches.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/patches.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/permissions.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/catalog.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/cssregistry.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/diff_tool.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrt.content_various.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/conclusion_phase2_reasons.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/conclusion_reasons.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/crf_code.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/eea_member_states.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/fuel.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/gas.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/ghg_source_category.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/ghg_source_sectors.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/highlight.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/esdrtvocabularies/parameter.csv +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/jsregistry.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/metadata.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/registry.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/rolemap.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/sharing.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/tinymce.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Comment.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/CommentAnswer.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Conclusion.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/ConclusionsPhase2.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/ESDRTFile.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Folder.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Observation.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/Question.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types/ReviewFolder.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/types.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-answer-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-comment-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-conclusion-phase2-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-conclusion-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-file-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-question-review-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-review-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows/esd-reviewtool-folder-workflow/definition.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles/default/workflows.xml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/profiles.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/question.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/localroles.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/roles/localrolesubscriber.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/setuphandlers.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen-sprite.png +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen-sprite@2x.png +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen.jquery.js +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/chosen.min.css +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/cookies.js +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/eea-tabs.css +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/eea-tabs.js +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/esdrt.content.css +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/flags.css +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/flags.png +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/inbox_view.css +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/inbox_view.js +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/moment.min.js +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/phase-1.png +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/phase-12.png +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/phase-2.png +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/static/superlink.jquery.js +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscribers.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/dexterity.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/subscriptions/interfaces.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/diffedview.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/observationview.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/templates/subscriptionconfiguration.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/tests.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/timeit.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/10_11.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/11_12.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/12_13.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/13_14.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/14_15.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/15_16.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/16_17.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/17_18.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/18_19.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/19_20.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/1_2.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/20_21.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/21_22.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/22_23.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/23_24.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/24_25.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/25_26.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/26_27.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/27_28.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/28_29.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/29_30.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/2_3.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/30_31.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/31_32.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/32_33.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/33_34.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/34_35.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/35_36.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/36_37.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/37_38.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/38_39.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/39_40.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/3_4.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/40_41.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/41_42.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/42_43.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/43_44.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/44_45.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/45_46.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/46_47.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/48_49.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/49_50.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/4_5.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/50_51.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/51_52.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/52_53.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/54_55.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/55_56.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/56_57.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/57_58.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/58_59.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/59_60.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/5_6.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/60_61.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/63_64.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/64_65.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/65_66.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/6_7.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/7_8.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/8_9.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/9_10.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/portal_workflow.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/upgrades/templates/portal_workflow_apply_and_reindex.pt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/__init__.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/configure.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/interfaces.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/ldap_utils.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/ms_user.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/utilities/roles.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/vocabularies.py +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/vocabularies.zcml +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/dependency_links.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/entry_points.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/namespace_packages.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/not-zip-safe +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/requires.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt.content.egg-info/top_level.txt +0 -0
- {esdrt.content-1.74.6 → esdrt_content-1.75.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: esdrt.content
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.75.1
|
|
4
4
|
Summary: Content-types for ESD Review Tool
|
|
5
5
|
Home-page: https://github.com/eea/esdrt.content/
|
|
6
6
|
Author: Mikel Larreategi
|
|
@@ -37,6 +37,16 @@ Review Tool
|
|
|
37
37
|
Changelog
|
|
38
38
|
=========
|
|
39
39
|
|
|
40
|
+
1.75.1 (2024-12-06)
|
|
41
|
+
-------------------
|
|
42
|
+
- Task: #277396 - Author support in carryover and bulk import.
|
|
43
|
+
[batradav]
|
|
44
|
+
|
|
45
|
+
1.75.0 (2024-12-05)
|
|
46
|
+
-------------------
|
|
47
|
+
- Task: #277396 - Only notify author SE.
|
|
48
|
+
[batradav]
|
|
49
|
+
|
|
40
50
|
1.74.6 (2024-07-01)
|
|
41
51
|
-------------------
|
|
42
52
|
- Task: #272010 - ESD EMRT extract error
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
1.75.1 (2024-12-06)
|
|
5
|
+
-------------------
|
|
6
|
+
- Task: #277396 - Author support in carryover and bulk import.
|
|
7
|
+
[batradav]
|
|
8
|
+
|
|
9
|
+
1.75.0 (2024-12-05)
|
|
10
|
+
-------------------
|
|
11
|
+
- Task: #277396 - Only notify author SE.
|
|
12
|
+
[batradav]
|
|
13
|
+
|
|
4
14
|
1.74.6 (2024-07-01)
|
|
5
15
|
-------------------
|
|
6
16
|
- Task: #272010 - ESD EMRT extract error
|
|
@@ -13,6 +13,7 @@ from Products.CMFCore.utils import getToolByName
|
|
|
13
13
|
import openpyxl
|
|
14
14
|
from DateTime import DateTime
|
|
15
15
|
from esdrt.content.roles.localrolesubscriber import grant_local_roles
|
|
16
|
+
import plone.api as api
|
|
16
17
|
|
|
17
18
|
LOG = getLogger("esdrt.content.carryover")
|
|
18
19
|
|
|
@@ -140,14 +141,24 @@ def reopen_with_qa(workflows, obj, actor):
|
|
|
140
141
|
if conclusion:
|
|
141
142
|
add_to_wh(wf_conclusion, conclusion, "redraft", "draft", actor)
|
|
142
143
|
|
|
144
|
+
def override_owner(obj, owner):
|
|
145
|
+
if owner:
|
|
146
|
+
user = api.user.get(owner)
|
|
147
|
+
if user:
|
|
148
|
+
userid = user.getId()
|
|
149
|
+
obj.changeOwnership(user)
|
|
150
|
+
obj.setCreators([userid])
|
|
151
|
+
obj.manage_setLocalRoles(userid, ["Owner", ])
|
|
143
152
|
|
|
144
153
|
def copy_direct(context, catalog, workflows, obj_from_url, row):
|
|
145
154
|
source = _read_col(row, 0)
|
|
146
155
|
conclusion_text = _read_col(row, 1)
|
|
147
156
|
actor = _read_col(row, 2)
|
|
157
|
+
owner = _read_col(row, 3)
|
|
148
158
|
|
|
149
159
|
obj = obj_from_url(source)
|
|
150
160
|
ob = _copy_and_flag(context, obj)
|
|
161
|
+
override_owner(ob, owner)
|
|
151
162
|
|
|
152
163
|
replace_conclusion_text(workflows, ob, conclusion_text)
|
|
153
164
|
clear_and_grant_roles(ob)
|
|
@@ -161,11 +172,13 @@ def copy_complex(context, catalog, workflows, obj_from_url, row):
|
|
|
161
172
|
older_source = _read_col(row, 1)
|
|
162
173
|
conclusion_text = _read_col(row, 2)
|
|
163
174
|
actor = _read_col(row, 3)
|
|
175
|
+
owner = _read_col(row, 4)
|
|
164
176
|
|
|
165
177
|
obj = obj_from_url(source)
|
|
166
178
|
older_obj = obj_from_url(older_source)
|
|
167
179
|
|
|
168
180
|
ob = _copy_and_flag(context, obj, older_obj.getId())
|
|
181
|
+
override_owner(ob, owner)
|
|
169
182
|
|
|
170
183
|
replace_conclusion_text(workflows, ob, conclusion_text)
|
|
171
184
|
prepend_qa(ob, older_obj)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import re
|
|
2
2
|
from functools import partial
|
|
3
3
|
from itertools import islice
|
|
4
|
-
from itertools import chain
|
|
5
4
|
from operator import itemgetter
|
|
6
5
|
|
|
7
6
|
from zope.component import getUtility
|
|
@@ -17,6 +16,7 @@ from plone import api
|
|
|
17
16
|
|
|
18
17
|
import openpyxl
|
|
19
18
|
|
|
19
|
+
from esdrt.content.browser.carryover import override_owner
|
|
20
20
|
from esdrt.content.observation import create_comment
|
|
21
21
|
from esdrt.content.question import create_question
|
|
22
22
|
|
|
@@ -26,6 +26,7 @@ PORTAL_TYPE = 'Observation'
|
|
|
26
26
|
UNUSED_FIELDS = (
|
|
27
27
|
'closing_comments', 'closing_deny_comments',
|
|
28
28
|
'closing_comments_phase2', 'closing_deny_comments_phase2',
|
|
29
|
+
'author',
|
|
29
30
|
)
|
|
30
31
|
|
|
31
32
|
UNCOMPLETED_ERR = (
|
|
@@ -101,8 +102,13 @@ def get_constants(context):
|
|
|
101
102
|
for idx, col in enumerate(filtered_inventory_cols, start=next_col):
|
|
102
103
|
XLS_COLS[col] = partial(_read_row, idx)
|
|
103
104
|
|
|
104
|
-
# last column always the initial Q&A question
|
|
105
|
-
|
|
105
|
+
# 2nd to last column always the initial Q&A question
|
|
106
|
+
idx_qa_text = idx + 1
|
|
107
|
+
XLS_COLS['question'] = partial(_read_row, idx_qa_text)
|
|
108
|
+
|
|
109
|
+
# last column is the Author override (optional)
|
|
110
|
+
idx_author = idx_qa_text + 1
|
|
111
|
+
XLS_COLS['author'] = partial(_read_row, idx_author)
|
|
106
112
|
|
|
107
113
|
return XLS_COLS
|
|
108
114
|
|
|
@@ -256,6 +262,11 @@ class Entry(object):
|
|
|
256
262
|
if val is not None:
|
|
257
263
|
return val.strip()
|
|
258
264
|
|
|
265
|
+
@property
|
|
266
|
+
def author(self):
|
|
267
|
+
value = self.constants['author'](self.row)
|
|
268
|
+
return value if value else None
|
|
269
|
+
|
|
259
270
|
def get_fields(self):
|
|
260
271
|
fields = self.constants.keys()
|
|
261
272
|
return {
|
|
@@ -302,6 +313,9 @@ def _create_observation(entry, context, request, portal_type, obj):
|
|
|
302
313
|
**fields
|
|
303
314
|
)
|
|
304
315
|
|
|
316
|
+
# change ownership if given
|
|
317
|
+
override_owner(content, entry.author)
|
|
318
|
+
|
|
305
319
|
question_text = entry.question
|
|
306
320
|
if question_text:
|
|
307
321
|
question = create_question(content)
|
|
@@ -20,7 +20,7 @@ class StatisticsView(grok.View):
|
|
|
20
20
|
grok.require('cmf.ManagePortal')
|
|
21
21
|
|
|
22
22
|
def update(self):
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
self.observations = self.get_all_observations()
|
|
25
25
|
self.questions = self.get_all_questions()
|
|
26
26
|
|
|
@@ -74,7 +74,7 @@ class StatisticsView(grok.View):
|
|
|
74
74
|
return step
|
|
75
75
|
|
|
76
76
|
def _generic_getter(self, objs, key, value, columns=[], filter_fun=None):
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
"""
|
|
79
79
|
Generic function to get items for later rendering.
|
|
80
80
|
Parameters:
|
|
@@ -258,7 +258,7 @@ class DownloadStatisticsView(grok.View):
|
|
|
258
258
|
return step
|
|
259
259
|
|
|
260
260
|
def _generic_getter(self, objs, key, value, columns=[], filter_fun=None):
|
|
261
|
-
|
|
261
|
+
|
|
262
262
|
"""
|
|
263
263
|
Generic function to get items for later rendering.
|
|
264
264
|
Parameters:
|
|
@@ -359,15 +359,15 @@ class DownloadStatisticsView(grok.View):
|
|
|
359
359
|
columns=['SRRE', 'LRQE', 'MSC', 'answered', 'conclusions', 'finalised']
|
|
360
360
|
)
|
|
361
361
|
for observation in observations:
|
|
362
|
-
data.append([observation['country'],
|
|
362
|
+
data.append([observation['country'],
|
|
363
363
|
observation['SRRE'],
|
|
364
364
|
observation['LRQE'],
|
|
365
365
|
observation['MSC'],
|
|
366
|
-
observation['answered'],
|
|
367
|
-
observation['conclusions'],
|
|
368
|
-
observation['finalised'],
|
|
366
|
+
observation['answered'],
|
|
367
|
+
observation['conclusions'],
|
|
368
|
+
observation['finalised'],
|
|
369
369
|
observation['sum']])
|
|
370
|
-
data.headers = ['Country', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
|
|
370
|
+
data.headers = ['Country', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
|
|
371
371
|
|
|
372
372
|
return data
|
|
373
373
|
|
|
@@ -379,19 +379,19 @@ class DownloadStatisticsView(grok.View):
|
|
|
379
379
|
key='sector',
|
|
380
380
|
value='status',
|
|
381
381
|
columns=['SRRE', 'LRQE', 'MSC', 'answered', 'conclusions', 'finalised']
|
|
382
|
-
)
|
|
382
|
+
)
|
|
383
383
|
for observation in observations:
|
|
384
|
-
data.append([observation['sector'],
|
|
384
|
+
data.append([observation['sector'],
|
|
385
385
|
observation['SRRE'],
|
|
386
386
|
observation['LRQE'],
|
|
387
387
|
observation['MSC'],
|
|
388
|
-
observation['answered'],
|
|
389
|
-
observation['conclusions'],
|
|
390
|
-
observation['finalised'],
|
|
388
|
+
observation['answered'],
|
|
389
|
+
observation['conclusions'],
|
|
390
|
+
observation['finalised'],
|
|
391
391
|
observation['sum']])
|
|
392
|
-
data.headers = ['Sector', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
|
|
392
|
+
data.headers = ['Sector', 'SR/RE', 'LR/QE', 'MSC', 'Answer received', 'Conclusions', 'Finalised', 'Sum']
|
|
393
393
|
|
|
394
|
-
return data
|
|
394
|
+
return data
|
|
395
395
|
|
|
396
396
|
def finalised_reason_per_country(self):
|
|
397
397
|
data = tablib.Dataset()
|
|
@@ -401,19 +401,19 @@ class DownloadStatisticsView(grok.View):
|
|
|
401
401
|
key='country',
|
|
402
402
|
value='finalisation_reason',
|
|
403
403
|
columns=['no-conclusion-yet', 'no-response-needed', 'partly-resolved', 'resolved', 'unresolved', 'significant-issue']
|
|
404
|
-
)
|
|
404
|
+
)
|
|
405
405
|
for observation in observations:
|
|
406
|
-
data.append([observation['country'],
|
|
406
|
+
data.append([observation['country'],
|
|
407
407
|
observation['no-conclusion-yet'],
|
|
408
408
|
observation['no-response-needed'],
|
|
409
409
|
observation['partly-resolved'],
|
|
410
|
-
observation['resolved'],
|
|
410
|
+
observation['resolved'],
|
|
411
411
|
observation['unresolved'],
|
|
412
412
|
observation['significant-issue'],
|
|
413
413
|
observation['sum']])
|
|
414
|
-
data.headers = ['Country', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
|
|
414
|
+
data.headers = ['Country', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
|
|
415
415
|
|
|
416
|
-
return data
|
|
416
|
+
return data
|
|
417
417
|
|
|
418
418
|
def finalised_reason_per_sector(self):
|
|
419
419
|
data = tablib.Dataset()
|
|
@@ -425,17 +425,17 @@ class DownloadStatisticsView(grok.View):
|
|
|
425
425
|
columns=['no-conclusion-yet', 'no-response-needed', 'partly-resolved', 'resolved', 'unresolved', 'significant-issue']
|
|
426
426
|
)
|
|
427
427
|
for observation in observations:
|
|
428
|
-
data.append([observation['sector'],
|
|
428
|
+
data.append([observation['sector'],
|
|
429
429
|
observation['no-conclusion-yet'],
|
|
430
430
|
observation['no-response-needed'],
|
|
431
431
|
observation['partly-resolved'],
|
|
432
|
-
observation['resolved'],
|
|
432
|
+
observation['resolved'],
|
|
433
433
|
observation['unresolved'],
|
|
434
434
|
observation['significant-issue'],
|
|
435
435
|
observation['sum']])
|
|
436
|
-
data.headers = ['Sector', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
|
|
436
|
+
data.headers = ['Sector', 'No conclusion yet', 'No response needed', 'Party resolved', 'Resolved', 'Unresolved', 'Significant issue', 'Sum']
|
|
437
437
|
|
|
438
|
-
return data
|
|
438
|
+
return data
|
|
439
439
|
|
|
440
440
|
|
|
441
441
|
def observation_highlights_pgf(self):
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
<strong>Please note that the first row of the XLS file will be ignored.</strong>
|
|
14
14
|
</li>
|
|
15
15
|
<li>The <strong>userid</strong> column needs to be a valid EIONET user id. It used for the Obsevation History.</li>
|
|
16
|
+
<li>The <strong>Author override</strong> column needs to be a valid EIONET user id. <strong>If given</strong>, it will override the observation author, thus reassigning ownership of the observation.</li>
|
|
16
17
|
</ul>
|
|
17
18
|
</div>
|
|
18
19
|
</div>
|
|
@@ -24,14 +25,27 @@
|
|
|
24
25
|
Observations are copied as-is, the ID will be preserved.
|
|
25
26
|
If provided, the conclusion text will replace the existing conclusion text.
|
|
26
27
|
</p>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
</
|
|
28
|
+
<table class="listing">
|
|
29
|
+
<thead>
|
|
30
|
+
<tr>
|
|
31
|
+
<th>Source observation</th>
|
|
32
|
+
<th>Conclusion text</th>
|
|
33
|
+
<th>userid</th>
|
|
34
|
+
<th>Author override (userid)</th>
|
|
35
|
+
</tr>
|
|
36
|
+
</thead>
|
|
37
|
+
<tbody>
|
|
38
|
+
<tr>
|
|
39
|
+
<td>
|
|
40
|
+
<tal:url replace="portal_url"/>
|
|
41
|
+
/2018/AT-1A-2018-0000
|
|
42
|
+
</td>
|
|
43
|
+
<td>Conclusion text that will replace the existing one.</td>
|
|
44
|
+
<td>someuserid</td>
|
|
45
|
+
<td>someuserid</td>
|
|
46
|
+
</tr>
|
|
47
|
+
</tbody>
|
|
48
|
+
</table>
|
|
35
49
|
|
|
36
50
|
</div>
|
|
37
51
|
|
|
@@ -46,15 +60,32 @@
|
|
|
46
60
|
</ul>
|
|
47
61
|
If provided, the conclusion text will replace the existing conclusion text.
|
|
48
62
|
</div>
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
</
|
|
63
|
+
<table class="listing">
|
|
64
|
+
<thead>
|
|
65
|
+
<tr>
|
|
66
|
+
<th>Source observation</th>
|
|
67
|
+
<th>Older source</th>
|
|
68
|
+
<th>Conclusion text</th>
|
|
69
|
+
<th>userid</th>
|
|
70
|
+
<th>Author override (userid)</th>
|
|
71
|
+
</tr>
|
|
72
|
+
</thead>
|
|
73
|
+
<tbody>
|
|
74
|
+
<tr>
|
|
75
|
+
<td>
|
|
76
|
+
<tal:url replace="portal_url"/>
|
|
77
|
+
/2018/AT-1A-2018-0000
|
|
78
|
+
</td>
|
|
79
|
+
<td>
|
|
80
|
+
<tal:url replace="portal_url"/>
|
|
81
|
+
/2018/AT-1A-2017-0000
|
|
82
|
+
</td>
|
|
83
|
+
<td>Conclusion text that will replace the existing one.</td>
|
|
84
|
+
<td>someuserid</td>
|
|
85
|
+
<td>someuserid</td>
|
|
86
|
+
</tr>
|
|
87
|
+
</tbody>
|
|
88
|
+
</table>
|
|
58
89
|
|
|
59
90
|
</div>
|
|
60
91
|
|
{esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/import_observation.pt
RENAMED
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
if your observation has multiple values, please write them one per line, as in the sample import file.
|
|
10
10
|
<br/> The "Fuel" and 'Description Flags' fields can be left empty as they are not mandatory fields.
|
|
11
11
|
<tal:key_categ condition="here/enable_key_category">
|
|
12
|
-
<br /> The MS/EU Key Category field can be set to 'True' if the observation belongs to this category
|
|
12
|
+
<br /> The MS/EU Key Category field can be set to 'True' if the observation belongs to this category,
|
|
13
13
|
or it can be left empty if it doesn't.
|
|
14
14
|
</tal:key_categ>
|
|
15
|
+
<br />
|
|
16
|
+
The last column is the <strong>Author override</strong> and requires a valid EIONET userid.
|
|
17
|
+
You can leave it empty, in which case the default is to assign yourself as the Author.
|
|
15
18
|
</p>
|
|
16
19
|
<p>You can download a sample import file by clicking <a href="./get_sample_xls">here</a>.</p>
|
|
17
20
|
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
<tal:block metal:fill-slot="javascript_head_slot">
|
|
9
9
|
<script tal:attributes="src string:${portal_url}/++resource++esdrt.content/cookies.js"></script>
|
|
10
10
|
<script tal:attributes="src string:${portal_url}/++resource++esdrt.content/inbox_view.js"></script>
|
|
11
|
+
<script type="text/javascript" src="++resource++orderedselect_input.js"></script>
|
|
12
|
+
<script type="text/javascript">
|
|
13
|
+
$(document).ready(function(){
|
|
14
|
+
$(".chosen-select").chosen({width: "100%", allow_single_deselect: true});
|
|
15
|
+
})
|
|
16
|
+
</script>
|
|
11
17
|
</tal:block>
|
|
12
18
|
<tal:block metal:fill-slot="style_slot">
|
|
13
19
|
<link rel="stylesheet" type="text/css" tal:attributes="href string:${portal_url}/++resource++esdrt.content/inbox_view.css" />
|
|
@@ -49,16 +55,29 @@
|
|
|
49
55
|
|
|
50
56
|
<div id="filters">
|
|
51
57
|
<div class="row" style="padding-top:30px">
|
|
52
|
-
<div class="cell position-1 width-
|
|
58
|
+
<div class="cell position-1 width-9 esdLabel">Free text</div>
|
|
59
|
+
<div class="cell position-10 width-3 esdLabel">Author</div>
|
|
53
60
|
</div>
|
|
54
61
|
<div class="row">
|
|
55
62
|
<form action="./inboxview" method="GET" tal:define="freeText request/freeText|nothing">
|
|
56
|
-
<div class="cell position-1 width-
|
|
57
|
-
<tal:params repeat="req_param python:[x for x in req_params if x[0]
|
|
63
|
+
<div class="cell position-1 width-9">
|
|
64
|
+
<tal:params repeat="req_param python:[x for x in req_params if x[0] not in ['freeText', 'obsAuthor']]">
|
|
58
65
|
<input type="hidden" tal:attributes="name python:req_param[0]; value python:req_param[1]" />
|
|
59
66
|
</tal:params>
|
|
60
67
|
<input type="text" style="width:100%;border-radius:5px;height:21px" name="freeText" tal:attributes="value freeText" />
|
|
61
68
|
</div>
|
|
69
|
+
<div class="cell position-10 width-3 esdLabel">
|
|
70
|
+
<select id="obsAuthorFilter" name="obsAuthor" class="chosen-select" data-placeholder="Select author"
|
|
71
|
+
tal:define="obsAuthor python:'';
|
|
72
|
+
obsAuthor request/obsAuthor | obsAuthor">
|
|
73
|
+
<option></option>
|
|
74
|
+
<tal:option repeat="author python:view.get_indexed_authors()">
|
|
75
|
+
<option
|
|
76
|
+
tal:attributes="value python:author[0]; selected python:author[0] == obsAuthor"
|
|
77
|
+
tal:content="python:author[1]"></option>
|
|
78
|
+
</tal:option>
|
|
79
|
+
</select>
|
|
80
|
+
</div>
|
|
62
81
|
<div class="cell position-14 width-1">
|
|
63
82
|
<input type="submit" class="standardButton" id="btnFilter" value="Search" />
|
|
64
83
|
</div>
|
{esdrt.content-1.74.6 → esdrt_content-1.75.1}/esdrt/content/browser/templates/reviewfolderview.pt
RENAMED
|
@@ -175,6 +175,16 @@
|
|
|
175
175
|
}
|
|
176
176
|
filter += "wfStatus=" + $('#wfStatusFilter').val();
|
|
177
177
|
}
|
|
178
|
+
// Commented so that empty value cand be used to show all available if desired.
|
|
179
|
+
// This is handled in reviewfolder.py by checking if obsAuthorFilter is None.
|
|
180
|
+
// if ($('#obsAuthorFilter').val() != ""){
|
|
181
|
+
if (filter == ""){
|
|
182
|
+
filter += "?";
|
|
183
|
+
}else{
|
|
184
|
+
filter += "&";
|
|
185
|
+
}
|
|
186
|
+
filter += "obsAuthor=" + $('#obsAuthorFilter').val();
|
|
187
|
+
// }
|
|
178
188
|
if ($('#crfFilter').val() != ""){
|
|
179
189
|
if (filter == ""){
|
|
180
190
|
filter += "?";
|
|
@@ -380,7 +390,8 @@
|
|
|
380
390
|
</div>
|
|
381
391
|
<div class="row" style="padding-top:20px">
|
|
382
392
|
<div class="cell position-1 width-3 esdLabel" tal:condition="here/enable_steps">Step</div>
|
|
383
|
-
<div class="cell position-4 width-
|
|
393
|
+
<div class="cell position-4 width-3 esdLabel">Workflow</div>
|
|
394
|
+
<div class="cell position-7 width-3 esdLabel">Author</div>
|
|
384
395
|
</div>
|
|
385
396
|
<div class="row">
|
|
386
397
|
<div class="cell position-1 width-3" tal:condition="here/enable_steps">
|
|
@@ -394,7 +405,7 @@
|
|
|
394
405
|
value="step2">Step2</option>
|
|
395
406
|
</select>
|
|
396
407
|
</div>
|
|
397
|
-
<div class="cell position-4 width-
|
|
408
|
+
<div class="cell position-4 width-3">
|
|
398
409
|
<select id="wfStatusFilter" class="chosen-select" data-placeholder="Select status"
|
|
399
410
|
tal:define="wfStatus python:'';
|
|
400
411
|
wfStatus request/wfStatus | wfStatus">
|
|
@@ -415,6 +426,18 @@
|
|
|
415
426
|
value="finalised">Finalised</option>
|
|
416
427
|
</select>
|
|
417
428
|
</div>
|
|
429
|
+
<div class="cell position-7 width-3">
|
|
430
|
+
<select id="obsAuthorFilter" class="chosen-select" data-placeholder="Select author"
|
|
431
|
+
tal:define="obsAuthor python:'';
|
|
432
|
+
obsAuthor request/obsAuthor | obsAuthor">
|
|
433
|
+
<option></option>
|
|
434
|
+
<tal:option repeat="author python:view.get_indexed_authors()">
|
|
435
|
+
<option
|
|
436
|
+
tal:attributes="value python:author[0]; selected python:author[0] == obsAuthor"
|
|
437
|
+
tal:content="python:author[1]"></option>
|
|
438
|
+
</tal:option>
|
|
439
|
+
</select>
|
|
440
|
+
</div>
|
|
418
441
|
</div>
|
|
419
442
|
<div class="row" style="padding-top:30px">
|
|
420
443
|
<div class="cell position-1 width-1">
|
|
@@ -98,12 +98,20 @@ def get_users_in_context(observation, role, notification_name):
|
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
def exclude_user_from_notification(observation, user, role, notification):
|
|
101
|
+
user_id = user.getId()
|
|
101
102
|
adapted = INotificationUnsubscriptions(observation)
|
|
102
|
-
data = adapted.get_user_data(
|
|
103
|
+
data = adapted.get_user_data(user_id)
|
|
103
104
|
if not data:
|
|
104
105
|
area = aq_parent(aq_inner(observation))
|
|
105
106
|
if IReviewFolder.providedBy(area):
|
|
106
107
|
adapted = INotificationUnsubscriptions(area)
|
|
107
|
-
data = adapted.get_user_data(
|
|
108
|
+
data = adapted.get_user_data(user_id)
|
|
108
109
|
excluded_notifications = data.get(role, [])
|
|
109
|
-
|
|
110
|
+
exclude_based_on_notification = notification in excluded_notifications
|
|
111
|
+
if exclude_based_on_notification:
|
|
112
|
+
return exclude_based_on_notification
|
|
113
|
+
|
|
114
|
+
if role in ["ReviewerPhase1", "ReviewerPhase2"] and "config_only_where_author" not in excluded_notifications:
|
|
115
|
+
owner = observation.getOwner()
|
|
116
|
+
return user_id != owner.getId() if owner else False
|
|
117
|
+
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import operator
|
|
2
3
|
import itertools
|
|
3
4
|
import time
|
|
4
5
|
from datetime import datetime
|
|
@@ -54,6 +55,7 @@ from esdrt.content.crf_code_matching import get_category_ldap_from_crf_code
|
|
|
54
55
|
from esdrt.content.timeit import timeit
|
|
55
56
|
from esdrt.content.utilities.interfaces import ISetupReviewFolderRoles
|
|
56
57
|
from esdrt.content.utilities.ms_user import IUserIsMS
|
|
58
|
+
from esdrt.content.utils import get_userid_name
|
|
57
59
|
|
|
58
60
|
|
|
59
61
|
LOG = logging.getLogger(__name__)
|
|
@@ -85,6 +87,31 @@ LDAP_QUERY_GROUPS = (
|
|
|
85
87
|
)
|
|
86
88
|
|
|
87
89
|
|
|
90
|
+
def get_indexed_authors(context):
|
|
91
|
+
catalog = api.portal.get_tool("portal_catalog")
|
|
92
|
+
path = "/".join(context.getPhysicalPath())
|
|
93
|
+
query = {
|
|
94
|
+
"path": path,
|
|
95
|
+
"portal_type": "Observation",
|
|
96
|
+
}
|
|
97
|
+
authors = set([b.Creator for b in catalog.searchResults(query)])
|
|
98
|
+
return authors
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def get_indexed_authors_with_names(context):
|
|
102
|
+
authors = get_indexed_authors(context)
|
|
103
|
+
return [(v, get_userid_name(v)) for v in authors]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_indexed_authors_for_select(context):
|
|
107
|
+
authors_with_names = get_indexed_authors_with_names(context)
|
|
108
|
+
user = api.user.get_current()
|
|
109
|
+
if (user):
|
|
110
|
+
userId = user.getId()
|
|
111
|
+
authors_with_names = [(uid, "Me ({})".format(uname)) if uid == userId else (uid, uname) for uid, uname in authors_with_names]
|
|
112
|
+
return sorted(authors_with_names, key=lambda x: float("-inf") if x[1][:2] == "Me" else x[1])
|
|
113
|
+
|
|
114
|
+
|
|
88
115
|
def get_observation_phase(brain):
|
|
89
116
|
result = ""
|
|
90
117
|
state = brain["observation_questions_workflow"]
|
|
@@ -162,6 +189,22 @@ def _user_name(fun, self, userid):
|
|
|
162
189
|
return (userid, time.time() // 86400)
|
|
163
190
|
|
|
164
191
|
|
|
192
|
+
def redirect_for_author(context, request):
|
|
193
|
+
obsAuthor = request.get("obsAuthor", None)
|
|
194
|
+
missing_author_filter = obsAuthor is None
|
|
195
|
+
user = api.user.get_current()
|
|
196
|
+
is_user = not api.user.is_anonymous() and "Manager" not in user.getRoles()
|
|
197
|
+
if missing_author_filter and is_user:
|
|
198
|
+
user_id = user.getId()
|
|
199
|
+
if user_id in get_indexed_authors(context):
|
|
200
|
+
new_url = "%s?%s&obsAuthor=%s" % (
|
|
201
|
+
request["ACTUAL_URL"],
|
|
202
|
+
request["QUERY_STRING"],
|
|
203
|
+
user_id,
|
|
204
|
+
)
|
|
205
|
+
return request.response.redirect(new_url)
|
|
206
|
+
|
|
207
|
+
|
|
165
208
|
class IReviewFolder(plone.directives.form.Schema, IImageScaleTraversable):
|
|
166
209
|
"""
|
|
167
210
|
Folder to have all observations together
|
|
@@ -235,6 +278,17 @@ class ReviewFolder(Container):
|
|
|
235
278
|
|
|
236
279
|
|
|
237
280
|
class ReviewFolderMixin(BrowserView):
|
|
281
|
+
|
|
282
|
+
def get_current_user_id(self):
|
|
283
|
+
result = ""
|
|
284
|
+
user = api.user.get_current()
|
|
285
|
+
if user:
|
|
286
|
+
result = user.getId()
|
|
287
|
+
return result
|
|
288
|
+
|
|
289
|
+
def get_indexed_authors(self):
|
|
290
|
+
return get_indexed_authors_for_select(self.context)
|
|
291
|
+
|
|
238
292
|
@memoize
|
|
239
293
|
def get_questions(self, sort_on="modified", sort_order="reverse"):
|
|
240
294
|
country = self.request.form.get("country", "")
|
|
@@ -245,6 +299,7 @@ class ReviewFolderMixin(BrowserView):
|
|
|
245
299
|
freeText = self.request.form.get("freeText", "")
|
|
246
300
|
step = self.request.form.get("step", "")
|
|
247
301
|
wfStatus = self.request.form.get("wfStatus", "")
|
|
302
|
+
obsAuthor = self.request.form.get("obsAuthor", "")
|
|
248
303
|
crfCode = self.request.form.get("crfCode", "")
|
|
249
304
|
gas = self.request.form.get("gas", self.request.form.get("gas[]", []))
|
|
250
305
|
gas = gas if isinstance(gas, list) else [gas]
|
|
@@ -289,6 +344,8 @@ class ReviewFolderMixin(BrowserView):
|
|
|
289
344
|
query["observation_step"] = step
|
|
290
345
|
if wfStatus != "":
|
|
291
346
|
query["observation_status"] = wfStatus
|
|
347
|
+
if obsAuthor != "":
|
|
348
|
+
query["Creator"] = obsAuthor
|
|
292
349
|
if crfCode != "":
|
|
293
350
|
query["crf_code"] = crfCode
|
|
294
351
|
if gas != "":
|
|
@@ -503,6 +560,7 @@ class ReviewFolderBrowserView(ReviewFolderMixin):
|
|
|
503
560
|
return table.render(table)
|
|
504
561
|
|
|
505
562
|
def render(self):
|
|
563
|
+
redirect_for_author(self.context, self.request)
|
|
506
564
|
sort_on = self.request.get("sort_on", "modified")
|
|
507
565
|
sort_order = self.request.get("sort_order", "reverse")
|
|
508
566
|
pagenumber = self.request.get("pagenumber", "1")
|
|
@@ -988,6 +1046,9 @@ class InboxReviewFolderView(BrowserView):
|
|
|
988
1046
|
def get_current_user(self):
|
|
989
1047
|
return api.user.get_current()
|
|
990
1048
|
|
|
1049
|
+
def get_indexed_authors(self):
|
|
1050
|
+
return get_indexed_authors_for_select(self.context)
|
|
1051
|
+
|
|
991
1052
|
def get_sections(self):
|
|
992
1053
|
is_sec = self.is_secretariat()
|
|
993
1054
|
viewable = [sec for sec in SECTIONS if is_sec or sec["check"](self)]
|
|
@@ -1015,6 +1076,7 @@ class InboxReviewFolderView(BrowserView):
|
|
|
1015
1076
|
|
|
1016
1077
|
def __call__(self):
|
|
1017
1078
|
self.rolemap_observations = {}
|
|
1079
|
+
redirect_for_author(self.context, self.request)
|
|
1018
1080
|
return super(InboxReviewFolderView, self).__call__()
|
|
1019
1081
|
|
|
1020
1082
|
def batch(self, observations, b_size, b_start, orphan, b_start_str):
|
|
@@ -1027,6 +1089,7 @@ class InboxReviewFolderView(BrowserView):
|
|
|
1027
1089
|
|
|
1028
1090
|
def get_observations(self, rolecheck=None, **kw):
|
|
1029
1091
|
freeText = self.request.form.get("freeText", "")
|
|
1092
|
+
obsAuthor = self.request.form.get("obsAuthor", "")
|
|
1030
1093
|
catalog = api.portal.get_tool("portal_catalog")
|
|
1031
1094
|
path = "/".join(self.context.getPhysicalPath())
|
|
1032
1095
|
query = {
|
|
@@ -1037,6 +1100,8 @@ class InboxReviewFolderView(BrowserView):
|
|
|
1037
1100
|
}
|
|
1038
1101
|
if freeText:
|
|
1039
1102
|
query["SearchableText"] = freeText
|
|
1103
|
+
if obsAuthor != "":
|
|
1104
|
+
query["Creator"] = obsAuthor
|
|
1040
1105
|
|
|
1041
1106
|
query.update(kw)
|
|
1042
1107
|
# from logging import getLogger
|