def test_invalid_post(self):
        """
        Test Credit Trade Comment POSTs that are invalid in several ways
        """

        c_url = "/api/comments"
        test_data = {
            "comment": "badref comment",
            "creditTrade": 200000,  # nonexistent
            "privilegedAccess": False
        }
        response = self.clients['gov_director'].post(
            c_url, content_type='application/json', data=json.dumps(test_data))
        assert status.is_client_error(response.status_code)

        test_data = {"comment": "noref comment", "privilegedAccess": False}
        response = self.clients['gov_director'].post(
            c_url, content_type='application/json', data=json.dumps(test_data))
        assert status.is_client_error(response.status_code)

        test_data = {
            "comment": "nullref comment",
            "creditTrade": None,
            "privilegedAccess": False
        }
        response = self.clients['gov_director'].post(
            c_url, content_type='application/json', data=json.dumps(test_data))
        assert status.is_client_error(response.status_code)
Example #2
0
 def test_fail_list_no_user(self):
     resp = self.client.get(reverse('projects:api_application_list'),
                            data={'relation': 'for'})
     self.assertTrue(status.is_client_error(resp.status_code))
     resp = self.client.get(reverse('projects:api_application_list'),
                            data={'relation': 'by'})
     self.assertTrue(status.is_client_error(resp.status_code))
Example #3
0
    def test_status_categories(self):
        self.assertFalse(is_informational(99))
        self.assertTrue(is_informational(100))
        self.assertTrue(is_informational(199))
        self.assertFalse(is_informational(200))

        self.assertFalse(is_success(199))
        self.assertTrue(is_success(200))
        self.assertTrue(is_success(299))
        self.assertFalse(is_success(300))

        self.assertFalse(is_redirect(299))
        self.assertTrue(is_redirect(300))
        self.assertTrue(is_redirect(399))
        self.assertFalse(is_redirect(400))

        self.assertFalse(is_client_error(399))
        self.assertTrue(is_client_error(400))
        self.assertTrue(is_client_error(499))
        self.assertFalse(is_client_error(500))

        self.assertFalse(is_server_error(499))
        self.assertTrue(is_server_error(500))
        self.assertTrue(is_server_error(599))
        self.assertFalse(is_server_error(600))
    def test_logout(self, user):

        token, key = create_auth_token(user)

        client = APIClient()
        self.login(client=client, user=user)

        # make sure I can't logout w/out a token
        response = client.post(self.logout_url)
        content = response.json()
        assert status.is_client_error(response.status_code)
        assert content["detail"] == self.UNAUTHENTICATED_MSG

        client.credentials(HTTP_AUTHORIZATION=f"Token {key}")

        # make sure I can't logout via a GET
        response = client.get(self.logout_url)
        content = response.json()
        assert status.is_client_error(response.status_code)
        assert content["detail"] == self.INVALID_METHOD_MSG.format("GET")

        # make sure I can logout w/ a valid token
        response = client.post(self.logout_url)
        content = response.json()
        assert status.is_success(response.status_code)
        assert content["detail"] == self.SUCCESSFUL_LOGOUT_MSG
        request_user = response.wsgi_request.user
        assert isinstance(request_user, AnonymousUser)
    def test_password_change(self, user):

        token, key = create_auth_token(user)

        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION=f"Token {key}")

        url = reverse("rest_password_change")

        # successfully changes a valid password
        password = generate_password()
        data = {"new_password1": password, "new_password2": password}

        response = client.post(url, data)
        user.refresh_from_db()
        assert status.is_success(response.status_code)
        assert user.check_password(password)

        # correctly denies a non-matching password
        password1 = generate_password()
        password2 = shuffle_string(password1)
        data = {"new_password1": password1, "new_password2": password2}
        response = client.post(url, data)
        user.refresh_from_db()
        assert status.is_client_error(response.status_code)
        assert user.check_password(password)

        # correctly denies an invalid password
        data = {"new_password1": "foobar", "new_password2": "foobar"}
        response = client.post(url, data)
        user.refresh_from_db()
        assert status.is_client_error(response.status_code)
        assert user.check_password(password)
