Commit 33fa3c8a authored by John Red Medrano's avatar John Red Medrano

Merge pull request #236 in RMS/api-main-service from RMSv2 to staging

* commit '237b9605': (229 commits)
  modify params on ordering at accounts
  allow to delete user when it doesnt have any transaction on CMS or other apps
  custom error handler
  custom error handler
  alter name
  added unique_together on department
  ordering
  awaiting fix
  sort
  edit user and upload user picture
  fixed list of change reqeust form
  download
  action_required
  notif
  fix issues
  remove update status acknowledge on routing tabke
  added Q function at exclude draft on business layer of change request forms
  replace exact to contains
  fix listing on form
  fixing
  ...
parents 43ab6456 237b9605
...@@ -3,6 +3,7 @@ __pycache__/ ...@@ -3,6 +3,7 @@ __pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
env.ini env.ini
media
# Distribution / packaging # Distribution / packaging
.Python .Python
......
...@@ -5,5 +5,5 @@ ADD . /code ...@@ -5,5 +5,5 @@ ADD . /code
COPY . /code COPY . /code
WORKDIR /code WORKDIR /code
RUN pip install -r requirements/local.txt RUN pip install -r requirements/local.txt
EXPOSE 7010 EXPOSE 7020
RUN python manage.py migrate RUN python manage.py migrate
...@@ -4,5 +4,6 @@ ...@@ -4,5 +4,6 @@
You have to pass which settings.py module you want to use in the command line: You have to pass which settings.py module you want to use in the command line:
``` ```
python manage.py runserver run the sqlfile at requirements folder.
initial postman collection located at requirements folder.
``` ```
\ No newline at end of file
# 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-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),
),
]
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({'message': 'Deleted'},
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.
File added
from django.apps import AppConfig
class AccesslayerConfig(AppConfig):
name = 'accesslayer'
from app.middleware.current_user.data import set_current_user
from rest_framework.authentication import TokenAuthentication
from rest_framework import exceptions
from datetime import datetime, timedelta
from django.conf import settings
class AppTokenAuthentication(TokenAuthentication):
keyword = 'Bearer'
def authenticate_credentials(self, key):
user, token = super(AppTokenAuthentication,
self).authenticate_credentials(key)
if token.created < datetime.now() - timedelta(minutes=int(settings.SESSION_TIMEOUT)):
token.delete()
raise exceptions.AuthenticationFailed('Token has expired')
else:
token.created = datetime.now()
token.save()
set_current_user(user)
return (user, token)
from django.urls import path, re_path
from app.accesslayer import views
urlpatterns = (
path(r'login/', views.Login.as_view(), name="API Login"),
re_path(r'^logout/', views.Logout.as_view(), name="API Logout"),
re_path(r'^refresh-token/(?P<token>\w+)/$', views.RefreshToken.as_view(), name="Refresh Token"),
path(r'current-user/', views.CurrentUser.as_view(), name="Current User"),
# re_path(r'^forgot-password/(?P<username>\w+)/$', views.ForgotPassword.as_view(), name="Forgot Password"),
# re_path(r'^validate-forgot-password-reset-token/(?P<token>\w+)/$', views.ValidateForgotPasswordResetToken.as_view(), name="Validate Forgot Password Reset Token"),
# re_path(r'^forgot-password-reset/(?P<token>\w+)/$', views.ForgotPasswordReset.as_view(), name="Forgot Password Reset"),
path('forgot-password/', views.ForgotPassword.as_view()),
path('reset-password-link/', views.ValidateForgotPasswordResetToken.as_view()),
path('forgot-password-reset/', views.ForgotPasswordReset.as_view()),
)
import json
import threading
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import AllowAny
from django.db import transaction
from app.helper import decorators
from app.applicationlayer.management.user.serializers import (
UserManagementRetreiveSerializer
)
from app.entities.models import User, AuthToken
from datetime import datetime
from random import randrange
from django.conf import settings
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.exceptions import ParseError
class Login(ObtainAuthToken):
@decorators.error_safe
def post(self, request, *args, **kwargs):
try:
serializer = self.serializer_class(data=request.data,
context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
if not created:
token.created = datetime.now()
token.save()
return Response({
'token': token.key,
# 'user_id': user.pk,
# 'email': user.email
})
except Exception as e:
return Response(
{"message": "Unable to log in with provided credentials."}
)
class Logout(APIView):
@decorators.error_safe
def post(self, request, *args, **kwargs):
existingUser = self.request.user
if existingUser:
existingToken = Token.objects.filter(user=existingUser).first()
if existingToken:
existingToken.delete()
return Response(data={"detail": "User was logged out"},
status=status.HTTP_200_OK)
else:
return Response(data={"detail": "User session not found"},
status=status.HTTP_404_NOT_FOUND)
else:
return Response(data={"detail": "User not found"},
status=status.HTTP_404_NOT_FOUND)
class RefreshToken(APIView):
@decorators.error_safe
def post(self, request, token=None, *args, **kwargs):
existingToken = Token.objects.filter(key=token).first()
if existingToken:
if existingToken.user == request.user:
existingToken.created = datetime.now()
existingToken.save()
return Response(data={"detail": "Token refreshed"},
status=status.HTTP_200_OK)
else:
return Response(data={"detail": "Token user not match"},
status=status.HTTP_401_UNAUTHORIZED)
else:
return Response(data={"detail": "Token not found"},
status=status.HTTP_404_NOT_FOUND)
class CurrentUser(APIView):
# @decorators.error_safe
def get(self, request, token=None, *args, **kwargs):
serializer = UserManagementRetreiveSerializer
context = {"request": request}
serializer = serializer(request.user, context=context)
serializer.data['key'] = 'value'
serialized = serializer.data
return Response(data=serialized,
status=status.HTTP_200_OK)
'''
***********************
** RESET CREDENTIALS **
***********************
'''
class ForgotPassword(APIView):
permission_classes = (AllowAny,)
# @decorators.error_safe
@transaction.atomic
def post(self, request, *args, **kwargs):
email = request.data['email']
try:
user = request.user.email
except Exception as e:
user = str(settings.CATCH_EMAIL)
existingUser = User.objects.filter(email=email).first()
if existingUser:
# Check if there's existing request
exToken = AuthToken\
.objects\
.filter(
user_id=existingUser.id,
is_active=True)\
.first()
if exToken:
raise ParseError('There is an existing password reset for this user.')
REF = 'AUTH'
TOKEN = ''
TIMEOUT = 10000
PASSCODE = 0
# Generate Random token for TOKEN
TOKEN = Token().generate_key()
# Generate Random number for PASSCODE
rands = []
rands.append(randrange(10))
rands.append(randrange(10))
rands.append(randrange(10))
rands.append(randrange(10))
PASSCODE = f"{rands[0]}{rands[1]}{rands[2]}{rands[3]}"
AuthToken(
ref=REF,
token=TOKEN,
passcode=PASSCODE,
timeout=TIMEOUT,
is_active=True,
user=existingUser,
).save()
url = f"{settings.FRONT_END_URL}/forgot-password/reset"\
f"?token={TOKEN}"
args = [str(PASSCODE), str(url), user, str(existingUser.email)]
# t1 = threading.Thread(target=sender.forgot_password, args=(args,))
# t1.start()
main_threading(args, sender.forgot_password)
args = [str(PASSCODE), str(url), user, str(existingUser.email)]
# t2 = threading.Thread(target=sender.forgot_password, args=(args,))
# t2.start()
main_threading(args, sender.forgot_password)
return Response(data={"detail": "Forgot Password Sent"},
status=status.HTTP_200_OK)
else:
return Response(data={"error": "User not found"},
status=status.HTTP_404_NOT_FOUND)
class ValidateForgotPasswordResetToken(APIView):
permission_classes = (AllowAny,)
@decorators.error_safe
@transaction.atomic
def post(self, request, *args, **kwargs):
token = request.data['token']
existingToken = AuthToken.objects.filter(token=token).first()
if existingToken:
if not existingToken.is_active:
raise Exception('Request is no longer active')
return Response(data={
"username": existingToken.user.username,
"email": existingToken.user.email
},
status=status.HTTP_200_OK)
else:
return Response(data={"error": "Token not found"},
status=status.HTTP_404_NOT_FOUND)
class ForgotPasswordReset(APIView):
permission_classes = (AllowAny,)
@decorators.error_safe
@transaction.atomic
def post(self, request, *args, **kwargs):
body_unicode = request.body.decode('utf-8')
body_data = json.loads(body_unicode)
username = body_data['username']
password = body_data['password']
password_confirm = body_data['password_confirm']
passcode = body_data['passcode']
token = body_data['token']
if not username:
raise Exception('Username is required')
if not passcode:
raise Exception('Passcode is required')
if password != password_confirm:
raise Exception('Passwords must match')
existingToken = AuthToken.objects.filter(token=token).first()
if existingToken:
if existingToken.user.username != username:
raise Exception('Username does not match')
if not existingToken.is_active:
raise Exception('Request is no longer active')
if existingToken.passcode != passcode:
raise Exception('Invalid Passcode')
# TODO: Reset password here
exUser = User.objects.filter(id=existingToken.user.id).first()
exUser.set_password(password_confirm)
exUser.save()
existingToken.is_active = False
existingToken.save()
# sender.password_changed(
# str(existingToken.user.username),
# str(datetime.now()),
# str(existingToken.user.email))
# args = [str(PASSCODE), str(url), str(existingUser.email), user]
# t1 = threading.Thread(target=sender.forgot_password, args=(args,))
# t1.start()
# args = [str(PASSCODE), str(url), user, str(existingUser.email)]
# t2 = threading.Thread(target=sender.forgot_password, args=(args,))
# t2.start()
return Response(data={"detail": "Forgot Password Reset Success"},
status=status.HTTP_200_OK)
else:
return Response(data={"error": "Token not found"},
status=status.HTTP_404_NOT_FOUND)
from django.apps import AppConfig
class ApplicationLayerConfig(AppConfig):
name = 'application_layer'
from django.apps import AppConfig
class AuthenticationConfig(AppConfig):
name = 'authentication'
from django.db import models
# Create your models here.
from django.shortcuts import render
# Create your views here.
from rest_framework import serializers
from app.entities.models import AllowedCompany
from django.forms.models import model_to_dict
class AllowedCompanySerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['department'] = model_to_dict(instance.group_pivots)
ret['company'] = model_to_dict(instance.company_pivot)
return ret
class Meta:
model = AllowedCompany
fields = '__all__'
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import AllowedCompany
from django.db.models import Q
class AllowedCompanyFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = AllowedCompany
fields = '__all__'
# from rest_framework.views import APIView
from rest_framework import status, viewsets
from rest_framework.response import Response
from app.entities import enums
from app.entities.models import AllowedCompany
from app.applicationlayer.utils import CustomPagination, status_message_response
# from rest_framework.exceptions import ParseError
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.allowed_company.serializer import (
AllowedCompanySerializer
)
from app.applicationlayer.cms.allowed_company.table_filter import (
AllowedCompanyFilterSet
)
from django.db import transaction
from rest_framework.exceptions import ValidationError
class AllowedCompanyViewSet(viewsets.ModelViewSet):
queryset = AllowedCompany.objects.all()
serializer_class = AllowedCompanySerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = AllowedCompanyFilterSet
ordering_fields = '__all__'
search_fields = (
'id_number__code', 'company_pivot__code',
'group_pivots__code'
)
# @decorators.rms.user_list
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of Users found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
@transaction.atomic
def create(self, request, *args, **kwargs):
try:
form = request.data['form']
id_number = form[0]['id_number']
AllowedCompany.objects.filter(id_number=id_number).delete()
serializer = AllowedCompanySerializer(
data=form, many=True
)
if serializer.is_valid(raise_exception=True):
serializer.save()
message = {
'code': 201,
'status': 'success',
'message': 'Form Details successfully saved!',
'results': serializer.data
}
return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e:
message = {
'code': 400,
'status': 'failed',
'message': str(e),
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
message = {
'code': 500,
'status': 'failed',
'message': 'Request was not able to process' + str(e),
}
return Response(str(e),
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
from app.entities import models
from rest_framework import serializers
from django.forms.models import model_to_dict
class ChangeRequestFormApproversSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = model_to_dict(instance.user.department.company)
ret['department'] = model_to_dict(instance.user.department)
user_object = {
"id": instance.user.id,
"name": instance.user.name,
"username": instance.user.username,
"code": instance.user.code,
"email": instance.user.email,
"contact_no": instance.user.contact_no
}
ret['user'] = user_object
return ret
except Exception as e:
ret['user'] = "none"
ret['department'] = "none"
ret['company'] = "none"
return ret
class Meta:
model = models.ChangeRequestFormApprovers
fields = '__all__'
read_only_fields = ['created', 'code']
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestFormApprovers
class ApproverFilter(filters.FilterSet):
class Meta:
model = ChangeRequestFormApprovers
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.form.approver.table_filters import ApproverFilter
from app.applicationlayer.cms.form.approver import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestFormApproversViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormApprovers.objects.all()
serializer_class = serializers.ChangeRequestFormApproversSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = ApproverFilter
ordering_fields = '__all__'
search_fields = (
'name', 'code',
'department__company__name',
'department__name',
'email', 'contact_no'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Form Approvers found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
\ No newline at end of file
from app.entities import models
from rest_framework import serializers
from django.forms.models import model_to_dict
class ChangeRequestFormAttachmentsSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
try:
ret = super().to_representation(instance)
user_object = {
"id": instance.uploaded_by.id,
"name": instance.uploaded_by.name,
"username": instance.uploaded_by.username,
"code": instance.uploaded_by.code,
"email": instance.uploaded_by.email,
"contact_no": instance.uploaded_by.contact_no
}
ret['uploaded_by'] = user_object
ret['file_upload'] = self.context['request'].build_absolute_uri(
instance.file_upload.url.url)
ret['file_upload_id'] = self.context['request'].build_absolute_uri(
instance.file_upload.url
)
return ret
except Exception as e:
ret['uploaded_by'] = "none"
ret['file_upload'] = "none"
return ret
class Meta:
model = models.ChangeRequestFormAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestFormAttachments
class AttachmentFilter(filters.FilterSet):
class Meta:
model = ChangeRequestFormAttachments
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.form.attachment.table_filters import AttachmentFilter
from app.applicationlayer.cms.form.attachment import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestFormAttachmentsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormAttachments.objects.all()
serializer_class = serializers.ChangeRequestFormAttachmentsSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = AttachmentFilter
ordering_fields = '__all__'
search_fields = (
'form_code', 'code',
'file_name',
'description',
'uploaded_by__name'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Form Attachments found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
\ No newline at end of file
from app.entities import models
from rest_framework import serializers
from django.forms.models import model_to_dict
class ChangeRequestFormDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormDetails
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestFormDetails
class DetailsFilter(filters.FilterSet):
class Meta:
model = ChangeRequestFormDetails
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.form.details.table_filters import DetailsFilter
from app.applicationlayer.cms.form.details import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestFormDetailsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormDetails.objects.all()
serializer_class = serializers.ChangeRequestFormDetailsSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = DetailsFilter
ordering_fields = '__all__'
search_fields = (
'code', 'form_code'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Form Details found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
from app.entities import models
from rest_framework import serializers
class headers(serializers.ModelSerializer):
def to_representation(self, instance):
setattr(
instance, 'created', instance.created.strftime('%Y-%m-%d-%H:%M:%S')
)
setattr(
instance, 'requested_to_target_date',
instance.requested_to_target_date.strftime('%Y-%m-%d-%H:%M:%S')
)
return super().to_representation(instance)
class Meta:
model = models.ChangeRequestFormHeader
fields = (
'requested_to_template_name',
'company_desc',
'department_desc',
'requested_desc',
'status',
'requested_to_priority',
'created',
'requested_to_target_date'
)
from rest_framework import viewsets as meviewsets
from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer
from app.entities.models import (
ChangeRequestFormHeader,
ChangeRequestFormApprovers,
ChangeRequestFormStakeHolders
)
# from app.applicationlayer.form_listing_ import headers
from app.applicationlayer.cms.form.download.serializers import headers
from django.db.models import CharField, Value
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
# from cms.applicationlayer.utilities import logged_user
class DownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
queryset = ChangeRequestFormHeader.objects.all()
serializer_class = headers
renderer_classes = (XLSXRenderer,)
filename = 'Change Request Form.xlsx'
permission_classes = (AllowAny,)
def list(self, request, *args, **kwargs):
# id_number = self.request.META.get('HTTP_ACCOUNT_NO')
# id_number = 'USER-20190923-0000001'
# print(request.user.code)
id_number = request.user.code
# id_number = self.request.query_params.get('id_number')
# approver = ChangeRequestFormApprovers.objects.filter(
# Q(user=id_number) &
# Q(deleted_at=None)
# )
# approver = [data['form_code'] for data in approver]
# stake = ChangeRequestFormStakeHolders.objects.filter(
# Q(user=id_number) &
# Q(deleted_at=None)
# )
# stake = [data['form_code'] for data in stake]
data = ChangeRequestFormHeader.objects.filter(
Q(frm_approvers__user__code=id_number) |
Q(requested_by_user=id_number) |
Q(frm_stakes__user__code=id_number)
).distinct()
# print(headers)
# print(headers)
# headers = [data['form_code'] for data in headers]
# form_code = stake + approver + headers
# self.queryset = ChangeRequestFormHeader.objects.filter(
# form_code__in=form_code,
# deleted_at=None,
# )
# exclude = self.queryset.filter(
# status='DRAFT',
# requested_by_user__ne=id_number
# )
# exclude = [data['form_code'] for data in exclude]
# self.queryset = headers
# print(data)
serializer = self.get_serializer(data, many=True)
# print(serializer.data)
return Response(serializer.data)
column_header = {
'titles': [
"Name",
"Company Request To",
"Department Requested To",
"Requested By",
"Status",
"Priority Level",
"Action"
"Date Modified",
"Date Required"
],
'column_width': [17, 30, 17],
'height': 25,
'style': {
'alignment': {
'horizontal': 'center',
'vertical': 'center',
'wrapText': False,
'shrink_to_fit': True,
},
'border_side': {
'border_style': 'thin',
'color': 'FF000000',
},
'font': {
'name': 'Arial',
'size': 14,
'bold': True,
'color': 'FF000000',
},
},
}
from app.entities import models
from rest_framework import serializers
from django.forms.models import model_to_dict
from django.db.models import Q
from app.applicationlayer.cms.form.approver.serializers import ChangeRequestFormApproversSerializer
from app.applicationlayer.cms.form.stakeholder.serializers import ChangeRequestFormStakeHoldersSerializer
from app.applicationlayer.cms.form.details.serializers import ChangeRequestFormDetailsSerializer
from app.applicationlayer.cms.form.attachment.serializers import ChangeRequestFormAttachmentsSerializer
class ChangeRequestFormHeaderSerializer(
serializers.ModelSerializer
):
frm_approvers = ChangeRequestFormApproversSerializer(
many=True, read_only=True)
frm_stakes = ChangeRequestFormStakeHoldersSerializer(
many=True, read_only=True)
frm_attachments = ChangeRequestFormAttachmentsSerializer(
many=True, read_only=True)
frm_details = ChangeRequestFormDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
user = self.context['request'].user
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
(Q(action='') | Q(action=None))
).order_by('level')
if current_level.count() > 0 and current_level[0].user.code == id_number:
if instance.status.lower() == 'rejected':
approver = 'No'
elif instance.status.lower() == 'cancelled':
approver = 'No'
elif instance.status.lower() == 'closed':
approver = 'No'
else:
approver = 'Yes'
else:
approver = 'No'
ret['action_required'] = approver
requested_to_user = {
"id": instance.requested_to_user.id,
"name": instance.requested_to_user.name,
"username": instance.requested_to_user.username,
"code": instance.requested_to_user.code,
"email": instance.requested_to_user.email,
"contact_no": instance.requested_to_user.contact_no
}
requested_by_user = {
"id": instance.requested_by_user.id,
"name": instance.requested_by_user.name,
"username": instance.requested_by_user.username,
"code": instance.requested_by_user.code,
"email": instance.requested_by_user.email,
"contact_no": instance.requested_by_user.contact_no
}
ret['requested_to_company'] = model_to_dict(instance.requested_to_company)
ret['requested_to_department'] = model_to_dict(instance.requested_to_department)
ret['requested_to_user'] = requested_to_user
ret['requested_by_user'] = requested_by_user
ret['requested_by_department'] = model_to_dict(instance.requested_by_department)
return ret
except Exception as e:
ret['action_required'] = "None"
ret['requested_to_company'] = "None"
ret['requested_to_department'] = "None"
ret['requested_to_user'] = "None"
ret['requested_by_user'] ="None"
ret['requested_by_department'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
# fields = '__all__'
fields = ('form_code', 'requested_to_template_name', 'requested_to_objective',
'requested_to_target_date', 'requested_to_priority',
'description', 'created', 'cancel_date', 'status',
'company_desc', 'department_desc', 'requested_desc',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'requested_by_user', 'requested_by_department',
'template_no', 'frm_approvers', 'frm_stakes',
'frm_attachments', 'frm_details')
read_only_fields = ['created', 'form_code']
class ChangeRequestFormHeaderSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
user = self.context['request'].user
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
(Q(action='') | Q(action=None))
).order_by('level')
if current_level.count() > 0 and current_level[0].user.code == id_number:
if instance.status.lower() == 'rejected':
approver = 'No'
elif instance.status.lower() == 'cancelled':
approver = 'No'
elif instance.status.lower() == 'closed':
approver = 'No'
else:
approver = 'Yes'
else:
approver = 'No'
ret['action_required'] = approver
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
return ret
except Exception as e:
ret['action_required'] = "No"
ret['company'] = "None"
ret['department'] = "None"
ret['requested_by'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
fields = '__all__'
read_only_fields = ['created', 'form_code']
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestFormHeader
class HeaderFilterSet(filters.FilterSet):
class Meta:
model = ChangeRequestFormHeader
fields = '__all__'
This diff is collapsed.
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from drf_writable_nested import WritableNestedModelSerializer
from django.forms.models import model_to_dict
class ChangeRequestFormApproversSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = model_to_dict(instance.user.department.company)
ret['department'] = model_to_dict(instance.user.department)
user_object = {
"id": instance.user.id,
"name": instance.user.name,
"username": instance.user.username,
"code": instance.user.code,
"email": instance.user.email,
"contact_no": instance.user.contact_no
}
ret['user'] = user_object
return ret
except Exception as e:
ret['user'] = "none"
ret['department'] = "none"
ret['company'] = "none"
return ret
class Meta:
model = models.ChangeRequestFormApprovers
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormStakeHoldersSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormStakeHolders
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormAttachmentsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormDetails
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormHeaderSerializer(
serializers.ModelSerializer
):
frm_approvers = ChangeRequestFormApproversSerializer(
many=True, read_only=True)
frm_stakes = ChangeRequestFormStakeHoldersSerializer(
many=True, read_only=True)
frm_attachments = ChangeRequestFormAttachmentsSerializer(
many=True, read_only=True)
frm_details = ChangeRequestFormDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
user = self.context['request'].user
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
(Q(action='') | Q(action=None))
).order_by('level')
if current_level[0].user.code == id_number:
if instance.status.lower() == 'rejected':
approver = 'No'
elif instance.status.lower() == 'cancelled':
approver = 'No'
elif instance.status.lower() == 'closed':
approver = 'No'
else:
approver = 'Yes'
else:
approver = 'No'
ret['action'] = approver
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
return ret
except Exception as e:
ret['action'] = "No"
ret['company'] = "None"
ret['department'] = "None"
ret['requested_by'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
# fields = '__all__'
fields = ('form_code', 'requested_to_template_name', 'requested_to_objective',
'requested_to_target_date', 'requested_to_priority',
'description', 'created', 'cancel_date', 'status',
'company_desc', 'department_desc', 'requested_desc',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'requested_by_user', 'requested_by_department',
'template_no', 'frm_approvers', 'frm_stakes',
'frm_attachments', 'frm_details')
read_only_fields = ['created', 'form_code']
class ChangeRequestFormHeaderSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
user = self.context['request'].user
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
(Q(action='') | Q(action=None))
).order_by('level')
if current_level[0].user.code == id_number:
if instance.status.lower() == 'rejected':
approver = 'No'
elif instance.status.lower() == 'cancelled':
approver = 'No'
elif instance.status.lower() == 'closed':
approver = 'No'
else:
approver = 'Yes'
else:
approver = 'No'
ret['action'] = approver
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
return ret
except Exception as e:
ret['action'] = "No"
ret['company'] = "None"
ret['department'] = "None"
ret['requested_by'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
fields = '__all__'
read_only_fields = ['created', 'form_code']
\ No newline at end of file
from app.entities import models
from rest_framework import serializers
from django.forms.models import model_to_dict
class ChangeRequestFormStakeHoldersSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
try:
ret = super().to_representation(instance)
user_object = {
"id": instance.user.id,
"name": instance.user.name,
"username": instance.user.username,
"code": instance.user.code,
"email": instance.user.email,
"contact_no": instance.user.contact_no
}
ret['company'] = model_to_dict(instance.user.department.company)
ret['department'] = model_to_dict(instance.user.department)
ret['user'] = user_object
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['name'] = "none"
return ret
class Meta:
model = models.ChangeRequestFormStakeHolders
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestFormStakeHolders
class StakeHolderFilter(filters.FilterSet):
class Meta:
model = ChangeRequestFormStakeHolders
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.form.stakeholder.table_filters import StakeHolderFilter
from app.applicationlayer.cms.form.stakeholder import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestFormStakeHoldersViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormStakeHolders.objects.all()
serializer_class = serializers.ChangeRequestFormStakeHoldersSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = StakeHolderFilter
ordering_fields = '__all__'
search_fields = (
'name', 'code',
'department__company__name',
'department__name',
'email', 'contact_no'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates Stakeholders found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
\ No newline at end of file
This diff is collapsed.
from rest_framework.views import APIView
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from app.applicationlayer.management.account.serializer import ChangeRequestList
from app.entities import models
from rest_framework.response import Response
from django.db.models import Q
from rest_framework import status
class UserList(APIView):
pagination_class = CustomPagination
def get(self, request, *args, **kwargs):
try:
serializer = ChangeRequestList
dept = self.request.query_params['department_code']
company = self.request.query_params['company_code']
user_list = models.AllowedCompany.objects.filter(
Q(company_pivot=company) &
Q(group_pivots=dept)
)
user_list = user_list.exclude(id=1).values('id_number')
queryset = models.User.objects.filter(code__in=user_list).order_by('name')
page = self.paginate_queryset(queryset)
if page is not None:
serializer = ChangeRequestList(page, many=True)
message = status_message_response(
200,
'success',
'list of User found',
serializer.data
)
return self.get_paginated_response(message)
except Exception as e:
return Response(
{"message": "this endpoint expect a query params department_id"},
status=status.HTTP_400_BAD_REQUEST
)
@property
def paginator(self):
"""
The paginator instance associated with the view, or `None`.
"""
if not hasattr(self, '_paginator'):
if self.pagination_class is None:
self._paginator = None
else:
self._paginator = self.pagination_class()
return self._paginator
def paginate_queryset(self, queryset):
"""
Return a single page of results, or `None` if pagination is disabled.
"""
if self.paginator is None:
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
def get_paginated_response(self, data):
"""
Return a paginated style `Response` object for the given output data.
"""
assert self.paginator is not None
return self.paginator.get_paginated_response(data)
\ No newline at end of file
from rest_framework import serializers
from app.entities.models import Company
class AdminCompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = '__all__'
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company
from django.db.models import Q
class ChangeRequestCompanyFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(Companyname__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = Company
fields = '__all__'
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Company, AllowedCompany
from rest_framework import viewsets, status
from app.businesslayer.company.serializer import AdminCompanySerializer
from app.applicationlayer.utils import CustomPagination, status_message_response
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.company import serializer
from app.applicationlayer.cms.master.company.table_filters import (
ChangeRequestCompanyFilterSet
)
from app.helper.decorators import rms
from rest_framework.response import Response
class ChangeRequestCompanyViewSet(viewsets.ModelViewSet):
queryset = Company.objects.all()
serializer_class = AdminCompanySerializer
pagination_class = CustomPagination
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = ChangeRequestCompanyFilterSet
ordering_fields = '__all__'
search_fields = ('name',)
http_method_names = ['get']
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
allowed = AllowedCompany.objects.filter(
id_number=self.request.user.code
).values('company_pivot')
queryset = queryset.filter(code__in=allowed)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of Company found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
from rest_framework import serializers
from app.entities.models import Department
from django.forms.models import model_to_dict
class AdminDepartmentSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['company'] = model_to_dict(instance.company)
return ret
class Meta:
model = Department
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department
from django.db.models import Q
class ChangeRequestDepartmentFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(Companyname__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = Department
fields = '__all__'
from rest_framework import viewsets, status
from rest_framework.response import Response
from django.forms.models import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Department, AllowedCompany
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.master.department import serializer
from app.applicationlayer.cms.master.department.table_filters import (
ChangeRequestDepartmentFilterSet
)
from app.helper.decorators import rms
from django.db.models import Q
from rest_framework.exceptions import ParseError
class ChangeRequestDepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all()
serializer_class = serializer.AdminDepartmentSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = ChangeRequestDepartmentFilterSet
ordering_fields = '__all__'
search_fields = ('name', 'company__name', 'code')
# @rms.department_list
def list(self, request, *args, **kwargs):
company = self.request.query_params['company_code']
queryset = self.filter_queryset(self.get_queryset())
allowed = AllowedCompany.objects.filter(
Q(id_number=self.request.user.code) &
Q(company_pivot=company)
).values('group_pivots')
queryset = queryset.filter(code__in=allowed)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of Department found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
from app.entities import models
from rest_framework import serializers
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateHeader
fields = '__all__'
\ No newline at end of file
from rest_framework import viewsets, status
from rest_framework.response import Response
from app.entities.models import ChangeRequestTemplateHeader, AllowedCompany
from app.applicationlayer.cms.master.template_list.serializers import ChangeRequestTemplatesSerializer
from app.applicationlayer.utils import CustomPagination, status_message_response
from rest_framework.exceptions import ParseError
class ChangeRequestTemplateHeaderMaster(viewsets.ModelViewSet):
queryset = ChangeRequestTemplateHeader.objects.all()
serializer_class = ChangeRequestTemplatesSerializer
pagination_class = CustomPagination
lookup_field = 'template_no'
def list(self, request, *args, **kwargs):
if "department_code" not in request.query_params:
raise ParseError('department_code is expected at query params')
department = request.query_params['department_code']
permit = AllowedCompany.objects.filter(
group_pivots=department
).count()
if permit <= 0:
raise ParseError('This department is not allowed')
else:
queryset = ChangeRequestTemplateHeader.objects.filter(
created_by_department=department
).order_by('requested_to_template_name')
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
from rest_framework import serializers
from app.entities import models
from django.forms.models import model_to_dict
class ChangeRequestTemplateApproversSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
try:
ret = super().to_representation(instance)
user_object = {
"id": instance.user.id,
"name": instance.user.name,
"username": instance.user.username,
"code": instance.user.code,
"email": instance.user.email,
"contact_no": instance.user.contact_no
}
ret['company'] = model_to_dict(instance.user.department.company)
ret['department'] = model_to_dict(instance.user.department)
ret['user'] = user_object
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['name'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateApprovers
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateApprovers
from django.db.models import Q
class ApproverFilter(filters.FilterSet):
class Meta:
model = ChangeRequestTemplateApprovers
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.template.approver.table_filters import ApproverFilter
from app.applicationlayer.cms.template.approver import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestTemplateApproversViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateApprovers.objects.all()
serializer_class = serializers.ChangeRequestTemplateApproversSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = ApproverFilter
ordering_fields = '__all__'
search_fields = (
'name', 'code',
'department__company__name',
'department__name',
'email', 'contact_no'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates Approvers found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
# comment
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
\ No newline at end of file
from rest_framework import serializers
from app.entities import models
from django.forms.models import model_to_dict
class ChangeRequestTemplateAttachmentsSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
try:
ret = super().to_representation(instance)
user_object = {
"id": instance.uploaded_by.id,
"name": instance.uploaded_by.name,
"username": instance.uploaded_by.username,
"code": instance.uploaded_by.code,
"email": instance.uploaded_by.email,
"contact_no": instance.uploaded_by.contact_no
}
ret['uploaded_by'] = user_object
ret['file_upload'] = self.context['request'].build_absolute_uri(
instance.file_upload.url.url
)
ret['file_upload_id'] = self.context['request'].build_absolute_uri(
instance.file_upload.url
)
return ret
except Exception as e:
ret['uploaded_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateAttachments
# fields = (
# "id",
# "attachment_type",
# "attachment_name",
# "file_name",
# "description",
# "created",
# "code",
# "uploaded_by",
# "file_upload",
# "template_no"
# )
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateAttachments
from django.db.models import Q
class AttachmentFilter(filters.FilterSet):
class Meta:
model = ChangeRequestTemplateAttachments
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.template.attachment.table_filters import AttachmentFilter
from app.applicationlayer.cms.template.attachment import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestTemplateAttachmentsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateAttachments.objects.all()
serializer_class = serializers.ChangeRequestTemplateAttachmentsSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = AttachmentFilter
ordering_fields = '__all__'
search_fields = (
'template_no', 'code',
'file_name',
'description',
'uploaded_by__name'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates Attachments found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
\ No newline at end of file
from rest_framework import serializers
from app.entities import models
from django.forms.models import model_to_dict
class ChangeRequestTemplateDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateDetails
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateDetails
from django.db.models import Q
class DetailsFilter(filters.FilterSet):
class Meta:
model = ChangeRequestTemplateDetails
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.template.details.table_filters import DetailsFilter
from app.applicationlayer.cms.template.details import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestTemplateDetailsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateDetails.objects.all()
serializer_class = serializers.ChangeRequestTemplateDetailsSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = DetailsFilter
ordering_fields = '__all__'
search_fields = (
'code', 'template_no'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates Details found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from django.conf import settings
from django.forms.models import model_to_dict
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
from app.applicationlayer.cms.template.attachment.serializers import ChangeRequestTemplateAttachmentsSerializer
from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer
from django.conf import settings
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
):
tmp_approvers = ChangeRequestTemplateApproversSerializer(
many=True, read_only=True)
tmp_stakes = ChangeRequestTemplateStakeHoldersSerializer(
many=True, read_only=True)
tmp_attachments = ChangeRequestTemplateAttachmentsSerializer(
many=True, read_only=True)
tmp_details = ChangeRequestTemplateDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
requested_to_user_object = {
"id": instance.requested_to_user.id,
"name": instance.requested_to_user.name,
"username": instance.requested_to_user.username,
"code": instance.requested_to_user.code,
"email": instance.requested_to_user.email,
"contact_no": instance.requested_to_user.contact_no
}
ret['requested_to_company_object'] = model_to_dict(instance.requested_to_company)
ret['requested_to_department_object'] = model_to_dict(instance.requested_to_department)
ret['requested_to_user_object'] = requested_to_user_object
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['requested_to_company_object'] = "none"
ret['requested_to_department_object'] = "none"
ret['requested_to_user_object'] = "none"
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
# fields = '__all__'
fields = ('template_no', 'requested_to_template_name',
'requested_to_objective', 'requested_to_target_date',
'requested_to_priority', 'description', 'created',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'created_by_user', 'created_by_department',
'tmp_approvers', 'tmp_stakes', 'tmp_attachments',
'tmp_details')
read_only_fields = ['created', 'template_no']
class ChangeRequestTemplatesSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
fields = '__all__'
read_only_fields = ['created', 'template_no']
\ No newline at end of file
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateHeader
from django.db.models import Q
class HeaderFilterSet(filters.FilterSet):
class Meta:
model = ChangeRequestTemplateHeader
fields = '__all__'
This diff is collapsed.
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from django.forms.models import model_to_dict
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
class ChangeRequestTemplateAttachmentsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestTemplateDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateDetails
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
):
tmp_approvers = ChangeRequestTemplateApproversSerializer(
many=True, read_only=True)
tmp_stakes = ChangeRequestTemplateStakeHoldersSerializer(
many=True, read_only=True)
tmp_attachments = ChangeRequestTemplateAttachmentsSerializer(
many=True, read_only=True)
tmp_details = ChangeRequestTemplateDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
# fields = '__all__'
fields = ('template_no', 'requested_to_template_name',
'requested_to_objective', 'requested_to_target_date',
'requested_to_priority', 'description', 'created',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'created_by_user', 'created_by_department',
'tmp_approvers', 'tmp_stakes', 'tmp_attachments',
'tmp_details')
read_only_fields = ['created', 'template_no']
class ChangeRequestTemplatesSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
fields = '__all__'
read_only_fields = ['created', 'template_no']
from rest_framework import serializers
from app.entities import models
from django.forms.models import model_to_dict
class ChangeRequestTemplateStakeHoldersSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
try:
ret = super().to_representation(instance)
user_object = {
"id": instance.user.id,
"name": instance.user.name,
"username": instance.user.username,
"code": instance.user.code,
"email": instance.user.email,
"contact_no": instance.user.contact_no
}
ret['company'] = model_to_dict(instance.user.department.company)
ret['department'] = model_to_dict(instance.user.department)
ret['user'] = user_object
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['name'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateStakeHolders
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateStakeHolders
from django.db.models import Q
class StakeHolderFilter(filters.FilterSet):
class Meta:
model = ChangeRequestTemplateStakeHolders
fields = '__all__'
from app.entities import models
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.template.stakeholder.table_filters import StakeHolderFilter
from app.applicationlayer.cms.template.stakeholder import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
class ChangeRequestTemplateStakeholdersViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateStakeHolders.objects.all()
serializer_class = serializers.ChangeRequestTemplateStakeHoldersSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = StakeHolderFilter
ordering_fields = '__all__'
search_fields = (
'name', 'code',
'department__company__name',
'department__name',
'email', 'contact_no'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates Stakeholders found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import User
from django.db.models import Q
class AccountFilterset(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = User
fields = '__all__'
This diff is collapsed.
from rest_framework import serializers
from app.entities.models import Application
import ast
class ApplicationSerializer(serializers.ModelSerializer):
class Meta:
model = Application
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Application
from django.db.models import Q
class ApplicationFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = Application
fields = '__all__'
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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