Пример #1
0
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context['request']):
            return contributor_info

        contributor_ids = obj.get('contributors', None)
        params_node = obj.get('node', None)

        if contributor_ids:
            for contrib_id in contributor_ids:
                user = User.load(contrib_id)
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[params_node].get('name', None)

                contributor_info.append({
                    'id': contrib_id,
                    'full_name': user.fullname,
                    'given_name': user.given_name,
                    'middle_names': user.middle_names,
                    'family_name': user.family_name,
                    'unregistered_name': unregistered_name,
                    'active': user.is_active
                })
        return contributor_info
Пример #2
0
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context['request']):
            return contributor_info

        contributor_ids = obj.get('contributors', None)
        params_node = obj.get('node', None)

        if contributor_ids:
            users = (OSFUser.objects.filter(
                guids___id__in=contributor_ids).only(
                    'fullname', 'given_name', 'middle_names', 'family_name',
                    'unclaimed_records', 'is_active').order_by('fullname'))
            for user in users:
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[
                        params_node].get('name', None)

                contributor_info.append({
                    'id': user._id,
                    'full_name': user.fullname,
                    'given_name': user.given_name,
                    'middle_names': user.middle_names,
                    'family_name': user.family_name,
                    'unregistered_name': unregistered_name,
                    'active': user.is_active
                })
        return contributor_info
Пример #3
0
    def get_paginated_response(self, data):
        """
        Formats paginated response in accordance with JSON API.

        Creates pagination links from the view_name if embedded resource,
        rather than the location used in the request.
        """
        kwargs = self.request.parser_context['kwargs'].copy()
        embedded = kwargs.pop('is_embedded', None)
        view_name = self.request.parser_context['view'].view_fqn
        reversed_url = None
        if embedded:
            reversed_url = reverse(view_name, kwargs=kwargs)

        response_dict = OrderedDict([
            ('data', data),
            ('links', OrderedDict([
                ('first', self.get_first_real_link(reversed_url)),
                ('last', self.get_last_real_link(reversed_url)),
                ('prev', self.get_previous_real_link(reversed_url)),
                ('next', self.get_next_real_link(reversed_url)),
                ('meta', OrderedDict([
                    ('total', self.page.paginator.count),
                    ('per_page', self.page.paginator.per_page),
                ]))
            ])),
        ])
        if is_anonymized(self.request):
            response_dict['meta'] = {'anonymous': True}
        return Response(response_dict)
Пример #4
0
    def get_paginated_response(self, data):
        """
        Formats paginated response in accordance with JSON API, as of version 2.1.
        Version 2.0 uses the response_dict_deprecated function,
        which does not return JSON API compliant pagination links.

        Creates pagination links from the view_name if embedded resource,
        rather than the location used in the request.
        """
        kwargs = self.request.parser_context['kwargs'].copy()
        embedded = kwargs.pop('is_embedded', None)
        view_name = self.request.parser_context['view'].view_fqn
        reversed_url = None
        if embedded:
            reversed_url = reverse(view_name, kwargs=kwargs)

        if self.request.version < '2.1':
            response_dict = self.get_response_dict_deprecated(data, reversed_url)
        else:
            response_dict = self.get_response_dict(data, reversed_url)

        if is_anonymized(self.request):
            if response_dict.get('meta', False):
                response_dict['meta'].update({'anonymous': True})
            else:
                response_dict['meta'] = {'anonymous': True}
        return Response(response_dict)
Пример #5
0
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context['request']):
            return contributor_info

        contributor_ids = obj.get('contributors', None)
        params_node = obj.get('node', None)

        if contributor_ids:
            users = (
                OSFUser.objects.filter(guids___id__in=contributor_ids)
                .only('fullname', 'given_name',
                      'middle_names', 'family_name',
                      'unclaimed_records', 'is_active')
                .order_by('fullname')
            )
            for user in users:
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[params_node].get('name', None)

                contributor_info.append({
                    'id': user._id,
                    'full_name': user.fullname,
                    'given_name': user.given_name,
                    'middle_names': user.middle_names,
                    'family_name': user.family_name,
                    'unregistered_name': unregistered_name,
                    'active': user.is_active
                })
        return contributor_info