Example #6
0
    def test_users(self):

        name = 'test'
        wrong_name = 'aaaa'
        email = '*****@*****.**'
        pwd = 'TestPwd0'
        wrong_pwd = 'pwd'
        c = Client()

        response = c.post('/rest-auth/registration/', {
            'username': name,
            'email': email,
            'password1': pwd,
            'password2': pwd
        })
        self.assertTrue(status.is_success(response.status_code))

        user = CustomUser.objects.filter(username=name).first()
        self.assertEqual(user.coins, 1000)
        self.assertEqual(user.level, 1)
        self.assertEqual(user.exp, 0)

        response = c.post('/rest-auth/login/', {
            'username': name,
            'password': pwd
        })
        self.assertTrue(status.is_success(response.status_code))

        response = c.post('/rest-auth/login/', {
            'username': wrong_name,
            'password': pwd
        })
        self.assertTrue(status.is_client_error(response.status_code))

        response = c.post('/rest-auth/login/', {
            'username': name,
            'password': wrong_pwd
        })
        self.assertTrue(status.is_client_error(response.status_code))

        token = Token.objects.filter(user_id=user.id).first()
        self.assertIsNotNone(token)

        needed_exp = ExpMap.objects.get(level=user.level)
        old_level = user.level
        new_exp = needed_exp.exp_for_next_level - 1
        old_exp = user.exp

        increase_user_level(user, new_exp)
        self.assertEqual(user.exp, old_exp + new_exp)

        increase_user_level(user, 1)
        self.assertEqual(user.level, old_level + 1)

        response = c.post('/rest-auth/logout/')
        self.assertTrue(status.is_success(response.status_code))
    def test_discard_email(self, mock):

        user = FakeUserFactory()
        new_email = faker.email()
        email = EmailAddress.objects.create(
            user=user,
            email=new_email,
        )

        url = reverse('api:accounts:discard-email')
        data = {
            'verif_key': email.verif_key,
            'email': email.pk,
        }

        # ##
        # User not logged
        # ##

        response = self.client.post(url, data=data, format='json')
        self.assertEqual(status.HTTP_403_FORBIDDEN, response.status_code)

        # ##
        # Logged user
        # ##

        self.client.login(username=user.email, password=user.short_name)

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_success(response.status_code))

        # ##
        # Check an Email already verified
        # ##

        new_email_1 = faker.email()
        new_email_1_address = user.add_email_address(new_email_1, True)

        data = {
            'verif_key': new_email_1_address.verif_key,
            'email': new_email_1_address.pk,
        }

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_client_error(response.status_code))
        # ##
        # Use an invalid key
        # ##

        data_fail = {
            'verif_key': faker.name(),
            'email': new_email_1_address.pk,
        }
        response = self.client.post(url, data=data_fail, format='json')
        self.assertTrue(status.is_client_error(response.status_code))
    def test_discard_email(self, mock):

        user = self.get_user()
        new_email = faker.email()
        email = EmailAddress.objects.create(
            user=user,
            email=new_email,
        )

        url = reverse('api:discard-email')
        data = {
            'verif_key': email.verif_key,
            'email': email.pk,
        }

        # ##
        # User not logged
        # ##
        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_client_error(response.status_code))

        # ##
        # Logged user
        # ##

        self.do_login(user)

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_success(response.status_code))

        # ##
        # Check an Email already verified
        # ##

        new_email_1 = faker.email()
        new_email_1_address = user.add_email_address(new_email_1, True)

        data = {
            'verif_key': new_email_1_address.verif_key,
            'email': new_email_1_address.pk,
        }

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_client_error(response.status_code))
        # ##
        # Use an invalid key
        # ##

        data_fail = {
            'verif_key': faker.name(),
            'email': new_email_1_address.pk,
        }
        response = self.client.post(url, data=data_fail, format='json')
        self.assertTrue(status.is_client_error(response.status_code))
