From a066cc5e12accb7a0b44f032f600277a58501e95 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Mon, 7 Apr 2025 11:44:21 -0400 Subject: [PATCH] remove draft registration and addons routes --- osf/models/mixins.py | 14 - tests/test_registrations/test_views.py | 420 ------------------ website/profile/views.py | 6 - website/project/metadata/utils.py | 1 - website/project/views/__init__.py | 2 +- website/project/views/drafts.py | 293 ------------ website/project/views/node.py | 7 - website/project/views/register.py | 55 --- website/routes.py | 134 ------ website/templates/project/register_draft.mako | 3 - 10 files changed, 1 insertion(+), 934 deletions(-) delete mode 100644 website/project/views/drafts.py diff --git a/osf/models/mixins.py b/osf/models/mixins.py index 9027a284f7c..0cd46c81a99 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -606,20 +606,6 @@ def add_addon(self, addon_name, auth=None, override=False, _force=False): ret.save(clean=False) # TODO This doesn't feel right return ret - def config_addons(self, config, auth=None, save=True): - """Enable or disable a set of add-ons. - - :param dict config: Mapping between add-on names and enabled / disabled - statuses - """ - for addon_name, enabled in config.items(): - if enabled: - self.add_addon(addon_name, auth) - else: - self.delete_addon(addon_name, auth) - if save: - self.save() - def delete_addon(self, addon_name, auth=None, _force=False): """Delete an add-on from the node. diff --git a/tests/test_registrations/test_views.py b/tests/test_registrations/test_views.py index 34c7577540e..927171ed2c6 100644 --- a/tests/test_registrations/test_views.py +++ b/tests/test_registrations/test_views.py @@ -19,7 +19,6 @@ from osf.utils import permissions from website.project.metadata.schemas import _name_to_id from website.util import api_url_for -from website.project.views import drafts as draft_views from osf_tests.factories import ( AuthUserFactory, @@ -37,425 +36,6 @@ SCHEMA_VERSION = 2 -@pytest.mark.django_db -@pytest.mark.enable_bookmark_creation -class TestRegistrationViews(RegistrationsTestBase): - - def test_node_register_page_not_registration_redirects(self): - url = self.node.web_url_for('node_register_page') - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_302_FOUND - - @mock.patch('website.archiver.tasks.archive') - def test_node_register_page_registration(self, mock_archive): - draft_reg = DraftRegistrationFactory(branched_from=self.node, user=self.node.creator) - reg = self.node.register_node(get_default_metaschema(), self.auth, draft_reg, None) - url = reg.web_url_for('node_register_page') - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - - def test_non_admin_can_view_node_register_page(self): - non_admin = AuthUserFactory() - self.node.add_contributor( - non_admin, - permissions.DEFAULT_CONTRIBUTOR_PERMISSIONS, - auth=self.auth, - save=True - ) - reg = RegistrationFactory(project=self.node) - url = reg.web_url_for('node_register_page') - res = self.app.get(url, auth=non_admin.auth) - assert res.status_code == http_status.HTTP_200_OK - - def test_is_public_node_register_page(self): - self.node.is_public = True - self.node.save() - reg = RegistrationFactory(project=self.node) - reg.is_public = True - reg.save() - url = reg.web_url_for('node_register_page') - res = self.app.get(url, auth=None) - assert res.status_code == http_status.HTTP_200_OK - - @mock.patch('framework.celery_tasks.handlers.enqueue_task', mock.Mock()) - def test_register_template_page_backwards_comptability(self): - # Historically metaschema's were referenced by a slugified version - # of their name. - reg = self.draft.register( - auth=self.auth, - save=True - ) - url = reg.web_url_for( - 'node_register_template_page', - metaschema_id=_name_to_id(self.meta_schema.name), - ) - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - - def test_register_template_page_redirects_if_not_registration(self): - url = self.node.web_url_for( - 'node_register_template_page', - metaschema_id=self.meta_schema._id, - ) - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_302_FOUND - - -@pytest.mark.enable_bookmark_creation -class TestDraftRegistrationViews(RegistrationsTestBase): - - def test_draft_before_register_page(self): - url = self.draft_url('draft_before_register_page') - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - - def test_get_draft_registration(self): - url = self.draft_api_url('get_draft_registration') - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - assert res.json['pk'] == self.draft._id - - def test_get_draft_registration_deleted(self): - self.draft.deleted = timezone.now() - self.draft.save() - self.draft.reload() - - url = self.draft_api_url('get_draft_registration') - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_410_GONE - - def test_get_draft_registration_invalid(self): - url = self.node.api_url_for('get_draft_registration', draft_id='13123123') - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_404_NOT_FOUND - - def test_get_draft_registration_not_admin(self): - url = self.draft_api_url('get_draft_registration') - res = self.app.get(url, auth=self.non_admin.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - def test_get_draft_registrations_only_gets_drafts_for_that_node(self): - dummy = NodeFactory() - - # Drafts for dummy node - for i in range(5): - d = DraftRegistrationFactory( - initiator=self.user, - branched_from=dummy, - meta_schema=self.meta_schema, - schema_data={} - ) - - found = [self.draft] - # Drafts for self.node - for i in range(3): - d = DraftRegistrationFactory( - initiator=self.user, - branched_from=self.node, - meta_schema=self.meta_schema, - schema_data={} - ) - found.append(d) - url = self.node.api_url_for('get_draft_registrations') - - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - # 3 new, 1 from setUp - assert len(res.json['drafts']) == 4 - for draft in res.json['drafts']: - assert draft['pk'] in [f._id for f in found] - - def test_new_draft_registration_POST(self): - target = NodeFactory(creator=self.user) - payload = { - 'schema_name': self.meta_schema.name, - 'schema_version': self.meta_schema.schema_version - } - url = target.web_url_for('new_draft_registration') - - res = self.app.post(url, data=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_302_FOUND - target.reload() - draft = DraftRegistration.objects.get(branched_from=target) - assert draft.registration_schema == self.meta_schema - - def test_new_draft_registration_on_registration(self): - target = RegistrationFactory(user=self.user) - payload = { - 'schema_name': self.meta_schema.name, - 'schema_version': self.meta_schema.schema_version - } - url = target.web_url_for('new_draft_registration') - res = self.app.post(url, json=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - def test_update_draft_registration_cant_update_registered(self): - metadata = { - 'summary': {'value': 'updated'} - } - assert metadata != self.draft.registration_metadata - payload = { - 'schema_data': metadata, - 'schema_name': 'OSF-Standard Pre-Data Collection Registration', - 'schema_version': 1 - } - self.draft.register(self.auth, save=True) - url = self.node.api_url_for('update_draft_registration', draft_id=self.draft._id) - - res = self.app.put(url, json=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - def test_edit_draft_registration_page_already_registered(self): - self.draft.register(self.auth, save=True) - url = self.node.web_url_for('edit_draft_registration_page', draft_id=self.draft._id) - res = self.app.get(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - def test_update_draft_registration(self): - metadata = { - 'summary': { - 'value': 'updated', - 'comments': [] - } - } - assert metadata != self.draft.registration_metadata - payload = { - 'schema_data': metadata, - 'schema_name': 'Open-Ended Registration', - 'schema_version': 2 - } - url = self.node.api_url_for('update_draft_registration', draft_id=self.draft._id) - - res = self.app.put(url, json=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - - open_ended_schema = RegistrationSchema.objects.get(name='Open-Ended Registration', schema_version=2) - - self.draft.reload() - assert open_ended_schema == self.draft.registration_schema - assert metadata == self.draft.registration_metadata - - def test_update_draft_registration_special_filename(self): - # Metadata dict is copied from the PUT request to /project//drafts// - # when adding a file as a supplemental file to a draft registration - metadata = { - 'summary': { - 'value': None, - 'comments': [], - 'extra': [] - }, - 'uploader': { - 'value': 'Cafe&LunchMenu.pdf', - 'comments': [], - 'extra': [{ - 'fileId': 'h8zsj', - 'data': { - 'id': 'osfstorage/5ea6ff395288ad0d931c17f5', - 'type': 'files', - 'links': { - 'move': 'http://localhost:7777/v1/resources/vdbcr/providers/osfstorage/5ea6ff395288ad0d931c17f5', - 'upload': 'http://localhost:7777/v1/resources/vdbcr/providers/osfstorage/5ea6ff395288ad0d931c17f5?kind=file', - 'delete': 'http://localhost:7777/v1/resources/vdbcr/providers/osfstorage/5ea6ff395288ad0d931c17f5', - 'download': 'http://localhost:7777/v1/resources/vdbcr/providers/osfstorage/5ea6ff395288ad0d931c17f5' - }, - 'extra': { - 'guid': None, - 'version': 1, - 'downloads': 0, - 'checkout': None, - 'latestVersionSeen': { - 'user': 'bd53u', - 'seen': True - }, - 'hashes': { - 'md5': '2919727d545c2a93ea89c3442d2545c5', - 'sha256': '2161a32cfe1cbbfbd73aa541fdcb8c407523a8828bfd7a031362e1763a74e8ad' - } - }, - 'kind': 'file', - 'name': 'Cafe&LunchMenu.pdf', - 'path': '/5ea6ff395288ad0d931c17f5', - 'provider': 'osfstorage', - 'materialized': '/Cafe&LunchMenu.pdf', - 'etag': 'c9248ce917b428c7cae6a7fd45a42b83952db882c4009f0bdf9603a43eab663b', - 'contentType': None, - 'modified': '2020-04-27T15:50:18.365664+00:00', - 'modified_utc': '2020-04-27T15:50:18.365664+00:00', - 'created_utc': '2020-04-27T15:50:18.365664+00:00', - 'size': 805847, - 'sizeInt': 805847, - 'resource': 'vdbcr', - 'permissions': { - 'view': True, - 'edit': True - }, - 'nodeId': 'vdbcr', - 'nodeUrl': '/vdbcr/', - 'nodeApiUrl': '/api/v1/project/vdbcr/', - 'accept': { - 'maxSize': 5120, - 'acceptedFiles': True - }, - 'waterbutlerURL': 'http://localhost:7777' - }, - 'selectedFileName': 'Cafe&LunchMenu.pdf', - 'nodeId': 'vdbcr', - 'viewUrl': '/project/vdbcr/files/osfstorage/5ea6ff395288ad0d931c17f5', - 'sha256': '2161a32cfe1cbbfbd73aa541fdcb8c407523a8828bfd7a031362e1763a74e8ad', - 'descriptionValue': '' - }] - } - } - assert metadata != self.draft.registration_metadata - payload = { - 'schema_data': metadata, - 'schema_name': 'Open-Ended Registration', - 'schema_version': 2 - } - url = self.node.api_url_for('update_draft_registration', draft_id=self.draft._id) - - res = self.app.put(url, json=payload, auth=self.user.auth) - assert res.status_code == http_status.HTTP_200_OK - - open_ended_schema = RegistrationSchema.objects.get(name='Open-Ended Registration', schema_version=2) - - self.draft.reload() - assert open_ended_schema == self.draft.registration_schema - assert metadata['uploader']['value'] == self.draft.registration_metadata['uploader']['value'] - assert metadata['uploader']['extra'][0]['selectedFileName'] == self.draft.registration_metadata['uploader']['extra'][0]['selectedFileName'] - - - def test_update_draft_registration_non_admin(self): - metadata = { - 'summary': { - 'value': 'updated', - 'comments': [] - } - } - assert metadata != self.draft.registration_metadata - payload = { - 'schema_data': metadata, - 'schema_name': 'OSF-Standard Pre-Data Collection Registration', - 'schema_version': 1 - } - url = self.node.api_url_for('update_draft_registration', draft_id=self.draft._id) - - res = self.app.put(url, json=payload, auth=self.non_admin.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - # group admin cannot update draft registration - res = self.app.put(url, json=payload, auth=self.group_mem.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - def test_delete_draft_registration(self): - assert 1 == DraftRegistration.objects.filter(deleted__isnull=True).count() - url = self.node.api_url_for('delete_draft_registration', draft_id=self.draft._id) - - res = self.app.delete(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_204_NO_CONTENT - assert 0 == DraftRegistration.objects.filter(deleted__isnull=True).count() - - def test_delete_draft_registration_non_admin(self): - assert 1 == DraftRegistration.objects.filter(deleted__isnull=True).count() - url = self.node.api_url_for('delete_draft_registration', draft_id=self.draft._id) - - res = self.app.delete(url, auth=self.non_admin.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - assert 1 == DraftRegistration.objects.filter(deleted__isnull=True).count() - - # group admin cannot delete draft registration - res = self.app.delete(url, auth=self.group_mem.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - @mock.patch('website.archiver.tasks.archive') - def test_delete_draft_registration_registered(self, mock_register_draft): - self.draft.register(auth=self.auth, save=True) - url = self.node.api_url_for('delete_draft_registration', draft_id=self.draft._id) - - res = self.app.delete(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - - @mock.patch('website.archiver.tasks.archive') - def test_delete_draft_registration_approved_and_registration_deleted(self, mock_register_draft): - self.draft.register(auth=self.auth, save=True) - self.draft.registered_node.is_deleted = True - self.draft.registered_node.save() - - assert 1 == DraftRegistration.objects.filter(deleted__isnull=True).count() - url = self.node.api_url_for('delete_draft_registration', draft_id=self.draft._id) - - res = self.app.delete(url, auth=self.user.auth) - assert res.status_code == http_status.HTTP_204_NO_CONTENT - assert 0 == DraftRegistration.objects.filter(deleted__isnull=True).count() - - def test_only_admin_can_delete_registration(self): - non_admin = AuthUserFactory() - assert 1 == DraftRegistration.objects.filter(deleted__isnull=True).count() - url = self.node.api_url_for('delete_draft_registration', draft_id=self.draft._id) - - res = self.app.delete(url, auth=non_admin.auth) - assert res.status_code == http_status.HTTP_403_FORBIDDEN - assert 1 == DraftRegistration.objects.filter(deleted__isnull=True).count() - - def test_get_metaschemas(self): - url = api_url_for('get_metaschemas') - res = self.app.get(url).json - assert len(res['meta_schemas']) == RegistrationSchema.objects.get_latest_versions().count() - - def test_get_metaschemas_all(self): - url = api_url_for('get_metaschemas', include='all') - res = self.app.get(url) - assert res.status_code == http_status.HTTP_200_OK - assert len(res.json['meta_schemas']) == RegistrationSchema.objects.filter(active=True).count() - - def test_validate_embargo_end_date_too_soon(self): - registration = RegistrationFactory(project=self.node) - today = dt.datetime.today().replace(tzinfo=pytz.utc) - too_soon = today + dt.timedelta(days=5) - with raises(HTTPError) as e: - draft_views.validate_embargo_end_date(too_soon.isoformat(), registration) - assert e.value.code == http_status.HTTP_400_BAD_REQUEST - - def test_validate_embargo_end_date_too_late(self): - registration = RegistrationFactory(project=self.node) - today = dt.datetime.today().replace(tzinfo=pytz.utc) - too_late = today + dt.timedelta(days=(4 * 365) + 1) - with raises(HTTPError) as e: - draft_views.validate_embargo_end_date(too_late.isoformat(), registration) - assert e.value.code == http_status.HTTP_400_BAD_REQUEST - - def test_validate_embargo_end_date_ok(self): - registration = RegistrationFactory(project=self.node) - today = dt.datetime.today().replace(tzinfo=pytz.utc) - too_late = today + dt.timedelta(days=12) - draft_views.validate_embargo_end_date(too_late.isoformat(), registration) - - - def test_check_draft_state_registered(self): - reg = RegistrationFactory() - self.draft.registered_node = reg - self.draft.save() - with raises(HTTPError) as e: - draft_views.check_draft_state(self.draft) - assert e.value.code == http_status.HTTP_403_FORBIDDEN - - def test_check_draft_state_registered_but_deleted(self): - reg = RegistrationFactory() - self.draft.registered_node = reg - reg.is_deleted = True - self.draft.save() - try: - draft_views.check_draft_state(self.draft) - except Exception as e: - self.fail(str(e)) - - def test_check_draft_state_ok(self): - try: - draft_views.check_draft_state(self.draft) - except Exception as e: - self.fail(str(e)) - - @pytest.mark.django_db class TestModeratorRegistrationViews: diff --git a/website/profile/views.py b/website/profile/views.py index c4306b92125..6af8f8e63d2 100644 --- a/website/profile/views.py +++ b/website/profile/views.py @@ -473,12 +473,6 @@ def collect_user_config_js(addon_configs): return js_modules -@must_be_logged_in -def user_choose_addons(**kwargs): - auth = kwargs['auth'] - json_data = escape_html(request.get_json()) - auth.user.config_addons(json_data, auth) - @must_be_logged_in def user_choose_mailing_lists(auth, **kwargs): """ Update mailing list subscription on user model and in mailchimp diff --git a/website/project/metadata/utils.py b/website/project/metadata/utils.py index e094da63753..2dc0ad77343 100644 --- a/website/project/metadata/utils.py +++ b/website/project/metadata/utils.py @@ -43,7 +43,6 @@ def serialize_draft_registration(draft, auth=None): 'before_register': node.api_url_for('project_before_register'), 'register': absolute_reverse('nodes:node-registrations', kwargs={'node_id': node._id, 'version': 'v2'}), 'register_page': node.web_url_for('draft_before_register_page', draft_id=draft._id, _guid=True), - 'registrations': node.web_url_for('node_registrations', _guid=True) }, } diff --git a/website/project/views/__init__.py b/website/project/views/__init__.py index 975a67e0205..3301035b4d0 100644 --- a/website/project/views/__init__.py +++ b/website/project/views/__init__.py @@ -1 +1 @@ -from . import contributor, node, register, tag, file, comment, drafts # noqa +from . import contributor, node, register, tag, file, comment # noqa diff --git a/website/project/views/drafts.py b/website/project/views/drafts.py deleted file mode 100644 index e4ee762c992..00000000000 --- a/website/project/views/drafts.py +++ /dev/null @@ -1,293 +0,0 @@ -import functools -from rest_framework import status as http_status -import itertools -import html - -from operator import itemgetter - -from dateutil.parser import parse as parse_date -from django.utils import timezone -from flask import request, redirect -import pytz - -from framework.database import autoload -from framework.exceptions import HTTPError - -from osf import features -from osf.utils.sanitize import strip_html -from osf.utils.permissions import ADMIN -from osf.utils.functional import rapply -from osf.models import RegistrationSchema, DraftRegistration - -from website.project.decorators import ( - must_be_valid_project, - must_be_contributor_and_not_group_member, - must_have_permission, -) -from website import settings -from website.ember_osf_web.decorators import ember_flag_is_active - -from website.project import utils -from website.project.metadata.schemas import METASCHEMA_ORDERING -from website.project.metadata.utils import serialize_meta_schema, serialize_draft_registration -from website.project.utils import serialize_node - -autoload_draft = functools.partial(autoload, DraftRegistration, 'draft_id', 'draft') - -def get_schema_or_fail(schema_name, schema_version): - try: - meta_schema = RegistrationSchema.objects.get(name=schema_name, schema_version=schema_version) - except RegistrationSchema.DoesNotExist: - raise HTTPError(http_status.HTTP_404_NOT_FOUND, data=dict( - message_long='No RegistrationSchema record matching that query could be found' - )) - return meta_schema - -def must_be_branched_from_node(func): - @autoload_draft - @must_be_valid_project - @functools.wraps(func) - def wrapper(*args, **kwargs): - node = kwargs['node'] - draft = kwargs['draft'] - if draft.deleted: - raise HTTPError(http_status.HTTP_410_GONE) - if not draft.branched_from._id == node._id: - raise HTTPError( - http_status.HTTP_400_BAD_REQUEST, - data={ - 'message_short': 'Not a draft of this node', - 'message_long': 'This draft registration is not created from the given node.' - } - ) - return func(*args, **kwargs) - return wrapper - -def validate_embargo_end_date(end_date_string, node): - """ - Our reviewers have a window of time in which to review a draft reg. submission. - If an embargo end_date that is within that window is at risk of causing - validation errors down the line if the draft is approved and registered. - - The draft registration approval window is always greater than the time span - for disallowed embargo end dates. - - :raises: HTTPError if end_date is less than the approval window or greater than the - max embargo end date - """ - end_date = parse_date(end_date_string, ignoretz=True).replace(tzinfo=pytz.utc) - today = timezone.now() - if (end_date - today) <= settings.DRAFT_REGISTRATION_APPROVAL_PERIOD: - raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data={ - 'message_short': 'Invalid embargo end date', - 'message_long': f'Embargo end date for this submission must be at least {settings.DRAFT_REGISTRATION_APPROVAL_PERIOD} days in the future.' - }) - elif not node._is_embargo_date_valid(end_date): - max_end_date = today + settings.DRAFT_REGISTRATION_APPROVAL_PERIOD - raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data={ - 'message_short': 'Invalid embargo end date', - 'message_long': f'Embargo end date must on or before {max_end_date.isoformat()}.' - }) - -def validate_registration_choice(registration_choice): - if registration_choice not in ('embargo', 'immediate'): - raise HTTPError( - http_status.HTTP_400_BAD_REQUEST, - data={ - 'message_short': "Invalid 'registrationChoice'", - 'message_long': "Values for 'registrationChoice' must be either 'embargo' or 'immediate'." - } - ) - -def check_draft_state(draft): - registered_and_deleted = draft.registered_node and draft.registered_node.is_deleted - if draft.registered_node and not registered_and_deleted: - raise HTTPError(http_status.HTTP_403_FORBIDDEN, data={ - 'message_short': 'This draft has already been registered', - 'message_long': 'This draft has already been registered and cannot be modified.' - }) - - -@must_have_permission(ADMIN) -@must_be_contributor_and_not_group_member -@must_be_branched_from_node -def draft_before_register_page(auth, node, draft, *args, **kwargs): - """Allow the user to select an embargo period and confirm registration - - :return: serialized Node + DraftRegistration - :rtype: dict - """ - ret = serialize_node(node, auth, primary=True) - - ret['draft'] = serialize_draft_registration(draft, auth) - return ret - - -@must_have_permission(ADMIN) -@must_be_branched_from_node -def get_draft_registration(auth, node, draft, *args, **kwargs): - """Return a single draft registration - - :return: serialized draft registration - :rtype: dict - """ - return serialize_draft_registration(draft, auth), http_status.HTTP_200_OK - -@must_have_permission(ADMIN) -@must_be_valid_project -def get_draft_registrations(auth, node, *args, **kwargs): - """List draft registrations for a node - - :return: serialized draft registrations - :rtype: dict - """ - #'updated': '2016-08-03T14:24:12Z' - count = request.args.get('count', 100) - drafts = itertools.islice(node.draft_registrations_active, 0, count) - serialized_drafts = [serialize_draft_registration(d, auth) for d in drafts] - sorted_serialized_drafts = sorted(serialized_drafts, key=itemgetter('updated'), reverse=True) - return { - 'drafts': sorted_serialized_drafts - }, http_status.HTTP_200_OK - -@must_have_permission(ADMIN) -@must_be_valid_project -@must_be_contributor_and_not_group_member -@ember_flag_is_active(features.EMBER_CREATE_DRAFT_REGISTRATION) -def new_draft_registration(auth, node, *args, **kwargs): - """Create a new draft registration for the node - - :return: Redirect to the new draft's edit page - :rtype: flask.redirect - :raises: HTTPError - """ - if node.is_registration: - raise HTTPError(http_status.HTTP_403_FORBIDDEN, data={ - 'message_short': "Can't create draft", - 'message_long': 'Creating draft registrations on registered projects is not allowed.' - }) - data = request.values - - schema_name = data.get('schema_name') - if not schema_name: - raise HTTPError( - http_status.HTTP_400_BAD_REQUEST, - data={ - 'message_short': 'Must specify a schema_name', - 'message_long': 'Please specify a schema_name' - } - ) - - schema_version = data.get('schema_version', 2) - - meta_schema = get_schema_or_fail(schema_name, int(schema_version)) - draft = DraftRegistration.create_from_node( - node=node, - user=auth.user, - schema=meta_schema, - data={} - ) - return redirect(node.web_url_for('edit_draft_registration_page', draft_id=draft._id, _guid=True)) - - -@must_have_permission(ADMIN) -@must_be_contributor_and_not_group_member -@ember_flag_is_active(features.EMBER_EDIT_DRAFT_REGISTRATION) -@must_be_branched_from_node -def edit_draft_registration_page(auth, node, draft, **kwargs): - """Draft registration editor - - :return: serialized DraftRegistration - :rtype: dict - """ - check_draft_state(draft) - ret = utils.serialize_node(node, auth, primary=True) - ret['draft'] = serialize_draft_registration(draft, auth) - return ret - -@must_have_permission(ADMIN) -@must_be_contributor_and_not_group_member -@must_be_branched_from_node -def update_draft_registration(auth, node, draft, *args, **kwargs): - """Update an existing draft registration - - :return: serialized draft registration - :rtype: dict - :raises: HTTPError - """ - check_draft_state(draft) - data = request.get_json() - - schema_data = data.get('schema_data', {}) - schema_data = rapply(schema_data, strip_html) - - # Unencodes HTML special characters in filenames - if schema_data.get('uploader', {}).get('value'): - schema_data['uploader']['value'] = html.unescape(schema_data['uploader']['value']) - if schema_data.get('uploader', {}).get('extra'): - for extra in schema_data['uploader']['extra']: - extra['selectedFileName'] = html.unescape(extra['selectedFileName']) - - schema_name = data.get('schema_name') - schema_version = data.get('schema_version', 1) - if schema_name: - meta_schema = get_schema_or_fail(schema_name, schema_version) - existing_schema = draft.registration_schema - if (existing_schema.name, existing_schema.schema_version) != (meta_schema.name, meta_schema.schema_version): - draft.registration_schema = meta_schema - - draft.update_metadata(schema_data) - draft.save() - return serialize_draft_registration(draft, auth), http_status.HTTP_200_OK - -@must_have_permission(ADMIN) -@must_be_contributor_and_not_group_member -@must_be_branched_from_node -def delete_draft_registration(auth, node, draft, *args, **kwargs): - """Permanently delete a draft registration - - :return: None - :rtype: NoneType - """ - if draft.registered_node and not draft.registered_node.is_deleted: - raise HTTPError( - http_status.HTTP_403_FORBIDDEN, - data={ - 'message_short': 'Can\'t delete draft', - 'message_long': 'This draft has already been registered and cannot be deleted.' - } - ) - draft.deleted = timezone.now() - draft.save(update_fields=['deleted']) - return None, http_status.HTTP_204_NO_CONTENT - - -def order_schemas(schema): - """ Schemas not specified in METASCHEMA_ORDERING get sent to the bottom of the list.""" - try: - return METASCHEMA_ORDERING.index(schema.name) - except ValueError: - return len(METASCHEMA_ORDERING) - - -def get_metaschemas(*args, **kwargs): - """ - List metaschemas with which a draft registration may be created. Only fetch the newest version for each schema. - - :return: serialized metaschemas - :rtype: dict - """ - count = request.args.get('count', 100) - include = request.args.get('include', 'latest') - - meta_schemas = RegistrationSchema.objects.filter(active=True) - if include == 'latest': - meta_schemas = RegistrationSchema.objects.get_latest_versions() - - meta_schemas = sorted(meta_schemas, key=order_schemas) - - return { - 'meta_schemas': [ - serialize_meta_schema(ms) for ms in meta_schemas[:count] - ] - }, http_status.HTTP_200_OK diff --git a/website/project/views/node.py b/website/project/views/node.py index 9bad3713d3b..45b7e75c495 100644 --- a/website/project/views/node.py +++ b/website/project/views/node.py @@ -405,12 +405,6 @@ def collect_node_config_js(addons): return js_modules -@must_have_permission(WRITE) -@must_not_be_registration -def node_choose_addons(auth, node, **kwargs): - node.config_addons(request.json, auth) - - @must_be_valid_project @must_not_be_retracted_registration @must_have_permission(READ) @@ -848,7 +842,6 @@ def _view_project(node, auth, primary=False, 'url': parent.url if parent else '', 'api_url': parent.api_url if parent else '', 'absolute_url': parent.absolute_url if parent else '', - 'registrations_url': parent.web_url_for('node_registrations', _guid=True) if parent else '', 'is_public': parent.is_public if parent else '', 'is_contributor_or_group_member': parent.is_contributor_or_group_member(user) if parent else '', 'is_contributor': parent.is_contributor(user) if parent else '', diff --git a/website/project/views/register.py b/website/project/views/register.py index 11a5da7f53c..797421ef46d 100644 --- a/website/project/views/register.py +++ b/website/project/views/register.py @@ -36,25 +36,6 @@ from .node import _view_project from api.waffle.utils import flag_is_active -@must_be_valid_project -@must_not_be_retracted_registration -@must_be_contributor_or_public -def node_register_page(auth, node, **kwargs): - """Display the registration metadata for a registration. - - :return: serialized Node - """ - - if node.is_registration: - return serialize_node(node, auth) - else: - status.push_status_message( - 'You have been redirected to the project\'s registrations page. From here you can initiate a new Draft Registration to complete the registration process', - trust=False, - id='redirected_to_registrations', - ) - return redirect(node.web_url_for('node_registrations', view='draft', _guid=True)) - @must_be_valid_project @must_have_permission(ADMIN) @must_be_contributor_and_not_group_member @@ -121,42 +102,6 @@ def node_registration_retraction_post(auth, node, **kwargs): return {'redirectUrl': node.web_url_for('view_project')} -@must_be_valid_project -@must_not_be_retracted_registration -@must_be_contributor_or_public -@ember_flag_is_active(features.EMBER_REGISTRATION_FORM_DETAIL) -def node_register_template_page(auth, node, metaschema_id, **kwargs): - if flag_is_active(request, features.EMBER_REGISTRIES_DETAIL_PAGE): - # Registration meta page obviated during redesign - return redirect(node.url) - if node.is_registration and bool(node.registered_schema): - try: - meta_schema = RegistrationSchema.objects.get(_id=metaschema_id) - except RegistrationSchema.DoesNotExist: - # backwards compatability for old urls, lookup by name - meta_schema = RegistrationSchema.objects.filter(name=_id_to_name(metaschema_id)).order_by('-schema_version').first() - if not meta_schema: - raise HTTPError(http_status.HTTP_404_NOT_FOUND, data={ - 'message_short': 'Invalid schema name', - 'message_long': 'No registration schema with that name could be found.' - }) - - ret = _view_project(node, auth, primary=True) - my_meta = serialize_meta_schema(meta_schema) - if has_anonymous_link(node, auth): - for indx, schema_page in enumerate(my_meta['schema']['pages']): - for idx, schema_question in enumerate(schema_page['questions']): - if schema_question['title'] in settings.ANONYMIZED_TITLES: - del my_meta['schema']['pages'][indx]['questions'][idx] - ret['node']['registered_schema'] = serialize_meta_schema(meta_schema) - return ret - else: - status.push_status_message( - 'You have been redirected to the project\'s registrations page. From here you can initiate a new Draft Registration to complete the registration process', - trust=False, - id='redirected_to_registrations', - ) - return redirect(node.web_url_for('node_registrations', view=kwargs.get('template'), _guid=True)) @must_be_valid_project # returns project @must_have_permission(ADMIN) diff --git a/website/routes.py b/website/routes.py index 227d68302e3..63abc462cb2 100644 --- a/website/routes.py +++ b/website/routes.py @@ -1242,96 +1242,6 @@ def make_url_map(app): notemplate, ), - # Registrations - Rule( - [ - '/project//register/', - '/project//node//register/', - ], - 'get', - project_views.register.node_register_page, - OsfWebRenderer('project/register.mako', trust=False) - ), - - Rule( - [ - '/project//register//', - '/project//node//register//', - ], - 'get', - project_views.register.node_register_template_page, - OsfWebRenderer('project/register.mako', trust=False) - ), - Rule( - [ - '/project//registrations/', - '/project//node//registrations/', - ], - 'get', - project_views.node.node_registrations, - notemplate, - ), - Rule( - [ - '/project//registrations/', - '/project//node//registrations/', - ], - 'post', - project_views.drafts.new_draft_registration, - OsfWebRenderer('project/edit_draft_registration.mako', trust=False)), - Rule( - [ - '/project//drafts//', - '/project//node//drafts//', - ], - 'get', - project_views.drafts.edit_draft_registration_page, - OsfWebRenderer('project/edit_draft_registration.mako', trust=False)), - Rule( - [ - '/project//drafts//register/', - '/project//node//drafts//register/', - ], - 'get', - project_views.drafts.draft_before_register_page, - OsfWebRenderer('project/register_draft.mako', trust=False)), - - Rule( - [ - '/project//retraction/', - '/project//node//retraction/', - ], - 'get', - project_views.register.node_registration_retraction_redirect, - notemplate, - ), - - Rule( - [ - '/project//withdraw/', - '/project//node//withdraw/', - ], - 'get', - project_views.register.node_registration_retraction_get, - OsfWebRenderer('project/retract_registration.mako', trust=False) - ), - - Rule( - '/ids///', - 'get', - project_views.register.get_referent_by_identifier, - notemplate, - ), - - Rule( - [ - '/project//analytics/', - '/project//node//analytics/', - ], - 'get', - project_views.node.project_statistics, - notemplate, - ), ### Files ### @@ -1520,33 +1430,6 @@ def make_url_map(app): json_renderer, ), - # Draft Registrations - Rule([ - '/project//drafts/', - ], 'get', project_views.drafts.get_draft_registrations, json_renderer), - Rule([ - '/project//drafts//', - ], 'get', project_views.drafts.get_draft_registration, json_renderer), - Rule([ - '/project//drafts//', - ], 'put', project_views.drafts.update_draft_registration, json_renderer), - Rule([ - '/project//drafts//', - ], 'delete', project_views.drafts.delete_draft_registration, json_renderer), - # Meta Schemas - Rule([ - '/project/drafts/schemas/', - ], 'get', project_views.drafts.get_metaschemas, json_renderer), - - Rule([ - '/project//get_contributors/', - '/project//node//get_contributors/', - ], 'get', project_views.contributor.get_contributors, json_renderer), - - Rule([ - '/project//get_contributors_from_parent/', - '/project//node//get_contributors_from_parent/', - ], 'get', project_views.contributor.get_contributors_from_parent, json_renderer), # Reorder contributors Rule( @@ -1723,13 +1606,6 @@ def make_url_map(app): project_views.register.registration_callbacks, json_renderer, ), - Rule( - '/settings/addons/', - 'post', - profile_views.user_choose_addons, - json_renderer, - ), - Rule( '/settings/notifications/', 'get', @@ -1778,16 +1654,6 @@ def make_url_map(app): json_renderer, ), - Rule( - [ - '/project//settings/addons/', - '/project//node//settings/addons/', - ], - 'post', - project_views.node.node_choose_addons, - json_renderer, - ), - Rule( [ '/project//settings/comments/', diff --git a/website/templates/project/register_draft.mako b/website/templates/project/register_draft.mako index 21dca55112d..cb2701dd7ab 100644 --- a/website/templates/project/register_draft.mako +++ b/website/templates/project/register_draft.mako @@ -26,9 +26,6 @@ Continue editing - - Back -