Example #1
0
 def create(self, validated_data):
     affiliations_serializer = TagSerializer(
         many=True, data=validated_data.pop('affiliations'))
     instance = super().create(validated_data)
     set_tags(instance, affiliations_serializer, 'affiliations')
     instance.save()
     return instance
Example #2
0
class MemberProfileListSerializer(serializers.ModelSerializer):
    date_joined = serializers.DateTimeField(source='user.date_joined',
                                            read_only=True,
                                            format='%c')
    username = serializers.CharField(source='user.username')
    profile_url = serializers.URLField(source='get_absolute_url',
                                       read_only=True)
    tags = TagSerializer(many=True)
    avatar = serializers.SerializerMethodField(
    )  # needed to materialize the FK relationship for wagtailimages
    bio = MarkdownField()
    research_interests = MarkdownField()

    def get_avatar(self, instance):
        request = self.context.get('request')
        if request and request.accepted_media_type != 'text/html':
            return instance.picture.get_rendition(
                'fill-150x150').url if instance.picture else None
        return instance.picture

    class Meta:
        model = MemberProfile
        fields = (
            'date_joined',
            'name',
            'profile_url',
            'tags',
            'username',
            'avatar',
            'bio',
            'research_interests',
            'full_member',
            'is_reviewer',
            'degrees',
        )
Example #3
0
    def update(self, instance, validated_data):
        raw_tags = TagSerializer(many=True, data=validated_data.pop('tags'))
        user = instance.user
        raw_user = validated_data.pop('user')
        user.first_name = raw_user['first_name']
        user.last_name = raw_user['last_name']
        user.save()

        new_email = self.initial_data['email']

        raw_institution = {
            'name': validated_data.pop('institution_name'),
            'url': validated_data.pop('institution_url')
        }
        institution = instance.institution
        if institution:
            institution.name = raw_institution.get('name')
            institution.url = raw_institution.get('url')
            institution.save()
        else:
            institution = Institution.objects.create(**raw_institution)
            instance.institution = institution

        # Full members cannot downgrade their status
        if instance.full_member:
            validated_data['full_member'] = True
        else:
            validated_data['full_member'] = bool(
                self.initial_data['full_member'])

        obj = super().update(instance, validated_data)
        self.save_tags(instance, raw_tags)
        self.save_email(user, new_email)
        return obj
Example #4
0
class ContributorSerializer(serializers.ModelSerializer):
    # Need an ID for Vue-Multiselect
    id = serializers.IntegerField(read_only=True)
    user = RelatedMemberProfileSerializer(required=False, allow_null=True)
    affiliations = TagSerializer(many=True)
    profile_url = serializers.SerializerMethodField()

    def get_existing_contributor(self, validated_data):
        user = validated_data.get('user')
        username = user.get('username') if user else None
        if username is not None:
            return User.objects.get(
                username=username), Contributor.objects.filter(
                    user__username=username).first()
        else:
            name = {
                'given_name': validated_data['given_name'],
                'family_name': validated_data['family_name']
            }
            return None, Contributor.objects.filter(**name).first()

    def save(self, **kwargs):
        if self.instance is None:
            validated_data = dict(
                list(self.validated_data.items()) + list(kwargs.items()))
            user, self.instance = self.get_existing_contributor(validated_data)
            if user:
                kwargs['user_id'] = user.id
        self.validated_data.pop('user')
        return super().save(**kwargs)

    def get_profile_url(self, instance):
        user = instance.user
        if user:
            return user.member_profile.get_absolute_url()
        else:
            return "{0}?{1}".format(reverse('home:profile-list'),
                                    urlencode({'query': instance.name}))

    def update(self, instance, validated_data):
        affiliations_serializer = TagSerializer(
            many=True, data=validated_data.pop('affiliations'))
        instance = super().update(instance, validated_data)
        set_tags(instance, affiliations_serializer, 'affiliations')
        instance.save()
        return instance

    def create(self, validated_data):
        affiliations_serializer = TagSerializer(
            many=True, data=validated_data.pop('affiliations'))
        instance = super().create(validated_data)
        set_tags(instance, affiliations_serializer, 'affiliations')
        instance.save()
        return instance

    class Meta:
        model = Contributor
        fields = ('id', 'given_name', 'middle_name', 'family_name', 'name',
                  'email', 'user', 'type', 'affiliations', 'profile_url')