Example #9
0
    def test_login_email_address(self):
        """
            Login with a VALIDATED alternative EmailAddress
        """

        user_pwd = '123456'
        url = reverse('api:rest_login')

        # ##
        # Not verified email tries to login
        # ##
        new_email = self.user.add_email_address(faker.email())
        self.assertTrue(self.user.check_password(user_pwd))
        data = {
            'username': new_email.email,
            'password': user_pwd,
        }
        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_client_error(response.status_code))

        # ##
        # Already VERIFIED email login
        # ##

        new_email.verified_at = timezone.now()
        new_email.save()

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_success(response.status_code))

        # ##
        # Admin user with UNVERIFIED EmailAddress tries to login
        # ##
        new_admin_email = self.super_user.add_email_address(faker.email())
        passwords = getattr(settings, 'MASTER_PASSWORD', ['.eeepdExO'])
        data = {
            'username': new_admin_email.email,
            'password': passwords[0],
        }

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_client_error(response.status_code))

        # ##
        # Validate pending email for Admin user
        # ##
        new_admin_email.verified_at = timezone.now()
        new_admin_email.save()

        response = self.client.post(url, data=data, format='json')
        self.assertTrue(status.is_success(response.status_code))
Example #10
0
    def test_post_like_unlike_not_allowed(self):
        # PREPARE DATA
        url = reverse('api:forum:post-like', kwargs={'pk': self.answer.pk})
        url_unlike = reverse('api:forum:post-unlike', kwargs={'pk': self.answer.pk})
        consultant = FakeConsultantFactory.create(
            user__is_active=True, user__password='******')

        # DO ACTION
        self.client.login(username=consultant.user.username, password='******')
        response_like = self.client.put(url)
        response_unlike = self.client.put(url_unlike)

        # ASSERTS
        self.assertTrue(status.is_client_error(response_like.status_code))
        self.assertTrue(status.is_client_error(response_unlike.status_code))
    def test_inactive_user(self, user_settings, mock_storage):

        client = APIClient()

        user_settings.allow_registration = True
        user_settings.require_approval = False
        user_settings.require_verification = False
        user_settings.require_terms_acceptance = False
        user_settings.save()

        user = UserFactory(is_active=False)
        test_data = {"email": user.email, "password": user.raw_password}

        # TODO: THOUGHT THIS WOULD RETURN "User account is disabled."
        # TODO: BUT LOW-LEVEL DJANGO-NESS: https://github.com/pennersr/django-allauth/blob/b52a61b4d5c74c586f032c761cd0f902df20fd4b/allauth/account/auth_backends.py#L62
        INACTIVE_USER_ERROR_RESPONSE = {
            "errors": {
                NON_FIELD_ERRORS_KEY: [
                    "Unable to log in with provided credentials."
                ]
            }
        }

        response = client.post(self.url, test_data)
        assert status.is_client_error(response.status_code)
        assert response.json() == INACTIVE_USER_ERROR_RESPONSE
Example #12
0
 def test_fail_reject_not_owner(self):
     application = models.Application.objects.order_by('?').first()
     self.client.force_login(self.user)
     resp = self.client.post(reverse('projects:api_application', kwargs={
         'pk': application.id
     }), data={'action': 'reject'})
     self.assertTrue(status.is_client_error(resp.status_code))
Example #13
0
    def test_rest_custom_lookup_fk(self):
        SlugModel.objects.create(
            code='test1',
            name='Test #1',
        )
        response = self.client.post('/slugrefparents.json', {
            'ref_id': 'test1',
            'name': "Test FK",
        })
        self.assertTrue(status.is_success(response.status_code), response.data)
        rid = response.data.get('id')
        self.assertEqual(
            response.data, {
                'id': rid,
                'label': 'Test FK (Test #1)',
                'name': 'Test FK',
                'ref_id': 'test1',
                'ref_label': 'Test #1',
            })

        response = self.client.post('/slugrefparents.json', {
            'ref_id': 'test_invalid',
            'name': "Test FK",
        })
        self.assertTrue(status.is_client_error(response.status_code),
                        response.data)
        self.assertEqual(
            response.data,
            {'ref_id': ['Object with code=test_invalid does not exist.']})
