From c57faa42005dd9195cd091550855737c2b27a295 Mon Sep 17 00:00:00 2001 From: Zacharias Zacharodimos Date: Mon, 8 Apr 2024 17:52:32 +0200 Subject: [PATCH] wip: codebase upgrade --- .gitignore | 5 +- .python-version | 1 + Upgrade.txt | 88 +++ cds/config.py | 253 +++--- cds/modules/deposit/api.py | 114 ++- cds/modules/deposit/bundles.py | 196 ++--- cds/modules/deposit/ext.py | 26 +- cds/modules/deposit/fetcher.py | 14 +- cds/modules/deposit/form.py | 4 +- cds/modules/deposit/loaders/loader.py | 63 +- .../videos/project/project-v1.0.0.json | 317 -------- .../records/videos/video/video-v1.0.0.json | 374 --------- .../deposit/mappings/os-v2/__init__.py | 0 .../mappings/os-v2/deposits/__init__.py | 0 .../os-v2/deposits/records/__init__.py | 0 .../os-v2/deposits/records/videos/__init__.py | 0 .../records/videos/project/__init__.py | 0 .../videos/project/project-v1.0.0.json | 304 ++++++++ .../deposits/records/videos/video/__init__.py | 0 .../records/videos/video/video-v1.0.0.json | 339 +++++++++ cds/modules/deposit/receivers.py | 8 +- .../videos/project/project-v1.0.0.json | 30 +- cds/modules/deposit/search.py | 6 +- .../static/js/cds_deposit/avc/avc.module.js | 247 ------ .../cds_deposit/avc/components/cdsActions.js | 166 ---- .../avc/components/cdsRemoteUploader.js | 93 --- .../js/cds_deposit/avc/factories/states.js | 140 ---- .../cds_deposit/avc/filters/mergeObjects.js | 9 - .../avc/filters/parseAutocomplete.js | 10 - .../js/cds_deposit/avc/filters/toInt.js | 14 - .../avc/providers/depositActions.js | 83 -- .../avc/providers/depositExtractedMetadata.js | 14 - .../avc/providers/depositStates.js | 14 - .../avc/providers/depositStatuses.js | 14 - .../avc/providers/inheritedProperties.js | 14 - .../js/cds_deposit/avc/providers/jwt.js | 19 - .../cds_deposit/avc/providers/stateReducer.js | 21 - .../avc/providers/taskRepresentations.js | 14 - .../cds_deposit/avc/providers/typeReducer.js | 21 - .../cds_deposit/avc/providers/urlBuilder.js | 21 - .../deposit/static/js/cds_deposit/main.js | 16 - .../json/cds_deposit/forms/project.json | 48 +- .../deposit/templates/cds_deposit/edit.html | 24 +- .../deposit/templates/cds_deposit/index.html | 12 +- cds/modules/ffmpeg/ffmpeg.py | 2 +- cds/modules/flows/tasks.py | 193 +++-- cds/modules/home/views.py | 29 +- cds/modules/invenio_deposit/__init__.py | 31 + cds/modules/invenio_deposit/api.py | 530 +++++++++++++ cds/modules/invenio_deposit/bundles.py | 139 ++++ cds/modules/invenio_deposit/config.py | 224 ++++++ cds/modules/invenio_deposit/errors.py | 50 ++ cds/modules/invenio_deposit/ext.py | 153 ++++ cds/modules/invenio_deposit/fetchers.py | 46 ++ cds/modules/invenio_deposit/minters.py | 70 ++ cds/modules/invenio_deposit/permissions.py | 48 ++ cds/modules/invenio_deposit/providers.py | 60 ++ cds/modules/invenio_deposit/proxies.py | 34 + cds/modules/invenio_deposit/scopes.py | 47 ++ cds/modules/invenio_deposit/search.py | 66 ++ cds/modules/invenio_deposit/serializers.py | 110 +++ cds/modules/invenio_deposit/signals.py | 52 ++ .../invenio_deposit/records/actions.html | 12 + .../invenio_deposit/records/form.html | 1 + .../templates/invenio_deposit/results.html | 39 + .../templates/invenio_deposit/searchbar.html | 17 + .../templates/invenio_deposit/selectbox.html | 5 + .../invenio_deposit/selectstatus.html | 12 + .../invenio_deposit/togglebutton.html | 4 + .../templates/invenio_deposit/base.html | 9 + .../templates/invenio_deposit/edit.html | 88 +++ .../templates/invenio_deposit/index.html | 136 ++++ .../templates/invenio_deposit/tombstone.html | 23 + cds/modules/invenio_deposit/utils.py | 120 +++ cds/modules/invenio_deposit/views/__init__.py | 27 + cds/modules/invenio_deposit/views/rest.py | 425 +++++++++++ cds/modules/invenio_deposit/views/ui.py | 115 +++ cds/modules/oauthclient/cern_openid.py | 4 +- cds/modules/previewer/bundles.py | 16 +- .../templates/cds_previewer/video/video.html | 5 +- cds/modules/records/api.py | 18 +- cds/modules/records/bundles.py | 84 +- cds/modules/records/forms.py | 2 +- .../mappings/categories/category-v1.0.0.json | 43 -- .../mappings/keywords/keyword-v1.0.0.json | 22 - .../records/mappings/os-v2/__init__.py | 0 .../mappings/os-v2/categories/__init__.py | 0 .../os-v2/categories/category-v1.0.0.json | 37 + .../mappings/os-v2/keywords/__init__.py | 0 .../os-v2/keywords/keyword-v1.0.0.json | 18 + .../mappings/os-v2/records/__init__.py | 0 .../mappings/os-v2/records/videos/__init__.py | 0 .../os-v2/records/videos/project/__init__.py | 0 .../videos/project/project-v1.0.0.json | 293 +++++++ .../os-v2/records/videos/video/__init__.py | 0 .../records/videos/video/video-v1.0.0.json | 326 ++++++++ .../videos/project/project-v1.0.0.json | 326 -------- .../records/videos/video/video-v1.0.0.json | 363 --------- cds/modules/records/permissions.py | 13 +- cds/modules/records/search.py | 6 +- .../records/serializers/fields/datetime.py | 8 +- cds/modules/records/serializers/json.py | 2 +- .../records/serializers/schemas/common.py | 43 +- .../records/serializers/schemas/doi.py | 71 +- .../records/serializers/schemas/project.py | 36 +- .../records/serializers/schemas/video.py | 28 +- .../records/static/js/cds_records/stats.js | 31 - .../templates/cds_records/record_detail.html | 4 +- .../templates/cds_records/record_stats.html | 16 +- cds/modules/records/utils.py | 10 +- cds/modules/records/validators.py | 18 +- cds/modules/search_ui/bundles.py | 48 +- .../js/invenio_search_bar_suggestions.js | 38 - .../templates/cds_search_ui/search.html | 6 +- cds/modules/stats/views.py | 6 +- .../bootstrap3}/js/cds-settings.js | 38 +- .../theme/assets/bootstrap3/js/cds/app.js | 143 ++++ .../theme/assets/bootstrap3/js/cds/module.js | 720 ++++++++++++++++++ .../bootstrap3}/js/cds/suggestions.js | 45 +- .../assets/bootstrap3/js/cds_deposit/app.js | 64 ++ .../js/cds_deposit/avc/avc.module.js | 282 +++++++ .../cds_deposit/avc/components/cdsActions.js | 175 +++++ .../cds_deposit/avc/components/cdsDeposit.js | 633 +++++++-------- .../cds_deposit/avc/components/cdsDeposits.js | 262 ++++--- .../js/cds_deposit/avc/components/cdsForm.js | 46 +- .../avc/components/cdsRemoteUploader.js | 102 +++ .../cds_deposit/avc/components/cdsUploader.js | 18 +- .../js/cds_deposit/avc/factories/states.js | 144 ++++ .../cds_deposit/avc/filters/mergeObjects.js | 10 + .../js/cds_deposit/avc/filters/orderTasks.js | 6 +- .../cds_deposit/avc/filters/overallState.js | 19 +- .../avc/filters/parseAutocomplete.js | 15 + .../cds_deposit/avc/filters/progressClass.js | 4 +- .../cds_deposit/avc/filters/progressIcon.js | 4 +- .../js/cds_deposit/avc/filters/toInt.js | 15 + .../avc/providers/depositActions.js | 127 +++ .../avc/providers/depositExtractedMetadata.js | 17 + .../avc/providers/depositStates.js | 15 + .../avc/providers/depositStatuses.js | 17 + .../avc/providers/inheritedProperties.js | 17 + .../cds_deposit/avc/providers/stateReducer.js | 22 + .../avc/providers/taskRepresentations.js | 17 + .../cds_deposit/avc/providers/typeReducer.js | 22 + .../cds_deposit/avc/providers/urlBuilder.js | 23 + .../assets/bootstrap3/js/cds_records/app.js} | 22 +- .../assets/bootstrap3/js/cds_records/stats.js | 34 + .../js/cds_records/user_actions_logger.js | 0 .../assets/bootstrap3/js/cds_search_ui/app.js | 76 ++ .../bootstrap3/scss/cds}/cds.scss | 6 +- .../bootstrap3/scss/cds}/colors.scss | 0 .../bootstrap3/scss/cds}/decorators.scss | 0 .../bootstrap3/scss/cds}/mixins.scss | 0 .../bootstrap3/scss/cds}/social.scss | 0 .../bootstrap3/scss/cds}/spacing.scss | 0 .../assets/bootstrap3/scss/cds/theme.scss | 38 + .../bootstrap3/scss/cds}/variables.scss | 0 .../bootstrap3/scss/cds_previewer/video.scss} | 0 .../bootstrap3/scss/cds_records}/stats.scss | 0 cds/modules/theme/bundles.py | 144 ++-- cds/modules/theme/static/js/cds/module.js | 643 ---------------- cds/modules/theme/static/js/main.js | 123 --- .../theme/templates/cds_theme/header.html | 5 +- .../theme/templates/cds_theme/page.html | 9 + .../theme/templates/cds_theme/scripts.html | 2 +- .../theme/templates/cds_theme/styles.html | 3 +- cds/modules/theme/webpack.py | 108 +++ docker-compose.full.yml | 8 +- docker-compose.yml | 4 +- docker-services.yml | 52 +- docker/es/Dockerfile | 4 +- pyproject.toml | 3 + requirements.packages.upgrade.txt | 174 +++++ requirements.pinned.upgrade.txt | 29 + scripts/assets-watch | 32 + scripts/bootstrap | 16 +- scripts/bootstrap_upgrade | 39 + scripts/celery | 2 +- setup copy.py | 299 ++++++++ setup.cfg | 233 +++++- setup.py | 227 +----- tests/unit/conftest.py | 499 ++++++------ tests/unit/test_project.py | 379 ++++----- tests/unit/test_video.py | 515 +++++++------ 183 files changed, 9342 insertions(+), 5422 deletions(-) create mode 100644 .python-version create mode 100644 Upgrade.txt delete mode 100644 cds/modules/deposit/mappings/deposits/records/videos/project/project-v1.0.0.json delete mode 100644 cds/modules/deposit/mappings/deposits/records/videos/video/video-v1.0.0.json create mode 100644 cds/modules/deposit/mappings/os-v2/__init__.py create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/__init__.py create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/records/__init__.py create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/records/videos/__init__.py create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/__init__.py create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/project-v1.0.0.json create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/__init__.py create mode 100644 cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/video-v1.0.0.json delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/avc.module.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/components/cdsActions.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/components/cdsRemoteUploader.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/factories/states.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/filters/mergeObjects.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/filters/parseAutocomplete.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/filters/toInt.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/depositActions.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/depositExtractedMetadata.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStates.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStatuses.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/inheritedProperties.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/jwt.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/stateReducer.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/taskRepresentations.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/typeReducer.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/avc/providers/urlBuilder.js delete mode 100644 cds/modules/deposit/static/js/cds_deposit/main.js create mode 100644 cds/modules/invenio_deposit/__init__.py create mode 100644 cds/modules/invenio_deposit/api.py create mode 100644 cds/modules/invenio_deposit/bundles.py create mode 100644 cds/modules/invenio_deposit/config.py create mode 100644 cds/modules/invenio_deposit/errors.py create mode 100644 cds/modules/invenio_deposit/ext.py create mode 100644 cds/modules/invenio_deposit/fetchers.py create mode 100644 cds/modules/invenio_deposit/minters.py create mode 100644 cds/modules/invenio_deposit/permissions.py create mode 100644 cds/modules/invenio_deposit/providers.py create mode 100644 cds/modules/invenio_deposit/proxies.py create mode 100644 cds/modules/invenio_deposit/scopes.py create mode 100644 cds/modules/invenio_deposit/search.py create mode 100644 cds/modules/invenio_deposit/serializers.py create mode 100644 cds/modules/invenio_deposit/signals.py create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/records/actions.html create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/records/form.html create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/results.html create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/searchbar.html create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/selectbox.html create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/selectstatus.html create mode 100644 cds/modules/invenio_deposit/static/templates/invenio_deposit/togglebutton.html create mode 100644 cds/modules/invenio_deposit/templates/invenio_deposit/base.html create mode 100644 cds/modules/invenio_deposit/templates/invenio_deposit/edit.html create mode 100644 cds/modules/invenio_deposit/templates/invenio_deposit/index.html create mode 100644 cds/modules/invenio_deposit/templates/invenio_deposit/tombstone.html create mode 100644 cds/modules/invenio_deposit/utils.py create mode 100644 cds/modules/invenio_deposit/views/__init__.py create mode 100644 cds/modules/invenio_deposit/views/rest.py create mode 100644 cds/modules/invenio_deposit/views/ui.py delete mode 100644 cds/modules/records/mappings/categories/category-v1.0.0.json delete mode 100644 cds/modules/records/mappings/keywords/keyword-v1.0.0.json create mode 100644 cds/modules/records/mappings/os-v2/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/categories/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/categories/category-v1.0.0.json create mode 100644 cds/modules/records/mappings/os-v2/keywords/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/keywords/keyword-v1.0.0.json create mode 100644 cds/modules/records/mappings/os-v2/records/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/records/videos/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/records/videos/project/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/records/videos/project/project-v1.0.0.json create mode 100644 cds/modules/records/mappings/os-v2/records/videos/video/__init__.py create mode 100644 cds/modules/records/mappings/os-v2/records/videos/video/video-v1.0.0.json delete mode 100644 cds/modules/records/mappings/records/videos/project/project-v1.0.0.json delete mode 100644 cds/modules/records/mappings/records/videos/video/video-v1.0.0.json delete mode 100644 cds/modules/records/static/js/cds_records/stats.js delete mode 100644 cds/modules/search_ui/static/js/invenio_search_bar_suggestions.js rename cds/modules/theme/{static => assets/bootstrap3}/js/cds-settings.js (69%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds/app.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds/module.js rename cds/modules/theme/{static => assets/bootstrap3}/js/cds/suggestions.js (57%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/app.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/avc.module.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/components/cdsActions.js rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/components/cdsDeposit.js (53%) rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/components/cdsDeposits.js (58%) rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/components/cdsForm.js (93%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/components/cdsRemoteUploader.js rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/components/cdsUploader.js (97%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/factories/states.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/filters/mergeObjects.js rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/filters/orderTasks.js (77%) rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/filters/overallState.js (51%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/filters/parseAutocomplete.js rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/filters/progressClass.js (86%) rename cds/modules/{deposit/static => theme/assets/bootstrap3}/js/cds_deposit/avc/filters/progressIcon.js (87%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/filters/toInt.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/depositActions.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/depositExtractedMetadata.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/depositStates.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/depositStatuses.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/inheritedProperties.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/stateReducer.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/taskRepresentations.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/typeReducer.js create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_deposit/avc/providers/urlBuilder.js rename cds/modules/{records/static/js/cds_records/main.js => theme/assets/bootstrap3/js/cds_records/app.js} (73%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_records/stats.js rename cds/modules/{records/static => theme/assets/bootstrap3}/js/cds_records/user_actions_logger.js (100%) create mode 100644 cds/modules/theme/assets/bootstrap3/js/cds_search_ui/app.js rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/cds.scss (99%) rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/colors.scss (100%) rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/decorators.scss (100%) rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/mixins.scss (100%) rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/social.scss (100%) rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/spacing.scss (100%) create mode 100644 cds/modules/theme/assets/bootstrap3/scss/cds/theme.scss rename cds/modules/theme/{static/scss => assets/bootstrap3/scss/cds}/variables.scss (100%) rename cds/modules/{previewer/static/css/cds_previewer/video.css => theme/assets/bootstrap3/scss/cds_previewer/video.scss} (100%) rename cds/modules/{records/static/scss => theme/assets/bootstrap3/scss/cds_records}/stats.scss (100%) delete mode 100644 cds/modules/theme/static/js/cds/module.js delete mode 100644 cds/modules/theme/static/js/main.js create mode 100644 cds/modules/theme/webpack.py create mode 100644 pyproject.toml create mode 100644 requirements.packages.upgrade.txt create mode 100644 requirements.pinned.upgrade.txt create mode 100755 scripts/assets-watch create mode 100755 scripts/bootstrap_upgrade create mode 100644 setup copy.py diff --git a/.gitignore b/.gitignore index a8af28b89..e0985cbb5 100644 --- a/.gitignore +++ b/.gitignore @@ -73,4 +73,7 @@ package-lock.json node_modules # celery beat -celerybeat* \ No newline at end of file +celerybeat* + +# ignore local tmp +tmp \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 000000000..2515b632e --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.9.14 diff --git a/Upgrade.txt b/Upgrade.txt new file mode 100644 index 000000000..760066b44 --- /dev/null +++ b/Upgrade.txt @@ -0,0 +1,88 @@ +# Notes + +- index: not_analyzed +- type: completion for suggestions +-[x] ffmpeg: gif method was removed +- admin panel shows Banners +- test statistics, should we install raven? +- missing os-v2 invenio_opendefinition.mappings +- existing kw need updating, remove payload as it is not supported + +# DB update + +- if local users then we need to re-encrypt the passwords + - set SECURITY_PASSWORD_SINGLE_HASH = True +- invenio alembic upgrade +- Remove keywords.suggest_name.payload +``` +from sqlalchemy.orm.exc import NoResultFound + +from cds.modules.records.api import Keyword +from invenio_pidstore.models import PersistentIdentifier, PIDStatus +from invenio_db import db + + +def get_all_pids_by(pid_type): + """Get all PIDs for the given type. + + :param pid_type: String representing the PID type value, for example 'recid'. + """ + pids = PersistentIdentifier.query.filter(PersistentIdentifier.pid_type == pid_type).filter( + PersistentIdentifier.status == PIDStatus.REGISTERED).yield_per(100) + return pids + + +def get_record_by_pid(pid): + """Fetch and return the published record given its PID. + + :param pid: String representing the PID value. + """ + try: + return Keyword.get_record(pid.object_uuid) + except NoResultFound: + return None + + +kwds = get_all_pids_by("kwid") + +for pid in kwds: + rec = get_record_by_pid(pid) + if rec is not None: + rec["suggest_name"].pop("payload", None) + rec.commit() +db.session.commit() +``` + +# Search reindex + +```bash + +cds index reindex -t recid +cds index reindex -t depid +cds index reindex -t catid +cds index reindex -t kwid +cds index run + +``` + +## Local setup + +- Node v18 +- Python 3.9 + +```bash + +# setup +./scripts/bootstrap_upgrade +./scripts/setup-instance.sh + +# web server +./scripts/server + +# celery +./scripts/celery + +# assets watch +./scripts/assets-watch + +``` \ No newline at end of file diff --git a/cds/config.py b/cds/config.py index 4d4b1ae5f..9c801ce24 100644 --- a/cds/config.py +++ b/cds/config.py @@ -31,26 +31,31 @@ from datetime import timedelta from celery.schedules import crontab -from elasticsearch import RequestsHttpConnection +from opensearchpy import RequestsHttpConnection from flask import current_app, session from flask_login import current_user from invenio_app.config import APP_DEFAULT_SECURE_HEADERS -from invenio_deposit.config import DEPOSIT_REST_FACETS -from invenio_deposit.scopes import write_scope -from invenio_deposit.utils import check_oauth2_scope from invenio_opendefinition.config import OPENDEFINITION_REST_ENDPOINTS from invenio_records_rest.facets import range_filter, terms_filter +from .modules.invenio_deposit.config import DEPOSIT_REST_FACETS +from .modules.invenio_deposit.scopes import write_scope +from .modules.invenio_deposit.utils import check_oauth2_scope from .modules.deposit.facets import created_by_me_aggs from .modules.deposit.indexer import CDSRecordIndexer -from .modules.records.permissions import (deposit_delete_permission_factory, - deposit_read_permission_factory, - deposit_update_permission_factory, - record_create_permission_factory, - record_read_permission_factory, - record_update_permission_factory) -from .modules.records.search import (NotDeletedKeywordSearch, - RecordVideosSearch, lowercase_filter) +from .modules.records.permissions import ( + deposit_delete_permission_factory, + deposit_read_permission_factory, + deposit_update_permission_factory, + record_create_permission_factory, + record_read_permission_factory, + record_update_permission_factory, +) +from .modules.records.search import ( + NotDeletedKeywordSearch, + RecordVideosSearch, + lowercase_filter, +) # Identity function for string extraction @@ -97,7 +102,7 @@ def _parse_env_bool(var_name, default=None): # Celery monitoring. CELERY_TASK_TRACK_STARTED = True # Celery accepted content types. -CELERY_ACCEPT_CONTENT = ['json', 'msgpack', 'yaml'] +CELERY_ACCEPT_CONTENT = ["json", "msgpack", "yaml"] """A whitelist of content-types/serializers.""" # Celery Beat schedule @@ -177,9 +182,7 @@ def _parse_env_bool(var_name, default=None): # variable from invenio_cache module to define our caching conditions. # See CACHE_IS_AUTHENTICATED_CALLBACK = ( - lambda: "_flashes" in session - or current_user.is_authenticated - or current_app.debug + lambda: "_flashes" in session or current_user.is_authenticated or current_app.debug ) ############################################################################### @@ -225,7 +228,9 @@ def _parse_env_bool(var_name, default=None): ############################################################################### # Search ############################################################################### -ELASTICSEARCH_HOSTS = ast.literal_eval(os.environ.get("ELASTICSEARCH_HOSTS", "['localhost']")) +ELASTICSEARCH_HOSTS = ast.literal_eval( + os.environ.get("ELASTICSEARCH_HOSTS", "['localhost']") +) ELASTICSEARCH_PORT = int(os.environ.get("ELASTICSEARCH_PORT", "9200")) ELASTICSEARCH_USER = os.environ.get("ELASTICSEARCH_USER") ELASTICSEARCH_PASSWORD = os.environ.get("ELASTICSEARCH_PASSWORD") @@ -246,7 +251,7 @@ def _parse_env_bool(var_name, default=None): es_host["verify_certs"] = ELASTICSEARCH_VERIFY_CERTS es_hosts.append(es_host) -SEARCH_ELASTIC_HOSTS = es_hosts +SEARCH_HOSTS = es_hosts # needed when verify cert is disabled see: # https://github.com/elastic/elasticsearch-py/issues/712 SEARCH_CLIENT_CONFIG = {"connection_class": RequestsHttpConnection} @@ -426,16 +431,11 @@ def _parse_env_bool(var_name, default=None): pid_minter="cds_recid", pid_fetcher="cds_recid", indexer_class=CDSRecordIndexer, - search_type=None, search_class=RecordVideosSearch, search_factory_imp="invenio_records_rest.query.es_search_factory", record_serializers={ - "application/json": ( - "cds.modules.records.serializers" ":json_v1_response" - ), - "application/smil": ( - "cds.modules.records.serializers" ":smil_v1_response" - ), + "application/json": ("cds.modules.records.serializers" ":json_v1_response"), + "application/smil": ("cds.modules.records.serializers" ":smil_v1_response"), "text/vtt": ("cds.modules.records.serializers" ":vtt_v1_response"), "x-application/drupal": ( "cds.modules.records.serializers" ":drupal_v1_response" @@ -452,9 +452,7 @@ def _parse_env_bool(var_name, default=None): "dcite": "application/x-datacite+xml", }, search_serializers={ - "application/json": ( - "cds.modules.records.serializers" ":json_v1_search" - ), + "application/json": ("cds.modules.records.serializers" ":json_v1_search"), }, list_route="/records/", item_route="/record/<{0}:pid_value>".format(_Record_PID), @@ -470,7 +468,6 @@ def _parse_env_bool(var_name, default=None): pid_fetcher="cds_catid", indexer_class=CDSRecordIndexer, search_index="categories", - search_type=None, search_class=RecordVideosSearch, search_factory_imp="invenio_records_rest.query.es_search_factory", record_serializers={ @@ -479,9 +476,7 @@ def _parse_env_bool(var_name, default=None): ), }, search_serializers={ - "application/json": ( - "invenio_records_rest.serializers" ":json_v1_search" - ), + "application/json": ("invenio_records_rest.serializers" ":json_v1_search"), }, list_route="/categories/", item_route="/categories/<{0}:pid_value>".format(_Category_PID), @@ -503,7 +498,6 @@ def _parse_env_bool(var_name, default=None): pid_fetcher="cds_kwid", indexer_class=CDSRecordIndexer, search_index="keywords", - search_type=None, search_class=NotDeletedKeywordSearch, search_factory_imp="invenio_records_rest.query.es_search_factory", record_serializers={ @@ -512,9 +506,7 @@ def _parse_env_bool(var_name, default=None): ), }, search_serializers={ - "application/json": ( - "invenio_records_rest.serializers" ":json_v1_search" - ), + "application/json": ("invenio_records_rest.serializers" ":json_v1_search"), }, list_route="/keywords/", item_route="/keywords/<{0}:pid_value>".format(_Keyword_PID), @@ -590,12 +582,10 @@ def _parse_env_bool(var_name, default=None): # From 2.2 this is not needed. RECORDS_REST_ELASTICSEARCH_ERROR_HANDLERS = { "query_parsing_exception": ( - "invenio_records_rest.views" - ":elasticsearch_query_parsing_exception_handler" + "invenio_records_rest.views" ":elasticsearch_query_parsing_exception_handler" ), "token_mgr_error": ( - "invenio_records_rest.views" - ":elasticsearch_query_parsing_exception_handler" + "invenio_records_rest.views" ":elasticsearch_query_parsing_exception_handler" ), } @@ -612,19 +602,19 @@ def _parse_env_bool(var_name, default=None): "terms": {"field": "category.untouched"}, }, "task_transcode": { - "terms": {"field": "_cds.state.file_transcode"}, + "terms": {"field": "_cds.state.file_transcode.keyword"}, }, "task_extract_frames": { - "terms": {"field": "_cds.state.file_video_extract_frames"}, + "terms": {"field": "_cds.state.file_video_extract_frames.keyword"}, }, "created_by": created_by_me_aggs, }, "filters": { "project_status": terms_filter("_deposit.status"), "category": terms_filter("category.untouched"), - "task_transcode": terms_filter("_cds.state.file_transcode"), + "task_transcode": terms_filter("_cds.state.file_transcode.keyword"), "task_extract_frames": terms_filter( - "_cds.state.file_video_extract_frames" + "_cds.state.file_video_extract_frames.keyword" ), "created_by": terms_filter("_deposit.created_by"), }, @@ -772,9 +762,7 @@ def _parse_env_bool(var_name, default=None): # Display a homepage. FRONTPAGE_ENDPOINT = "cds_home.index" # Featured query -FRONTPAGE_FEATURED_QUERY = ( - "/api/records/?q=featured:true&size=1&sort=mostrecent" -) +FRONTPAGE_FEATURED_QUERY = "/api/records/?q=featured:true&size=1&sort=mostrecent" # Recent videos query FRONTPAGE_RECENT_QUERY = "/api/records/?size=3&sort=mostrecent&type=VIDEO" # Queries for the boxes @@ -897,6 +885,11 @@ def _parse_env_bool(var_name, default=None): # Security login salt. SECURITY_LOGIN_SALT = "CHANGE_ME" +# Force single hash +# Enable this for production +# SECURITY_PASSWORD_SINGLE_HASH = True +SECURITY_PASSWORD_SINGLE_HASH = False + # Flask configuration # =================== # See details on @@ -910,13 +903,13 @@ def _parse_env_bool(var_name, default=None): "https://*.theoplayer.com", "'unsafe-inline'", "'unsafe-eval'", - "https://www.dropbox.com" + "https://www.dropbox.com", ], "style-src": [ "'self'", "https://*.theoplayer.com", "https://*.cern.ch/", - "'unsafe-inline'" + "'unsafe-inline'", ], "img-src": ["'self'", "https://*.theoplayer.com", "data:"], "connect-src": ["'self'", "https://*.theoplayer.com", "https://*.cern.ch"], @@ -954,7 +947,10 @@ def _parse_env_bool(var_name, default=None): # OAuth ############################################################################### -OAUTHCLIENT_CERN_OPENID_USERINFO_URL = os.environ.get("OAUTHCLIENT_CERN_OPENID_USERINFO_URL", "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/userinfo") +OAUTHCLIENT_CERN_OPENID_USERINFO_URL = os.environ.get( + "OAUTHCLIENT_CERN_OPENID_USERINFO_URL", + "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/userinfo", +) OAUTHCLIENT_CERN_OPENID_ALLOWED_ROLES = ["cern-user"] @@ -973,13 +969,24 @@ def _parse_env_bool(var_name, default=None): title="CERN", description="Connecting to CERN Organization.", icon="", - logout_url=os.environ.get("OAUTH_CERN_OPENID_LOGOUT_URL", "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/logout"), + logout_url=os.environ.get( + "OAUTH_CERN_OPENID_LOGOUT_URL", + "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/logout", + ), params=dict( - base_url=os.environ.get("OAUTH_CERN_OPENID_BASE_URL", "https://auth.cern.ch/auth/realms/cern"), + base_url=os.environ.get( + "OAUTH_CERN_OPENID_BASE_URL", "https://auth.cern.ch/auth/realms/cern" + ), request_token_params={"scope": "openid"}, - access_token_url=os.environ.get("OAUTH_CERN_OPENID_ACCESS_TOKEN_URL", "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/token"), + access_token_url=os.environ.get( + "OAUTH_CERN_OPENID_ACCESS_TOKEN_URL", + "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/token", + ), access_token_method="POST", - authorize_url=os.environ.get("OAUTH_CERN_OPENID_AUTHORIZE_URL", "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/auth"), + authorize_url=os.environ.get( + "OAUTH_CERN_OPENID_AUTHORIZE_URL", + "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/auth", + ), app_key="CERN_APP_OPENID_CREDENTIALS", content_type="application/json", ), @@ -992,9 +999,7 @@ def _parse_env_bool(var_name, default=None): ), ) -OAUTHCLIENT_REMOTE_APPS = dict( - cern_openid=REMOTE_APP -) +OAUTHCLIENT_REMOTE_APPS = dict(cern_openid=REMOTE_APP) """CERN Openid Remote Application.""" @@ -1013,7 +1018,7 @@ def _parse_env_bool(var_name, default=None): ) ## Needed for populating the user profiles when users login via CERN Openid -USERPROFILES_EXTEND_SECURITY_FORMS=True +USERPROFILES_EXTEND_SECURITY_FORMS = True # Set the template OAUTH2SERVER_SETTINGS_TEMPLATE = "cds_theme/settings.html" @@ -1023,10 +1028,9 @@ def _parse_env_bool(var_name, default=None): ############################################################################### # The site name -THEME_SITENAME = _(u"CDS Videos · CERN") +THEME_SITENAME = _("CDS Videos · CERN") THEME_SITEDESCRIPTION = _( - "CDS Videos is the CERN official repository to " - "archive and disseminate videos." + "CDS Videos is the CERN official repository to " "archive and disseminate videos." ) # Default site URL (used only when not in a context - e.g. like celery tasks). THEME_SITEURL = "http://localhost:5000" @@ -1136,9 +1140,7 @@ def _parse_env_bool(var_name, default=None): # The schema form deposit DEPOSIT_DEFAULT_SCHEMAFORM = "json/cds_deposit/forms/project.json" # Default schema for the deposit -DEPOSIT_DEFAULT_JSONSCHEMA = ( - "deposits/records/videos/project/project-v1.0.0.json" -) +DEPOSIT_DEFAULT_JSONSCHEMA = "deposits/records/videos/project/project-v1.0.0.json" # Deposit schemas DEPOSIT_JSONSCHEMA = { "project": "deposits/records/videos/project/project-v1.0.0.json", @@ -1148,17 +1150,14 @@ def _parse_env_bool(var_name, default=None): DEPOSIT_UI_JSTEMPLATE_FORM = "templates/cds_deposit/form.html" DEPOSIT_UI_JSTEMPLATE_ACTIONS = "templates/cds_deposit/actions.html" DEPOSIT_SEARCH_API = "/api/deposits/project/" -_CDSDeposit_PID = ( - 'pid(depid,record_class="cds.modules.deposit.api:CDSDeposit")' -) +_CDSDeposit_PID = 'pid(depid,record_class="cds.modules.deposit.api:CDSDeposit")' _Project_PID = 'pid(depid,record_class="cds.modules.deposit.api:Project")' _Video_PID = 'pid(depid,record_class="cds.modules.deposit.api:Video")' DEPOSIT_UI_ENDPOINT_DEFAULT = "{scheme}://{host}/deposit/{pid_value}" DEPOSIT_UI_ENDPOINT = "{scheme}://{host}/deposit/{type}/{pid_value}" DEPOSIT_RECORDS_API_DEFAULT = "/api/deposits/{pid_value}" DEPOSIT_RECORDS_API = "/api/deposits/{type}/{pid_value}" -# use a custom function to catch record publish signals -DEPOSIT_REGISTER_SIGNALS = False + # Deposit rest endpoints DEPOSIT_REST_ENDPOINTS = dict( depid=dict( @@ -1169,7 +1168,7 @@ def _parse_env_bool(var_name, default=None): record_class="cds.modules.deposit.api:CDSDeposit", files_serializers={ "application/json": ( - "invenio_deposit.serializers" ":json_v1_files_response" + "cds.modules.invenio_deposit.serializers" ":json_v1_files_response" ), }, record_serializers={ @@ -1177,40 +1176,30 @@ def _parse_env_bool(var_name, default=None): "invenio_records_rest.serializers" ":json_v1_response" ), }, - search_class="invenio_deposit.search:DepositSearch", + search_class="cds.modules.invenio_deposit.search:DepositSearch", search_serializers={ - "application/json": ( - "invenio_records_rest.serializers" ":json_v1_search" - ), + "application/json": ("invenio_records_rest.serializers" ":json_v1_search"), }, list_route="/deposits/", indexer_class=CDSRecordIndexer, item_route="/deposits/<{0}:pid_value>".format(_CDSDeposit_PID), - file_list_route="/deposits/<{0}:pid_value>/files".format( - _CDSDeposit_PID - ), + file_list_route="/deposits/<{0}:pid_value>/files".format(_CDSDeposit_PID), file_item_route="/deposits/<{0}:pid_value>/files/".format( _CDSDeposit_PID ), default_media_type="application/json", links_factory_imp="cds.modules.deposit.links:deposit_links_factory", create_permission_factory_imp=check_oauth2_scope( - lambda record: record_create_permission_factory( - record=record - ).can(), + lambda record: record_create_permission_factory(record=record).can(), write_scope.id, ), read_permission_factory_imp=deposit_read_permission_factory, update_permission_factory_imp=check_oauth2_scope( - lambda record: record_update_permission_factory( - record=record - ).can(), + lambda record: record_update_permission_factory(record=record).can(), write_scope.id, ), delete_permission_factory_imp=check_oauth2_scope( - lambda record: deposit_delete_permission_factory( - record=record - ).can(), + lambda record: deposit_delete_permission_factory(record=record).can(), write_scope.id, ), max_result_window=10000, @@ -1228,53 +1217,41 @@ def _parse_env_bool(var_name, default=None): }, files_serializers={ "application/json": ( - "invenio_deposit.serializers" ":json_v1_files_response" + "cds.modules.invenio_deposit.serializers" ":json_v1_files_response" ), }, record_serializers={ "application/json": ( - "cds.modules.records.serializers" - ":cdsdeposit_json_v1_response" + "cds.modules.records.serializers" ":cdsdeposit_json_v1_response" ), "application/vnd.project.partial+json": ( - "cds.modules.records.serializers" - ":cdsdeposit_json_v1_response" + "cds.modules.records.serializers" ":cdsdeposit_json_v1_response" ), }, search_class="cds.modules.deposit.search:DepositVideosSearch", search_serializers={ - "application/json": ( - "invenio_records_rest.serializers" ":json_v1_search" - ), + "application/json": ("invenio_records_rest.serializers" ":json_v1_search"), }, list_route="/deposits/project/", indexer_class=CDSRecordIndexer, item_route="/deposits/project/<{0}:pid_value>".format(_Project_PID), - file_list_route="/deposits/project/<{0}:pid_value>/files".format( - _Project_PID - ), + file_list_route="/deposits/project/<{0}:pid_value>/files".format(_Project_PID), file_item_route="/deposits/project/<{0}:pid_value>/files/".format( _Project_PID ), default_media_type="application/json", links_factory_imp="cds.modules.deposit.links:project_links_factory", create_permission_factory_imp=check_oauth2_scope( - lambda record: record_create_permission_factory( - record=record - ).can(), + lambda record: record_create_permission_factory(record=record).can(), write_scope.id, ), read_permission_factory_imp=deposit_read_permission_factory, update_permission_factory_imp=check_oauth2_scope( - lambda record: deposit_update_permission_factory( - record=record - ).can(), + lambda record: deposit_update_permission_factory(record=record).can(), write_scope.id, ), delete_permission_factory_imp=check_oauth2_scope( - lambda record: deposit_delete_permission_factory( - record=record - ).can(), + lambda record: deposit_delete_permission_factory(record=record).can(), write_scope.id, ), max_result_window=10000, @@ -1291,53 +1268,41 @@ def _parse_env_bool(var_name, default=None): }, files_serializers={ "application/json": ( - "invenio_deposit.serializers" ":json_v1_files_response" + "cds.modules.invenio_deposit.serializers" ":json_v1_files_response" ), }, record_serializers={ "application/json": ( - "cds.modules.records.serializers" - ":cdsdeposit_json_v1_response" + "cds.modules.records.serializers" ":cdsdeposit_json_v1_response" ), "application/vnd.video.partial+json": ( - "cds.modules.records.serializers" - ":cdsdeposit_json_v1_response" + "cds.modules.records.serializers" ":cdsdeposit_json_v1_response" ), }, - search_class="invenio_deposit.search:DepositSearch", + search_class="cds.modules.invenio_deposit.search:DepositSearch", search_serializers={ - "application/json": ( - "invenio_records_rest.serializers" ":json_v1_search" - ), + "application/json": ("invenio_records_rest.serializers" ":json_v1_search"), }, list_route="/deposits/video/", indexer_class=CDSRecordIndexer, item_route="/deposits/video/<{0}:pid_value>".format(_Video_PID), - file_list_route="/deposits/video/<{0}:pid_value>/files".format( - _Video_PID - ), + file_list_route="/deposits/video/<{0}:pid_value>/files".format(_Video_PID), file_item_route="/deposits/video/<{0}:pid_value>/files/".format( _Video_PID ), default_media_type="application/json", links_factory_imp="cds.modules.deposit.links:video_links_factory", create_permission_factory_imp=check_oauth2_scope( - lambda record: record_create_permission_factory( - record=record - ).can(), + lambda record: record_create_permission_factory(record=record).can(), write_scope.id, ), read_permission_factory_imp=deposit_read_permission_factory, update_permission_factory_imp=check_oauth2_scope( - lambda record: deposit_update_permission_factory( - record=record - ).can(), + lambda record: deposit_update_permission_factory(record=record).can(), write_scope.id, ), delete_permission_factory_imp=check_oauth2_scope( - lambda record: deposit_delete_permission_factory( - record=record - ).can(), + lambda record: deposit_delete_permission_factory(record=record).can(), write_scope.id, ), max_result_window=10000, @@ -1381,7 +1346,7 @@ def _parse_env_bool(var_name, default=None): DEPOSIT_FORM_TEMPLATES = { "default": "default.html", "fieldset": "fieldset.html", - "ckeditor": "ckeditor.html", + "ckeditor": "textarea.html", "uiselect": "uiselect.html", "array": "array.html", "radios_inline": "radios_inline.html", @@ -1443,14 +1408,14 @@ def _parse_env_bool(var_name, default=None): LOG_USER_ACTIONS_ENABLED = False # endpoints for logging user actions LOG_USER_ACTIONS_ENDPOINTS = { - 'base_url': os.environ.get("LOG_USER_ACTIONS_BASE_URL", None), - 'media_view': '{base_url}cds_videos_media_view?ext=true&' - 'recid={recid}&report_number={' - 'report_number}&format={format}', - 'media_download': '{base_url}cds_videos_media_download?recid={recid}&' - 'report_number={report_number}&' - 'format={format}&quality={quality}', - 'page_view': '{base_url}cds_videos_page_view?recid={recid}&userid={userid}' + "base_url": os.environ.get("LOG_USER_ACTIONS_BASE_URL", None), + "media_view": "{base_url}cds_videos_media_view?ext=true&" + "recid={recid}&report_number={" + "report_number}&format={format}", + "media_download": "{base_url}cds_videos_media_download?recid={recid}&" + "report_number={report_number}&" + "format={format}&quality={quality}", + "page_view": "{base_url}cds_videos_page_view?recid={recid}&userid={userid}", } ############################################################################### @@ -1519,7 +1484,19 @@ def _parse_env_bool(var_name, default=None): CDS_OPENCAST_API_PASSWORD = "changeme" CDS_OPENCAST_SERIES_ID = "changeme" CDS_OPENCAST_API_ENDPOINT_VERIFY_CERT = False -CDS_OPENCAST_STATUS_CHECK_TASK_TIMEOUT = 5*60 # 5 minutes -CDS_OPENCAST_DOWNLOAD_TASK_TIMEOUT = 30*60 # 30 minutes +CDS_OPENCAST_STATUS_CHECK_TASK_TIMEOUT = 5 * 60 # 5 minutes +CDS_OPENCAST_DOWNLOAD_TASK_TIMEOUT = 30 * 60 # 30 minutes CDS_LDAP_URL = "ldap://xldap.cern.ch" + + +# Invenio APP +APP_THEME = ["bootstrap3"] + +# Invenio-Search +# ============== +SEARCH_INDEX_PREFIX = "cds-videos-prod-" + +REST_CSRF_ENABLED = True + +ACCOUNTS_JWT_ENABLE = False diff --git a/cds/modules/deposit/api.py b/cds/modules/deposit/api.py index 3e9539284..ab5736f75 100644 --- a/cds/modules/deposit/api.py +++ b/cds/modules/deposit/api.py @@ -40,11 +40,18 @@ from flask import current_app from flask_security import current_user from invenio_db import db -from invenio_files_rest.models import (MultipartObject, ObjectVersion, - ObjectVersionTag, as_object_version) +from invenio_files_rest.models import ( + MultipartObject, + ObjectVersion, + ObjectVersionTag, + as_object_version, +) from invenio_jsonschemas import current_jsonschemas -from invenio_pidstore.errors import (PIDDoesNotExistError, PIDInvalidAction, - ResolverError) +from invenio_pidstore.errors import ( + PIDDoesNotExistError, + PIDInvalidAction, + ResolverError, +) from invenio_pidstore.models import PersistentIdentifier from invenio_pidstore.resolver import Resolver from invenio_records_files.models import RecordsBuckets @@ -52,16 +59,23 @@ from invenio_sequencegenerator.api import Sequence from jsonschema.exceptions import ValidationError -from invenio_deposit.api import Deposit, has_status, preserve -from invenio_deposit.utils import mark_as_action +from ..invenio_deposit.api import Deposit, has_status, preserve +from ..invenio_deposit.utils import mark_as_action from invenio_indexer.tasks import index_record -from ..flows.api import (FlowService, get_tasks_status_grouped_by_task_name, - merge_tasks_status) +from ..flows.api import ( + FlowService, + get_tasks_status_grouped_by_task_name, + merge_tasks_status, +) from ..flows.models import FlowMetadata -from ..records.api import (CDSFileObject, CDSFilesIterator, CDSRecord, - CDSVideosFilesIterator) +from ..records.api import ( + CDSFileObject, + CDSFilesIterator, + CDSRecord, + CDSVideosFilesIterator, +) from ..records.minters import doi_minter, is_local_doi, report_number_minter from ..records.resolver import record_resolver from ..records.utils import is_record, lowercase_value @@ -141,9 +155,7 @@ def _get_files_dump(self): @classmethod def get_record(cls, id_, with_deleted=False): """Get record instance.""" - deposit = super(CDSDeposit, cls).get_record( - id_=id_, with_deleted=with_deleted - ) + deposit = super(CDSDeposit, cls).get_record(id_=id_, with_deleted=with_deleted) return deposit @classmethod @@ -210,9 +222,7 @@ def update(self, *args, **kwargs): """Update only drafts.""" # use always lower case in the access rights to prevent problems if "_access" in self: - self["_access"]["read"] = lowercase_value( - self["_access"].get("read", []) - ) + self["_access"]["read"] = lowercase_value(self["_access"].get("read", [])) self["_access"]["update"] = lowercase_value( self["_access"].get("update", []) ) @@ -312,9 +322,7 @@ def _process_files(self, record_id, data): yield data - db.session.add( - RecordsBuckets(record_id=record_id, bucket_id=snapshot.id) - ) + db.session.add(RecordsBuckets(record_id=record_id, bucket_id=snapshot.id)) else: yield @@ -325,8 +333,7 @@ def publish(self, pid=None, id_=None, **kwargs): self["_cds"]["modified_by"] = int(current_user.get_id()) except AttributeError: current_app.logger.warning( - "No current user found, keeping previous value for" - " _cds.modified_by" + "No current user found, keeping previous value for" " _cds.modified_by" ) if "publication_date" not in self: now = datetime.datetime.utcnow().date().isoformat() @@ -346,9 +353,7 @@ def add_keyword(self, keyword): def remove_keyword(self, keyword): """Remove a keyword.""" ref = keyword.ref - self["keywords"] = list( - filter(lambda x: x["$ref"] != ref, self["keywords"]) - ) + self["keywords"] = list(filter(lambda x: x["$ref"] != ref, self["keywords"])) def has_record(self): """Check if deposit is published at least one time.""" @@ -404,10 +409,7 @@ def _fix_tags_refs_to_master(self, bucket): } # list of tags with 'master' key slave_tags = [ - tag - for obj in snapshot_obj_list - for tag in obj.tags - if tag.key == "master" + tag for obj in snapshot_obj_list for tag in obj.tags if tag.key == "master" ] # change master of slave videos to new master object versions for tag in slave_tags: @@ -500,7 +502,8 @@ def create(cls, data, id_=None, **kwargs): # Add the current user to the ``_access.update`` list try: data["_access"]["update"] = [current_user.email] - data["_cds"]["current_user_mail"] = current_user.email + # this is not needed as it is used only for _access.update + #data["_cds"]["current_user_mail"] = current_user.email except AttributeError: current_app.logger.warning( "No current user found, _access.update will stay empty." @@ -547,7 +550,7 @@ def _video_refs(self): def _find_refs(self, refs): """Find index of references.""" result = {} - for (key, value) in enumerate(self._video_refs): + for key, value in enumerate(self._video_refs): try: refs.index(value) result[key] = value @@ -561,7 +564,7 @@ def _update_videos(self, old_refs, new_refs): :param old_refs: List contains the video references to substitute. :param new_refs: List contains the new video references """ - for (key, value) in enumerate(self._video_refs): + for key, value in enumerate(self._video_refs): try: index = old_refs.index(value) self["videos"][key] = {"$ref": new_refs[index]} @@ -580,9 +583,7 @@ def _publish_videos(self): """Publish all videos that are still deposits.""" # get reference of all video deposits still not published refs_old = [ - video_ref - for video_ref in self._video_refs - if is_deposit(video_ref) + video_ref for video_ref in self._video_refs if is_deposit(video_ref) ] # extract the PIDs from the video deposits @@ -590,21 +591,17 @@ def _publish_videos(self): # publish them and get the new PID videos_published = [ - video.publish().commit() - for video in deposit_videos_resolver(ids_old) + video.publish().commit() for video in deposit_videos_resolver(ids_old) ] # get new video references - refs_new = [ - record_build_url(video["recid"]) for video in videos_published - ] + refs_new = [record_build_url(video["recid"]) for video in videos_published] # update project video references self._update_videos(refs_old, refs_new) return videos_published - @mark_as_action def publish(self, pid=None, id_=None, **kwargs): """Publish a project. @@ -720,9 +717,7 @@ def videos(self): if is_deposit(ref): videos.append(deposit_video_resolver(record_unbuild_url(ref))) else: - videos.append( - record_video_resolver(record_unbuild_url(ref)) - ) + videos.append(record_video_resolver(record_unbuild_url(ref))) return videos def update(self, *args, **kwargs): @@ -751,10 +746,7 @@ def _sync_fields(self, video): project_access = self.get("_access", {}).get("update") project_created_by = self["_deposit"].get("created_by") - if ( - video.get("_access", {}).get("update") != project_access - and project_access - ): + if video.get("_access", {}).get("update") != project_access and project_access: changed = True # sync access rights if "_access" in video: @@ -926,9 +918,7 @@ def publish(self, pid=None, id_=None, **kwargs): ) if "_access" not in self: self["_access"] = {} - self["_access"]["update"] = self.project.get("_access", {}).get( - "update", [] - ) + self["_access"]["update"] = self.project.get("_access", {}).get("update", []) self.project._sync_fields(self) # generate human-readable duration self.generate_duration() @@ -936,9 +926,7 @@ def publish(self, pid=None, id_=None, **kwargs): self._create_tags() # publish the video - video_published = super(Video, self).publish( - pid=pid, id_=id_, **kwargs - ) + video_published = super(Video, self).publish(pid=pid, id_=id_, **kwargs) _, record_new = self.fetch_published() # update associated project @@ -970,9 +958,7 @@ def edit(self, pid=None): def _delete_flows(self): """Delete all the flows.""" - flows = FlowMetadata.get_all_by_deposit( - deposit_id=self["_deposit"]["id"] - ) + flows = FlowMetadata.get_all_by_deposit(deposit_id=self["_deposit"]["id"]) for flow in flows: FlowService(flow).delete(hard=True) @@ -993,9 +979,7 @@ def discard(self, pid=None): """Discard a video.""" video_old_ref = self.ref video_discarded = super(Video, self).discard(pid=pid) - video_discarded.project._update_videos( - [video_old_ref], [video_discarded.ref] - ) + video_discarded.project._update_videos([video_old_ref], [video_discarded.ref]) return video_discarded def assign_report_number(self, report_number): @@ -1065,9 +1049,7 @@ def _create_tags(self): # Subtitle file pattern = re.compile(".*_([a-zA-Z]{2})\.vtt$") objs = [ - o - for o in sorted_files_from_bucket(self._bucket) - if pattern.match(o.key) + o for o in sorted_files_from_bucket(self._bucket) if pattern.match(o.key) ] with db.session.begin_nested(): for obj in objs: @@ -1081,12 +1063,8 @@ def _create_tags(self): ObjectVersionTag.delete(obj, "language") # other tags ObjectVersionTag.create_or_update(obj, "content_type", "vtt") - ObjectVersionTag.create_or_update( - obj, "context_type", "subtitle" - ) - ObjectVersionTag.create_or_update( - obj, "media_type", "subtitle" - ) + ObjectVersionTag.create_or_update(obj, "context_type", "subtitle") + ObjectVersionTag.create_or_update(obj, "media_type", "subtitle") # refresh object db.session.refresh(obj) diff --git a/cds/modules/deposit/bundles.py b/cds/modules/deposit/bundles.py index 3aff4f7da..eaa19bb87 100644 --- a/cds/modules/deposit/bundles.py +++ b/cds/modules/deposit/bundles.py @@ -24,107 +24,107 @@ """UI for Invenio-Deposit.""" -from flask_assets import Bundle -from invenio_assets import NpmBundle -from invenio_deposit.bundles import (js_dependecies_autocomplete, - js_dependecies_uploader, - js_dependencies_ckeditor, - js_dependencies_ui_sortable) +# from flask_assets import Bundle +# from invenio_assets import NpmBundle +# from ..invenio_deposit.bundles import (js_dependecies_autocomplete, +# js_dependecies_uploader, +# js_dependencies_ckeditor, +# js_dependencies_ui_sortable) -js_main = NpmBundle( - 'node_modules/angular/angular.js', - 'node_modules/angular-sanitize/angular-sanitize.js', - 'node_modules/lodash/lodash.js', - 'node_modules/angular-loading-bar/build/loading-bar.js', - 'node_modules/angular-elastic/elastic.js', - 'node_modules/bootstrap-sass/assets/javascripts/bootstrap.js', - 'node_modules/ngmodal/dist/ng-modal.js', - 'node_modules/angular-sticky-plugin/dist/angular-sticky.js', - 'node_modules/angular-scroll/angular-scroll.js', - npm={ - 'angular': '~1.5.8', - 'angular-sanitize': '~1.5.8', - 'lodash': '~4.17.4', - 'angular-elastic': '~2.5.1', - "angular-scroll": '~1.0.2', - "angular-sticky-plugin": '~0.4.1', - } -) +# js_main = NpmBundle( +# 'node_modules/angular/angular.js', +# 'node_modules/angular-sanitize/angular-sanitize.js', +# 'node_modules/lodash/lodash.js', +# 'node_modules/angular-loading-bar/build/loading-bar.js', +# 'node_modules/angular-elastic/elastic.js', +# 'node_modules/bootstrap-sass/assets/javascripts/bootstrap.js', +# 'node_modules/ngmodal/dist/ng-modal.js', +# 'node_modules/angular-sticky-plugin/dist/angular-sticky.js', +# 'node_modules/angular-scroll/angular-scroll.js', +# npm={ +# 'angular': '~1.5.8', +# 'angular-sanitize': '~1.5.8', +# 'lodash': '~4.17.4', +# 'angular-elastic': '~2.5.1', +# "angular-scroll": '~1.0.2', +# "angular-sticky-plugin": '~0.4.1', +# } +# ) -js_dependecies_schema_form = NpmBundle( - 'node_modules/tv4/tv4.js', - 'node_modules/objectpath/lib/ObjectPath.js', - 'node_modules/angular-schema-form/dist/schema-form.js', - 'node_modules/angular-schema-form/dist/bootstrap-decorator.js', - 'node_modules/angular-schema-form-dynamic-select/' + - 'angular-schema-form-dynamic-select.js', - npm={ - 'angular-schema-form': '~0.8.13', - 'angular-schema-form-bootstrap': '~0.2.0', - 'objectpath': '~1.2.1', - 'tv4': '~1.2.7', - 'angular-schema-form-dynamic-select': '~0.13.1', - } -) +# js_dependecies_schema_form = NpmBundle( +# 'node_modules/tv4/tv4.js', +# 'node_modules/objectpath/lib/ObjectPath.js', +# 'node_modules/angular-schema-form/dist/schema-form.js', +# 'node_modules/angular-schema-form/dist/bootstrap-decorator.js', +# 'node_modules/angular-schema-form-dynamic-select/' + +# 'angular-schema-form-dynamic-select.js', +# npm={ +# 'angular-schema-form': '~0.8.13', +# 'angular-schema-form-bootstrap': '~0.2.0', +# 'objectpath': '~1.2.1', +# 'tv4': '~1.2.7', +# 'angular-schema-form-dynamic-select': '~0.13.1', +# } +# ) -js_jquery = NpmBundle( - 'node_modules/jqueryui/jquery-ui.js', - filters='jsmin', - output='gen/cds.deposit.jquery.deposit.%(version)s.js', -) +# js_jquery = NpmBundle( +# 'node_modules/jqueryui/jquery-ui.js', +# filters='jsmin', +# output='gen/cds.deposit.jquery.deposit.%(version)s.js', +# ) -js_deposit_common = Bundle( - 'js/cds_deposit/main.js', - 'js/cds_deposit/avc/avc.module.js', - 'js/cds_deposit/avc/filters/mergeObjects.js', - 'js/cds_deposit/avc/filters/orderTasks.js', - 'js/cds_deposit/avc/filters/overallState.js', - 'js/cds_deposit/avc/filters/progressClass.js', - 'js/cds_deposit/avc/filters/progressIcon.js', - 'js/cds_deposit/avc/filters/toInt.js', - 'js/cds_deposit/avc/filters/parseAutocomplete.js', - 'js/cds_deposit/avc/providers/depositExtractedMetadata.js', - 'js/cds_deposit/avc/providers/depositStates.js', - 'js/cds_deposit/avc/providers/depositStatuses.js', - 'js/cds_deposit/avc/providers/depositActions.js', - 'js/cds_deposit/avc/providers/inheritedProperties.js', - 'js/cds_deposit/avc/providers/taskRepresentations.js', - 'js/cds_deposit/avc/providers/stateReducer.js', - 'js/cds_deposit/avc/providers/typeReducer.js', - 'js/cds_deposit/avc/providers/urlBuilder.js', - 'js/cds_deposit/avc/providers/jwt.js', - output='gen/cds.deposit.common.%(version)s.js' -) +# js_deposit_common = Bundle( +# 'js/cds_deposit/main.js', +# 'js/cds_deposit/avc/avc.module.js', +# 'js/cds_deposit/avc/filters/mergeObjects.js', +# 'js/cds_deposit/avc/filters/orderTasks.js', +# 'js/cds_deposit/avc/filters/overallState.js', +# 'js/cds_deposit/avc/filters/progressClass.js', +# 'js/cds_deposit/avc/filters/progressIcon.js', +# 'js/cds_deposit/avc/filters/toInt.js', +# 'js/cds_deposit/avc/filters/parseAutocomplete.js', +# 'js/cds_deposit/avc/providers/depositExtractedMetadata.js', +# 'js/cds_deposit/avc/providers/depositStates.js', +# 'js/cds_deposit/avc/providers/depositStatuses.js', +# 'js/cds_deposit/avc/providers/depositActions.js', +# 'js/cds_deposit/avc/providers/inheritedProperties.js', +# 'js/cds_deposit/avc/providers/taskRepresentations.js', +# 'js/cds_deposit/avc/providers/stateReducer.js', +# 'js/cds_deposit/avc/providers/typeReducer.js', +# 'js/cds_deposit/avc/providers/urlBuilder.js', +# 'js/cds_deposit/avc/providers/jwt.js', +# output='gen/cds.deposit.common.%(version)s.js' +# ) -js_cds_deposit = NpmBundle( - js_deposit_common, - 'js/cds_deposit/avc/factories/states.js', - 'js/cds_deposit/avc/components/cdsActions.js', - 'js/cds_deposit/avc/components/cdsDeposit.js', - 'js/cds_deposit/avc/components/cdsDeposits.js', - 'js/cds_deposit/avc/components/cdsForm.js', - 'js/cds_deposit/avc/components/cdsUploader.js', - 'js/cds_deposit/avc/components/cdsRemoteUploader.js', - 'node_modules/angular-lazy-image/release/lazy-image.js', - 'node_modules/angular-local-storage/dist/angular-local-storage.js', - npm={ - 'angular-schema-form': '~0.8.13', - 'angular-schema-form-bootstrap': '~0.2.0', - 'angular-lazy-image': '~0.3.2', - 'angular-local-storage': '~0.5.2', - 'objectpath': '~1.2.1', - 'tv4': '~1.2.7', - } -) +# js_cds_deposit = NpmBundle( +# js_deposit_common, +# 'js/cds_deposit/avc/factories/states.js', +# 'js/cds_deposit/avc/components/cdsActions.js', +# 'js/cds_deposit/avc/components/cdsDeposit.js', +# 'js/cds_deposit/avc/components/cdsDeposits.js', +# 'js/cds_deposit/avc/components/cdsForm.js', +# 'js/cds_deposit/avc/components/cdsUploader.js', +# 'js/cds_deposit/avc/components/cdsRemoteUploader.js', +# 'node_modules/angular-lazy-image/release/lazy-image.js', +# 'node_modules/angular-local-storage/dist/angular-local-storage.js', +# npm={ +# 'angular-schema-form': '~0.8.13', +# 'angular-schema-form-bootstrap': '~0.2.0', +# 'angular-lazy-image': '~0.3.2', +# 'angular-local-storage': '~0.5.2', +# 'objectpath': '~1.2.1', +# 'tv4': '~1.2.7', +# } +# ) -js_deposit = NpmBundle( - js_main, - js_dependecies_schema_form, - js_dependecies_autocomplete, - js_dependencies_ui_sortable, - js_dependencies_ckeditor, - js_dependecies_uploader, - js_cds_deposit, - filters='jsmin', - output='gen/cds.deposit.%(version)s.js', -) +# js_deposit = NpmBundle( +# js_main, +# js_dependecies_schema_form, +# js_dependecies_autocomplete, +# js_dependencies_ui_sortable, +# js_dependencies_ckeditor, +# js_dependecies_uploader, +# js_cds_deposit, +# filters='jsmin', +# output='gen/cds.deposit.%(version)s.js', +# ) diff --git a/cds/modules/deposit/ext.py b/cds/modules/deposit/ext.py index dfe367f9a..1bf3b009d 100644 --- a/cds/modules/deposit/ext.py +++ b/cds/modules/deposit/ext.py @@ -27,14 +27,16 @@ from __future__ import absolute_import, print_function from invenio_base.signals import app_loaded -from invenio_deposit.signals import post_action +from ..invenio_deposit.signals import post_action from invenio_indexer.signals import before_record_index from .indexer import cdsdeposit_indexer_receiver -from .receivers import (datacite_register_after_publish, - index_deposit_after_action, - register_celery_class_based_tasks, - update_project_id_after_publish) +from .receivers import ( + datacite_register_after_publish, + index_deposit_after_action, + register_celery_class_based_tasks, + update_project_id_after_publish, +) class CDSDepositApp(object): @@ -47,7 +49,7 @@ def __init__(self, app=None): def init_app(self, app): """Flask application initialization.""" - app.extensions['cds-deposit'] = self + app.extensions["cds-deposit"] = self self.register_signals(app) @staticmethod @@ -55,16 +57,12 @@ def register_signals(app): """Register CDS Deposit signals.""" # index records after published # note: if publish a project -> index also videos - post_action.connect(index_deposit_after_action, - sender=app, weak=False) - post_action.connect(update_project_id_after_publish, - sender=app, weak=False) + post_action.connect(index_deposit_after_action, sender=app, weak=False) + post_action.connect(update_project_id_after_publish, sender=app, weak=False) # if it's a project/video, expands information before index - before_record_index.connect( - cdsdeposit_indexer_receiver, sender=app, weak=False) + before_record_index.connect(cdsdeposit_indexer_receiver, sender=app, weak=False) # register Datacite after publish record - post_action.connect( - datacite_register_after_publish, sender=app, weak=False) + post_action.connect(datacite_register_after_publish, sender=app, weak=False) # register class based celery tasks app_loaded.connect(register_celery_class_based_tasks) diff --git a/cds/modules/deposit/fetcher.py b/cds/modules/deposit/fetcher.py index f71b06f01..9325aab27 100644 --- a/cds/modules/deposit/fetcher.py +++ b/cds/modules/deposit/fetcher.py @@ -20,15 +20,15 @@ """Deposit fetchers.""" from __future__ import absolute_import, print_function -from invenio_deposit.providers import DepositProvider +from ..invenio_deposit.providers import DepositProvider from invenio_pidstore.fetchers import FetchedPID def deposit_fetcher(record_uuid, data): """Fetch PID from deposit.""" - pid_value = data.get('_deposit', {}).get('id') - return FetchedPID( - provider=DepositProvider, - pid_type='depid', - pid_value=pid_value - ) if pid_value else None + pid_value = data.get("_deposit", {}).get("id") + return ( + FetchedPID(provider=DepositProvider, pid_type="depid", pid_value=pid_value) + if pid_value + else None + ) diff --git a/cds/modules/deposit/form.py b/cds/modules/deposit/form.py index f1f5812af..1e3c28a67 100644 --- a/cds/modules/deposit/form.py +++ b/cds/modules/deposit/form.py @@ -26,8 +26,8 @@ import arrow -from flask_babelex import gettext as _ -from flask_wtf import Form +from invenio_i18n import lazy_gettext as _ +from flask_wtf import FlaskForm as Form from invenio_pidstore.errors import PIDDoesNotExistError from invenio_pidstore.models import PersistentIdentifier from invenio_sequencegenerator.api import Template diff --git a/cds/modules/deposit/loaders/loader.py b/cds/modules/deposit/loaders/loader.py index 4ac4b4872..f3908e41f 100644 --- a/cds/modules/deposit/loaders/loader.py +++ b/cds/modules/deposit/loaders/loader.py @@ -24,6 +24,7 @@ import json from flask import current_app, has_request_context, request +from marshmallow import ValidationError from invenio_rest.errors import RESTValidationError @@ -33,38 +34,42 @@ def _doi_context(): context = dict(replace_refs=has_request_context()) # DOI validation context - if request and request.view_args and request.view_args.get('pid_value'): - managed_prefix = current_app.config['PIDSTORE_DATACITE_DOI_PREFIX'] + if request and request.view_args and request.view_args.get("pid_value"): + managed_prefix = current_app.config["PIDSTORE_DATACITE_DOI_PREFIX"] - _, record = request.view_args.get('pid_value').data + _, record = request.view_args.get("pid_value").data # context['recid'] = record['recid'] if record.has_minted_doi(): - context['required_doi'] = record['doi'] + context["required_doi"] = record["doi"] # elif not record.is_published(): # context['allowed_dois'] = [doi_generator(record['recid'])] elif record.is_published(): # Ensure we cannot change to e.g. empty string. - context['doi_required'] = True + context["doi_required"] = True - context['managed_prefixes'] = [managed_prefix] - context['banned_prefixes'] = \ - ['10.5072'] if managed_prefix != '10.5072' else [] + context["managed_prefixes"] = [managed_prefix] + context["banned_prefixes"] = ["10.5072"] if managed_prefix != "10.5072" else [] return context def marshmallow_loader(schema_class, partial=False): """Marshmallow loader.""" + def schema_loader(): request_json = request.get_json() - context = _doi_context() + try: + request_json = request.get_json() + context = _doi_context() + valid_data = schema_class(context=context, partial=partial).load( + request_json + ) + except ValidationError as e: + raise MarshmallowErrors(e) + + return valid_data - result = schema_class(context=context, - partial=partial).load(request_json) - if result.errors: - raise MarshmallowErrors(result.errors) - return result.data return schema_loader @@ -79,26 +84,28 @@ def __init__(self, errors): def __str__(self): """Print exception with errors.""" return "{base}. Encountered errors: {errors}".format( - base=super(RESTValidationError, self).__str__(), - errors=self.errors) + base=super(RESTValidationError, self).__str__(), errors=self.errors + ) - def iter_errors(self, errors, prefix=''): + def iter_errors(self, errors, prefix=""): """Iterator over marshmallow errors.""" res = [] - for field, error in errors.items(): + _errors = errors.messages if hasattr(errors, "messages") else errors + for field, error in _errors.items(): if isinstance(error, list): - res.append(dict( - field='{0}{1}'.format(prefix, field), - message=' '.join([str(x) for x in error]) - )) + res.append( + dict( + field="{0}{1}".format(prefix, field), + message=" ".join([str(x) for x in error]), + ) + ) elif isinstance(error, dict): - res.extend(self.iter_errors( - error, - prefix='{0}{1}.'.format(prefix, field) - )) + res.extend( + self.iter_errors(error, prefix="{0}{1}.".format(prefix, field)) + ) return res - def get_body(self, environ=None): + def get_body(self, *args, environ=None): """Get the request body.""" body = dict( status=self.code, @@ -106,6 +113,6 @@ def get_body(self, environ=None): ) if self.errors: - body['errors'] = self.iter_errors(self.errors) + body["errors"] = self.iter_errors(self.errors) return json.dumps(body) diff --git a/cds/modules/deposit/mappings/deposits/records/videos/project/project-v1.0.0.json b/cds/modules/deposit/mappings/deposits/records/videos/project/project-v1.0.0.json deleted file mode 100644 index 357e32ae6..000000000 --- a/cds/modules/deposit/mappings/deposits/records/videos/project/project-v1.0.0.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "mappings": { - "project-v1.0.0": { - "numeric_detection": true, - "properties": { - "report_number": { - "type": "string" - }, - "_created": { - "type": "date" - }, - "_updated": { - "type": "date" - }, - "license": { - "type": "object", - "properties": { - "license": { - "type": "string", - "fields": { - "untouched": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "material": { - "type": "string" - }, - "credit": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "_access": { - "type": "object", - "properties": { - "read": { - "type": "string", - "index": "not_analyzed" - }, - "update": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "description": { - "type": "string" - }, - "keywords": { - "type": "object", - "properties": { - "key_id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "contributors": { - "type": "object", - "properties": { - "role": { - "type": "string" - }, - "ids": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "source": { - "type": "string" - } - } - }, - "affiliations": { - "type": "string" - }, - "name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "contribution": { - "type": "string" - } - } - }, - "_files": { - "type": "object", - "properties": { - "version_id": { - "type": "string" - }, - "type": { - "type": "string" - }, - "category": { - "type": "string" - }, - "bucket": { - "type": "string" - }, - "previewer": { - "type": "string" - }, - "checksum": { - "type": "string" - }, - "key": { - "type": "string" - }, - "size": { - "type": "long" - } - } - }, - "category": { - "type": "string", - "fields": { - "untouched": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "type": { - "type": "string", - "fields": { - "untouched": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "recid": { - "type": "double" - }, - "videos": { - "type": "object", - "properties": { - "_project_id": { - "type": "string" - }, - "contributors": { - "properties": { - "affiliations": { - "type": "string" - }, - "email": { - "type": "string" - }, - "ids": { - "properties": { - "source": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "name": { - "type": "string" - }, - "role": { - "type": "string" - } - } - } - } - }, - "_oai": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "sets": { - "type": "string" - }, - "updated": { - "type": "string" - } - } - }, - "translations": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "language": { - "type": "string" - }, - "title": { - "type": "object", - "properties": { - "source": { - "type": "string" - }, - "subtitle": { - "type": "string" - }, - "title": { - "type": "string" - } - } - } - } - }, - "_deposit": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "created_by": { - "type": "integer" - }, - "pid": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "revision_id": { - "type": "integer" - } - } - }, - "status": { - "type": "string" - }, - "owners": { - "type": "integer" - } - } - }, - "_cds": { - "type": "object", - "properties": { - "extracted_metadata": { - "type": "object" - }, - "state": { - "type": "object" - }, - "modified_by": { - "type": "integer" - } - } - }, - "title": { - "type": "object", - "properties": { - "subtitle": { - "type": "string" - }, - "source": { - "type": "string" - }, - "title": { - "type": "string", - "fields": { - "raw": { - "type": "string", - "index": "not_analyzed", - "analyzer": "case_insensitive_sort" - } - } - } - } - }, - "$schema": { - "type": "string" - }, - "date": { - "type": "date", - "format": "date||date_time_no_millis" - }, - "_buckets": { - "type": "object", - "properties": { - "record": { - "type": "string" - }, - "deposit": { - "type": "string" - } - } - } - }, - "date_detection": true - } - }, - "settings": { - "analysis": { - "analyzer": { - "case_insensitive_sort": { - "tokenizer": "keyword", - "filter": [ "lowercase" ] - } - } - } - } -} diff --git a/cds/modules/deposit/mappings/deposits/records/videos/video/video-v1.0.0.json b/cds/modules/deposit/mappings/deposits/records/videos/video/video-v1.0.0.json deleted file mode 100644 index b8c17d43a..000000000 --- a/cds/modules/deposit/mappings/deposits/records/videos/video/video-v1.0.0.json +++ /dev/null @@ -1,374 +0,0 @@ -{ - "mappings": { - "video-v1.0.0": { - "date_detection": true, - "properties": { - "accelerator_experiment": { - "type": "object", - "properties": { - "project": { - "type": "string" - }, - "study": { - "type": "string" - }, - "experiment": { - "type": "string" - }, - "accelerator": { - "type": "string" - }, - "facility": { - "type": "string" - } - } - }, - "report_number": { - "type": "string" - }, - "_created": { - "type": "date" - }, - "_updated": { - "type": "date" - }, - "physical_medium": { - "type": "object", - "properties": { - "shelf": { - "type": "string", - "index": "not_analyzed" - }, - "copy_number": { - "type": "string", - "index": "not_analyzed" - }, - "arrangement": { - "type": "string", - "index": "not_analyzed" - }, - "note": { - "type": "string", - "index": "not_analyzed" - }, - "camera": { - "type": "string", - "index": "not_analyzed" - }, - "location": { - "type": "string", - "index": "not_analyzed" - }, - "bar_code": { - "type": "string", - "index": "not_analyzed" - }, - "medium_standard": { - "type": "string", - "index": "not_analyzed" - }, - "sequence_number": { - "type": "string", - "index": "not_analyzed" - }, - "internal_note": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "_project_id":{ - "type": "string" - }, - "title": { - "properties": { - "subtitle": { - "type": "string" - }, - "title": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "_files": { - "properties": { - "version_id": { - "type": "string" - }, - "width": { - "type": "string" - }, - "bitrate": { - "type": "string" - }, - "category": { - "type": "string" - }, - "thumbnail": { - "type": "string" - }, - "size": { - "type": "long" - }, - "type": { - "type": "string" - }, - "bucket": { - "type": "string" - }, - "checksum": { - "type": "string" - }, - "key": { - "type": "string" - }, - "height": { - "type": "string" - }, - "previewer": { - "type": "string" - }, - "quality": { - "type": "string" - } - }, - "type": "object" - }, - "category": { - "type": "string", - "fields": { - "untouched": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "type": { - "type": "string", - "fields": { - "untouched": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "date": { - "type": "date", - "format": "date||date_time_no_millis" - }, - "keywords": { - "properties": { - "key_id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "$schema": { - "type": "string" - }, - "copyright": { - "properties": { - "year": { - "type": "string" - }, - "holder": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "type": "object" - }, - "_deposit": { - "properties": { - "pid": { - "properties": { - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "revision_id": { - "type": "integer" - } - }, - "type": "object" - }, - "owners": { - "type": "integer" - }, - "_oai": { - "properties": { - "updated": { - "type": "string" - }, - "id": { - "type": "string" - }, - "sets": { - "type": "string" - } - }, - "type": "object" - }, - "status": { - "type": "string" - }, - "id": { - "type": "string" - }, - "created_by": { - "type": "integer" - } - }, - "type": "object" - }, - "_cds": { - "type": "object", - "properties": { - "extracted_metadata": { - "type": "object" - }, - "state": { - "type": "object" - }, - "modified_by": { - "type": "integer" - } - } - }, - "recid": { - "type": "double" - }, - "license": { - "type": "object", - "properties": { - "license": { - "type": "string", - "fields": { - "untouched": { - "type": "string", - "index": "not_analyzed" - } - } - }, - "material": { - "type": "string" - }, - "credit": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "translations": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "language": { - "type": "string" - }, - "title": { - "type": "object", - "properties": { - "source": { - "type": "string" - }, - "subtitle": { - "type": "string" - }, - "title": { - "type": "string" - } - } - } - } - }, - "related_links": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "url": { - "type": "string" - } - } - }, - "description": { - "type": "string" - }, - "contributors": { - "properties": { - "contribution": { - "type": "string" - }, - "email": { - "type": "string" - }, - "ids": { - "properties": { - "source": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object" - }, - "affiliations": { - "type": "string" - }, - "role": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "_buckets": { - "properties": { - "deposit": { - "type": "string" - }, - "record": { - "type": "string" - } - }, - "type": "object" - }, - "_access": { - "type": "object", - "properties": { - "read": { - "type": "string", - "index": "not_analyzed" - }, - "update": { - "type": "string", - "index": "not_analyzed" - } - } - } - }, - "numeric_detection": true - } - } -} diff --git a/cds/modules/deposit/mappings/os-v2/__init__.py b/cds/modules/deposit/mappings/os-v2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cds/modules/deposit/mappings/os-v2/deposits/__init__.py b/cds/modules/deposit/mappings/os-v2/deposits/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cds/modules/deposit/mappings/os-v2/deposits/records/__init__.py b/cds/modules/deposit/mappings/os-v2/deposits/records/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cds/modules/deposit/mappings/os-v2/deposits/records/videos/__init__.py b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/__init__.py b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/project-v1.0.0.json b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/project-v1.0.0.json new file mode 100644 index 000000000..7a18bffb4 --- /dev/null +++ b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/project/project-v1.0.0.json @@ -0,0 +1,304 @@ +{ + "mappings": { + "properties": { + "report_number": { + "type": "text" + }, + "_created": { + "type": "date" + }, + "_updated": { + "type": "date" + }, + "license": { + "type": "object", + "properties": { + "license": { + "type": "keyword" + }, + "material": { + "type": "text" + }, + "credit": { + "type": "text" + }, + "url": { + "type": "text" + } + } + }, + "_access": { + "type": "object", + "properties": { + "read": { + "type": "keyword" + }, + "update": { + "type": "keyword" + } + } + }, + "description": { + "type": "text" + }, + "keywords": { + "type": "object", + "properties": { + "key_id": { + "type": "text" + }, + "name": { + "type": "text" + } + } + }, + "contributors": { + "type": "object", + "properties": { + "role": { + "type": "text" + }, + "ids": { + "type": "object", + "properties": { + "value": { + "type": "text" + }, + "source": { + "type": "text" + } + } + }, + "affiliations": { + "type": "text" + }, + "name": { + "type": "text" + }, + "email": { + "type": "text" + }, + "contribution": { + "type": "text" + } + } + }, + "_files": { + "type": "object", + "properties": { + "version_id": { + "type": "text" + }, + "type": { + "type": "text" + }, + "category": { + "type": "text" + }, + "bucket": { + "type": "text" + }, + "previewer": { + "type": "text" + }, + "checksum": { + "type": "text" + }, + "key": { + "type": "text" + }, + "size": { + "type": "long" + } + } + }, + "category": { + "type": "text", + "fields": { + "untouched": { + "type": "keyword" + } + } + }, + "type": { + "type": "text", + "fields": { + "untouched": { + "type": "keyword" + } + } + }, + "recid": { + "type": "double" + }, + "videos": { + "type": "object", + "properties": { + "_project_id": { + "type": "text" + }, + "contributors": { + "properties": { + "affiliations": { + "type": "text" + }, + "email": { + "type": "text" + }, + "ids": { + "properties": { + "source": { + "type": "text" + }, + "value": { + "type": "text" + } + } + }, + "name": { + "type": "text" + }, + "role": { + "type": "text" + } + } + } + } + }, + "_oai": { + "type": "object", + "properties": { + "id": { + "type": "text" + }, + "sets": { + "type": "text" + }, + "updated": { + "type": "text" + } + } + }, + "translations": { + "type": "object", + "properties": { + "description": { + "type": "text" + }, + "language": { + "type": "text" + }, + "title": { + "type": "object", + "properties": { + "source": { + "type": "text" + }, + "subtitle": { + "type": "text" + }, + "title": { + "type": "text" + } + } + } + } + }, + "_deposit": { + "type": "object", + "properties": { + "id": { + "type": "text" + }, + "created_by": { + "type": "integer" + }, + "pid": { + "type": "object", + "properties": { + "type": { + "type": "text" + }, + "value": { + "type": "text" + }, + "revision_id": { + "type": "integer" + } + } + }, + "status": { + "type": "keyword" + }, + "owners": { + "type": "integer" + } + } + }, + "_cds": { + "type": "object", + "properties": { + "extracted_metadata": { + "type": "object" + }, + "state": { + "type": "object" + }, + "modified_by": { + "type": "integer" + } + } + }, + "title": { + "type": "object", + "properties": { + "subtitle": { + "type": "text" + }, + "source": { + "type": "text" + }, + "title": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "analyzer": "case_insensitive_sort" + } + } + } + } + }, + "$schema": { + "type": "text" + }, + "date": { + "type": "date", + "format": "date||date_time_no_millis" + }, + "_buckets": { + "type": "object", + "properties": { + "record": { + "type": "text" + }, + "deposit": { + "type": "text" + } + } + } + } + }, + "settings": { + "analysis": { + "analyzer": { + "case_insensitive_sort": { + "tokenizer": "keyword", + "filter": [ + "lowercase" + ] + } + } + } + } +} \ No newline at end of file diff --git a/cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/__init__.py b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/video-v1.0.0.json b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/video-v1.0.0.json new file mode 100644 index 000000000..ae4cbfb87 --- /dev/null +++ b/cds/modules/deposit/mappings/os-v2/deposits/records/videos/video/video-v1.0.0.json @@ -0,0 +1,339 @@ +{ + "mappings": { + "properties": { + "accelerator_experiment": { + "type": "object", + "properties": { + "project": { + "type": "text" + }, + "study": { + "type": "text" + }, + "experiment": { + "type": "text" + }, + "accelerator": { + "type": "text" + }, + "facility": { + "type": "text" + } + } + }, + "report_number": { + "type": "text" + }, + "_created": { + "type": "date" + }, + "_updated": { + "type": "date" + }, + "physical_medium": { + "type": "object", + "properties": { + "shelf": { + "type": "keyword" + }, + "copy_number": { + "type": "keyword" + }, + "arrangement": { + "type": "keyword" + }, + "note": { + "type": "keyword" + }, + "camera": { + "type": "keyword" + }, + "location": { + "type": "keyword" + }, + "bar_code": { + "type": "keyword" + }, + "medium_standard": { + "type": "keyword" + }, + "sequence_number": { + "type": "keyword" + }, + "internal_note": { + "type": "keyword" + } + } + }, + "_project_id": { + "type": "text" + }, + "title": { + "properties": { + "subtitle": { + "type": "text" + }, + "title": { + "type": "text" + }, + "source": { + "type": "text" + } + } + }, + "_files": { + "properties": { + "version_id": { + "type": "text" + }, + "width": { + "type": "text" + }, + "bitrate": { + "type": "text" + }, + "category": { + "type": "text" + }, + "thumbnail": { + "type": "text" + }, + "size": { + "type": "long" + }, + "type": { + "type": "text" + }, + "bucket": { + "type": "text" + }, + "checksum": { + "type": "text" + }, + "key": { + "type": "text" + }, + "height": { + "type": "text" + }, + "previewer": { + "type": "text" + }, + "quality": { + "type": "text" + } + } + }, + "category": { + "type": "text", + "fields": { + "untouched": { + "type": "keyword" + } + } + }, + "type": { + "type": "text", + "fields": { + "untouched": { + "type": "keyword" + } + } + }, + "date": { + "type": "date", + "format": "date||date_time_no_millis" + }, + "keywords": { + "properties": { + "key_id": { + "type": "text" + }, + "name": { + "type": "text" + } + } + }, + "$schema": { + "type": "text" + }, + "copyright": { + "properties": { + "year": { + "type": "text" + }, + "holder": { + "type": "text" + }, + "url": { + "type": "text" + } + } + }, + "_deposit": { + "properties": { + "pid": { + "properties": { + "type": { + "type": "text" + }, + "value": { + "type": "text" + }, + "revision_id": { + "type": "integer" + } + } + }, + "owners": { + "type": "integer" + }, + "_oai": { + "properties": { + "updated": { + "type": "text" + }, + "id": { + "type": "text" + }, + "sets": { + "type": "text" + } + } + }, + "status": { + "type": "keyword" + }, + "id": { + "type": "text" + }, + "created_by": { + "type": "integer" + } + } + }, + "_cds": { + "properties": { + "extracted_metadata": { + "type": "object" + }, + "state": { + "type": "object" + }, + "modified_by": { + "type": "integer" + } + } + }, + "recid": { + "type": "double" + }, + "license": { + "properties": { + "license": { + "type": "text", + "fields": { + "untouched": { + "type": "keyword" + } + } + }, + "material": { + "type": "text" + }, + "credit": { + "type": "text" + }, + "url": { + "type": "text" + } + } + }, + "translations": { + "properties": { + "description": { + "type": "text" + }, + "language": { + "type": "text" + }, + "title": { + "properties": { + "source": { + "type": "text" + }, + "subtitle": { + "type": "text" + }, + "title": { + "type": "text" + } + } + } + } + }, + "related_links": { + "properties": { + "name": { + "type": "text" + }, + "url": { + "type": "text" + } + } + }, + "description": { + "type": "text" + }, + "contributors": { + "properties": { + "contribution": { + "type": "text" + }, + "email": { + "type": "text" + }, + "ids": { + "properties": { + "source": { + "type": "text" + }, + "value": { + "type": "text" + } + } + }, + "affiliations": { + "type": "text" + }, + "role": { + "type": "text" + }, + "name": { + "type": "text" + } + } + }, + "_buckets": { + "properties": { + "deposit": { + "type": "text" + }, + "record": { + "type": "text" + } + } + }, + "_access": { + "properties": { + "read": { + "type": "keyword" + }, + "update": { + "type": "keyword" + } + } + } + } + } +} \ No newline at end of file diff --git a/cds/modules/deposit/receivers.py b/cds/modules/deposit/receivers.py index 9642e53e7..4b527a01b 100644 --- a/cds/modules/deposit/receivers.py +++ b/cds/modules/deposit/receivers.py @@ -87,7 +87,7 @@ def register_celery_class_based_tasks(sender, app=None): register them explicitly. """ celery = app.extensions["invenio-celery"].celery - celery.tasks.register(ExtractMetadataTask()) - celery.tasks.register(DownloadTask()) - celery.tasks.register(ExtractFramesTask()) - celery.tasks.register(TranscodeVideoTask()) + celery.register_task(ExtractMetadataTask()) + celery.register_task(DownloadTask()) + celery.register_task(ExtractFramesTask()) + celery.register_task(TranscodeVideoTask()) diff --git a/cds/modules/deposit/schemas/deposits/records/videos/project/project-v1.0.0.json b/cds/modules/deposit/schemas/deposits/records/videos/project/project-v1.0.0.json index 7c834f7d8..a5f26e70f 100644 --- a/cds/modules/deposit/schemas/deposits/records/videos/project/project-v1.0.0.json +++ b/cds/modules/deposit/schemas/deposits/records/videos/project/project-v1.0.0.json @@ -1,7 +1,12 @@ { "description": "Describe information needed for deposit module.", "title": "CDS Project Deposit Schema", - "required": ["_deposit", "title", "category", "type"], + "required": [ + "_deposit", + "title", + "category", + "type" + ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", @@ -96,7 +101,9 @@ "minItems": 1, "items": { "additionalProperties": false, - "required": ["name"], + "required": [ + "name" + ], "type": "object", "description": "An entity responsible for making contributions to the resource. Examples of a Contributor include a person, an organization, or a service. Typically, the name of a Contributor should be used to indicate the entity.", "properties": { @@ -165,7 +172,9 @@ }, "title": { "additionalProperties": false, - "required": ["title"], + "required": [ + "title" + ], "type": "object", "description": "A name given to the resource. Typically, a Title will be a name by which the resource is formally known.", "properties": { @@ -221,11 +230,16 @@ "_deposit": { "description": "Internal deposit metadata.", "title": "Deposit", - "required": ["id"], + "required": [ + "id" + ], "type": "object", "properties": { "status": { - "enum": ["draft", "published"], + "enum": [ + "draft", + "published" + ], "type": "string", "description": "Status of the deposit, either 'draft' or 'published'.", "name": "status", @@ -376,7 +390,9 @@ }, "title": { "additionalProperties": false, - "required": ["title"], + "required": [ + "title" + ], "type": "object", "description": "A name given to the resource. Typically, a Title will be a name by which the resource is formally known.", "properties": { @@ -480,4 +496,4 @@ "type": "string" } } -} +} \ No newline at end of file diff --git a/cds/modules/deposit/search.py b/cds/modules/deposit/search.py index 277e2917d..7e90e1f6c 100644 --- a/cds/modules/deposit/search.py +++ b/cds/modules/deposit/search.py @@ -25,7 +25,7 @@ from __future__ import absolute_import, print_function -from elasticsearch_dsl.query import Q +from opensearch_dsl.query import Q from flask import current_app, g, request from flask_login import current_user from invenio_access.permissions import Permission, superuser_access @@ -37,7 +37,7 @@ from .facets import deposit_facets_factory -def deposit_search_factory(self, search): +def deposit_search_factory(self, search, search_query_parser): """Replace default search factory to use custom facet factory.""" from invenio_records_rest.sorter import default_sorter_factory query_string = request.values.get('q', '') @@ -52,7 +52,7 @@ def deposit_search_factory(self, search): exc_info=True) raise InvalidQueryRESTError() - search_index = search._index[0] + search_index = getattr(search, "_original_index", search._index)[0] search, urlkwargs = deposit_facets_factory(search, search_index) search, sortkwargs = default_sorter_factory(search, search_index) for key, value in sortkwargs.items(): diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/avc.module.js b/cds/modules/deposit/static/js/cds_deposit/avc/avc.module.js deleted file mode 100644 index 19efd381f..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/avc.module.js +++ /dev/null @@ -1,247 +0,0 @@ -function cdsDepositsConfig( - $locationProvider, - depositExtractedMetadataProvider, - depositStatesProvider, - depositStatusesProvider, - depositActions, - inheritedPropertiesProvider, - taskRepresentationsProvider, - urlBuilderProvider, - typeReducerProvider, - localStorageServiceProvider, - sfErrorMessageProvider, - jwtProvider, - $httpProvider, - $compileProvider -) { - $locationProvider.html5Mode({ - enabled: true, - requireBase: false, - rewriteLinks: false, - }); - sfErrorMessageProvider.setDefaultMessage(0, 'This field is required.'); - - // Local storage configuration - localStorageServiceProvider.setPrefix('cdsDeposit'); - - var mainStatuses = [ - 'file_upload', - 'file_download', - 'file_video_metadata_extraction', - 'file_video_extract_frames', - 'file_transcode', - ]; - - // Initialize the states - depositStatesProvider.setValues(mainStatuses); - - // Initialize statuses provider - depositStatusesProvider.setValues({ - PENDING: 'PENDING', - STARTED: 'STARTED', - FAILURE: 'FAILURE', - SUCCESS: 'SUCCESS', - CANCELLED: 'CANCELLED', - }); - - // Initialize extracted metadata pre-fill - depositExtractedMetadataProvider.setValues({ - values:{ - 'title': function(deposit, metadata){ - if('title' in metadata){ - deposit.title = {title: metadata.title}; - return metadata.title; - } - }, - 'description': function(deposit, metadata){ - if('description' in metadata){ - deposit.description = metadata.description; - return metadata.description; - } - }, - 'keywords': function(deposit, metadata){ - if('keywords' in metadata){ - deposit.keywords = metadata.keywords.map(function(keyword){ - return {name: keyword, value: {name: keyword}}; - }); - return metadata.keywords.join(', '); - } - }, - 'date': function(deposit, metadata){ - if('creation_time' in metadata){ - deposit.date = new Date(metadata.creation_time).toISOString().slice(0,10); - return deposit.date; - } - }, - } - }); - - // Deposit actions' information - depositActions.setValues(['project', 'video']) - - inheritedPropertiesProvider.setValues([ - 'contributors', - 'date', - 'description', - 'keywords', - 'license', - 'title.title', - 'translations', - ]); - - taskRepresentationsProvider.setValues({ - file_upload: 'Video file upload', - file_download: 'Video file download', - file_transcode: 'Video transcoding', - file_video_extract_frames: 'Video frame extraction', - file_video_metadata_extraction: 'Video metadata extraction' - }); - - // Initialize url builder - urlBuilderProvider.setBlueprints({ - iiif: '/api/iiif/v2/<%=deposit%>:<%=version_id%>:<%=key%>/full/!<%=res%>/0/default.png', - categories: '/api/categories', - video: '/deposit/<%=deposit%>/preview/video/<%=key%>', - restartTask: '/api/flows/<%=flowId%>/tasks/<%=taskId%>', - restartFlow: '/api/flows/<%=flowId%>', - taskFeedback: '/api/flows/<%=flowId%>/feedback', - selfVideo: '/api/deposits/video/<%=deposit%>', - bucketVideo: '/api/files/<%=bucket%>', - actionVideo: '/api/deposits/video/<%=deposit%>/actions/<%=action%>', - record: '/record/<%=recid%>', - }); - - // Initialize type reducer - typeReducerProvider.setBlueprints({ - SUCCESS: function(type, data) { - if (type === 'update_deposit') { - this.updateDeposit(data.meta.payload.deposit); - } - }, - }); - - // JWT Token - // Search DOM if exists - var authorized_token = document.getElementsByName('authorized_token'); - if (authorized_token.length > 0) { - token = authorized_token[0].value; - // No cache on API requests - var headers = { - 'Authorization': 'Bearer ' + token, - 'Content-Type': 'application/json', - }; - // Add no cache on all ``GET`` requests - var _get = _.merge( - headers, - { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - 'Pragma': 'no-cache', - 'Expires': 0 - } - ); - jwtProvider.setHeader(_get); - $httpProvider.defaults.headers['delete'] = headers; - $httpProvider.defaults.headers['post'] = headers; - $httpProvider.defaults.headers['put'] = headers; - } - - // Optimize Angular on production - // $compileProvider.debugInfoEnabled(false); -} - -// Inject the necessary angular services -cdsDepositsConfig.$inject = [ - '$locationProvider', - 'depositExtractedMetadataProvider', - 'depositStatesProvider', - 'depositStatusesProvider', - 'depositActionsProvider', - 'inheritedPropertiesProvider', - 'taskRepresentationsProvider', - 'urlBuilderProvider', - 'typeReducerProvider', - 'localStorageServiceProvider', - 'sfErrorMessageProvider', - 'jwtProvider', - '$httpProvider', - '$compileProvider', -]; - -// Register modules -angular.module('cdsDeposit.filters', []); -angular.module('cdsDeposit.providers', []); -angular.module('cdsDeposit.components', []); -angular.module('cdsDeposit.factories', []); - -// Register all cdsDeposit module into one -angular.module('cdsDeposit.modules', [ - 'cdsDeposit.filters', - 'cdsDeposit.providers', - 'cdsDeposit.factories', - 'cdsDeposit.components', - 'LocalStorageModule', - 'schemaForm', -]).config(cdsDepositsConfig); - -angular - .module('cdsDeposit.filters') - .filter('taskRepr', function(taskRepresentations) { - return function(input) { - return taskRepresentations[input] || input; - }; - }); - -angular.module('schemaForm') - .controller('invenioDynamicSelectController', ['$scope', '$controller', '$select', '$http', - function ($scope, $controller, $select, $http) { - $controller('dynamicSelectController', {$scope: $scope}); - - // format return value for uiselectmultiple - function formatTokenTags(item) { - return { - name: item, - value: { - name: item - } - } - }; - - $scope.form.formatTokenTags = formatTokenTags; - - // Use this only in multiple select - if ($scope.form.type === 'uiselectmultiple') { - // listen to keywords external change (inherit from project) and update the internal model - $scope.$on('cds.deposit.form.keywords.inherit', function(event, record) { - // format the keywords list for uiselectmultiple - var value = record.keywords.map(function(item) { - return formatTokenTags(item.name) - }); - // assign it to the form internal model - event.currentScope.internalModelTags = value; - }); - } - - }]); -// Initialize the module -angular - .module('cdsDeposit', [ - 'cdsDeposit.modules', - 'schemaForm', - 'mgcrea.ngStrap', - 'mgcrea.ngStrap.modal', - 'pascalprecht.translate', - 'ui.sortable', - 'ui.select', - 'mgcrea.ngStrap.select', - 'mgcrea.ngStrap.datepicker', - 'mgcrea.ngStrap.helpers.dateParser', - 'mgcrea.ngStrap.tooltip', - 'ngFileUpload', - 'monospaced.elastic', - 'invenioFiles.filters', - 'afkl.lazyImage', - 'hl.sticky', - 'duScroll', - 'toaster', - 'angular-loading-bar', - ]); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/components/cdsActions.js b/cds/modules/deposit/static/js/cds_deposit/avc/components/cdsActions.js deleted file mode 100644 index 81f2f0480..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/components/cdsActions.js +++ /dev/null @@ -1,166 +0,0 @@ -function cdsActionsCtrl($scope, $q, cdsAPI) { - var that = this; - - this.$onInit = function () { - - this.actionHandler = function (userActions) { - var hasMultipleActions = _.isArray(userActions), - method = hasMultipleActions ? 'makeMultipleActions' : 'makeSingleAction'; - - that.cdsDepositCtrl.preActions(); - return chainExtraActions(userActions) - .then(function(response) { - return that.cdsDepositCtrl[method](userActions) - .then(function(response) { - var _check = hasMultipleActions ? userActions : [userActions], - message; - if (_check.indexOf('DELETE') > -1) { - message = 'Successfully deleted.' - } else if (_check.indexOf('PUBLISH') > -1) { - message = 'Successfully published.' - } - that.cdsDepositCtrl.onSuccessAction(response, message); - }, - that.cdsDepositCtrl.onErrorAction - ) - .finally(that.cdsDepositCtrl.postActions); - }); - }; - - this.deleteVideo = function () { - that.actionHandler('DELETE').then( - function () { - var children = that.cdsDepositCtrl.cdsDepositsCtrl.master.metadata.videos; - for (var i in children) { - if (children[i]._deposit.id === that.cdsDepositCtrl.id) { - children.splice(i, 1); - } - } - } - ); - } - - $scope.$on('cds.deposit.delete', function () { - that.deleteVideo(); - }); - - /* - * Show a warning message if user wants to edit a published video but the project is already published - */ - this.showCannotEditVideoDialog = false; - this.editPublished = function () { - if (that.cdsDepositCtrl.depositType === 'video' && that.cdsDepositCtrl.isProjectPublished()) { - that.showCannotEditVideoDialog = true; - } else { - that.actionHandler(['EDIT', 'SAVE_PARTIAL']); - that.cdsDepositCtrl.changeShowAll(false); - } - } - - this.saveAllPartial = function() { - if (that.cdsDepositCtrl.depositType === 'project') { - var saveActions = getSaveAllMakeActions(); - that.cdsDepositCtrl.preActions(); - return cdsAPI.chainedActions(saveActions) - .then( - that.cdsDepositCtrl.onSuccessActionMultiple, - that.cdsDepositCtrl.onErrorAction - ) - .finally(that.cdsDepositCtrl.postActions); - } - } - - /* - * Save videos first, then save project: this is because the save project - * response will contain also the videos metadata, which must be up-to-date. - */ - $scope.$on('cds.deposit.project.saveAll', function() { - that.saveAllPartial(); - }); - - /* - * If user is publishing a project, save videos and project first - */ - function chainExtraActions(actions) { - var arrayActions = _.isArray(actions) ? actions : [actions], - isPublishing = arrayActions.indexOf('PUBLISH') > -1, - extraActionPromises; - - if (isPublishing && that.cdsDepositCtrl.depositType === 'project') { - extraActionPromises = cdsAPI.chainedActions(getSaveAllMakeActions()); - } else { - // empty promise - extraActionPromises = $q.when(); - } - return extraActionPromises; - } - - /* - * Return actions to save videos and project - */ - function getSaveAllMakeActions() { - var depositsCtrl = that.cdsDepositCtrl.cdsDepositsCtrl, - master = depositsCtrl.master, - project = master.metadata, - videos = project.videos, - actionName = 'SAVE_PARTIAL', - videoActions = getVideoMakeActions(actionName, videos), - projectAction = getProjectMakeAction(actionName, master, project); - - videoActions.push(projectAction); - - return videoActions; - } - - function getVideoMakeActions(actionName, videos) { - return videos - .filter(function (video) { - return video._deposit.status === 'draft'; - }) - .map(function (video) { - return function () { - var depositType = 'video', - cleanedVideo = cdsAPI.cleanData(video); - url = cdsAPI.guessEndpoint(cleanedVideo, depositType, actionName, cleanedVideo.links); - - return cdsAPI.makeAction( - url, - depositType, - actionName, - cleanedVideo - ); - }; - }); - } - - function getProjectMakeAction(actionName, master, project) { - return function () { - var depositType = 'project', - cleanedProject = cdsAPI.cleanData(project), - url = cdsAPI.guessEndpoint(cleanedProject, depositType, actionName, master.links); - - return cdsAPI.makeAction( - url, - depositType, - actionName, - cleanedProject - ); - }; - } - }; -} - -cdsActionsCtrl.$inject = ['$scope', '$q', 'cdsAPI']; - -function cdsActions() { - return { - bindings: {}, - require: {cdsDepositCtrl: '^cdsDeposit'}, - controller: cdsActionsCtrl, - templateUrl: function ($element, $attrs) { - return $attrs.template; - } - }; -} - -angular.module('cdsDeposit.components').component('cdsActions', cdsActions()); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/components/cdsRemoteUploader.js b/cds/modules/deposit/static/js/cds_deposit/avc/components/cdsRemoteUploader.js deleted file mode 100644 index 356546343..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/components/cdsRemoteUploader.js +++ /dev/null @@ -1,93 +0,0 @@ -function cdsRemoteUploadCtrl($scope, $http, $element, $q) { - var that = this; - this.$onInit = function() { - // Initialize dropbox dropin if enabled - if (this.dropboxEnabled) { - if (typeof Dropbox !== 'undefined') { - Dropbox.appKey = this.dropboxAppKey; - var button = Dropbox.createChooseButton({ - success: function (files) { - var _files = files.map(function (file) { - return { - key: file.name, - name: file.name, - size: file.bytes, - receiver: that.cdsDepositsCtrl.isVideoFile(file.name) ? that.remoteMasterReceiver : that.remoteChildrenReceiver, - url: file.link - }; - }); - var ctrl = that.cdsUploaderCtrl || that.cdsDepositsCtrl; - ctrl.addFiles(_files); - $scope.$apply(); - }, - linkType: 'direct' - }); - $element[0].querySelector(this.dropboxSelector).appendChild(button); - } else { - $scope.dropboxError = 'Dropbox dropins.js is not loaded'; - } - } - - $scope.startUrlUploads = function (urls) { - var _urls = urls.split('\n'); - var urlsResolved = $q.all(_urls.map(function(url) { - // Use an a element to parse the URL - var parser = document.createElement('a'); - parser.href = url; - var name = parser.pathname.split('/').pop(); - var obj = { - key: name, - name: name, - receiver: that.cdsDepositsCtrl.isVideoFile(name) ? that.remoteMasterReceiver : that.remoteChildrenReceiver, - url: url - }; - var sizePromise; - // Retrieve the file size if the protocol is http/s - if (url.startsWith('http')) { - sizePromise = $http.head(url).then(function (response) { - var len = response.headers('content-length'); - if (len) { - obj.size = len; - } - }); - } else { - sizePromise = $q.resolve(); - } - // Return the object wrapped in a promise - return sizePromise.catch(angular.noop).then(function () { - return obj; - }); - })); - // When all the objects have been formed, add them as files - urlsResolved.then(function(objs) { - var ctrl = that.cdsUploaderCtrl || that.cdsDepositsCtrl; - ctrl.addFiles(objs); - }); - }; - }; -} - -cdsRemoteUploadCtrl.$inject = ['$scope', '$http', '$element', '$q']; - -function cdsRemoteUploader() { - return { - require: { - cdsUploaderCtrl: '?^cdsUploader', - cdsDepositsCtrl: '?^cdsDeposits' - }, - bindings: { - remoteMasterReceiver: '@', - remoteChildrenReceiver: '@', - dropboxEnabled: '<', - dropboxAppKey: '@', - dropboxSelector: '@' - }, - controller: cdsRemoteUploadCtrl, - templateUrl: function($element, $attrs) { - return $attrs.template; - } - } -} - -angular.module('cdsDeposit.components') - .component('cdsRemoteUploader', cdsRemoteUploader()); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/factories/states.js b/cds/modules/deposit/static/js/cds_deposit/avc/factories/states.js deleted file mode 100644 index bd2b3185d..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/factories/states.js +++ /dev/null @@ -1,140 +0,0 @@ -function cdsAPI($q, $http, depositActions, urlBuilder) { - - function action(url, method, payload, headers) { - requestConfig = { - url: url, - method: method, - data: payload - }; - - if (headers) { - requestConfig.headers = headers - } - - return $http(requestConfig); - } - - function chainedActions(promises) { - var defer = $q.defer(); - var data = []; - function _chain(promise) { - var fn = promise; - var callback; - - if (typeof(promise) !== 'function') { - fn = promise[0]; - callback = promise[1]; - } - fn().then( - function(_data) { - data.push(_data); - if (typeof(callback) === 'function') { - // Call the callback - callback(_data); - } - if (promises.length > 0) { - return _chain(promises.shift()); - } else { - defer.resolve(data); - } - }, function(error) { - defer.reject(error); - } - ); - } - _chain(promises.shift()); - return defer.promise; - } - - function cleanData(data, unwanted) { - var _unwantend = unwanted || [[null], [undefined]]; - data = angular.copy(data); - // Delete the _files before request - delete data._files; - angular.forEach(data, function(value, key) { - angular.forEach(_unwantend, function(_value) { - if (angular.equals(_value, value)) { - delete data[key]; - } - }); - }); - return data; - } - - function getUrlPath(url) { - var _parser = document.createElement('a'); - _parser.href = url; - return _parser.pathname; - } - - function resolveJSON(url) { - return $http({ - url: url, - method: 'GET', - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - 'Pragma': 'no-cache', - 'Expires': 0 - } - }); - } - - function containsLink(links, link) { - return links && Object.keys(links).indexOf(link) > -1; - } - - function guessEndpoint(record, depositType, actionName, links) { - var link = depositActions[depositType][actionName].link, - isMaster = depositType === 'project'; - - if (containsLink(links, link)) { - return links[link]; - } else { - if (!isMaster) { - // If the link is self just return the self video url - if (link === 'self') { - return urlBuilder.selfVideo({ - deposit: record._deposit.id - }); - } else if (link === 'bucket') { - return urlBuilder.bucketVideo({ - bucket: record._buckets.deposit - }); - } - // If the link is different return the action video url - return urlBuilder.actionVideo({ - deposit: record._deposit.id, - action: actionName.toLowerCase() - }); - } - } - } - - function makeAction(url, depositType, actionName, payload) { - var actionInfo = depositActions[depositType][actionName]; - if (actionInfo.preprocess) { - payload = actionInfo.preprocess(payload); - } - return action(url, actionInfo.method, payload, actionInfo.headers); - } - - return { - action: action, - cleanData: cleanData, - chainedActions: chainedActions, - resolveJSON: resolveJSON, - getUrlPath: getUrlPath, - guessEndpoint: guessEndpoint, - makeAction: makeAction - }; -} - -cdsAPI.$inject = [ - '$q', - '$http', - 'depositActions', - 'urlBuilder' -]; - -angular.module('cdsDeposit.factories') - .factory('cdsAPI', cdsAPI); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/filters/mergeObjects.js b/cds/modules/deposit/static/js/cds_deposit/avc/filters/mergeObjects.js deleted file mode 100644 index 5151500c8..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/filters/mergeObjects.js +++ /dev/null @@ -1,9 +0,0 @@ -function mergeObjects() { - // Filter to allow merging of two objects inside angular expressions - return function(dst, src) { - return angular.merge({}, dst, src); - } -} - -angular.module('cdsDeposit.filters') - .filter('mergeObjects', mergeObjects); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/filters/parseAutocomplete.js b/cds/modules/deposit/static/js/cds_deposit/avc/filters/parseAutocomplete.js deleted file mode 100644 index 22ec2c393..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/filters/parseAutocomplete.js +++ /dev/null @@ -1,10 +0,0 @@ -function parseAutocomplete() { - return function(input, key) { - if (typeof(input) === "object") { - return _.get(input, key || 'name'); - } - return input; - }; -} - -angular.module('cdsDeposit.filters').filter('parseAutocomplete', parseAutocomplete); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/filters/toInt.js b/cds/modules/deposit/static/js/cds_deposit/avc/filters/toInt.js deleted file mode 100644 index 04342f4f7..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/filters/toInt.js +++ /dev/null @@ -1,14 +0,0 @@ -function toInt() { - return function(input) { - var result; - try { - result = parseInt(input); - } catch(error) { - result = input; - } - return result; - }; -} - -angular.module('cdsDeposit.filters') - .filter('toInt', toInt); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositActions.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositActions.js deleted file mode 100644 index 6931a85eb..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositActions.js +++ /dev/null @@ -1,83 +0,0 @@ -function depositActions() { - var actions = {}; - return { - setValues: function(depositTypes, extraActions) { - actions = depositTypes.reduce(function(obj, depositType) { - mimetype = 'application/vnd.' + depositType + '.partial+json', - obj[depositType] = Object.assign({ - CREATE: { - method: 'POST', - link: 'self', - headers: { - 'Content-Type': mimetype, - 'Accept': mimetype - }, - preprocess: sanitizeData - }, - SAVE_PARTIAL: { - method: 'PUT', - link: 'self', - headers: { - 'Content-Type': mimetype, - 'Accept': mimetype - }, - preprocess: sanitizeData - }, - SAVE: { - method: 'PUT', - link: 'self', - preprocess: sanitizeData - }, - EDIT: { - method: 'POST', - link: 'edit', - preprocess: noPayload - }, - PUBLISH: { - method: 'POST', - link: 'publish', - preprocess: noPayload - }, - DELETE: { - method: 'DELETE', - link: 'self' - }, - BUCKET: { - method: 'GET', - link: 'bucket' - } - }, extraActions || {}) - return obj - }, {}) - }, - $get: function() { - return actions; - } - }; -} - -function isPopulated(val) { - return val !== null && val !== undefined && !_.isEqual(val, '') - && !_.isEqual(val, []) && !(val.constructor === Object && _.isEmpty(val)); -} - -function noPayload(payload) { - return null; -} - -function sanitizeData(payload) { - if (_.isArray(payload)) { - return payload.map(sanitizeData).filter(isPopulated); - } else if (_.isObject(payload)) { - return _.chain(payload) - .mapValues(sanitizeData) - .omitBy(function(o) { - return !isPopulated(o); - }).value(); - } else { - return payload; - } -} - -angular.module('cdsDeposit.providers') - .provider('depositActions', depositActions); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositExtractedMetadata.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositExtractedMetadata.js deleted file mode 100644 index a60618125..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositExtractedMetadata.js +++ /dev/null @@ -1,14 +0,0 @@ -function depositExtractedMetadata() { - var metadata = {}; - return { - setValues: function(values) { - metadata = values; - }, - $get: function() { - return metadata; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('depositExtractedMetadata', depositExtractedMetadata); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStates.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStates.js deleted file mode 100644 index 645237da8..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStates.js +++ /dev/null @@ -1,14 +0,0 @@ -function depositStates() { - var states = []; - return { - setValues: function(values) { - states = states.concat(values); - }, - $get: function() { - return states; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('depositStates', depositStates); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStatuses.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStatuses.js deleted file mode 100644 index 667e45d1c..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/depositStatuses.js +++ /dev/null @@ -1,14 +0,0 @@ -function depositStatuses() { - var statuses = {}; - return { - setValues: function(values) { - statuses = values; - }, - $get: function() { - return statuses; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('depositStatuses', depositStatuses); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/inheritedProperties.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/inheritedProperties.js deleted file mode 100644 index 00c5636b4..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/inheritedProperties.js +++ /dev/null @@ -1,14 +0,0 @@ -function inheritedProperties() { - var properties = []; - return { - setValues: function(values) { - properties = values; - }, - $get: function() { - return properties; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('inheritedProperties', inheritedProperties); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/jwt.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/jwt.js deleted file mode 100644 index bd2cfcbe2..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/jwt.js +++ /dev/null @@ -1,19 +0,0 @@ -function jwt() { - var header = {}; - - function setHeader(header_) { - header = header_; - } - - return { - setHeader: function(header_) { - setHeader(header_); - }, - $get: function() { - return header; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('jwt', jwt); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/stateReducer.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/stateReducer.js deleted file mode 100644 index 48a3fef8e..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/stateReducer.js +++ /dev/null @@ -1,21 +0,0 @@ -function stateReducer() { - var blueprints = {}; - - function setBlueprint(key, value) { - // underscorejs templates - blueprints[key] = value; - } - return { - setBlueprints: function(blueprints_) { - angular.forEach(blueprints_, function(value, key) { - setBlueprint(key, value); - }) - }, - $get: function() { - return blueprints; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('stateReducer', stateReducer); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/taskRepresentations.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/taskRepresentations.js deleted file mode 100644 index 268901f99..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/taskRepresentations.js +++ /dev/null @@ -1,14 +0,0 @@ -function taskRepresentations() { - var representations = {}; - return { - setValues: function(values) { - representations = values; - }, - $get: function() { - return representations; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('taskRepresentations', taskRepresentations); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/typeReducer.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/typeReducer.js deleted file mode 100644 index 193100bb5..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/typeReducer.js +++ /dev/null @@ -1,21 +0,0 @@ -function typeReducer() { - var blueprints = {}; - - function setBlueprint(key, value) { - // underscorejs templates - blueprints[key] = value; - } - return { - setBlueprints: function(blueprints_) { - angular.forEach(blueprints_, function(value, key) { - setBlueprint(key, value); - }) - }, - $get: function() { - return blueprints; - } - } -} - -angular.module('cdsDeposit.providers') - .provider('typeReducer', typeReducer); diff --git a/cds/modules/deposit/static/js/cds_deposit/avc/providers/urlBuilder.js b/cds/modules/deposit/static/js/cds_deposit/avc/providers/urlBuilder.js deleted file mode 100644 index fca7aac8d..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/avc/providers/urlBuilder.js +++ /dev/null @@ -1,21 +0,0 @@ -function urlBuilder() { - var blueprints = {}; - - function setBlueprint(key, value) { - // underscorejs templates - blueprints[key] = _.template(value); - } - return { - setBlueprints: function(blueprints_) { - angular.forEach(blueprints_, function(value, key) { - setBlueprint(key, value); - }) - }, - $get: function() { - return blueprints; - } - }; -} - -angular.module('cdsDeposit.providers') - .provider('urlBuilder', urlBuilder); diff --git a/cds/modules/deposit/static/js/cds_deposit/main.js b/cds/modules/deposit/static/js/cds_deposit/main.js deleted file mode 100644 index 23389d4ff..000000000 --- a/cds/modules/deposit/static/js/cds_deposit/main.js +++ /dev/null @@ -1,16 +0,0 @@ -$(document).ready(function() { - // show warning if IE (not supported for deposit) - var $cdsDepositIeWarning = $('#cds-deposit-ie-warning'); - if ($cdsDepositIeWarning.length && isIEBelowEdge()) { - $cdsDepositIeWarning.removeClass('hidden'); - } - - function isIEBelowEdge() { - return ( - navigator.appName == 'Microsoft Internet Explorer' || - !!(navigator.userAgent.match(/Trident/) || - navigator.userAgent.match(/rv:11/)) || - (typeof $.browser !== "undefined" && $.browser.msie == 1) - ); - } -}); diff --git a/cds/modules/deposit/static/json/cds_deposit/forms/project.json b/cds/modules/deposit/static/json/cds_deposit/forms/project.json index 3949ddf05..6c18d0b82 100644 --- a/cds/modules/deposit/static/json/cds_deposit/forms/project.json +++ b/cds/modules/deposit/static/json/cds_deposit/forms/project.json @@ -20,12 +20,38 @@ "entities": false, "height": 200, "toolbar": [ - ["PasteText", "PasteFromWord"], - ["Bold", "Italic", "Strike", "-", "Subscript", "Superscript"], - ["NumberedList", "BulletedList", "Blockquote"], - ["Undo", "Redo", "-", "Find", "Replace", "-", "RemoveFormat"], - ["Source"], - ["Maximize"] + [ + "PasteText", + "PasteFromWord" + ], + [ + "Bold", + "Italic", + "Strike", + "-", + "Subscript", + "Superscript" + ], + [ + "NumberedList", + "BulletedList", + "Blockquote" + ], + [ + "Undo", + "Redo", + "-", + "Find", + "Replace", + "-", + "RemoveFormat" + ], + [ + "Source" + ], + [ + "Maximize" + ] ], "disableNativeSpellChecker": false, "removePlugins": "elementspath", @@ -79,7 +105,9 @@ "onChange": "$ctrl.updateType(modelValue, form)", "readonly": "$ctrl.cdsDepositCtrl.hasCategory() || $ctrl.isAnyVideoAlreadyPublished()", "options": { - "filterTriggers": ["model.category"], + "filterTriggers": [ + "model.category" + ], "filter": "item.category == model.category", "asyncCallback": "$ctrl.autocompleteType" } @@ -216,7 +244,9 @@ "onChange": "$ctrl.updateType(modelValue, form)", "readonly": "$ctrl.cdsDepositCtrl.hasCategory() || $ctrl.isAnyVideoAlreadyPublished()", "options": { - "filterTriggers": ["model.category"], + "filterTriggers": [ + "model.category" + ], "filter": "item.category == model.category", "asyncCallback": "$ctrl.autocompleteType" }, @@ -440,4 +470,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/cds/modules/deposit/templates/cds_deposit/edit.html b/cds/modules/deposit/templates/cds_deposit/edit.html index 46f859b49..741649d7e 100644 --- a/cds/modules/deposit/templates/cds_deposit/edit.html +++ b/cds/modules/deposit/templates/cds_deposit/edit.html @@ -3,7 +3,7 @@ {%- set container_class = '{{container_class}} cds-max-fluid-width' -%} {%- block css %} - {% assets "invenio_deposit_css" %}{% endassets %} + {# {% assets "invenio_deposit_css" %}{% endassets %} #} {{ super() }}