Example #5
0
    def get_tags(self, obj):

        if hasattr(obj, 'donation_tags'):
            tag_list = []
            for lol in obj.donation_tags.all():
                tag_list.append(lol.tag)
            serializer = TagSerializer(tag_list, many=True)
            return serializer.data
Example #6
0
 def create(self, validated_data):
     serialized_tags = TagSerializer(many=True,
                                     data=validated_data.pop('tags'))
     codebase = Codebase(**validated_data)
     codebase.submitter = self.context['request'].user
     codebase.identifier = codebase.uuid
     set_tags(codebase, serialized_tags)
     codebase.save()
     return codebase
 def create(self, request, *args, **kwargs):
     """Overwrite create method"""
     name = request.data.get("name", None)
     if name:
         queryset = self.get_queryset()
         tag = queryset.filter(name=name).first()
         if tag:
             return response.Response(TagSerializer(tag).data)
     return super().create(request, *args, **kwargs)
Example #8
0
    def update(self, instance, validated_data):
        programming_languages = TagSerializer(
            many=True, data=validated_data.pop('programming_languages'))
        platform_tags = TagSerializer(many=True,
                                      data=validated_data.pop('platform_tags'))

        raw_license = validated_data.pop('license')
        existing_license = License.objects.get(name=raw_license['name'])

        set_tags(instance, programming_languages, 'programming_languages')
        set_tags(instance, platform_tags, 'platform_tags')

        instance = super().update(instance, validated_data)

        instance.license = existing_license
        instance.draft = False
        instance.save()

        return instance
    def test_retreive_tags(self):
        Tag.objects.create(tag_name=fake.name(), company=self.company)

        res = self.client.get(TAG_URL)

        tags = Tag.objects.all().order_by('-id')

        serializer = TagSerializer(tags, many=True)

        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(res.data, serializer.data)
Example #10
0
class PeerReviewReviewerSerializer(serializers.ModelSerializer):
    tags = TagSerializer(many=True)

    class Meta:
        model = MemberProfile
        fields = (
            'id',
            'avatar_url',
            'degrees',
            'name',
            'tags',
        )
class PostSerializer(PostBaseSerializer):
    images = ImageSerializer(many=True, read_only=True)
    categories = CategorySerializer(many=True, read_only=True)
    tags = TagSerializer(many=True, read_only=True)
    thumbnail = serializers.CharField(read_only=True)

    def create(self, validated_data):
        super().create(validated_data)

    class Meta:
        fields = "__all__"
        model = Post
Example #12
0
    def test_name_max_length_check_respected(self):
        too_long = Tag._meta.get_field('name').max_length + 1
        name_too_long = TagSerializer(data={'name': 'a'*too_long})
        self.assertFalse(name_too_long.is_valid())

        valid_name = TagSerializer(data={'name': 'fishing'})
        self.assertTrue(valid_name.is_valid())
Example #13
0
class RelatedCodebaseSerializer(serializers.ModelSerializer,
                                FeaturedImageMixin):
    """
    Sparse codebase serializer
    """
    all_contributors = ContributorSerializer(many=True, read_only=True)
    tags = TagSerializer(many=True)
    version_number = serializers.ReadOnlyField(
        source='latest_version.version_number')
    first_published_at = serializers.DateTimeField(
        read_only=True, format=DATE_PUBLISHED_FORMAT)
    last_published_on = serializers.DateTimeField(read_only=True,
                                                  format=DATE_PUBLISHED_FORMAT)
    summarized_description = serializers.CharField(read_only=True)
    live = serializers.SerializerMethodField()

    def get_live(self, instance):
        return instance.live

    def create(self, validated_data):
        return create(self.Meta.model, validated_data, self.context)

    def update(self, instance, validated_data):
        return update(super().update, instance, validated_data)

    class Meta:
        model = Codebase
        fields = (
            'all_contributors',
            'tags',
            'title',
            'first_published_at',
            'last_published_on',
            'identifier',
            'version_number',
            'featured_image',
            'summarized_description',
            'description',
            'live',
            'peer_reviewed',
            'repository_url',
        )