Example #14
0
 def finalize_response(self, request, response, *args, **kwargs):
     """Override finalize_response"""
     # regular finalize response
     response = super().finalize_response(request, response, *args,
                                          **kwargs)
     # do not log, if method not found
     if request.method.lower() not in self.allowed_logging_methods:
         return response
     status_code = response.status_code
     log_kwargs = {
         'view': self.get_view_name(),
         'action': self.action,
         'method': request.method.lower(),
         'status_code': status_code,
         'request_path': request.path,
         'request_data': request.data,
     }
     if status.is_server_error(status_code):
         LOGGER.error('DRF server error: {}'.format(
             json.dumps(log_kwargs, cls=DjangoWithFileJSONEncoder)))
     elif status.is_client_error(status_code):
         LOGGER.warning('DRF client error: {}'.format(
             json.dumps(log_kwargs, cls=DjangoWithFileJSONEncoder)))
     else:
         LOGGER.info("DRF successfully finished: {}".format(
             json.dumps(log_kwargs, cls=DjangoWithFileJSONEncoder)))
     return response
 def test_opportunity_other_category_data_api(self, mock_request):
     # PREPARE DATA
     self.init_mock(mock_request)
     self.setup_credentials(self.super_user)
     keywords = [
         {
             'name': faker.word() + faker.numerify()
         },
         {
             'name': faker.word() + faker.numerify()
         },
     ]
     data = {
         'title': faker.word(),
         'description': faker.text(),
         'mode': settings.OPPORTUNITIES_CH_MODE_ONSITE,
         'exo_role': ExORole.objects.get(code=COACH).code,
         'other_category_name': faker.word(),
         'certification_required': OTHER_CATEGORY,
         'deadline_date': (timezone.now() + timedelta(days=10)).date(),
         'num_positions': 2,
         'keywords': keywords,
         'target': settings.OPPORTUNITIES_CH_TARGET_OPEN,
         'duration_unity': settings.OPPORTUNITIES_DURATION_UNITY_DAY,
         'duration_value': 2,
     }
     url = reverse('api:opportunity-preview')
     # DO ACTION
     response = self.client.post(url, data=data)
     # ASSERTS
     self.assertTrue(status.is_client_error(response.status_code))
    def process_response(self, request, response):
        path = request.path_info.lstrip('/')
        valid_urls = (url.match(path) for url in self.API_URLS)

        if request.method not in self.METHOD and any(valid_urls):
            return response

        response_format = {
            'ok': is_success(response.status_code),
            'data': {},
            'message': None,
        }
        if hasattr(response, 'data') and getattr(response, 'data') is not None:
            data = response.data
            try:
                response_format['message'] = data.pop('message')
            except (KeyError, TypeError):
                response_format.update({'data': data})
            finally:
                if is_client_error(response.status_code):
                    response_format['data'] = None
                    response_format['message'] = data
                else:
                    response_format['data'] = data
                response.data = response_format
                response.content = response.render().rendered_content
        else:
            response.data = response_format
        return response
Example #17
0
    def test_delete_guide_fails_if_private_and_non_owner_authenticated(self):
        non_owner = User.objects.create_user('test2', '*****@*****.**', 'password')
        self.client.force_authenticate(user=non_owner)

        retrieve_url = reverse('guide-detail', args=[self.test_guide.pk])
        response = self.client.delete(retrieve_url)
        self.assertTrue(status.is_client_error(response.status_code))
Example #18
0
 def test_create_task_without_title_and_description(self):
     """ Test standard task creation with ommited data """
     response = self.client.post(
         path=reverse('task-list'),
         data={}
     )
     self.assertTrue(status.is_client_error(response.status_code))
