Commit ba610cc3 authored by John Red Medrano's avatar John Red Medrano

prepare for version 2

parent 144dfa03
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class ApiConfig(AppConfig):
name = 'api'
# Generated by Django 2.1.5 on 2019-05-15 11:23
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='APIEndpoint',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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)),
('is_need_auth', models.BooleanField(default=False)),
('is_active', models.BooleanField(default=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('deleted_at', models.DateTimeField(blank=True, null=True)),
],
options={
'db_table': 'api_endpoints',
},
),
migrations.CreateModel(
name='APIService',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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)),
('updated_at', models.DateTimeField(auto_now=True)),
('deleted_at', models.DateTimeField(blank=True, null=True)),
],
options={
'db_table': 'api_services',
},
),
migrations.CreateModel(
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)),
('updated_at', models.DateTimeField(auto_now=True)),
('deleted_at', models.DateTimeField(blank=True, null=True)),
],
options={
'db_table': 'application',
},
),
migrations.AddField(
model_name='apiservice',
name='application',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.Application'),
),
migrations.AddField(
model_name='apiendpoint',
name='service',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.APIService'),
),
]
# 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,
),
]
# Generated by Django 2.1.5 on 2019-05-16 16:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0002_apiservice_service_token'),
]
operations = [
migrations.AddField(
model_name='application',
name='code',
field=models.CharField(default=1, max_length=300),
preserve_default=False,
),
]
# Generated by Django 2.1.5 on 2019-06-19 09:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0003_application_code'),
]
operations = [
migrations.AlterField(
model_name='application',
name='theme',
field=models.IntegerField(default=1),
),
]
# Generated by Django 2.1.5 on 2019-06-19 10:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0004_auto_20190619_0952'),
]
operations = [
migrations.AlterField(
model_name='application',
name='theme',
field=models.IntegerField(blank=True, default=1, null=True),
),
]
# Generated by Django 2.1.5 on 2019-06-19 15:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0005_auto_20190619_1012'),
]
operations = [
migrations.AlterField(
model_name='application',
name='theme',
field=models.IntegerField(blank=True, default=1),
),
]
# Generated by Django 2.1.5 on 2019-06-19 15:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0006_auto_20190619_1524'),
]
operations = [
migrations.AlterField(
model_name='application',
name='theme',
field=models.IntegerField(default=1),
),
]
from django.db import models
from django.utils import timezone
class Application(models.Model):
application_no = models.CharField(max_length=250)
name = models.CharField(max_length=200, unique=True)
theme = models.IntegerField(default=1)
code = models.CharField(max_length=300)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
deleted_at = models.DateTimeField(null=True, blank=True)
def delete(self):
self.deleted_at = timezone.now()
self.save()
def __str__(self):
return self.name
class Meta:
db_table = 'application'
class APIService(models.Model):
api_service_no = models.CharField(max_length=250)
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)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
deleted_at = models.DateTimeField(null=True, blank=True)
def delete(self):
self.deleted_at = timezone.now()
self.save()
def __str__(self):
return self.name
class Meta:
db_table = 'api_services'
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)
description = models.CharField(max_length=255, null=True, blank=True)
http_method = models.CharField(max_length=100)
endpoint_url = models.CharField(max_length=200)
is_need_auth = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
deleted_at = models.DateTimeField(null=True, blank=True)
def delete(self):
self.deleted_at = timezone.now()
self.save()
def __str__(self):
return self.name
class Meta:
db_table = 'api_endpoints'
from rest_framework import serializers
from .models import APIService, APIEndpoint, Application
from api.utils import BadRequestException
from rest_framework.exceptions import ValidationError
class GroupDependentSerializer(serializers.ModelSerializer):
class Meta:
model = Application
fields = ('id', 'name', 'code')
class ApplicationSerializer(serializers.ModelSerializer):
class Meta:
model = Application
fields = (
'id', 'application_no', 'name', "code", 'theme',
# 'groups', 'modules'
)
read_only_fields = (
'id', 'application_no', '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)
class APIServiceSerializer(serializers.ModelSerializer):
class Meta:
model = APIService
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)
class APIEndpointSerializer(serializers.ModelSerializer):
class Meta:
model = APIEndpoint
fields = (
'id', 'api_endpoint_no', 'service', 'name',
'description', 'http_method', 'endpoint_url', 'is_need_auth',
'is_active', 'created_at', 'updated_at', 'deleted_at'
)
read_only_fields = (
'id', 'api_endpoint_no', '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)
from django.test import TestCase
# Create your tests here.
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from api.viewsets.services import APIServiceViewSet
from api.viewsets.endpoints import APIEndpointViewSet
from api.viewsets.applications import (
ApplicationViewSet, MainApplicationViewSet
)
from api.views import (
APIGatewayList, APIGatewaySlugDetail, APIGatewaySlugModelDetail
)
router = DefaultRouter()
router.register(r'applications', ApplicationViewSet)
router.register(r'services', APIServiceViewSet)
router.register(r'endpoints', APIEndpointViewSet)
router.register(r'main-application', MainApplicationViewSet)
urlpatterns = [
path('', include(router.urls)),
path('<str:service>/<str:endpoint_url>/', APIGatewayList.as_view()),
path('<str:service>/<str:endpoint_url>/<str:slug>/',
APIGatewaySlugDetail.as_view()),
path('<str:service>/<str:endpoint_url>/<str:slug>/<str:model>/',
APIGatewaySlugModelDetail.as_view()),
]
import json
import requests
from django.conf import settings
from django.http import Http404
from rest_framework import status
from django_filters import FilterSet
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
from django.db.models.functions import Lower
import copy
VALIDATE_TOKEN_URL = settings.VALIDATE_TOKEN_URL
class BadRequestException(Exception):
pass
class APIEndpointFilter(FilterSet):
service = filters.CharFilter('service__name')
class Meta:
model = APIEndpoint
fields = ('service',)
class Helper:
def __init__(self):
self._headers = {'Content-Type': 'application/json'}
def _response_data(self, data, status_code, headers):
return {
'data': data,
'status_code': status_code,
'headers': headers
}
def _request_method(self, request, final_endpoint, headers):
if request.method == 'GET':
req = requests.get(final_endpoint, headers=headers)
if req.headers.get('content-type') == 'application/json':
return self._response_data(req.json(),
req.status_code,
req.headers)
else:
return req
elif request.method == 'POST':
data = copy.deepcopy(request.data)
filesBody = {}
if not request.FILES == {}:
for fileKey in request.FILES.keys():
filesBody[fileKey] = data[fileKey]
data.pop(fileKey, None)
# Content type will be set to default
# as MultiPart when files header is
# not empty
headers.pop('Content-Type', None)
json_body = data
else:
json_body = json.dumps(data)
req = requests.post(
final_endpoint,
data=json_body,
headers=headers,
files=filesBody
)
return self._response_data(req.json(),
req.status_code,
self._headers)
elif request.method == 'PUT':
data = request.data
json_body = json.dumps(data)
req = requests.put(
final_endpoint,
data=json_body,
headers=headers
)
return self._response_data(req.json(),
req.status_code,
self._headers)
elif request.method == 'PATCH':
data = request.data
json_body = json.dumps(data)
req = requests.patch(
final_endpoint,
data=json_body,
headers=headers
)
return self._response_data(req.json(),
req.status_code,
self._headers)
elif request.method == 'DELETE':
req = requests.delete(final_endpoint, headers=headers)
return self._response_data(req.json(),
req.status_code,
self._headers)
def get_endpoint(self, request, service, endpoint_url):
try:
endpoint = APIEndpoint.objects.select_related('service').get(
http_method=request.method,
service__name=service,
endpoint_url=endpoint_url,
)
if endpoint.is_active is True:
base_url = endpoint.service.base_url
full_path = request.get_full_path()
final_endpoint = f"{base_url}{full_path}"
# print(final_endpoint)
if endpoint.is_need_auth is True:
# redirect to authenticator service
self._headers = {
'Authorization': request.META['HTTP_AUTHORIZATION'],
'Content-Type': 'application/json',
"endpoint": str(endpoint.id)
# "user": str(endpoint.name),
}
# print(endpoint.endpoint_url)
# last = full_path.split('/')
# print(last)
# print(f'{full_path},dddd')
# print(request)
# print(self._headers)
if endpoint.endpoint_url == 'current-user':
return self._request_method(request, final_endpoint,
self._headers)
req = requests.post(VALIDATE_TOKEN_URL,
headers=self._headers)
all_headers = {**req.headers, **self._headers}
if req.status_code == 200:
return self._request_method(request,
final_endpoint,
all_headers)
return self._response_data({'message': 'Unauthorized'},
status.HTTP_401_UNAUTHORIZED,
self._headers)
else:
return self._request_method(request, final_endpoint,
self._headers)
else:
return self._response_data(
{'message': 'Invalid'},
status.HTTP_500_INTERNAL_SERVER_ERROR,
self._headers
)
except APIEndpoint.DoesNotExist:
raise Http404
except Exception as e:
return self._response_data({'message': str(e)},
status.HTTP_500_INTERNAL_SERVER_ERROR,
self._headers)
class CustomPagination(PageNumberPagination):
page_size = 5
max_page_size = 50
page_query_param = 'page'
page_size_query_param = 'page_size'
def get_paginated_response(self, data):
return Response({
'page_number': self.page.number,
'size_per_page': self.page.paginator.per_page,
'total_pages': self.page.paginator.num_pages,
'total': self.page.paginator.count,
'code': data['code'],
'status': data['status'],
'message': data['message'],
'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
# status message
def status_message_response(code, status, message, results):
message = {
'code': code,
'status': status,
'message': message,
'results': results
}
return message
# Table ordering
def tbl_ordering(queryset, **kwargs):
sort_field = kwargs.get('sort_field', None)[0]
sort_order = kwargs.get('sort_order', None)[0]
if sort_order.lower() == 'asc':
queryset = queryset.order_by(
Lower(sort_field).asc())
else:
queryset = queryset.order_by(
Lower(sort_field).desc())
return queryset
from rest_framework.views import APIView
from rest_framework.response import Response
from .utils import Helper
from django.conf import settings
from django.http import FileResponse
import requests
class APIGatewayList(APIView):
def _response(self, request, **kwargs):
service = kwargs.get('service')
endpoint_url = kwargs.get('endpoint_url')
api = Helper().get_endpoint(request, service, endpoint_url)
if str(type(api)) == "<class 'requests.models.Response'>":
# varifile = f"{settings.BASE_DIR}/test.xlsx"
# filedesciptor = open(varifile, 'wb')
# filedesciptor.write(api.content)
# filedesciptor.close()
# filer = open(varifile, 'rb')
return FileResponse(api, as_attachment=True)
return Response(api['data'],
status=api['status_code'],
headers=api['headers'])
def get(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def post(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def delete(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
class APIGatewaySlugDetail(APIView):
def _response(self, request, **kwargs):
service = kwargs.get('service')
endpoint_url = kwargs.get('endpoint_url')
slug = kwargs.get('slug')
if slug == 'archived':
slug = 'archived'
else:
slug = 'slug'
api = Helper().get_endpoint(
request, service, f"{endpoint_url}/{slug}")
return Response(api['data'],
status=api['status_code'],
headers=api['headers'])
def get(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def put(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def patch(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def delete(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
class APIGatewaySlugModelDetail(APIView):
def _response(self, request, **kwargs):
service = kwargs.get('service')
endpoint_url = kwargs.get('endpoint_url')
api = Helper().get_endpoint(
request, service, f"{endpoint_url}/slug/model")
return Response(api['data'],
status=api['status_code'],
headers=api['headers'])
def get(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def post(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def put(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def patch(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
def delete(self, request, format=None, **kwargs):
return self._response(request, **kwargs)
class Download(APIView):
def post(self, request, **kwargs):
req = requests.get(request.data.get("url"))
return FileResponse(req, as_attachment=True)
This diff is collapsed.
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from api.models import APIEndpoint, APIService
from api.serializers import APIEndpointSerializer
from api.utils import (
CustomPagination, BadRequestException,
status_message_response, number_generator, tbl_ordering
)
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
class APIEndpointViewSet(viewsets.ModelViewSet):
http_method_names = [
'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'
]
queryset = APIEndpoint.objects.all().order_by('service')
serializer_class = APIEndpointSerializer
lookup_field = 'pk'
pagination_class = CustomPagination
filter_backends = (DjangoFilterBackend, SearchFilter,)
search_fields = (
'api_endpoint_no', 'service__name', 'name', 'description',
'http_method', 'endpoint_url'
)
# filter_class = APIEndpointFilter
# CREATE Endpoint
def create(self, request, *args, **kwargs):
try:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
endpoint_create = serializer.save()
# for endpoint_no
endpoint_id = endpoint_create.pk
endpoint_create.api_endpoint_no = number_generator(
'ENP', endpoint_id
)
endpoint_create.save()
message = status_message_response(
201, 'success',
'New endpoint created', serializer.data
)
return Response(message)
except BadRequestException as e:
message = status_message_response(400, 'failed', str(e), [])
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# SHOW LIST of endpoints
def list(self, request, *args, **kwargs):
try:
queryset = self.queryset.filter(deleted_at__exact=None)
# table ordering
if 'sort_order' in request.query_params and 'sort_field' in request.query_params:
queryset = tbl_ordering(
queryset, **request.query_params
)
queryset = self.filter_queryset(queryset)
if not queryset.exists():
message = status_message_response(
200, 'success', 'No records found', []
)
return Response(message)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
enp_data = serializer.data
for service in enp_data:
svc_values = APIService.objects.filter(
id=service['service']).values()
service['service'] = svc_values[0]
message = {
'code': 200,
'status': 'success',
'message': 'List of endpoints found',
'results': serializer.data
}
return self.get_paginated_response(message)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# SHOW endpoint details
def retrieve(self, request, *args, **kwargs):
try:
id = self.kwargs['pk']
instance = APIEndpoint.objects.get(id=id)
serializer = self.get_serializer(instance)
message = status_message_response(
200, 'success',
'Endpoint retrieved', serializer.data
)
return Response(message, status=status.HTTP_200_OK)
except APIEndpoint.DoesNotExist:
message = status_message_response(404, 'failed',
'No record found', [])
return Response(message, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# UPDATE endpoint
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(
instance, data=request.data, partial=partial
)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
message = status_message_response(
200, 'success',
'Endpoint updated', serializer.data
)
return Response(message)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# SOFT DELETE / ARCHIVED
def destroy(self, request, *args, **kwargs):
try:
instance = self.get_object()
self.perform_destroy(instance)
message = status_message_response(
200, 'success', 'Endpoint deleted', []
)
return Response(message, status=status.HTTP_200_OK)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# PATCH - RESTORE archived endpoint
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 = status_message_response(
200, 'success',
'Archived endpoint restored', serializer.data
)
instance.save()
return Response(message)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# /archived - show list of archived endpoints
@action(methods=["GET"], detail=False)
def archived(self, request, pk=None):
try:
queryset = APIEndpoint.objects.filter(deleted_at__isnull=False)
# table ordering
if 'sort_order' in request.query_params and 'sort_field' in request.query_params:
queryset = tbl_ordering(
queryset, **request.query_params
)
queryset = self.filter_queryset(queryset)
if not queryset.exists():
message = status_message_response(
200, 'success', 'No archived endpoints', []
)
return Response(message)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = {
'code': 200,
'status': 'success',
'message': 'Archived endpoints found',
'results': serializer.data
}
return self.get_paginated_response(message)
except Exception as e:
message = status_message_response(
500, 'failed',
'Request was not able to process' + str(e), []
)
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
This diff is collapsed.
"""
Django settings for config project.
Generated by 'django-admin startproject' using Django 2.1.5.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'k1wlprswi7j14l9xtyvjem3!4!pj!dg=uig!1+520w-wfg(h99'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'config.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'config.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
"""
Django settings for config project.
Generated by 'django-admin startproject' using Django 2.1.5.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'k1wlprswi7j14l9xtyvjem3!4!pj!dg=uig!1+520w-wfg(h99'
# Application definition
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'django_filters',
'rest_framework',
'api',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
]
ROOT_URLCONF = 'config.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'config.wsgi.application'
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Singapore'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
# CORS Headers Settings
# https://github.com/ottoyiu/django-cors-headers/
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = True
ALLOWED_HOSTS = ['*']
INSTALLED_APPS += [
'rest_framework_swagger',
]
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
'UNAUTHENTICATED_USER': None,
}
config = configparser.ConfigParser()
config.read('env.ini')
DATABASES = {
'default': {
'ENGINE': config['LOCAL']['DATABASE_ENGINE'],
'NAME': config['LOCAL']['DATABASE_NAME'],
'USER': config['LOCAL']['DATABASE_USER'],
'PASSWORD': config['LOCAL']['DATABASE_PASSWORD'],
'HOST': config['LOCAL']['DATABASE_HOST'],
'PORT': config['LOCAL']['DATABASE_PORT'],
}
}
AUTHENTICATOR_IP = config['SERVICE']['AUTHENTICATOR_IP']
AUTHENTICATOR_PATH = '/api/v1/authenticator'
VALIDATE_TOKEN_URL = f'http://{AUTHENTICATOR_IP}{AUTHENTICATOR_PATH}/authenticator-validate-token/'
AUTHENTICATOR_GROUP = f'http://{AUTHENTICATOR_IP}{AUTHENTICATOR_PATH}/authenticator-group'
\ No newline at end of file
from .base import *
import configparser
DEBUG = False
ALLOWED_HOSTS = ['*']
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
'UNAUTHENTICATED_USER': None,
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
}
config = configparser.ConfigParser()
config.read('env.ini')
DATABASES = {
'default': {
'ENGINE': config['PRODUCTION']['DATABASE_ENGINE'],
'NAME': config['PRODUCTION']['DATABASE_NAME'],
'USER': config['PRODUCTION']['DATABASE_USER'],
'PASSWORD': config['PRODUCTION']['DATABASE_PASSWORD'],
'HOST': config['PRODUCTION']['DATABASE_HOST'],
'PORT': config['PRODUCTION']['DATABASE_PORT'],
}
}
AUTHENTICATOR_IP = config['SERVICE']['AUTHENTICATOR_IP']
AUTHENTICATOR_PATH = '/api/v1/authenticator'
VALIDATE_TOKEN_URL = f'http://{AUTHENTICATOR_IP}{AUTHENTICATOR_PATH}/validate-token/'
ACCOUNT_GROUP = f'http://{AUTHENTICATOR_IP}{AUTHENTICATOR_PATH}/application-dependent'
\ No newline at end of file
from .base import *
import configparser
DEBUG = True
ALLOWED_HOSTS = ['*']
INSTALLED_APPS += [
'rest_framework_swagger',
]
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
'UNAUTHENTICATED_USER': None,
}
config = configparser.ConfigParser()
config.read('env.ini')
DATABASES = {
'default': {
'ENGINE': config['UAT']['DATABASE_ENGINE'],
'NAME': config['UAT']['DATABASE_NAME'],
'USER': config['UAT']['DATABASE_USER'],
'PASSWORD': config['UAT']['DATABASE_PASSWORD'],
'HOST': config['UAT']['DATABASE_HOST'],
'PORT': config['UAT']['DATABASE_PORT'],
}
}
AUTHENTICATOR_IP = config['SERVICE']['AUTHENTICATOR_IP']
AUTHENTICATOR_PATH = '/api/v1/authenticator'
VALIDATE_TOKEN_URL = f'http://{AUTHENTICATOR_IP}{AUTHENTICATOR_PATH}/authenticator-validate-token/'
AUTHENTICATOR_GROUP = f'http://{AUTHENTICATOR_IP}{AUTHENTICATOR_PATH}/authenticator-group'
\ No newline at end of file
"""config URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path, include
from rest_framework_swagger.views import get_swagger_view
from api.views import (Download)
swagger = get_swagger_view(title='API Main End Point')
urlpatterns = [
path('docs/', swagger),
path('api/v1/', include('api.urls')),
path('api/v1/download/', Download.as_view()),
]
"""
WSGI config for config project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()
[PRODUCTION]
DATABASE_ENGINE = django.db.backends.mysql
DATABASE_NAME = authenticatordb
DATABASE_USER = root
DATABASE_PASSWORD =
DATABASE_HOST =
DATABASE_PORT =
[UAT]
DATABASE_ENGINE = django.db.backends.mysql
DATABASE_NAME = uat_rms_main_db
DATABASE_USER = oneberry
DATABASE_PASSWORD = 0N3Berryt!r
DATABASE_HOST = 52.74.129.178
DATABASE_PORT = 3306
[LOCAL]
DATABASE_ENGINE = django.db.backends.mysql
DATABASE_NAME = ob_maindb
DATABASE_USER = root
DATABASE_PASSWORD = password
DATABASE_HOST = 127.0.0.1
DATABASE_PORT = 3306
[SETTINGS]
CONFIG = config.settings.uat
[SERVICE]
AUTHENTICATOR_IP = 172.17.0.1:7011
#!/usr/bin/env python
import os
import sys
import configparser
config = configparser.ConfigParser()
config.read('env.ini')
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', config['SETTINGS']['CONFIG'])
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
Binary files a/requirements/local.txt and /dev/null differ
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