Example #14
0
class CodebaseSerializer(serializers.ModelSerializer, FeaturedImageMixin):
    absolute_url = serializers.URLField(source='get_absolute_url',
                                        read_only=True)
    all_contributors = ContributorSerializer(many=True, read_only=True)
    date_created = serializers.DateTimeField(
        read_only=True, default=serializers.CreateOnlyDefault(timezone.now))
    download_count = serializers.IntegerField(read_only=True)
    first_published_at = serializers.DateTimeField(
        format=DATE_PUBLISHED_FORMAT, read_only=True)
    last_published_on = serializers.DateTimeField(format=DATE_PUBLISHED_FORMAT,
                                                  read_only=True)
    latest_version_number = serializers.ReadOnlyField(
        source='latest_version.version_number')
    releases = serializers.SerializerMethodField()
    submitter = LinkedUserSerializer(read_only=True,
                                     default=serializers.CurrentUserDefault())
    summarized_description = serializers.CharField(read_only=True)
    identifier = serializers.ReadOnlyField()
    tags = TagSerializer(many=True)

    # FIXME: output should be raw markdown, not rendered
    description = MarkdownField()

    def get_releases(self, obj):
        request = self.context.get('request')
        user = request.user if request else User.get_anonymous()
        queryset = CodebaseRelease.objects.filter(
            codebase_id=obj.pk).accessible(user).order_by('-version_number')
        # queryset = obj.releases.order_by('-version_number')
        return RelatedCodebaseReleaseSerializer(queryset,
                                                read_only=True,
                                                many=True,
                                                context=self.context).data

    def create(self, validated_data):
        serialized_tags = TagSerializer(many=True,
                                        data=validated_data.pop('tags'))
        codebase = Codebase(**validated_data)
        codebase.submitter = self.context['request'].user
        codebase.identifier = codebase.uuid
        set_tags(codebase, serialized_tags)
        codebase.save()
        return codebase

    def update(self, instance, validated_data):
        validated_data['draft'] = False
        return update(super().update, instance, validated_data)

    class Meta:
        model = Codebase
        fields = (
            'absolute_url',
            'all_contributors',
            'date_created',
            'download_count',
            'featured_image',
            'repository_url',
            'first_published_at',
            'last_published_on',
            'latest_version_number',
            'releases',
            'submitter',
            'summarized_description',
            'tags',
            'description',
            'title',
            'doi',
            'identifier',
            'id',
            'references_text',
            'associated_publication_text',
            'replication_text',
            'peer_reviewed',
        )
Example #15
0
class MemberProfileSerializer(serializers.ModelSerializer):
    """
    FIXME: references library.Codebase, keeping in home for now to avoid circular dependencies in core
    """
    # User fields
    date_joined = serializers.DateTimeField(source='user.date_joined',
                                            read_only=True,
                                            format='%B %d %Y')
    family_name = serializers.CharField(source='user.last_name')
    given_name = serializers.CharField(source='user.first_name')
    username = serializers.CharField(source='user.username', read_only=True)
    user_pk = serializers.IntegerField(source='user.pk', read_only=True)
    email = serializers.SerializerMethodField()

    # Followers
    follower_count = serializers.ReadOnlyField(source='user.following.count')
    following_count = serializers.ReadOnlyField(source='user.followers.count')

    codebases = RelatedCodebaseSerializer(source='user.codebases',
                                          many=True,
                                          read_only=True)

    # Institution
    institution_name = serializers.CharField(allow_blank=True)
    institution_url = serializers.URLField(allow_blank=True)

    # MemberProfile
    avatar = serializers.SerializerMethodField(
    )  # needed to materialize the FK relationship for wagtailimages
    orcid_url = serializers.ReadOnlyField()
    github_url = serializers.ReadOnlyField()
    tags = TagSerializer(many=True)
    profile_url = serializers.URLField(source='get_absolute_url',
                                       read_only=True)
    bio = MarkdownField()
    research_interests = MarkdownField()

    def get_email(self, instance):
        request = self.context.get('request')
        if request and request.user.is_anonymous:
            return None
        else:
            return instance.email

    def get_avatar(self, instance):
        request = self.context.get('request')
        if request and request.accepted_media_type != 'text/html':
            return instance.picture.get_rendition(
                'fill-150x150').url if instance.picture else None
        return instance.picture

    def save_email(self, user, new_email):
        if user.email != new_email:
            try:
                validate_email(new_email)
                # Check if any user other the user currently being edited has an email account with the same address as the
                # new email
                users_with_email = MemberProfile.objects.find_users_with_email(
                    new_email, exclude_user=user)
                if users_with_email.exists():
                    logger.warning(
                        "Unable to register email %s, already owned by [%s]",
                        user.email, users_with_email)
                    raise DrfValidationError(
                        {'email': ["This email address is already taken."]})
            except ValidationError as e:
                raise DrfValidationError({'email': e.messages})

            sender = self.context.get('request')
            EmailAddress.objects.get(primary=True,
                                     user=user).change(sender,
                                                       new_email,
                                                       confirm=True)
            logger.warning(
                'email change for user [pk: %s] %s -> %s, awaiting confirmation.',
                user.id, user.email, new_email)

    @transaction.atomic
    def update(self, instance, validated_data):
        raw_tags = TagSerializer(many=True, data=validated_data.pop('tags'))
        user = instance.user
        raw_user = validated_data.pop('user')
        user.first_name = raw_user['first_name']
        user.last_name = raw_user['last_name']
        user.save()

        new_email = self.initial_data['email']

        raw_institution = {
            'name': validated_data.pop('institution_name'),
            'url': validated_data.pop('institution_url')
        }
        institution = instance.institution
        if institution:
            institution.name = raw_institution.get('name')
            institution.url = raw_institution.get('url')
            institution.save()
        else:
            institution = Institution.objects.create(**raw_institution)
            instance.institution = institution

        # Full members cannot downgrade their status
        if instance.full_member:
            validated_data['full_member'] = True
        else:
            validated_data['full_member'] = bool(
                self.initial_data['full_member'])

        obj = super().update(instance, validated_data)
        self.save_tags(instance, raw_tags)
        self.save_email(user, new_email)
        return obj

    @staticmethod
    def save_tags(instance, tags):
        if not tags.is_valid():
            raise serializers.ValidationError(tags.errors)
        db_tags = tags.save()
        instance.tags.clear()
        instance.tags.add(*db_tags)
        instance.save()

    class Meta:
        model = MemberProfile
        fields = (
            # User
            'date_joined',
            'family_name',
            'given_name',
            'profile_url',
            'username',
            'email',
            'user_pk',
            # Follower
            'follower_count',
            'following_count',
            'codebases',
            # institution
            'institution_name',
            'institution_url',
            # MemberProfile
            'avatar',
            'bio',
            'name',
            'degrees',
            'full_member',
            'tags',
            'orcid_url',
            'github_url',
            'personal_url',
            'is_reviewer',
            'professional_url',
            'profile_url',
            'research_interests',
            'name',
        )