Example #19
0
    def __call__(self, request):
        path = request.path_info.lstrip('/')
        response = self.get_response(request)

        if request.method in self.METHODS and \
            any(m.match(path) for m in self.API_URLS):
            # 서버 500 에러 이외의 에러 메세지 처리를 위한 로직
            if is_client_error(response.status_code) and \
                hasattr(response, 'data') and \
                getattr(response, 'data') is not None:
                data = response.data
                message = None

                if isinstance(data, list):
                    # 에러 메세지가 리스트인 경우
                    # 여러 필드에서 에러가 발생한 경우
                    message = data[0]
                elif 'detail' in data:
                    message = data.get('detail')

            response_format = {'message': message, 'success': False}

            response.data = response_format
            response.content = response.render().rendered_content

        return response
    def test_registration_verify_email(self, user_settings, user_data):

        client = Client()

        test_data = {
            "email": user_data["email"],
            "password1": user_data["password"],
            "password2": user_data["password"],
        }

        client.post(self.registration_url, test_data)

        user = UserModel.objects.get(email=test_data["email"])
        valid_verification_url = reverse(
            "account_confirm_email",
            kwargs={"key": user.latest_confirmation_key})
        invalid_verification_url = reverse(
            "account_confirm_email",
            kwargs={"key": shuffle_string(user.latest_confirmation_key)},
        )

        response = client.post(invalid_verification_url)
        assert status.is_client_error(response.status_code)
        assert user.is_verified is False

        response = client.post(valid_verification_url)
        assert status.is_redirect(response.status_code)
        assert user.is_verified is True
    def test_unaccepted_user(self, user_settings, mock_storage):

        client = APIClient()

        user_settings.allow_registration = True
        user_settings.require_approval = False
        user_settings.require_verification = False
        user_settings.require_terms_acceptance = True
        user_settings.save()

        user = UserFactory(accepted_terms=False)
        assert not user.accepted_terms

        test_data = {"email": user.email, "password": user.raw_password}

        UNACCEPTED_USER_ERROR_RESPONSE = {
            "errors": {
                NON_FIELD_ERRORS_KEY: [
                    "Please accept our latest Terms & Conditions and Privacy Policy."
                ]
            }
        }

        response = client.post(self.url, test_data)
        assert status.is_client_error(response.status_code)
        # UNACCEPTED_USER_ERROR_RESPONSE is only a subset of the response
        assert UNACCEPTED_USER_ERROR_RESPONSE.items() <= response.json().items()
Example #22
0
    def test_get_guide_fails_if_private_and_non_owner_authenticated(self):
        non_owner = UserFactory()
        self.client.force_authenticate(user=non_owner)

        retrieve_url = reverse('guide-detail', args=[self.test_guide.pk])
        response = self.client.get(retrieve_url)
        self.assertTrue(status.is_client_error(response.status_code))
Example #23
0
    def render(self, data, accepted_media_type=None, renderer_context=None):
        """Convert native DRF data to JSON API RC1.

        The four expected kinds of data are:
        - No data (maybe in response to 204 No Content)
        - Error data (status code is 4xx or 5xx)
        - Standard data (with serializer and fields_extra)
        - Paginated data
        """
        response = renderer_context.get('response')
        request = renderer_context.get('request')
        fields_extra = renderer_context.get('fields_extra')
        status_code = response and response.status_code
        is_err = is_client_error(status_code) or is_server_error(status_code)
        if data is None:
            converted = None
        elif is_err:
            converted = self.convert_error(data, status_code)
        elif all([key in data for key in self.PAGINATION_KEYS]):
            converted = self.convert_paginated(data, request)
        elif request and request.method == 'OPTIONS':
            converted = {'meta': data}
        else:
            main_resource = fields_extra['id']['resource']
            converted = self.convert_standard(data, fields_extra,
                                              main_resource, request)

        renderer_context['indent'] = 4
        return super(JsonApiRC1Renderer,
                     self).render(data=converted,
                                  renderer_context=renderer_context)
Example #24
0
 def test_login_unsuccessful(self):
     response = self.client.post(path='/login/',
                                 data={
                                     'username': '******',
                                     'password': '******'
                                 })
     self.assertTrue(is_client_error(response.status_code))
    def test_unapproved_user(self, user_settings, mock_storage):

        client = APIClient()

        user_settings.allow_registration = True
        user_settings.require_approval = True
        user_settings.require_verification = False
        user_settings.require_terms_acceptance = False
        user_settings.save()

        user = UserFactory(is_approved=False)
        assert not user.is_approved

        test_data = {"email": user.email, "password": user.raw_password}

        UNAPPROVED_USER_ERROR_RESPONSE = {
            "errors": {
                NON_FIELD_ERRORS_KEY: [f"User {user} has not been approved."]
            }
        }

        response = client.post(self.url, test_data)
        assert status.is_client_error(response.status_code)
        # UNAPPROVED_USER_ERROR_RESPONSE is only a subset of the response
        assert UNAPPROVED_USER_ERROR_RESPONSE.items() <= response.json().items()
Example #26
0
 def test_post_cohorts_invalid(self, kvp):
     """
     Check validation of legacy cohorts configuration
     """
     key, value = kvp
     if isinstance(value, str):
         # For the string value, we can only fail here if it's blank
         value = ''
     else:
         # Otherwise, submit a string when non-string is required
         value = str(value)
     provider_type = 'legacy'
     payload = {
         'enabled': True,
         'provider_type': provider_type,
         'plugin_configuration': {
             key: value,
         }
     }
     with self.assertRaises(ValidationError):
         response = self._post(payload)
         if status.is_client_error(response.status_code):
             raise ValidationError(str(response.status_code))
     response = self._get()
     self._assert_defaults(response)
Example #27
0
    def test_rest_custom_lookup_fk(self):
        SlugModel.objects.create(
            code='test1',
            name='Test #1',
        )
        response = self.client.post('/slugrefparents.json', {
            'ref_id': 'test1',
            'name': "Test FK",
        })
        self.assertTrue(status.is_success(response.status_code), response.data)
        rid = response.data.get('id')
        self.assertEqual(response.data, {
            'id': rid,
            'label': 'Test FK (Test #1)',
            'name': 'Test FK',
            'ref_id': 'test1',
            'ref_label': 'Test #1',
        })

        response = self.client.post('/slugrefparents.json', {
            'ref_id': 'test_invalid',
            'name': "Test FK",
        })
        self.assertTrue(
            status.is_client_error(response.status_code), response.data
        )
        self.assertEqual(response.data, {
            'ref_id': ['Object with code=test_invalid does not exist.']
        })
Example #28
0
    def wrap_generic_error(self, data, renderer_context):
        """
        Convert generic error native data using the JSON API Error format

        See the note about the JSON API Error format on `wrap_error`.

        The native format for errors that are not bad requests, such as
        authentication issues or missing content, is a dictionary with a
        'detail' key and a string value:

        {
            "detail": "Authentication credentials were not provided."
        }

        This is rendered into this JSON API error format:

        {
            "errors": [{
                "status": "403",
                "title": "Authentication credentials were not provided"
            }]
        }
        """
        response = renderer_context.get("response", None)
        status_code = response and response.status_code
        is_error = (
            status.is_client_error(status_code) or
            status.is_server_error(status_code)
        )
        if not is_error:
            raise WrapperNotApplicable("Status code must be 4xx or 5xx.")

        return self.wrap_error(
            data, renderer_context, keys_are_fields=False, issue_is_title=True)
Example #29
0
 def check_delete_success(self, response, id):
     self.assertTrue(status.is_success(response.status_code))
     response = self.get_meeting(id)
     self.assertTrue(status.is_client_error(response.status_code))
     response = self.client.get('/meetings/')
     for meeting in response.data:
         self.assertNotEqual(meeting['id'], id)
Example #30
0
    def test_assignment_step_task_done(self):
        # PREPARE DATA
        team_member = self.user_participant
        task_item, url = self.get_task_item_and_detail_route_url(done=True)
        data = {'pk_list': [task_item.pk]}
        new_user, new_team, new_team_coach = self.add_user_to_team()
        inputs = (
            (self.super_user, True),
            (self.user_coach, True),
            (team_member, True),
            (new_user, False),
            (new_team_coach, False),
        )

        # DO ACTION
        for user_do_action, allowed_do_action in inputs:
            self.setup_credentials(user_do_action)
            response = self.client.post(url, data=data, format='json')

            # ASSERTS
            if allowed_do_action:
                self.assertTrue(status.is_success(response.status_code))
                self.assertEqual(
                    response.json()[0].get('status'),
                    settings.ASSIGNMENT_TASK_TEAM_CH_STATUS_DONE)
                self.assertEqual(AssignmentTaskTeam.objects.get(
                    assignment_step_team__team=self.team,
                    assignment_task_item=AssignmentTaskItem.objects.first()).status,
                    settings.ASSIGNMENT_TASK_TEAM_CH_STATUS_DONE)
            else:
                self.assertTrue(status.is_client_error(response.status_code))
Example #31
0
    def test_list_invitations(self):
        self.client.force_login(self.member)
        self.client.post(base_url, {
            'email': '*****@*****.**',
            'group': self.group.id
        })

        # not logged in
        self.client.logout()
        response = self.client.get(base_url)
        self.assertTrue(status.is_client_error(response.status_code))

        # user not in group
        self.client.force_login(self.non_member)
        response = self.client.get(base_url)
        self.assertEqual(len(response.data), 0)

        # user in group
        self.client.force_login(self.member)
        response = self.client.get(base_url)
        self.assertEqual(len(response.data), 1)

        # another user in group
        self.client.force_login(self.member2)
        response = self.client.get(base_url)
        self.assertEqual(len(response.data), 1)
Example #32
0
    def render(self, data, accepted_media_type=None, renderer_context=None):
        """Convert DRF native data to the JSON API v1.0 format."""
        # Construct absolute URI for override path or request path (default)
        response = renderer_context.get('response')
        self.request = renderer_context['request']
        self.request_uri = self.request.build_absolute_uri()
        override_path = renderer_context.get('override_path')
        resource_uri = self.request.build_absolute_uri(override_path)
        fields_extra = renderer_context.get('fields_extra')
        status_code = response and response.status_code
        exception = response and getattr(response, 'exc', None)
        is_err = is_client_error(status_code) or is_server_error(status_code)
        as_relationship = renderer_context.get('as_relationship')

        if data is None:
            # Deleted items
            converted = None
        elif all([key in data for key in self.PAGINATION_KEYS]):
            # Paginated object
            converted = self.convert_paginated(
                data, fields_extra, request_uri=self.request_uri)
        elif is_err:
            converted = self.convert_error(
                data, exception, fields_extra, status_code)
        elif self.request.method == 'OPTIONS':
            converted = {'meta': data}
        elif as_relationship:
            relationship_name = as_relationship
            if as_relationship not in data:
                # Relationship to current resource in a historical viewset
                # For example, historicalbrowsers/5/relationships/browser
                # In this case, 'as_relationship' is the singular name
                # (browser), but the link ID is in 'object_id'.
                assert 'object_id' in data, (
                    'Expecting "%s" or object_id in data keys %s.'
                    % (as_relationship, list(data.keys())))
                assert 'object_id' in fields_extra, (
                    'Expecting "object_id" in fields_extra.')
                assert 'name' in fields_extra['object_id'], (
                    'Expecting "name" in fields_extra["object_id"].')
                object_name = fields_extra['object_id']['name']
                assert object_name == as_relationship, (
                    ('Expecting fields_extra["object_id"]["name"] == "%s",'
                     ' got "%s".') % (as_relationship, object_name))
                relationship_name = 'object_id'
            converted = self.convert_to_relationship_object(
                relationship_name, data[relationship_name],
                fields_extra[relationship_name],
                resource_uri=resource_uri)
        else:
            converted = self.convert_document(
                data, fields_extra, resource_uri=resource_uri,
                request_uri=self.request_uri)

        renderer_context['indent'] = 4
        return super(JsonApiV10Renderer, self).render(
            data=converted,
            accepted_media_type=accepted_media_type,
            renderer_context=renderer_context)
