def update(self, instance, validated_data):
        assert isinstance(instance, OSFUser), 'instance must be a User'
        for attr, value in validated_data.items():
            if 'social' == attr:
                for key, val in value.items():
                    # currently only profileWebsites are a list, the rest of the social key only has one value
                    if key == 'profileWebsites':
                        instance.social[key] = val
                    else:
                        if len(val) > 1:
                            raise InvalidModelValueError(
                                detail=
                                '{} only accept a list of one single value'.
                                format(key))
                        instance.social[key] = val[0]
            else:
                setattr(instance, attr, value)
        try:
            instance.save()
        except ValidationValueError as e:
            raise InvalidModelValueError(detail=e.message)
        except ValidationError as e:
            raise InvalidModelValueError(e)

        return instance
Beispiel #2
0
    def update(self, node, validated_data):
        """Update instance with the validated data. Requires
        the request to be in the serializer context.
        """
        assert isinstance(node, AbstractNode), 'node must be a Node'
        auth = get_user_auth(self.context['request'])

        # Update tags
        if 'tags' in validated_data:
            new_tags = set(validated_data.pop('tags', []))
            node.update_tags(new_tags, auth=auth)

        if validated_data:

            if 'license_type' in validated_data or 'license' in validated_data:
                license_details = get_license_details(node, validated_data)
                validated_data['node_license'] = license_details

            try:
                node.update(validated_data, auth=auth)
            except ValidationError as e:
                raise InvalidModelValueError(detail=e.message)
            except PermissionsError:
                raise exceptions.PermissionDenied
            except NodeUpdateError as e:
                raise exceptions.ValidationError(detail=e.reason)
            except NodeStateError as e:
                raise InvalidModelValueError(detail=e.message)

        return node
Beispiel #3
0
    def update(self, instance, validated_data):
        assert isinstance(instance, OSFUser), 'instance must be a User'
        for attr, value in validated_data.items():
            if 'social' == attr:
                for key, val in value.items():
                    instance.social[key] = val
            elif 'accepted_terms_of_service' == attr:
                if value and not instance.accepted_terms_of_service:
                    instance.accepted_terms_of_service = timezone.now()
            elif 'region_id' == attr:
                region_id = validated_data.get('region_id')
                user_settings = instance._settings_model(
                    'osfstorage').objects.get(owner=instance)
                user_settings.default_region_id = region_id
                user_settings.save()
                instance.default_region = self.context['request'].data[
                    'default_region']
            else:
                setattr(instance, attr, value)
        try:
            instance.save()
        except ValidationValueError as e:
            raise InvalidModelValueError(detail=e.message)
        except ValidationError as e:
            raise InvalidModelValueError(e)

        return instance
Beispiel #4
0
    def update(self, node, validated_data):
        """Update instance with the validated data. Requires
        the request to be in the serializer context.
        """
        assert isinstance(node, Node), 'node must be a Node'
        auth = get_user_auth(self.context['request'])
        old_tags = set([tag._id for tag in node.tags])
        if 'tags' in validated_data:
            current_tags = set(validated_data.pop('tags', []))
        elif self.partial:
            current_tags = set(old_tags)
        else:
            current_tags = set()

        for new_tag in (current_tags - old_tags):
            node.add_tag(new_tag, auth=auth)
        for deleted_tag in (old_tags - current_tags):
            node.remove_tag(deleted_tag, auth=auth)

        if validated_data:
            try:
                node.update(validated_data, auth=auth)
            except ValidationValueError as e:
                raise InvalidModelValueError(detail=e.message)
            except PermissionsError:
                raise exceptions.PermissionDenied
            except NodeUpdateError as e:
                raise exceptions.ValidationError(detail=e.reason)
            except NodeStateError as e:
                raise InvalidModelValueError(detail=e.message)

        return node
Beispiel #5
0
    def update(self, instance, validated_data):
        assert isinstance(instance, OSFUser), 'instance must be a User'
        for attr, value in validated_data.items():
            if 'social' == attr:
                for key, val in value.items():
                    instance.social[key] = val
            elif 'accepted_terms_of_service' == attr:
                if value and not instance.accepted_terms_of_service:
                    instance.accepted_terms_of_service = timezone.now()
            elif 'region_id' == attr:
                region_id = validated_data.get('region_id')
                user_settings = instance._settings_model(
                    'osfstorage').objects.get(owner=instance)
                user_settings.default_region_id = region_id
                user_settings.save()
                instance.default_region = self.context['request'].data[
                    'default_region']
            else:
                setattr(instance, attr, value)
        try:
            instance.save()
        except ValidationValueError as e:
            raise InvalidModelValueError(detail=e.message)
        except ValidationError as e:
            raise InvalidModelValueError(e)
        if set(validated_data.keys()).intersection(
                set(OSFUser.SPAM_USER_PROFILE_FIELDS.keys())):
            request_headers = string_type_request_headers(
                self.context['request'])
            instance.check_spam(saved_fields=validated_data,
                                request_headers=request_headers)

        return instance
Beispiel #6
0
def validate_user_json(value, json_schema):
    try:
        jsonschema.validate(value, from_json(json_schema))
    except jsonschema.ValidationError as e:
        if len(e.path) > 1:
            raise InvalidModelValueError("For '{}' the field value {}".format(e.path[-1], e.message))
        raise InvalidModelValueError(e.message)
    except jsonschema.SchemaError as e:
        raise InvalidModelValueError(e.message)

    validate_dates(value)
Beispiel #7
0
 def update(self, collection, validated_data):
     """Update instance with the validated data.
     """
     assert isinstance(collection, Collection), 'collection must be a Collection'
     if validated_data:
         for key, value in validated_data.items():
             if key == 'title' and collection.is_bookmark_collection:
                 raise InvalidModelValueError('Bookmark collections cannot be renamed.')
             setattr(collection, key, value)
     try:
         collection.save()
     except ValidationError as e:
         raise InvalidModelValueError(detail=e.messages[0])
     return collection
Beispiel #8
0
 def get_target_type(self, obj):
     if not getattr(obj.referent, 'target_type', None):
         raise InvalidModelValueError(
             source={'pointer': '/data/relationships/target/links/related/meta/type'},
             detail='Invalid comment target type.',
         )
     return obj.referent.target_type
 def create(self, validated_data):
     subjects = validated_data.pop('subjects', None)
     collection = validated_data.pop('collection', None)
     creator = validated_data.pop('creator', None)
     guid = validated_data.pop('guid')
     if not collection:
         raise exceptions.ValidationError('"collection" must be specified.')
     if not creator:
         raise exceptions.ValidationError('"creator" must be specified.')
     if not (creator.has_perm('write_collection', collection) or
             (hasattr(guid.referent, 'has_permission')
              and guid.referent.has_permission(creator, WRITE))):
         raise exceptions.PermissionDenied(
             'Must have write permission on either collection or collected object to collect.'
         )
     try:
         obj = collection.collect_object(guid.referent, creator,
                                         **validated_data)
     except ValidationError as e:
         raise InvalidModelValueError(e.message)
     if subjects:
         auth = get_user_auth(self.context['request'])
         try:
             obj.set_subjects(subjects, auth)
         except PermissionsError as e:
             raise exceptions.PermissionDenied(detail=str(e))
         except (ValueError, NodeStateError) as e:
             raise exceptions.ValidationError(detail=str(e))
     return obj
    def create(self, validated_data):
        group = self.context['group']
        user = self.get_user_object(validated_data.get('_id', None), group)
        auth = Auth(self.context['request'].user)
        full_name = validated_data.get('full_name', None)
        email = validated_data.get('email', None)
        role = self.get_group_role(validated_data, MEMBER)

        try:
            if user:
                self.get_member_method(group, role)(user, auth)
            else:
                if not full_name or not email:
                    raise exceptions.ValidationError(
                        detail=
                        'You must provide a full_name/email combination to add an unconfirmed member.'
                    )
                else:
                    user = group.add_unregistered_member(
                        full_name, email, auth, role)
        except ValueError as e:
            raise exceptions.ValidationError(detail=str(e))
        except ValidationError as e:
            raise InvalidModelValueError(detail=list(e)[0])

        return user
    def update(self, draft, validated_data):
        draft = super(DraftRegistrationDetailSerializer, self).update(draft, validated_data)
        user = self.context['request'].user
        auth = get_user_auth(self.context['request'])

        if 'tags' in validated_data:
            new_tags = set(validated_data.pop('tags', []))
            draft.update_tags(new_tags, auth=auth)
        if 'license_type' in validated_data or 'license' in validated_data:
            license_details = get_license_details(draft, validated_data)
            validated_data['node_license'] = license_details
        if 'affiliated_institutions' in validated_data:
            institutions_list = validated_data.pop('affiliated_institutions')
            new_institutions = [{'_id': institution} for institution in institutions_list]
            update_institutions(draft, new_institutions, user)
        if 'subjects' in validated_data:
            subjects = validated_data.pop('subjects', None)
            self.update_subjects(draft, subjects, auth)
        try:
            draft.update(validated_data, auth=auth)
        except PermissionsError:
            raise exceptions.PermissionDenied
        except DraftRegistrationStateError as e:
            raise InvalidModelValueError(detail=str(e))

        return draft
Beispiel #12
0
    def update(self, node, validated_data):
        """Update instance with the validated data. Requires
        the request to be in the serializer context.
        """
        assert isinstance(node, Node), 'node must be a Node'
        auth = self.get_user_auth(self.context['request'])
        tags = validated_data.get('tags')
        if tags is not None:
            del validated_data['tags']
            current_tags = set(tags)
        else:
            current_tags = set()
        old_tags = set([tag._id for tag in node.tags])
        for new_tag in (current_tags - old_tags):
            node.add_tag(new_tag, auth=auth)
        for deleted_tag in (old_tags - current_tags):
            node.remove_tag(deleted_tag, auth=auth)

        if validated_data:
            try:
                node.update(validated_data, auth=auth)
            except ValidationValueError as e:
                raise InvalidModelValueError(detail=e.message)
            except PermissionsError:
                raise exceptions.PermissionDenied

        return node
Beispiel #13
0
 def create(self, validated_data):
     node = Node(**validated_data)
     try:
         node.save()
     except ValidationValueError as e:
         raise InvalidModelValueError(detail=e.message)
     return node
Beispiel #14
0
    def validate_social(self, value):
        schema = from_json('social-schema.json')
        try:
            jsonschema.validate(value, schema)
        except jsonschema.ValidationError as e:
            raise InvalidModelValueError(e)

        return value
Beispiel #15
0
 def create(self, validated_data):
     request = self.context['request']
     user = request.user
     collection = self.context['view'].get_collection()
     target_node_id = validated_data['_id']
     pointer_node = AbstractNode.load(target_node_id)
     if not pointer_node:
         raise InvalidModelValueError(
             source={'pointer': '/data/relationships/node_links/data/id'},
             detail='Target Node \'{}\' not found.'.format(target_node_id))
     try:
         pointer = collection.collect_object(pointer_node, user)
     except ValidationError:
         raise InvalidModelValueError(
             source={'pointer': '/data/relationships/node_links/data/id'},
             detail='Target Node \'{}\' already pointed to by \'{}\'.'.
             format(target_node_id, collection._id))
     return pointer
Beispiel #16
0
    def create(self, validated_data):
        Alert = apps.get_model('osf.DismissedAlert')
        alert = Alert(**validated_data)
        try:
            alert.save()
        except ValidationError as e:
            raise InvalidModelValueError(detail=e.messages[0])

        return alert
Beispiel #17
0
    def create(self, validated_data):
        request = self.context['request']
        user = request.user
        Node = apps.get_model('osf.Node')
        tag_instances = []
        if 'tags' in validated_data:
            tags = validated_data.pop('tags')
            for tag in tags:
                tag_instance, created = Tag.objects.get_or_create(
                    name=tag, defaults=dict(system=False))
                tag_instances.append(tag_instance)
        if 'template_from' in validated_data:
            template_from = validated_data.pop('template_from')
            template_node = Node.load(template_from)
            if template_node is None:
                raise exceptions.NotFound
            if not template_node.has_permission(
                    user, 'read', check_parent=False):
                raise exceptions.PermissionDenied

            validated_data.pop('creator')
            changed_data = {template_from: validated_data}
            node = template_node.use_as_template(auth=get_user_auth(request),
                                                 changes=changed_data)
        else:
            node = Node(**validated_data)
        try:
            node.save()
        except ValidationError as e:
            raise InvalidModelValueError(detail=e.messages[0])
        if len(tag_instances):
            for tag in tag_instances:
                node.tags.add(tag)
        if is_truthy(request.GET.get('inherit_contributors')
                     ) and validated_data['parent'].has_permission(
                         user, 'write'):
            auth = get_user_auth(request)
            parent = validated_data['parent']
            contributors = []
            for contributor in parent.contributor_set.exclude(user=user):
                contributors.append({
                    'user':
                    contributor.user,
                    'permissions':
                    parent.get_permissions(contributor.user),
                    'visible':
                    contributor.visible
                })
                if not contributor.user.is_registered:
                    node.add_unregistered_contributor(
                        fullname=contributor.user.fullname,
                        email=contributor.user.email,
                        auth=auth,
                        permissions=parent.get_permissions(contributor.user),
                        existing_user=contributor.user)
            node.add_contributors(contributors, auth=auth, log=True, save=True)
        return node
Beispiel #18
0
 def create(self, validated_data):
     node = Node(**validated_data)
     node.is_folder = True
     node.category = ''
     try:
         node.save()
     except ValidationValueError as e:
         raise InvalidModelValueError(detail=e.message)
     return node
Beispiel #19
0
 def get_target_type(self, obj):
     if isinstance(obj, Node):
         return 'nodes'
     elif isinstance(obj, Comment):
         return 'comments'
     else:
         raise InvalidModelValueError(
             source={'pointer': '/data/relationships/target/links/related/meta/type'},
             detail='Invalid comment target type.'
         )
Beispiel #20
0
 def create(self, validated_data):
     request = self.context['request']
     user = request.user
     auth = Auth(user)
     node = self.context['view'].get_node()
     target_node_id = validated_data['_id']
     pointer_node = Node.load(target_node_id)
     if not pointer_node or pointer_node.is_collection:
         raise InvalidModelValueError(
             source={'pointer': '/data/relationships/node_links/data/id'},
             detail='Target Node \'{}\' not found.'.format(target_node_id))
     try:
         pointer = node.add_pointer(pointer_node, auth, save=True)
         return pointer
     except ValueError:
         raise InvalidModelValueError(
             source={'pointer': '/data/relationships/node_links/data/id'},
             detail='Target Node \'{}\' already pointed to by \'{}\'.'.
             format(target_node_id, node._id))
Beispiel #21
0
    def update(self, instance, validated_data):
        assert isinstance(instance, OSFUser), 'instance must be a User'
        for attr, value in validated_data.items():
            if 'social' == attr:
                for key, val in value.items():
                    instance.social[key] = val
            elif 'accepted_terms_of_service' == attr:
                if value and not instance.accepted_terms_of_service:
                    instance.accepted_terms_of_service = timezone.now()
            else:
                setattr(instance, attr, value)
        try:
            instance.save()
        except ValidationValueError as e:
            raise InvalidModelValueError(detail=e.message)
        except ValidationError as e:
            raise InvalidModelValueError(e)

        return instance
Beispiel #22
0
 def create(self, validated_data):
     node = Collection(**validated_data)
     node.category = ''
     try:
         node.save()
     except ValidationError as e:
         raise InvalidModelValueError(detail=e.messages[0])
     except IntegrityError:
         raise ser.ValidationError('Each user cannot have more than one Bookmark collection.')
     return node
Beispiel #23
0
 def create(self, validated_data):
     node = Node(**validated_data)
     node.is_collection = True
     node.category = ''
     try:
         node.save()
     except ValidationValueError as e:
         raise InvalidModelValueError(detail=e.message)
     except NodeStateError:
         raise ser.ValidationError('Each user cannot have more than one Bookmark collection.')
     return node
Beispiel #24
0
    def create(self, validated_data):
        request = self.context['request']
        user = request.user
        if 'template_from' in validated_data:
            template_from = validated_data.pop('template_from')
            template_node = Node.load(key=template_from)
            if template_node is None:
                raise exceptions.NotFound
            if not template_node.has_permission(
                    user, 'read', check_parent=False):
                raise exceptions.PermissionDenied

            validated_data.pop('creator')
            changed_data = {template_from: validated_data}
            node = template_node.use_as_template(auth=get_user_auth(request),
                                                 changes=changed_data)
        else:
            node = Node(**validated_data)
        try:
            node.save()
        except ValidationValueError as e:
            raise InvalidModelValueError(detail=e.message)
        if is_truthy(request.GET.get('inherit_contributors')
                     ) and validated_data['parent'].has_permission(
                         user, 'write'):
            auth = get_user_auth(request)
            parent = validated_data['parent']
            contributors = []
            for contributor in parent.contributors:
                if contributor is not user:
                    contributors.append({
                        'user':
                        contributor,
                        'permissions':
                        parent.get_permissions(contributor),
                        'visible':
                        parent.get_visible(contributor)
                    })

                if not contributor.is_registered:
                    node.add_unregistered_contributor(
                        fullname=contributor.fullname,
                        email=contributor.email,
                        auth=auth,
                        permissions=parent.get_permissions(contributor),
                        existing_user=contributor)

                node.add_contributors(contributors,
                                      auth=auth,
                                      log=True,
                                      save=True)
        return node
Beispiel #25
0
def validate_dates(info):
    for history in info:

        if history.get('startYear'):
            startDate = datetime.date(history['startYear'], history.get('startMonth', 1), 1)

        if not history['ongoing']:
            if history.get('endYear'):
                endDate = datetime.date(history['endYear'], history.get('endMonth', 1), 1)

            if history.get('startYear') and history.get('endYear'):
                if (endDate - startDate).days <= 0:
                    raise InvalidModelValueError(detail='End date must be greater than or equal to the start date.')
