Commit 5b7beb73 authored by Gladys Forte's avatar Gladys Forte

Merge branch 'product-staging' into 'product-demo'

Product staging

See merge request rms/Backend/api-main-service!1029
parents 05fa1631 dfef78c8
from app.entities.models import AMSAsset
from rest_framework import serializers
class AMSAssetSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['asset_type'] = instance.asset_type.name
ret['in_qty'] = instance.ams_asset_to_assetdetail.filter(status='In-Store').count()
ret['out_qty'] = instance.ams_asset_to_assetdetail.filter(status='Deployed').count()
ret['unavailable'] = instance.ams_asset_to_assetdetail.filter(
status__in=['Faulty', 'Returned', 'Written Off']
).count()
ret['created_by'] = instance.created_by.name
return ret
class Meta:
model = AMSAsset
fields = '__all__'
from django_filters import rest_framework as filters
from app.entities.models import AMSAsset
class AMSAssetFilter(filters.FilterSet):
class Meta:
model = AMSAsset
fields = '__all__'
from app.entities.models import AMSAsset, AMSAssetType
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.ams.asset.table_filters import AMSAssetFilter
from app.applicationlayer.ams.asset_stock.serializers import AMSAssetStockSerializer
from app.applicationlayer.ams.asset import serializers
from django.db import transaction
from app.applicationlayer.utils import(
CustomPagination, status_message_response
)
from rest_framework.decorators import action
from app.applicationlayer.utils import log_save, enums
from app.applicationlayer.utils import model_to_dict
from django.db import IntegrityError
from django.db.models import Q
from app.helper.decorators import AssetValidation
class AMSAssetViewSet(viewsets.ModelViewSet):
queryset = AMSAsset.objects.all()
serializer_class = serializers.AMSAssetSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (
DjangoFilterBackend, SearchFilter,
OrderingFilter
)
ordering_fields = '__all__'
search_filter = (
'code',
'name',
'asset_type__name'
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()).filter(is_active=True)
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 Asset 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
)
@AssetValidation
@transaction.atomic
def create(self, request, *args, **kwargs):
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(data=form)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Asset created', serializer.data
)
return Response(
message
)
@AssetValidation
@transaction.atomic
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(instance, data=form, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAsset.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
except IntegrityError as e:
return Response(
{"message": "Cannot delete or update this reocrd it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
if instance.ams_asset_to_assetdetail.count() > 0:
message = status_message_response(
400, 'Failed',
'This Asset had an Asset Stocks', model_to_dict(instance)
)
return Response(
message,
status=status.HTTP_400_BAD_REQUEST
)
instance.is_active = False
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.AMSAsset.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@action(
methods=['PATCH'], detail=True,
url_path='restore', url_name='restore'
)
def restore(self, request, code=None):
try:
instance = self.get_object()
instance.is_active = True
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAsset.value,
new_instance['id'],
new_instance,
''
)
message = status_message_response(
200, 'success',
'Archived Asset restored',
''
)
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)
@action(methods=['GET'], detail=True,
url_path='stock-list', url_name='stock_list')
def stock_list(self, request, code):
self.serializer_class = AMSAssetStockSerializer
queryset = self.get_object().ams_asset_to_assetdetail.all()
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 Archived Assets 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
)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
)
def archived(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(is_active=False)
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 Archived Assets 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
)
\ No newline at end of file
from app.entities import models from app.entities import models
from rest_framework import serializers from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from django.db.models import Q
class AssetGroupSerializerList(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['asset_type_count'] = instance.ams_asset_to_assetgroup.values('asset__asset_type').distinct().count()
ret['asset_count'] = instance.ams_asset_to_assetgroup.values('asset').distinct().count()
ret['asset_stock_count'] = instance.ams_asset_to_assetgroup.count()
return ret
class Meta:
model = models.AMSAssetGroup
fields = '__all__'
read_only_fields = ['created', 'code']
class AssetGroupSerializer(serializers.ModelSerializer): class AssetGroupSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['asset_type_count'] = instance.ams_asset_to_assetgroup.values('asset__asset_type').distinct().count()
ret['asset_count'] = instance.ams_asset_to_assetgroup.values('asset').distinct().count()
ret['asset_stock_count'] = instance.ams_asset_to_assetgroup.count()
ret['own'] = instance.ams_asset_to_assetgroup.filter(acquisition_type='Owned').count()
ret['loan'] = instance.ams_asset_to_assetgroup.filter(acquisition_type='Loan').count()
ret['in_qty'] = instance.ams_asset_to_assetgroup.filter(status='In-Store').count()
ret['out_qty'] = instance.ams_asset_to_assetgroup.filter(status='Deployed').count()
ret['unavailable'] = instance.ams_asset_to_assetgroup.filter(
status__in=['Faulty', 'Returned', 'Written Off']
).count()
ret['in_store'] = instance.ams_asset_to_assetgroup.filter(status='In-Store').count()
ret['deployed'] = instance.ams_asset_to_assetgroup.filter(status='Deployed').count()
ret['returned'] = instance.ams_asset_to_assetgroup.filter(status='Returned').count()
ret['written_off'] = instance.ams_asset_to_assetgroup.filter(status='Written Off').count()
ret['faulty'] = instance.ams_asset_to_assetgroup.filter(status='Faulty').count()
return ret
class Meta: class Meta:
model = models.AssetGroup model = models.AMSAssetGroup
fields = '__all__' fields = '__all__'
read_only_fields = ['created', 'code'] read_only_fields = ['created', 'code']
\ No newline at end of file
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import AssetGroup from app.entities.models import AMSAssetGroup
class AssetGroupFilter(filters.FilterSet): class AssetGroupFilter(filters.FilterSet):
class Meta: class Meta:
model = AssetGroup model = AMSAssetGroup
fields = '__all__' fields = '__all__'
...@@ -11,24 +11,31 @@ from app.applicationlayer.utils import ( ...@@ -11,24 +11,31 @@ from app.applicationlayer.utils import (
) )
from app.helper import decorators from app.helper import decorators
from django.db import transaction from django.db import transaction
from rest_framework.decorators import action
from app.applicationlayer.utils import log_save, enums
from app.applicationlayer.utils import model_to_dict
from app.helper.decorators import AssetGroupValidation
from django.db import IntegrityError
class AssetGroupViewset(viewsets.ModelViewSet): class AssetGroupViewset(viewsets.ModelViewSet):
queryset = models.AMSAssetGroup.objects.all()
queryset = models.AssetGroup.objects.all()
serializer_class = serializers.AssetGroupSerializer serializer_class = serializers.AssetGroupSerializer
pagination_class = CustomPagination pagination_class = CustomPagination
lookup_field = "code" lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
ordering_fields = '__all__' ordering_fields = '__all__'
search_fields = ( search_fields = (
'code', 'name', 'asset_group' 'code', 'name'
) )
@AssetGroupValidation
@transaction.atomic @transaction.atomic
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=form)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
self.perform_create(serializer) self.perform_create(serializer)
...@@ -41,8 +48,39 @@ class AssetGroupViewset(viewsets.ModelViewSet): ...@@ -41,8 +48,39 @@ class AssetGroupViewset(viewsets.ModelViewSet):
message message
) )
# @AssetGroupValidation
@transaction.atomic
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(instance, data=form, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAssetGroup.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
except IntegrityError as e:
return Response(
{"message": "Cannot delete or update this record it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
self.serializer_class = serializers.AssetGroupSerializerList
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
...@@ -75,6 +113,91 @@ class AssetGroupViewset(viewsets.ModelViewSet): ...@@ -75,6 +113,91 @@ class AssetGroupViewset(viewsets.ModelViewSet):
def destroy(self, request, *args, **kwargs): def destroy(self, request, *args, **kwargs):
instance = self.get_object() instance = self.get_object()
self.perform_destroy(instance) if instance.ams_asset_to_assetgroup.count() > 0:
message = status_message_response(
400, 'Failed',
'This Asset Group had an Asset Stocks', model_to_dict(instance)
)
return Response(
message,
status=status.HTTP_400_BAD_REQUEST
)
instance.is_active = False
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.AMSAssetGroup.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
)
def archived(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(is_active=False)
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 Archived Asset Groups 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
)
@action(
methods=['PATCH'], detail=True,
url_path='restore', url_name='restore'
)
def restore(self, request, code=None):
try:
instance = self.get_object()
instance.is_active = True
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAssetGroup.value,
new_instance['id'],
new_instance,
''
)
message = status_message_response(
200, 'success',
'Archived Asset Group restored',
''
)
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)
from app.entities.models import AMSAssetStock
from rest_framework import serializers
class AMSAssetStockSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['asset_group'] = instance.asset_group.name
ret['asset'] = instance.asset.name
ret['asset_type'] = instance.asset.asset_type.name
ret['manager'] = instance.manager.name
ret['user_client'] = instance.user_client.name
# ret['created_by'] = {
# "name": instance.created_by.name,
# "code": instance.created_by.code
# }
return ret
class Meta:
model = AMSAssetStock
fields = '__all__'
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import AMSAssetStock
class AMSAssetStockFilter(filters.FilterSet):
class Meta:
model = AMSAssetStock
fields = '__all__'
\ No newline at end of file
from app.entities.models import AMSAssetStock
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.ams.asset_stock.table_filters import AMSAssetStockFilter
from app.applicationlayer.ams.asset_stock import serializers
from django.db import transaction
from app.applicationlayer.utils import(
CustomPagination, status_message_response
)
from rest_framework.decorators import action
from app.applicationlayer.utils import log_save, enums
from app.applicationlayer.utils import model_to_dict
from django.db import IntegrityError
from django.db.models import Q
from app.helper.decorators import AssetStockValidation
from django.db.models import Count
class AMSAssetStockViewSet(viewsets.ModelViewSet):
queryset = AMSAssetStock.objects.all()
serializer_class = serializers.AMSAssetStockSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (
DjangoFilterBackend, SearchFilter,
OrderingFilter
)
ordering_fields = '__all__'
search_filter = (
'code',
'name',
'asset_group__name',
'asset__name',
'asset_type__name',
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()).filter(is_active=True)
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 Asset Stock list 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
)
@action(detail=False,
methods=['get'],
url_path='dashboard',
name="Dashboard Summary")
def dashboard_asset(self, request):
in_store = self.queryset.filter(
status__iexact='In-Store'
).count()
deployed = self.queryset.filter(
status__iexact='Deployed'
).count()
returned = self.queryset.filter(
status__iexact='Returned'
).count()
written_off = self.queryset.filter(
status__iexact='Written Off'
).count()
faulty = self.queryset.filter(
status__iexact='Faulty'
).count()
in_qty = self.queryset.filter(
status__iexact='In-Store'
).count()
out_qty = self.queryset.filter(
status__iexact='Deployed'
).count()
unavailable = self.queryset.filter(
status__iexact=['Faulty', 'Returned', 'Written Off']
).count()
top_asset_groups = self.queryset.values('asset_group__name', 'asset_group', 'asset').annotate(
asset_type_count=Count('asset__asset_type'),
asset_count=Count('asset'),
asset_stock_count=Count('asset_group')).order_by('-asset_group')
recent_reports = 0
message = {
'in_store': in_store,
'deployed': deployed,
'returned': returned,
'written_off': written_off,
'faulty': faulty,
'in_qty': in_qty,
'out_qty': out_qty,
'unavailable': unavailable,
'top_asset_groups': top_asset_groups,
'recent_reports': recent_reports,
'code': 200,
'status': 'success',
'message': 'Dashboard Summary'
}
return Response(message, status=status.HTTP_200_OK)
@AssetStockValidation
@transaction.atomic
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(instance, data=form, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReport.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
except IntegrityError as e:
return Response(
{"message": "Cannot delete or update this reocrd it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
@AssetStockValidation
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Asset Stock created', serializer.data
)
return Response(
message
)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
instance.is_active = False
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAssetStock.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
)
def archived(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(is_active=False)
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 Archived Asset Stocks 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
)
@action(
methods=['PATCH'], detail=True,
url_path='restore', url_name='restore'
)
def restore(self, request, code=None):
try:
instance = self.get_object()
instance.is_active = True
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAssetStock.value,
new_instance['id'],
new_instance,
''
)
message = status_message_response(
200, 'success',
'Archived Asset Stock restored',
''
)
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)
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class AssetTypeSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
assets = instance.ams_asset_type.select_related()
# assets1 = instance.ams_asset_type.count()
# asset_stock1 = instance.ams_asset_type.values('')
# ams_asset_to_assetdetail
# print(assets1)
ams_stock_counter = 0
for asset in assets:
ams_stock_counter = ams_stock_counter + models.AMSAsset.objects.get(code=asset.code).ams_asset_to_assetdetail.count()
ret['asset_count'] = assets.count()
ret['asset_stock_count'] = ams_stock_counter
return ret
class Meta:
model = models.AMSAssetType
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 AMSAssetType
class AssetTypeFilter(filters.FilterSet):
class Meta:
model = AMSAssetType
fields = '__all__'
\ No newline at end of file
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.ams.asset_type.table_filters import AssetTypeFilter
from app.applicationlayer.ams.asset_type import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from app.helper import decorators
from django.db import transaction
from rest_framework.decorators import action
from app.applicationlayer.utils import model_to_dict
from app.applicationlayer.utils import log_save, enums
from app.applicationlayer.utils import model_to_dict
from app.helper.decorators import AssetTypeValidation
from django.db import IntegrityError
class AssetTypeViewset(viewsets.ModelViewSet):
queryset = models.AMSAssetType.objects.all()
serializer_class = serializers.AssetTypeSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
ordering_fields = '__all__'
search_fields = (
'code', 'name'
)
@AssetTypeValidation
@transaction.atomic
def create(self, request, *args, **kwargs):
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(data=form)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Asset Type created', serializer.data
)
return Response(
message
)
# @AssetTypeValidation
@transaction.atomic
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(instance, data=form, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAsset.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
except IntegrityError as e:
return Response(
{"message": "Cannot delete or update this record it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
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 Asset Types 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)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
if instance.ams_asset_type.count() > 0:
message = status_message_response(
400, 'Failed',
'This Asset Type had an Assets', model_to_dict(instance)
)
return Response(
message,
status=status.HTTP_400_BAD_REQUEST
)
instance.is_active = False
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.AMSAssetType.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
)
def archived(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(is_active=False)
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 Archived Asset Types 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
)
@action(
methods=['PATCH'], detail=True,
url_path='restore', url_name='restore'
)
def restore(self, request, code=None):
try:
instance = self.get_object()
instance.is_active = True
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSAssetType.value,
new_instance['id'],
new_instance,
''
)
message = status_message_response(
200, 'success',
'Archived Asset Type restored',
''
)
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)
\ No newline at end of file
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class AMSReportSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['created_by'] = instance.created_by.name
ret['report_type'] = instance.report_type.name
ret['unique_identifier'] = instance.asset_stock.unique_identifier
ret['asset'] = instance.asset_stock.asset.name
ret['asset_type'] = instance.asset_stock.asset.asset_type.name
del ret['asset_stock']
return ret
class Meta:
model = models.AMSReport
fields = '__all__'
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import AMSReport
class AMSReportFilter(filters.FilterSet):
class Meta:
model = AMSReport
fields = '__all__'
\ No newline at end of file
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.ams.report.table_filters import AMSReportFilter
from app.applicationlayer.ams.report import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from app.helper import decorators
from django.db import transaction
from app.applicationlayer.utils import model_to_dict
from app.applicationlayer.utils import log_save, enums
from django.db import IntegrityError
from rest_framework.decorators import action
class AMSReportViewset(viewsets.ModelViewSet):
queryset = models.AMSReport.objects.all()
serializer_class = serializers.AMSReportSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
ordering_fields = '__all__'
search_fields = (
'code', 'name'
)
@transaction.atomic
def create(self, request, *args, **kwargs):
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(data=form)
# serializer.is_valid(raise_exception=True)
if serializer.is_valid(raise_exception=True):
serializer.save(created_by=self.request.user)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Report created', serializer.data
)
return Response(
message
)
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(instance, data=form, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReport.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
except IntegrityError as e:
print(e)
return Response(
{"message": "Cannot delete or update this reocrd it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()).filter(is_active=True)
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 Report 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)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
instance.is_active = False
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReport.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
)
def archived(self, request, *args, **kwargs):
self.serializer_class = serializers.AMSReportSerializer
queryset = self.filter_queryset(self.queryset).filter(is_active=False)
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 Archived Report 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
)
@action(
methods=['PATCH'], detail=True,
url_path='restore', url_name='restore'
)
def restore(self, request, code=None):
try:
instance = self.get_object()
instance.is_active = True
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReport.value,
new_instance['id'],
new_instance,
''
)
message = status_message_response(
200, 'success',
'Archived Report restored',
''
)
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)
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class AMSReportTypeSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['created_by'] = instance.created_by.name
return ret
class Meta:
model = models.AMSReportType
fields = '__all__'
\ No newline at end of file
from django_filters import rest_framework as filters
from app.entities.models import AMSReportType
class AMSReportTypeFilter(filters.FilterSet):
class Meta:
model = AMSReportType
fields = '__all__'
\ No newline at end of file
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.ams.report_type.table_filters import AMSReportTypeFilter
from app.applicationlayer.ams.report_type import serializers
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from app.helper import decorators
from django.db import transaction
from app.applicationlayer.utils import model_to_dict
from app.applicationlayer.utils import log_save, enums
from django.db import IntegrityError
from rest_framework.decorators import action
class AMSReportTypeViewset(viewsets.ModelViewSet):
queryset = models.AMSReportType.objects.all()
serializer_class = serializers.AMSReportTypeSerializer
pagination_class = CustomPagination
lookup_field = "code"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
ordering_fields = '__all__'
search_fields = (
'code', 'name'
)
@transaction.atomic
def create(self, request, *args, **kwargs):
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(data=form)
# serializer.is_valid(raise_exception=True)
if serializer.is_valid(raise_exception=True):
serializer.save(created_by=self.request.user)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Report Type created', serializer.data
)
return Response(
message
)
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(instance, data=form, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReportType.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
except IntegrityError as e:
print(e)
return Response(
{"message": "Cannot delete or update this reocrd it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.queryset).filter(is_active=True)
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 Report Types 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)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
instance.is_active = False
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReportType.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
)
def archived(self, request, *args, **kwargs):
self.serializer_class = serializers.AMSReportTypeSerializer
queryset = self.filter_queryset(self.queryset).filter(is_active=False)
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 Archived Report type 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
)
@action(
methods=['PATCH'], detail=True,
url_path='restore', url_name='restore'
)
def restore(self, request, code=None):
try:
instance = self.get_object()
instance.is_active = True
instance.save()
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReportType.value,
new_instance['id'],
new_instance,
''
)
message = status_message_response(
200, 'success',
'Archived Report Type restored',
''
)
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)
...@@ -6,11 +6,21 @@ from rest_framework.urlpatterns import format_suffix_patterns ...@@ -6,11 +6,21 @@ from rest_framework.urlpatterns import format_suffix_patterns
from app.applicationlayer.ams.asset_group import views as assetgroup from app.applicationlayer.ams.asset_group import views as assetgroup
from app.applicationlayer.ams.ams_privilege import views as amsprivilege from app.applicationlayer.ams.ams_privilege import views as amsprivilege
from app.applicationlayer.ams.ams_user_type.views import AMSUserTypeViewSet from app.applicationlayer.ams.ams_user_type.views import AMSUserTypeViewSet
from app.applicationlayer.ams.asset_type import views as assettype
from app.applicationlayer.ams.asset.views import AMSAssetViewSet
from app.applicationlayer.ams.asset_stock.views import AMSAssetStockViewSet
from app.applicationlayer.ams.report_type.views import AMSReportTypeViewset
from app.applicationlayer.ams.report.views import AMSReportViewset
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'asset-group', assetgroup.AssetGroupViewset) router.register(r'asset-group', assetgroup.AssetGroupViewset)
router.register(r'asset-type', assettype.AssetTypeViewset)
router.register(r'ams-privilege', amsprivilege.AMSPrivilegeViewSet) router.register(r'ams-privilege', amsprivilege.AMSPrivilegeViewSet)
router.register(r'asset', AMSAssetViewSet)
router.register(r'asset-stock', AMSAssetStockViewSet)
router.register(r'report-type', AMSReportTypeViewset)
router.register(r'report', AMSReportViewset)
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),
......
...@@ -111,7 +111,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -111,7 +111,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
"requested_to_user__name", "requested_to_template_name", "requested_to_user__name", "requested_to_template_name",
"requested_to_objective", "requested_to_priority", "description" "requested_to_objective", "requested_to_priority", "description"
) )
# comment
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
self.serializer_class = ChangeRequestFormHeaderSerializerList self.serializer_class = ChangeRequestFormHeaderSerializerList
...@@ -753,6 +753,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -753,6 +753,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
form_code = kwargs['form_code'] form_code = kwargs['form_code']
form_data = request.data form_data = request.data
old_template_code = instance.template_no.template_no
# generate batchno history # generate batchno history
batchno = get_max_batchno("batch") batchno = get_max_batchno("batch")
...@@ -795,6 +797,9 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -795,6 +797,9 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
new_instance new_instance
) )
new_template_code = serializer.validated_data['template_no'].template_no
if old_template_code == new_template_code:
change_request.form_add_edit_delete( change_request.form_add_edit_delete(
form_data['frm_approvers'], form_data['frm_approvers'],
models.ChangeRequestFormApprovers, models.ChangeRequestFormApprovers,
...@@ -806,6 +811,18 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -806,6 +811,18 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
batchno, batchno,
enums.CREnum.SAVE.value enums.CREnum.SAVE.value
) )
else:
change_request.form_add_edit_delete_for_draft(
form_data['frm_approvers'],
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SAVE.value
)
change_request.form_add_edit_delete( change_request.form_add_edit_delete(
form_data['frm_stakes'], form_data['frm_stakes'],
......
...@@ -17,7 +17,8 @@ from app.applicationlayer.utils import model_to_dict ...@@ -17,7 +17,8 @@ from app.applicationlayer.utils import model_to_dict
from app.entities.models import ( from app.entities.models import (
User, EntityLog, PasswordReset, Application, UserImage, User, EntityLog, PasswordReset, Application, UserImage,
ChangeRequestFormHeader, ChangeRequestTemplateHeader, ChangeRequestFormHeader, ChangeRequestTemplateHeader,
AllowedCompany, Company, Department, UserHistory AllowedCompany, Company, Department, UserHistory,
AMSPrivilege
) )
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
...@@ -32,6 +33,12 @@ from app.applicationlayer.utils import ( ...@@ -32,6 +33,12 @@ from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save, CustomPagination, status_message_response, log_save,
main_threading main_threading
) )
import os
import configparser
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
class UserViewSet(viewsets.ModelViewSet): class UserViewSet(viewsets.ModelViewSet):
...@@ -181,7 +188,6 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -181,7 +188,6 @@ class UserViewSet(viewsets.ModelViewSet):
partial = kwargs.pop('partial', False) partial = kwargs.pop('partial', False)
instance = self.get_object() instance = self.get_object()
cms_form = ChangeRequestFormHeader.objects.filter( cms_form = ChangeRequestFormHeader.objects.filter(
Q(frm_approvers__user__code=instance.code) | Q(frm_approvers__user__code=instance.code) |
Q(frm_stakes__user__code=instance.code) | Q(frm_stakes__user__code=instance.code) |
...@@ -220,16 +226,25 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -220,16 +226,25 @@ class UserViewSet(viewsets.ModelViewSet):
rms = Application.objects.filter(id=1).values('code').first() rms = Application.objects.filter(id=1).values('code').first()
app.append(rms['code']) app.append(rms['code'])
app = Application.objects.filter( app_data = Application.objects.filter(
code__in=app code__in=app
) )
if not config['APPLICATION_CODE']['AMS'] in app:
ams_priv = AMSPrivilege.objects.filter(
id_number=instance.code
).delete()
if not config['APPLICATION_CODE']['CMS'] in app:
cms_priv = AllowedCompany.objects.filter(
id_number=instance.code
).delete()
instance = User.objects.get( instance = User.objects.get(
id=serializer.data['id'] id=serializer.data['id']
) )
instance.application.set(app_data)
instance.application.set(app)
new_instance = serializer.data new_instance = serializer.data
log_save( log_save(
......
...@@ -368,6 +368,55 @@ def form_add_edit_delete(form_request_body, ...@@ -368,6 +368,55 @@ def form_add_edit_delete(form_request_body,
return True return True
def form_add_edit_delete_for_draft(form_request_body,
queryset,
entity,
serializer_data,
partial,
self,
form_code,
batch_no,
main_action):
delete_query = queryset.objects.filter(
form_code=form_code
)
if delete_query.count() > 0:
crhistory_log_bulk_delete(delete_query,
entity,
queryset,
form_code,
batch_no,
main_action
)
for i in form_request_body:
frm_code = {
"form_code": form_code
}
data = {**i, **frm_code}
serializer = serializer_data(data=data,
context={"request": self.request})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
new_instance = serializer.data
crhistory_save(
batch_no,
main_action,
enums.CREnum.ADD.value,
entity,
form_code,
None,
new_instance
)
return True
def attachment_add_edit_delete(form_request_body, def attachment_add_edit_delete(form_request_body,
queryset, queryset,
entity, entity,
......
...@@ -31,13 +31,17 @@ class GenerateCode(Enum): ...@@ -31,13 +31,17 @@ class GenerateCode(Enum):
FORM_DETAIL = 'FRMDETAIL' FORM_DETAIL = 'FRMDETAIL'
ETL = 'ETL' ETL = 'ETL'
# ASSET_GROUP = 'AMSGRP'
CMS_SETTINGS = "CMSSET" CMS_SETTINGS = "CMSSET"
ASSET_TYPE = 'ASSTTYPE' ASSET_TYPE = 'ASSTTYPE'
ASSET = 'ASST' ASSET = 'ASST'
ASSET_STOCK = 'ASSTSTOCK' ASSET_STOCK = 'ASSTSTOCK'
ASSET_GROUP = 'ASSTGRP' ASSET_GROUP = 'ASSTGRP'
ASSET_STOCK_SUPPORT = 'ASSTSTOCKSUP'
REPORT_TYPE = 'RPTTYPE'
REPORT = 'RPT'
FORM_ASSET = 'FRMASSET'
''' '''
********* *********
...@@ -72,6 +76,15 @@ class LogEntitiesEnum(Enum): ...@@ -72,6 +76,15 @@ class LogEntitiesEnum(Enum):
ChangeRequestFormDetails = "ChangeRequestFormDetails" ChangeRequestFormDetails = "ChangeRequestFormDetails"
ChangeRequestSettings = 'ChangeRequestSettings' ChangeRequestSettings = 'ChangeRequestSettings'
AMSReportType = 'AMSReportType'
AMSReport = 'AMSReport'
AMSAsset = 'AMSAsset'
AMSAssetStock = 'AMSAssetStock'
AMSAssetStockSupport = 'AMSAssetStockSupport'
AMSAssetType = 'AMSAssetType'
AMSAssetGroup = 'AMSAssetGroup'
''' '''
********* *********
CR HISTORY ENUMS CR HISTORY ENUMS
......
This diff is collapsed.
# Generated by Django 2.2 on 2020-03-18 15:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0006_auto_20200318_1314'),
]
operations = [
migrations.AlterField(
model_name='entitylog',
name='entity',
field=models.CharField(choices=[('USER', 'USER'), ('APPLICATION', 'APPLICATION'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('MODULE', 'MODULE'), ('DELEGATION', 'DELEGATION'), ('ChangeRequestTemplateHeader', 'ChangeRequestTemplateHeader'), ('ChangeRequestTemplateApprovers', 'ChangeRequestTemplateApprovers'), ('ChangeRequestTemplateStakeHolders', 'ChangeRequestTemplateStakeHolders'), ('ChangeRequestTemplateAttachments', 'ChangeRequestTemplateAttachments'), ('ChangeRequestTemplateDetails', 'ChangeRequestTemplateDetails'), ('ChangeRequestFormHeader', 'ChangeRequestFormHeader'), ('ChangeRequestFormApprovers', 'ChangeRequestFormApprovers'), ('ChangeRequestFormStakeHolders', 'ChangeRequestFormStakeHolders'), ('ChangeRequestFormAttachments', 'ChangeRequestFormAttachments'), ('ChangeRequestFormDetails', 'ChangeRequestFormDetails'), ('ChangeRequestSettings', 'ChangeRequestSettings'), ('AMSReportType', 'AMSReportType'), ('AMSReport', 'AMSReport'), ('AMSASSET', 'AMSASSET')], default='Add', max_length=50),
),
]
# Generated by Django 2.2 on 2020-03-18 15:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0007_auto_20200318_1535'),
]
operations = [
migrations.AlterField(
model_name='entitylog',
name='entity',
field=models.CharField(choices=[('USER', 'USER'), ('APPLICATION', 'APPLICATION'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('MODULE', 'MODULE'), ('DELEGATION', 'DELEGATION'), ('ChangeRequestTemplateHeader', 'ChangeRequestTemplateHeader'), ('ChangeRequestTemplateApprovers', 'ChangeRequestTemplateApprovers'), ('ChangeRequestTemplateStakeHolders', 'ChangeRequestTemplateStakeHolders'), ('ChangeRequestTemplateAttachments', 'ChangeRequestTemplateAttachments'), ('ChangeRequestTemplateDetails', 'ChangeRequestTemplateDetails'), ('ChangeRequestFormHeader', 'ChangeRequestFormHeader'), ('ChangeRequestFormApprovers', 'ChangeRequestFormApprovers'), ('ChangeRequestFormStakeHolders', 'ChangeRequestFormStakeHolders'), ('ChangeRequestFormAttachments', 'ChangeRequestFormAttachments'), ('ChangeRequestFormDetails', 'ChangeRequestFormDetails'), ('ChangeRequestSettings', 'ChangeRequestSettings'), ('AMSReportType', 'AMSReportType'), ('AMSReport', 'AMSReport'), ('AMSAsset', 'AMSAsset'), ('AMSAssetStock', 'AMSAssetStock'), ('AMSAssetStockSupport', 'AMSAssetStockSupport')], default='Add', max_length=50),
),
]
# Generated by Django 2.2 on 2020-03-18 17:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0008_auto_20200318_1545'),
]
operations = [
migrations.AlterField(
model_name='entitylog',
name='entity',
field=models.CharField(choices=[('USER', 'USER'), ('APPLICATION', 'APPLICATION'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('MODULE', 'MODULE'), ('DELEGATION', 'DELEGATION'), ('ChangeRequestTemplateHeader', 'ChangeRequestTemplateHeader'), ('ChangeRequestTemplateApprovers', 'ChangeRequestTemplateApprovers'), ('ChangeRequestTemplateStakeHolders', 'ChangeRequestTemplateStakeHolders'), ('ChangeRequestTemplateAttachments', 'ChangeRequestTemplateAttachments'), ('ChangeRequestTemplateDetails', 'ChangeRequestTemplateDetails'), ('ChangeRequestFormHeader', 'ChangeRequestFormHeader'), ('ChangeRequestFormApprovers', 'ChangeRequestFormApprovers'), ('ChangeRequestFormStakeHolders', 'ChangeRequestFormStakeHolders'), ('ChangeRequestFormAttachments', 'ChangeRequestFormAttachments'), ('ChangeRequestFormDetails', 'ChangeRequestFormDetails'), ('ChangeRequestSettings', 'ChangeRequestSettings'), ('AMSReportType', 'AMSReportType'), ('AMSReport', 'AMSReport'), ('AMSAsset', 'AMSAsset'), ('AMSAssetStock', 'AMSAssetStock'), ('AMSAssetStockSupport', 'AMSAssetStockSupport'), ('AMSAssetType', 'AMSAssetType'), ('AMSAssetGroup', 'AMSAssetGroup')], default='Add', max_length=50),
),
]
This diff is collapsed.
...@@ -18,6 +18,7 @@ from app.businesslayer.changerequest.change_request_template import ( ...@@ -18,6 +18,7 @@ from app.businesslayer.changerequest.change_request_template import (
validation_vendor_unique_level validation_vendor_unique_level
) )
from app.applicationlayer.utils import error_message from app.applicationlayer.utils import error_message
from app.entities import models
def error_safe(function): def error_safe(function):
...@@ -414,3 +415,189 @@ def FormValidation(function): ...@@ -414,3 +415,189 @@ def FormValidation(function):
return function(self, request, *args, **kwargs) return function(self, request, *args, **kwargs)
return wrapper return wrapper
def AssetValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
form = request.data
if 'name' not in form:
return error_message(
'400', "The key name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
if len(form['name']) == 0:
return error_message(
'400', "Asset name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
check_existing = models.AMSAsset.objects.filter(name=form['name']).count()
if check_existing >= 1:
return error_message(
'400', "Asset with this name already exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
if 'asset_type' not in form:
return error_message(
'400', "The key asset_type is required",
'failed', status.HTTP_400_BAD_REQUEST
)
valid_asset_type = models.AMSAssetType.objects.filter(
Q(code=form['asset_type']) &
Q(is_active=True)
).count()
if valid_asset_type <= 0:
return error_message(
'400', "Invalid Asset Type",
'failed', status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
return wrapper
def AssetStockValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
form = request.data
fields = ["asset_type"]
fields.append("unique_identifier")
fields.append("status")
fields.append( "acquisition_type")
fields.append("location")
fields.append("user_client")
fields.append("manager")
fields.append("dynamic_field")
fields.append("asset_group")
fields.append("asset")
print(fields)
for data in fields:
if str(data) not in form:
return error_message(
'400', f"The key {data.replace('_', ' ')} is required",
'failed', status.HTTP_400_BAD_REQUEST
)
for data in form.keys():
if str(data) != 'dynamic_field':
if len(data) == 0:
return error_message(
'400', f"{data.replace('_', ' ')} is required",
'failed', status.HTTP_400_BAD_REQUEST
)
unique_identifier = models.AMSAssetStock.objects.filter(
unique_identifier=form['unique_identifier']
).count()
if unique_identifier >= 1:
return error_message(
'400', "unique identifier already exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
user_client = models.User.objects.filter(
code=form['user_client']
).count()
if user_client <= 0:
return error_message(
'400', "User does not exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
manager = models.User.objects.filter(
code=form['manager']
).count()
if manager <= 0:
return error_message(
'400', "User for manager does not exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
asset = models.AMSAsset.objects.filter(
code=form['asset']
).count()
if asset <= 0:
return error_message(
'400', "Asset does not exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
asset_group = models.AMSAssetGroup.objects.filter(
code=form['asset_group']
).count()
if asset_group <= 0:
return error_message(
'400', "Asset Group does not exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
valid_asset_type = models.AMSAssetType.objects.filter(
Q(code=form['asset_type']) &
Q(is_active=True)
).count()
if valid_asset_type <= 0:
return error_message(
'400', "Invalid Asset Type",
'failed', status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
return wrapper
def AssetGroupValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
form = request.data
if 'name' not in form:
return error_message(
'400', "The key name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
if len(form['name']) == 0:
return error_message(
'400', "Asset Group name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
check_existing = models.AMSAssetGroup.objects.filter(name=form['name']).count()
if check_existing >= 1:
return error_message(
'400', "Asset Group with this name already exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
return wrapper
def AssetTypeValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
form = request.data
if 'name' not in form:
return error_message(
'400', "The key name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
if len(form['name']) == 0:
return error_message(
'400', "Asset Type name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
check_existing = models.AMSAssetType.objects.filter(name=form['name']).count()
if check_existing >= 1:
return error_message(
'400', "Asset Type with this name already exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
return wrapper
\ No newline at end of file
...@@ -22,7 +22,6 @@ cluster = api ...@@ -22,7 +22,6 @@ cluster = api
cms_notification = cms_notification cms_notification = cms_notification
[NOTIFICATION_EMAIL] [NOTIFICATION_EMAIL]
APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED
REQUESTOR_MESSAGE = has APPROVED the change request;RMS-CRAPPROVED REQUESTOR_MESSAGE = has APPROVED the change request;RMS-CRAPPROVED
...@@ -35,3 +34,9 @@ VENDOR_REJECT_MESSAGE = has REJECTED the change request;RMS-CRREJECTED-VENDOR ...@@ -35,3 +34,9 @@ VENDOR_REJECT_MESSAGE = has REJECTED the change request;RMS-CRREJECTED-VENDOR
REVISED_MESSAGE = has REJECTED the change request for your revision;RMS-CRREVISED REVISED_MESSAGE = has REJECTED the change request for your revision;RMS-CRREVISED
CANCEL_MESSAGE = has CANCELLED the change request;RMS-CRCANCELLED-USERTRIGGER CANCEL_MESSAGE = has CANCELLED the change request;RMS-CRCANCELLED-USERTRIGGER
APPROVER_REJECT_MESSAGE = has REJECTED the change request for your approval;RMS-CRREJECTED-APPROVER APPROVER_REJECT_MESSAGE = has REJECTED the change request for your approval;RMS-CRREJECTED-APPROVER
[APPLICATION_CODE]
RMS = APP-20190923-0000001
CMS = APP-20190923-0000002
AMS = APP-20190923-0000003
\ No newline at end of file
Username,Name,Company,Department,Department_Code,Email,Contact_No,Application,Default_app,Privilege_Company,Privilege_Department,Privilege_Department_Code,Create_CR,Create_Template,View_All_CR,Approve_CR Username,Name,Company,Department,Department_Code,Email,Contact_No,Application,Default_app,Change_Request_Privilege_Company,Change_Request_Privilege_Department,Change_Request_Privilege_Department_Code,Create_CR,Create_Template,View_All_CR,View_All_CR_Template,Approve_CR,Asset_Management_Privilege_Company,Asset_Management_Privilege_Department,Asset_Management_Privilege_Department_Code,Asset_Management_User_Group
ob-john,John Doe,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,johndoe@gmail.com,123456,"cms,ams",cms,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,Yes,No,Yes,Yes ob-john,John Doe,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,johndoe@gmail.com,123456,"cms,ams",cms,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,Yes,No,Yes,Yes,Yes,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,MANAGER
,,,,,,,,,Please use this department code as reference,,,,,, ,,,,,,,,,Please use this department code as reference,,,,,,,,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,,,, ,,,,,,,,,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,,,,,,,,,
,,,,,,,,,JTC Corporation,Security,DEPARTMENT-20200122-0000002,,,, ,,,,,,,,,JTC Corporation,Security,DEPARTMENT-20200122-0000002,,,,,,,,,
,,,,,,,,,Sample Company,Facilities Management,DEPARTMENT-20200130-0000004,,,, ,,,,,,,,,Sample Company,Facilities Management,DEPARTMENT-20200130-0000004,,,,,,,,,
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
INSERT INTO `applications` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `excel_code`) VALUES
(1, '2019-09-23 12:43:33.754098', 'superuser', '2019-09-23 12:43:33.754098', 'superuser', 'APP-20190923-0000001', 'Resource Management System', 'rms'),
(2, '2019-09-23 12:43:40.512905', 'superuser', '2019-09-23 12:43:40.512905', 'superuser', 'APP-20190923-0000002', 'Change Request Management System', 'cms'),
(3, '2019-09-23 12:43:55.957076', 'superuser', '2019-09-23 12:43:55.957076', 'superuser', 'APP-20190923-0000003', 'Asset Management System', 'ams');
INSERT INTO `auth_user` (`id`, `last_login`, `is_superuser`, `first_name`, `last_name`, `is_staff`, `is_active`, `date_joined`, `user_type`, `code`, `name`, `username`, `password`, `contact_no`, `email`, `default_app_id`, `department_id`, `doa_id`) VALUES
(1, '2019-11-25 14:25:06.048963', 1, '', '', 1, 1, '2019-09-23 12:42:37.938304', 'SU', 'USER-20190923-0000001', '', 'superuser', 'pbkdf2_sha256$150000$YLmqqWBQGsJG$r4NYkY05q1zlmgzh106ejBbzd0NY00YEfylllyVQyk0=', NULL, 'red@tirsolutions.com', 'APP-20190923-0000001', 'DEPARTMENT-20190923-0000001', NULL);
INSERT INTO `auth_user_application` (`id`, `user_id`, `application_id`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3);
INSERT INTO `auth_user_images` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `name`, `image`, `is_primary`, `user_id`) VALUES
(11, '2019-10-15 12:27:13.058304', 'superuser', '2019-10-15 12:27:13.058352', 'superuser', '_profile_pic.png', 'user_images/_profile_pic.png', 1, 'USER-20190923-0000001');
INSERT INTO `companies` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `contact_details`) VALUES
(1, '2019-09-23 12:45:31.058709', 'superuser', '2019-10-01 18:10:40.098534', 'superuser', 'COMPANY-20190923-0000001', 'Oneberry Technologies Pte Ltd', '2152509');
DELETE FROM `delegations`;
INSERT INTO `delegations` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`) VALUES
(1, '2019-11-19 17:46:08.984731', 'superuser', '2019-11-19 17:46:08.984731', 'superuser', 'DELEGATION-20191119-0000001', 'Requestor'),
(2, '2019-11-19 17:46:18.010437', 'superuser', '2019-11-19 17:46:18.010437', 'superuser', 'DELEGATION-20191119-0000002', 'Vendor/Implementor'),
(3, '2019-11-19 17:46:26.168693', 'superuser', '2019-11-22 10:03:40.605242', 'superuser', 'DELEGATION-20191119-0000003', 'Head of Department'),
(4, '2019-11-19 17:46:34.020753', 'superuser', '2019-11-19 17:46:34.020753', 'superuser', 'DELEGATION-20191119-0000004', 'SD/OD'),
(5, '2019-11-19 17:46:41.461203', 'superuser', '2019-11-19 17:46:41.462205', 'superuser', 'DELEGATION-20191119-0000005', 'Change Control Board'),
(6, '2019-11-19 17:46:49.472397', 'superuser', '2019-11-19 17:46:49.472397', 'superuser', 'DELEGATION-20191119-0000006', 'Approver'),
(12, '2019-11-21 09:46:42.763973', 'superuser', '2019-11-21 09:46:55.656089', 'superuser', 'DELEGATION-20191121-0000012', 'Facilities Manager'),
(13, '2019-11-21 09:47:04.092120', 'superuser', '2019-11-21 10:08:40.239094', 'superuser', 'DELEGATION-20191121-0000013', 'Move Manager');
INSERT INTO `departments` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `company_id`) VALUES
(1, '2019-09-23 12:45:52.531178', 'superuser', '2019-10-01 18:12:27.956536', 'superuser', 'DEPARTMENT-20190923-0000001', 'Super User', 'COMPANY-20190923-0000001');
INSERT INTO `email_logs` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `template`, `recipients`, `content`, `is_sent`) VALUES
(1, '2019-12-11 15:57:36.338584', 'red@tirsolutions.com', '2019-12-11 15:57:36.338637', 'red@tirsolutions.com', 'RMS-NEWUSER.html', 'tirsamemail+fan@gmail.com', '<!DOCTYPE html>\n<html>\n<head>\n<title>RMS: New User Created</title>\n</head>\n<body style="font-family: arial;">\n\n<h3>Resource Management System &#40;RMS&#41;</h3>\n<h3 style="color:#888888;">New User Created</h3><br>\n\n<p>Dear Rita Fantilga,</p><br>\n<p>You have been created as a new user of RMS. Please see your default login details below.</p><br>\n \n<b>Username</b><br>ob-rita<br><br>\n<b>Password</b><br>xqZgDfBjZR<br><br>\n\n<p>You may change your password through the <u><a href="http://devweb.rmsv2.oneberrysystem.com/cms/profile" style="text-decoration:underline;color:#007bff;" target="_blank">my profile</a></u> section of RMS any time.</p><br>\n \n<p>Sincerely,</p>\n<p>RMS Team</p><br><br>\n \n<p>Powered by</p>\n<img src="https://s3-ap-southeast-1.amazonaws.com/oneberry/img/logo_oneberry.png" class="img-responsive" style="width:150px;height:auto;" />\n \n</body>\n</html>', 1);
INSERT INTO `master_attachments` (`id`, `url`, `attch_ref`) VALUES
(323, 'uploads/RMS_-_Forgot_Password_3_A77aRmz.html', 'url'),
(324, 'uploads/batch_upload.xlsx', 'url'),
(325, 'uploads/batch_upload_rewd8IS.xlsx', 'sa1w1ypu4qbk39jbkek'),
(332, 'uploads/zzzzz7_6yOT3ai.xlsx', 'url'),
(374, 'uploads/instruction.pdf', 'url'),
(507, 'uploads/fred.png', 'url'),
(612, 'uploads/zzzzz7.xlsx', 'url'),
(818, 'uploads/user_format.csv', 'etl_gen');
INSERT INTO `modules` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `sort_id`, `component`, `application_id`, `parent_id`) VALUES
(1, '2019-09-27 12:49:27.795897', 'superuser', '2019-09-27 12:49:27.795897', 'superuser', 'MODULE-20190927-0000001', 'Application Management', 1, 'rms/application-management', 'APP-20190923-0000001', NULL),
(2, '2019-09-27 12:49:31.756321', 'superuser', '2019-09-27 13:00:57.280102', 'superuser', 'MODULE-20190927-0000002', 'Company Management', 2, 'rms/company-management', 'APP-20190923-0000001', NULL),
(3, '2019-09-27 12:49:49.528430', 'superuser', '2019-09-27 13:00:18.423200', 'superuser', 'MODULE-20190927-0000003', 'Department Management', 4, 'rms/department-management', 'APP-20190923-0000001', NULL),
(4, '2019-09-27 12:49:57.378955', 'superuser', '2019-09-27 12:58:07.634481', 'superuser', 'MODULE-20190927-0000004', 'Module Management', 5, 'rms/module-management', 'APP-20190923-0000001', NULL),
(5, '2019-09-27 12:50:01.383432', 'superuser', '2019-09-30 14:37:53.210860', 'superuser', 'MODULE-20190927-0000005', 'User Management', 6, 'rms/user-management', 'APP-20190923-0000001', NULL),
(6, '2019-09-27 12:50:15.910699', 'superuser', '2019-09-27 19:04:53.805099', 'superuser', 'MODULE-20190927-0000006', 'Change Request Template', 3, 'cms/change-request/template', 'APP-20190923-0000002', NULL),
(10, '2019-09-28 12:28:20.174483', 'superuser', '2019-09-30 14:38:38.604217', 'superuser', 'MODULE-20190928-0000010', 'Change Request Form', 2, 'cms/change-request/form', 'APP-20190923-0000002', NULL),
(11, '2019-09-30 17:15:33.022534', 'superuser', '2019-09-30 17:15:33.022578', 'superuser', 'MODULE-20190930-0000011', 'Notification', 1, 'cms/notifications', 'APP-20190923-0000002', NULL),
(19, '2019-11-07 17:27:21.486248', 'superuser', '2019-11-07 17:27:21.486290', 'superuser', 'MODULE-20191107-0000019', 'Delegation Management', 7, 'rms/delegation-management', 'APP-20190923-0000001', NULL);
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