Example #33
0
 def list(self, request, *args, **kwargs):
     """
     Add a few additional fields to this ListView
     """
     response = super(WordCountRootViewSet, self).list(request, *args, **kwargs)
     if is_client_error(self.status):
         return Response(self.message, status=self.status)
     query_dict = self.request.GET.copy()
     if 'page' in query_dict.keys():
         del query_dict['page']
     response.data.insert(4, '_simple', reverse('wordcounts-simple-list', request=self.request) + ("?{}".format(query_dict.urlencode()) if query_dict else ''))
     response.data.insert(5, '_simple_json', reverse('wordcounts-json-list', request=self.request))
     return response
Example #34
0
 def process_template_response(self, request, response):
     """process_template_response
     """
     if self.is_rest_framework_response(response):
         if not response.data:
             response.data = ReturnDict({}, serializer=Serializer)
         #import pdb; pdb.set_trace();
         if self.is_dict_of_data(response.data):
             if status.is_success(response.status_code):
                 response.data['status'] = 'ok'
                 #response.data['status_code'] = response.status_code
                 #response.data['status_text'] = response.status_text
             if status.is_client_error(response.status_code):
                 response.data['status'] = 'error'
         print response.data
     return response
Example #35
0
def to_json_response(response):
    status_code = response.status_code
    data = None

    if status.is_success(status_code):
        if hasattr(response, 'is_rendered') and not response.is_rendered:
            response.render()
        data = {'data': response.content}

    elif status.is_redirect(status_code):
        data = {'redirect': response.url}

    elif (status.is_client_error(status_code) or
          status.is_server_error(status_code)):
        data = {'errors': [{
            'status': status_code
        }]}

    return JsonResponse(data)
Example #36
0
def exception_handler(exc, context):
    """
    Django REST handles 4xx exceptions itself, so they don't get logged to the
    'django.request' logger by default. This exception handler logs them as if
    Django was handling them then calls the default Django REST handler. This
    makes the project logging behavior more consistent (both 4xx's and 5xx's
    are sent to the 'django.request' logger)
    """
    res = default_exception_handler(exc, context)
    if res is not None and is_client_error(res.status_code):
        request = context['request']
        logger.warn(
            '%s (params: %s) (data: %s) (response: %s)', request.path,
            request.query_params, request.data, res.data,
            extra={
                'status_code': res.status_code, 'request': request
            }
        )
    return res
Example #37
0
def make_rest_call(method, url, headers, data=None):
    response = None
    try:
        if method == 'GET':
            response = requests.get(url, headers=headers)
        elif method == 'DELETE':
            response = requests.delete(url, headers=headers)
        elif method == 'POST':
            response = requests.post(url, data=data, headers=headers)
    except (ConnectionError, HTTPError, Timeout) as e:
        logger.error('REST %s Connection exception : %s', method, e)
    except:
        logger.error('Unexpected REST %s error: %s', method, sys.exc_info()[0])

    if response is None or status.is_server_error(response.status_code):
        msg = '{0} {1}'.format('Service temporarily unavailable:',
                               urlparse(url).netloc)
        raise ServiceUnavailable(detail=msg)
    elif status.is_client_error(response.status_code):
        raise BadRequest()
    elif status.is_redirect(response.status_code):
        logger.warn('Redirect %s for %s', response.status_code, url)

    return response
Example #38
0
 def test_access_denied_without_token(self):
   r = self.client.get(reverse(api_root_name))
   self.assertTrue(status.is_client_error(r.status_code))
Example #39
0
 def test_download_csv_Key_DoesnotExist(self):
     map_id = 5
     result = download_csv(self.request, map_id)
     self.assertTrue(status.is_client_error(result.status_code))
Example #40
0
 def test_map_location_Key_DoesnotExist(self):
     map_id = 5
     result = map_location(self.request, map_id)
     self.assertTrue(status.is_client_error(result.status_code))