Beispiel #26
0
    def create(self, validated_data):
        node = validated_data.pop('node')
        fork_title = validated_data.pop('title', None)
        request = self.context['request']
        auth = get_user_auth(request)
        fork = node.fork_node(auth, title=fork_title)

        try:
            fork.save()
        except ValidationValueError as e:
            raise InvalidModelValueError(detail=e.message)

        return fork
Beispiel #27
0
 def update(self, instance, validated_data):
     assert isinstance(instance, User), 'instance must be a User'
     for attr, value in validated_data.items():
         if 'social' == attr:
             for key, val in value.items():
                 instance.social[key] = val
         else:
             setattr(instance, attr, value)
     try:
         instance.save()
     except ValidationValueError as e:
         raise InvalidModelValueError(detail=e.message)
     return instance
Beispiel #28
0
    def update(self, node, validated_data):
        """Update instance with the validated data. Requires
        the request to be in the serializer context.
        """
        assert isinstance(node, AbstractNode), 'node must be a Node'
        auth = get_user_auth(self.context['request'])
        old_tags = set(node.tags.values_list('name', flat=True))
        if 'tags' in validated_data:
            current_tags = set(validated_data.pop('tags', []))
        elif self.partial:
            current_tags = set(old_tags)
        else:
            current_tags = set()

        for new_tag in (current_tags - old_tags):
            node.add_tag(new_tag, auth=auth)
        for deleted_tag in (old_tags - current_tags):
            node.remove_tag(deleted_tag, auth=auth)

        if validated_data:

            if 'license_type' in validated_data or 'license' in validated_data:
                license_details = get_license_details(node, validated_data)
                validated_data['node_license'] = license_details

            try:
                node.update(validated_data, auth=auth)
            except ValidationError as e:
                raise InvalidModelValueError(detail=e.message)
            except PermissionsError:
                raise exceptions.PermissionDenied
            except NodeUpdateError as e:
                raise exceptions.ValidationError(detail=e.reason)
            except NodeStateError as e:
                raise InvalidModelValueError(detail=e.message)

        return node
Beispiel #29
0
    def update(self, registration, validated_data):
        user = self.context['request'].user
        auth = Auth(user)
        self.check_perms(registration, user, validated_data)
        validated_data.pop('_id', None)

        if 'tags' in validated_data:
            self.update_registration_tags(registration, validated_data, auth)
        if 'custom_citation' in validated_data:
            registration.update_custom_citation(
                validated_data.pop('custom_citation'), auth)
        if 'license_type' in validated_data or 'license' in validated_data:
            license_details = get_license_details(registration, validated_data)
            validated_data['node_license'] = license_details
            validated_data.pop('license_type', None)
            validated_data.pop('license', None)
        if 'affiliated_institutions' in validated_data:
            institutions_list = validated_data.pop('affiliated_institutions')
            new_institutions = [{
                '_id': institution
            } for institution in institutions_list]
            update_institutions(registration, new_institutions, user)
            registration.save()
        if 'subjects' in validated_data:
            subjects = validated_data.pop('subjects', None)
            self.update_subjects(registration, subjects, auth)
        if 'withdrawal_justification' in validated_data or 'is_pending_retraction' in validated_data:
            self.retract_registration(registration, validated_data, user)
        if 'is_public' in validated_data:
            if validated_data.get('is_public') is False:
                raise exceptions.ValidationError(
                    'Registrations can only be turned from private to public.')
        if 'provider_specific_metadata' in validated_data:
            try:
                registration.update_provider_specific_metadata(
                    validated_data.pop('provider_specific_metadata'), )
            except ValueError as e:
                raise exceptions.ValidationError(str(e))

        try:
            registration.update(validated_data, auth=auth)
        except ValidationError as e:
            raise InvalidModelValueError(detail=e.messages[0])
        except NodeUpdateError as err:
            raise exceptions.ValidationError(err.reason)
        except NodeStateError as err:
            raise exceptions.ValidationError(str(err))

        return registration
Beispiel #30
0
 def validate_metadata(self, value):
     schema = from_json(self.instance.serializer.osf_schema)
     try:
         jsonschema.validate(value, schema)
     except jsonschema.ValidationError as e:
         if e.relative_schema_path[0] == 'additionalProperties':
             error_message = e.message
         else:
             error_message = 'Your response of {} for the field {} was invalid.'.format(
                 e.instance,
                 e.absolute_path[0],
             )
         raise InvalidModelValueError(detail=error_message,
                                      meta={'metadata_schema': schema})
     return value