Пример #6
0
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context['request']):
            return contributor_info

        contributor_ids = obj.get('contributors', None)
        params_node = obj.get('node', None)

        if contributor_ids:
            for contrib_id in contributor_ids:
                user = User.load(contrib_id)
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[params_node].get('name', None)

                contributor_info.append({
                    'id': contrib_id,
                    'full_name': user.fullname,
                    'given_name': user.given_name,
                    'middle_names': user.middle_names,
                    'family_name': user.family_name,
                    'unregistered_name': unregistered_name,
                    'active': user.is_active
                })
        return contributor_info
Пример #7
0
    def get_paginated_response(self, data):
        """
        Formats paginated response in accordance with JSON API, as of version 2.1.
        Version 2.0 uses the response_dict_deprecated function,
        which does not return JSON API compliant pagination links.

        Creates pagination links from the view_name if embedded resource,
        rather than the location used in the request.
        """
        kwargs = self.request.parser_context['kwargs'].copy()
        embedded = kwargs.pop('is_embedded', None)
        view_name = self.request.parser_context['view'].view_fqn
        reversed_url = None
        if embedded:
            reversed_url = reverse(view_name, kwargs=kwargs)

        if self.request.version < '2.1':
            response_dict = self.get_response_dict_deprecated(
                data, reversed_url)
        else:
            response_dict = self.get_response_dict(data, reversed_url)

        if is_anonymized(self.request):
            if response_dict.get('meta', False):
                response_dict['meta'].update({'anonymous': True})
            else:
                response_dict['meta'] = {'anonymous': True}
        return Response(response_dict)
Пример #8
0
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context["request"]):
            return contributor_info

        contributor_ids = obj.get("contributors", None)
        params_node = obj.get("node", None)

        if contributor_ids:
            for contrib_id in contributor_ids:
                user = User.load(contrib_id)
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[params_node].get("name", None)

                contributor_info.append(
                    {
                        "id": contrib_id,
                        "full_name": user.fullname,
                        "given_name": user.given_name,
                        "middle_names": user.middle_names,
                        "family_name": user.family_name,
                        "unregistered_name": unregistered_name,
                        "active": user.is_active,
                    }
                )
        return contributor_info
Пример #9
0
    def get_paginated_response(self, data):
        """
        Formats paginated response in accordance with JSON API.

        Creates pagination links from the view_name if embedded resource,
        rather than the location used in the request.
        """
        kwargs = self.request.parser_context['kwargs'].copy()
        embedded = kwargs.pop('is_embedded', None)
        view_name = self.request.parser_context['view'].view_fqn
        reversed_url = None
        if embedded:
            reversed_url = reverse(view_name, kwargs=kwargs)

        response_dict = OrderedDict([
            ('data', data),
            ('links',
             OrderedDict([('first', self.get_first_real_link(reversed_url)),
                          ('last', self.get_last_real_link(reversed_url)),
                          ('prev', self.get_previous_real_link(reversed_url)),
                          ('next', self.get_next_real_link(reversed_url)),
                          ('meta',
                           OrderedDict([
                               ('total', self.page.paginator.count),
                               ('per_page', self.page.paginator.per_page),
                           ]))])),
        ])
        if is_anonymized(self.request):
            response_dict['meta'] = {'anonymous': True}
        return Response(response_dict)
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context['request']):
            return contributor_info

        contributor_data = obj.get('contributors', None)
        params_node = obj.get('node', None)

        if contributor_data:
            contributor_ids = [each for each in contributor_data if isinstance(each, basestring)]
            # Very old logs may contain contributror data with dictionaries for non-registered contributors,
            # e.g. {'nr_email': '*****@*****.**', 'nr_name': 'Foo Bar'}
            non_registered_contributor_data = [each for each in contributor_data if isinstance(each, dict)]

            users = (
                OSFUser.objects.filter(guids___id__in=contributor_ids)
                .only(
                    'fullname', 'given_name',
                    'middle_names', 'family_name',
                    'unclaimed_records', 'is_active',
                )
                .order_by('fullname')
            )
            for user in users:
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[params_node].get('name', None)

                contributor_info.append({
                    'id': user._id,
                    'full_name': user.fullname,
                    'given_name': user.given_name,
                    'middle_names': user.middle_names,
                    'family_name': user.family_name,
                    'unregistered_name': unregistered_name,
                    'active': user.is_active,
                })

            # Add unregistered contributor data
            for nr_contrib in non_registered_contributor_data:
                full_name = nr_contrib.get('nr_name', '')
                guessed_names = impute_names_model(full_name)
                contributor_info.append({
                    'id': None,
                    'full_name': full_name,
                    'unregistered_name': full_name,
                    'given_name': guessed_names['given_name'],
                    'middle_names': guessed_names['middle_names'],
                    'family_name': guessed_names['family_name'],
                    'active': False,
                })

        return contributor_info
