class FailingOutContractView(ApiView): spec = Spec(Method.GET, s.Query(result=s.Boolean()), Response(200, schema=s.Object(foo=s.String()))) def handle(self, data): if data['result']: return {'foo': '1'}
def test_qs(self): schema = s.Query(string=s.String(), number=s.Number(), integer=s.Integer(), boolean=s.Boolean(), array=s.Array(s.String())) data = QueryDict( 'string=foo&number=1.2&integer=1&boolean=&array=foo&array=bar') self.assertEqual( schema.qs_check_and_return(data), { 'string': 'foo', 'number': 1.2, 'integer': 1, 'boolean': False, 'array': ['foo', 'bar'] }) data = QueryDict('string=foo&number=1.2&boolean=&array=foo&array=bar') with self.assertRaises(s.DataError) as ctx: schema.qs_check_and_return(data) self.assertEqual(ctx.exception.as_dict(), [{ 'path': ['integer'], 'error': "'None' is not of type 'integer'" }])
class ReturnStatusView(ApiView): spec = Spec(Method.GET, s.Query(result=s.String()), Response(204), Response(200, schema=s.Object(result=s.String()))) def handle(self, data): if data['result'] == 'int': return 204 elif data['result'] == 'fail': return 201 return data
class EmailConfirm(ApiView): ''' Confirm user email ''' spec = Spec( Method.GET, s.Query( id=s.Integer(), code=s.String(), next=s.Optional(s.String()), ), Response(301, description='redirect to the next page'), ) def handle(self, data): code = data['code'] user = User.objects.filter(pk=data['id']) \ .exclude(email=None, new_email=None) \ .filter(Q(email_confirm_code=code) | Q(new_email_confirm_code=code)) \ .first() if user: if user.email_confirm_code == code: user.email_confirmed = True user.email_confirm_code = None user.is_active = True user.save(update_fields=[ 'email_confirmed', 'email_confirm_code', 'is_active' ]) signals.email_confirmed.send(User, user=user) login(self.request, user) signals.signup_completed.send(User, user=user) elif user.new_email_confirm_code == code: user.backend = 'django.contrib.auth.backends.ModelBackend' login(self.request, user) signals.signup_completed.send(User, user=user) if not User.objects.filter(email=user.new_email).exists(): user.email = user.new_email user.new_email = None user.new_email_confirm_code = None user.email_confirmed = True user.save(update_fields=[ 'email', 'new_email', 'new_email_confirm_code', 'email_confirmed' ]) next = data['next'] or '/' return redirect(next)
class UnknownResponseView(ApiView): spec = Spec(Method.GET, s.Query(status=s.Number()), Response(204)) def handle(self, data): return data['status'], data
class OutContractView(ApiView): spec = Spec(Method.GET, s.Query(foo=s.String()), Response(200, schema=s.Object(foo=s.String()))) def handle(self, data): return data
class InContractView(ApiView): spec = Spec(Method.GET, s.Query(foo=s.Number()), Response(204)) def handle(self, data): return 204