Example #16
0
    def load_people_detail(self):
        """load all the residents and save to db"""
        file = os.path.join('./resources/', 'people.json')
        data = pd.read_json(file)

        # load tags
        tags = [{'name': x} for x in list(set(chain(*data.tags.values)))]
        self.to_db(TagSerializer(data=tags, many=True), 'Tag')

        # # load foods
        foods = [{
            'name': x
        } for x in list(set(chain(*data.favouriteFood.values)))]
        self.to_db(FoodSerializer(data=foods, many=True), 'Food')

        # load people
        json_data = self.read_json_file(file)
        for data in json_data:
            resident = People()
            resident._id = data['_id']
            resident.guid = data['guid']
            resident.index = data['index']
            resident.name = data['name']
            resident.age = data['age']
            resident.has_died = False if data['has_died'] == "false" or data[
                'has_died'] == False else True
            resident.balance = Decimal(data['balance'].strip('$').replace(
                ',', ''))
            resident.picture = data['picture']
            resident.eye_color = data['eyeColor']
            resident.gender = data['gender']
            resident.company = Company.objects.get(index=data['company_id'] -
                                                   1)
            resident.email = data['email']
            resident.phone = data['phone']
            resident.address = data['address']
            resident.about = data['about']
            resident.registered = dateutil.parser.parse(data['registered'])

            resident.save()

            tags = data.pop('tags') if 'tags' in data else None
            if tags:
                for value in tags:
                    resident.tags.add(Tag.objects.get(name=value))
                resident.save()

            favourite_foods = data.pop(
                'favouriteFood') if 'favouriteFood' in data else None
            if favourite_foods:
                for food in favourite_foods:
                    resident.favourite_foods.add(Food.objects.get(name=food))
                resident.save()

            friends = data.pop('friends') if 'friends' in data else None
            if friends:
                resident.friends = ','.join(
                    str(friend['index']) for friend in friends)
                resident.save()

        self.stdout.write(self.style.SUCCESS('load people success !'))
Example #17
0
class CodebaseReleaseSerializer(serializers.ModelSerializer):
    absolute_url = serializers.URLField(
        source='get_absolute_url',
        read_only=True,
        help_text=_('URL to the detail page of the codebase'))
    citation_text = serializers.ReadOnlyField()
    codebase = CodebaseSerializer(read_only=True)
    release_contributors = ReleaseContributorSerializer(
        read_only=True, source='index_ordered_release_contributors', many=True)
    date_created = serializers.DateTimeField(format=YMD_DATETIME_FORMAT,
                                             read_only=True)
    first_published_at = serializers.DateTimeField(
        format=DATE_PUBLISHED_FORMAT, read_only=True)
    last_published_on = serializers.DateTimeField(format=DATE_PUBLISHED_FORMAT,
                                                  read_only=True)
    license = LicenseSerializer()
    live = serializers.ReadOnlyField()
    os_display = serializers.ReadOnlyField(source='get_os_display')
    platforms = TagSerializer(many=True, source='platform_tags')
    programming_languages = TagSerializer(many=True)
    submitter = LinkedUserSerializer(read_only=True, label='Submitter')
    version_number = serializers.ReadOnlyField()
    release_notes = MarkdownField(max_length=2048)
    urls = serializers.SerializerMethodField()
    review_status = serializers.SerializerMethodField()

    def get_urls(self, instance):
        request_peer_review_url = instance.get_request_peer_review_url()
        review = instance.get_review()
        review_url = review.get_absolute_url() if review else None
        notify_reviewers_of_changes_url = instance.get_notify_reviewers_of_changes_url(
        ) if review else None
        return {
            'request_peer_review': request_peer_review_url,
            'review': review_url,
            'notify_reviewers_of_changes': notify_reviewers_of_changes_url
        }

    def get_review_status(self, instance):
        return instance.review.status if instance.get_review() else None

    class Meta:
        model = CodebaseRelease
        fields = (
            'absolute_url',
            'citation_text',
            'release_contributors',
            'date_created',
            'dependencies',
            'release_notes',
            'documentation',
            'doi',
            'download_count',
            'embargo_end_date',
            'first_published_at',
            'last_modified',
            'last_published_on',
            'license',
            'live',
            'os',
            'os_display',
            'peer_reviewed',
            'platforms',
            'programming_languages',
            'submitted_package',
            'submitter',
            'codebase',
            'review_status',
            'version_number',
            'id',
            'share_url',
            'urls',
        )