Пример #11
0
    def get_contributors(self, obj):

        contributor_info = []

        if is_anonymized(self.context['request']):
            return contributor_info

        contributor_data = obj.get('contributors', None)
        params_node = obj.get('node', None)

        if contributor_data:
            contributor_ids = [each for each in contributor_data if isinstance(each, basestring)]
            # Very old logs may contain contributror data with dictionaries for non-registered contributors,
            # e.g. {'nr_email': '*****@*****.**', 'nr_name': 'Foo Bar'}
            non_registered_contributor_data = [each for each in contributor_data if isinstance(each, dict)]

            users = (
                OSFUser.objects.filter(guids___id__in=contributor_ids)
                .only(
                    'fullname', 'given_name',
                    'middle_names', 'family_name',
                    'unclaimed_records', 'is_active',
                )
                .order_by('fullname')
            )
            for user in users:
                unregistered_name = None
                if user.unclaimed_records.get(params_node):
                    unregistered_name = user.unclaimed_records[params_node].get('name', None)

                contributor_info.append({
                    'id': user._id,
                    'full_name': user.fullname,
                    'given_name': user.given_name,
                    'middle_names': user.middle_names,
                    'family_name': user.family_name,
                    'unregistered_name': unregistered_name,
                    'active': user.is_active,
                })

            # Add unregistered contributor data
            for nr_contrib in non_registered_contributor_data:
                full_name = nr_contrib.get('nr_name', '')
                guessed_names = impute_names_model(full_name)
                contributor_info.append({
                    'id': None,
                    'full_name': full_name,
                    'unregistered_name': full_name,
                    'given_name': guessed_names['given_name'],
                    'middle_names': guessed_names['middle_names'],
                    'family_name': guessed_names['family_name'],
                    'active': False,
                })

        return contributor_info
Пример #12
0
    def anonymize_fields(self, obj, data):
        """
        Consolidates logic to anonymize fields with contributor information
        on both registered_meta and registration_responses
        """
        if is_anonymized(self.context['request']):
            anonymous_registration_response_keys = obj.get_contributor_registration_response_keys()

            for key in anonymous_registration_response_keys:
                if key in data:
                    del data[key]

        return data
Пример #13
0
 def anonymize_registered_meta(self, obj):
     """
     Looks at every question on every page of the schema, for any titles
     matching ANONYMIZED_TITLES.  If present, deletes that question's response
     from meta_values.
     """
     meta_values = obj.registered_meta.values()[0]
     if is_anonymized(self.context['request']):
         registration_schema = RegistrationSchema.objects.get(
             _id=obj.registered_schema_id)
         for page in registration_schema.schema['pages']:
             for question in page['questions']:
                 if question[
                         'title'] in ANONYMIZED_TITLES and meta_values.get(
                             question.get('qid')):
                     del meta_values[question['qid']]
     return meta_values
Пример #14
0
    def get_paginated_response(self, data):
        """
        Formats paginated response in accordance with JSON API.

        Creates pagination links from the view_name if embedded resource,
        rather than the location used in the request.
        """
        kwargs = self.request.parser_context["kwargs"].copy()
        embedded = kwargs.pop("is_embedded", None)
        view_name = self.request.parser_context["view"].view_fqn
        reversed_url = None
        if embedded:
            reversed_url = reverse(view_name, kwargs=kwargs)

        response_dict = self.get_response_dict(data, reversed_url)

        if is_anonymized(self.request):
            if response_dict.get("meta", False):
                response_dict["meta"].update({"anonymous": True})
            else:
                response_dict["meta"] = {"anonymous": True}
        return Response(response_dict)