Commit fd14d8de authored by Ristylou Dolar's avatar Ristylou Dolar

Complete Application CRUD, Added service_token for APIServices

parent e85459b8
# Generated by Django 2.1.5 on 2019-05-14 15:45
# Generated by Django 2.1.5 on 2019-05-15 11:23
from django.db import migrations, models
import django.db.models.deletion
......@@ -16,7 +16,8 @@ class Migration(migrations.Migration):
name='APIEndpoint',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200, unique=True)),
('api_endpoint_no', models.CharField(max_length=250)),
('name', models.CharField(max_length=200)),
('description', models.CharField(blank=True, max_length=255, null=True)),
('http_method', models.CharField(max_length=100)),
('endpoint_url', models.CharField(max_length=200)),
......@@ -34,7 +35,8 @@ class Migration(migrations.Migration):
name='APIService',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200, unique=True)),
('api_service_no', models.CharField(max_length=250)),
('name', models.CharField(max_length=200)),
('base_url', models.CharField(max_length=200)),
('service_url', models.CharField(max_length=200)),
('created_at', models.DateTimeField(auto_now_add=True)),
......@@ -49,6 +51,7 @@ class Migration(migrations.Migration):
name='Application',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('application_no', models.CharField(max_length=250)),
('name', models.CharField(max_length=200, unique=True)),
('theme', models.IntegerField()),
('created_at', models.DateTimeField(auto_now_add=True)),
......
# Generated by Django 2.1.5 on 2019-05-15 14:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='apiservice',
name='service_token',
field=models.CharField(default=1, max_length=200, unique=True),
preserve_default=False,
),
]
......@@ -23,7 +23,8 @@ class Application(models.Model):
class APIService(models.Model):
api_service_no = models.CharField(max_length=250)
name = models.CharField(max_length=200, unique=True)
name = models.CharField(max_length=200)
service_token = models.CharField(max_length=200, unique=True)
base_url = models.CharField(max_length=200)
service_url = models.CharField(max_length=200)
application = models.ForeignKey(Application, on_delete=models.DO_NOTHING)
......@@ -45,7 +46,7 @@ class APIService(models.Model):
class APIEndpoint(models.Model):
api_endpoint_no = models.CharField(max_length=250)
service = models.ForeignKey(APIService, on_delete=models.DO_NOTHING)
name = models.CharField(max_length=200, unique=True)
name = models.CharField(max_length=200)
description = models.CharField(max_length=255, null=True, blank=True)
http_method = models.CharField(max_length=100)
endpoint_url = models.CharField(max_length=200)
......
from rest_framework import serializers
from .models import APIService, APIEndpoint, Application
from api.utils import BadRequestException
from api.utils import BadRequestException, number_generator
from rest_framework.exceptions import ValidationError
from django.utils.crypto import get_random_string
class ApplicationSerializer(serializers.ModelSerializer):
......@@ -50,13 +51,66 @@ class ApplicationSerializer(serializers.ModelSerializer):
raise BadRequestException(error_message)
return not bool(self._errors)
def create(self, validated_data):
new_application = Application.objects.create(**validated_data)
new_application.application_no = number_generator('APP', new_application.id)
new_application.save()
return new_application
class APIServiceSerializer(serializers.ModelSerializer):
class Meta:
model = APIService
fields = ('id', 'api_service_no', 'name', 'base_url', 'service_url', 'application', 'created_at', 'updated_at', 'deleted_at')
read_only_fields = ('id', 'api_service_no', 'created_at', 'updated_at', 'deleted_at')
fields = ('id', 'api_service_no', 'name', 'service_token', 'base_url', 'service_url', 'application', 'created_at', 'updated_at', 'deleted_at')
read_only_fields = ('id', 'api_service_no', 'service_token', 'created_at', 'updated_at', 'deleted_at')
def is_valid(self, raise_exception=False):
assert not hasattr(self, 'restore_object'), (
'Serializer `%s.%s` has old-style version 2 `.restore_object()` '
'that is no longer compatible with REST framework 3. '
'Use the new-style `.create()` and `.update()` methods instead.' %
(self.__class__.__module__, self.__class__.__name__)
)
assert hasattr(self, 'initial_data'), (
'Cannot call `.is_valid()` as no `data=` keyword argument was '
'passed when instantiating the serializer instance.'
)
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data)
except ValidationError as exc:
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}
#if validation failed
if self._errors and raise_exception:
error_message = {}
message = str(self.errors)
for k, v in self.errors.items():
message = str(v)
start = message.find('string=') + 8
end = message.find(', code=') - 1
message = message[start:end]
error_message[str(k)] = message
raise BadRequestException(error_message)
return not bool(self._errors)
def create(self, validated_data):
new_service = APIService.objects.create(**validated_data)
new_service.api_service_no = number_generator('SVC', new_service.id)
new_service.service_token = get_random_string(length=16)
new_service.save()
return new_service
class APIEndpointSerializer(serializers.ModelSerializer):
......
......@@ -8,6 +8,8 @@ from django_filters import rest_framework as filters
from .models import APIEndpoint
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
import datetime
VALIDATE_TOKEN_URL = settings.VALIDATE_TOKEN_URL
......@@ -139,4 +141,10 @@ class CustomPagination(PageNumberPagination):
'results': data['results']
})
# autogenerated number
def number_generator(prefix, id):
date = '{:%Y%m%d}'.format(datetime.datetime.now())
id_num = '{:07}'.format(id)
autogenerated_no = prefix + '-' + date + '-' + id_num
return autogenerated_no
......@@ -83,7 +83,7 @@ class ApplicationViewSet(viewsets.ModelViewSet):
}
return Response(message, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# Show specific item
# SHOW application details
def retrieve(self, request, *args, **kwargs):
try:
id = self.kwargs['pk']
......@@ -113,7 +113,7 @@ class ApplicationViewSet(viewsets.ModelViewSet):
}
return Response(message, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# Update Application
# UPDATE Application
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
......@@ -121,7 +121,6 @@ class ApplicationViewSet(viewsets.ModelViewSet):
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
instance = self.get_object()
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
message = {
......@@ -163,7 +162,30 @@ class ApplicationViewSet(viewsets.ModelViewSet):
# PATCH - RESTORE archived application
def partial_update(self, request, *args, **kwargs):
try:
kwargs['partial'] = True
instance = self.get_object()
instance.deleted_at = None
serializer = self.get_serializer(instance)
message = {
'code': 200,
'status': 'success',
'message': 'Archived application restored',
'results': serializer.data
}
instance.save()
return Response(message)
except Exception as e:
message = {
'code': 500,
'status': 'failed',
'message': 'Request was not able to process' + str(e),
}
return Response(message, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# /archived - show list of archived marital status
@action(methods=["GET"], detail=False)
......@@ -200,9 +222,8 @@ class ApplicationViewSet(viewsets.ModelViewSet):
@action(methods=['GET'], detail=True)
def services(self, request, id=None):
app = self.get_object()
services = APIService.objects.filter(application=app)
def services(self, request, pk):
services = APIService.objects.filter(application=pk)
serializer = APIServiceSerializer(services, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment