Commit 83ad148a authored by Gladys Forte's avatar Gladys Forte

{devbugfix} validations asset type, asset group, initial api for dashboard

parent 739f8644
......@@ -98,7 +98,7 @@ class AMSAssetViewSet(viewsets.ModelViewSet):
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.AMSReport.value,
enums.LogEntitiesEnum.AMSAsset.value,
old_instance['id'],
old_instance,
new_instance
......@@ -134,7 +134,7 @@ class AMSAssetViewSet(viewsets.ModelViewSet):
new_instance = model_to_dict(instance)
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.AMSAsset.value,
new_instance['id'],
new_instance,
......@@ -184,9 +184,6 @@ class AMSAssetViewSet(viewsets.ModelViewSet):
def stock_list(self, request, code):
self.serializer_class = AMSAssetStockSerializer
queryset = self.get_object().ams_asset_to_assetdetail.all()
print(queryset)
# queryset = queryset.filter(is_active=False)
page = self.paginate_queryset(queryset)
if page is not None:
......
......@@ -18,7 +18,7 @@ class AssetGroupSerializerList(serializers.ModelSerializer):
class Meta:
model = models.AMSAssetGroup
fields = '__all__'
read_only_fields = ['created', 'created_by', 'code']
read_only_fields = ['created', 'code']
class AssetGroupSerializer(serializers.ModelSerializer):
......@@ -48,4 +48,4 @@ class AssetGroupSerializer(serializers.ModelSerializer):
class Meta:
model = models.AMSAssetGroup
fields = '__all__'
read_only_fields = ['created', 'created_by', 'code']
\ No newline at end of file
read_only_fields = ['created', 'code']
\ No newline at end of file
......@@ -14,10 +14,11 @@ 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):
queryset = models.AMSAssetGroup.objects.all()
serializer_class = serializers.AssetGroupSerializer
pagination_class = CustomPagination
......@@ -28,23 +29,53 @@ class AssetGroupViewset(viewsets.ModelViewSet):
'code', 'name'
)
@AssetGroupValidation
@transaction.atomic
def create(self, request, *args, **kwargs):
form = request.data
form['created_by'] = request.user.code
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save(created_by=self.request.user)
serializer = self.get_serializer(data=form)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Asset Group created', serializer.data
message = status_message_response(
201, 'success',
'New Asset Group created', serializer.data
)
return Response(
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
{"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):
......@@ -82,6 +113,15 @@ class AssetGroupViewset(viewsets.ModelViewSet):
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
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)
......
......@@ -100,31 +100,12 @@ class AMSAssetStockViewSet(viewsets.ModelViewSet):
status__iexact=['Faulty', 'Returned', 'Written Off']
).count()
# x = self.queryset.values('asset_group').distinct()
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')
# print(x)
# SELECT
# device,
# merchant,
# count(*)
# FROM
# sale
# GROUP BY
# CUBE(merchant, device)
# distinct = self.queryset.annotate(
# name_count=Count('asset_group')
# ).distinct()
# print(distinct)
# records = User.objects.filter(first_name__in=[item['first_name'] for item in distinct])
# (User.objects
# .values('is_active')
# .annotate(total=Count('id')))
recent_reports = 0
message = {
'in_store': in_store,
......@@ -135,6 +116,8 @@ class AMSAssetStockViewSet(viewsets.ModelViewSet):
'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'
......@@ -146,7 +129,6 @@ class AMSAssetStockViewSet(viewsets.ModelViewSet):
@transaction.atomic
def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
form = request.data
......
......@@ -22,4 +22,4 @@ class AssetTypeSerializer(serializers.ModelSerializer):
class Meta:
model = models.AMSAssetType
fields = '__all__'
read_only_fields = ['created', 'created_by', 'code']
\ No newline at end of file
read_only_fields = ['created', 'code']
\ No newline at end of file
......@@ -15,6 +15,8 @@ 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):
......@@ -29,22 +31,55 @@ class AssetTypeViewset(viewsets.ModelViewSet):
'code', 'name'
)
@AssetTypeValidation
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
form = request.data
form['created_by'] = request.user.code
if serializer.is_valid(raise_exception=True):
serializer.save(created_by=self.request.user)
self.perform_create(serializer)
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
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
{"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):
......@@ -81,10 +116,19 @@ class AssetTypeViewset(viewsets.ModelViewSet):
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,
......
......@@ -422,26 +422,28 @@ def AssetValidation(function):
def wrapper(self, request, *args, **kwargs):
form = request.data
if 'name' not in form:
return Response(
{"message": "The key name is required"},
status=status.HTTP_400_BAD_REQUEST
return error_message(
'400', "The key name is required",
'failed', status.HTTP_400_BAD_REQUEST
)
if len(form['name']) == 0:
return Response(
{"message": "Asset name is required"},
status=status.HTTP_400_BAD_REQUEST
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 Response(
{"message": "Asset with this name already exists."},
status=status.HTTP_400_BAD_REQUEST
return error_message(
'400', "Asset with this name already exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
if 'asset_type' not in form:
return Response(
{"message": "The key asset_type is required"},
status=status.HTTP_400_BAD_REQUEST
return error_message(
'400', "The key asset_type is required",
'failed', status.HTTP_400_BAD_REQUEST
)
valid_asset_type = models.AMSAssetType.objects.filter(
......@@ -449,9 +451,9 @@ def AssetValidation(function):
Q(is_active=True)
).count()
if valid_asset_type <= 0:
return Response(
{"message": "Invalid Asset Type"},
status=status.HTTP_400_BAD_REQUEST
return error_message(
'400', "Invalid Asset Type",
'failed', status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
......@@ -476,30 +478,27 @@ def AssetStockValidation(function):
for data in fields:
if str(data) not in form:
return Response(
{
"message": f"The key {data.replace('_', ' ')} is required"
},
status=status.HTTP_400_BAD_REQUEST
)
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 Response(
{
"message": f"{data.replace('_', ' ')} is required"
},
status=status.HTTP_400_BAD_REQUEST
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 Response(
{"message": "unique identifier already exists."},
status=status.HTTP_400_BAD_REQUEST
return error_message(
'400', "unique identifier already exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
user_client = models.User.objects.filter(
......@@ -507,9 +506,9 @@ def AssetStockValidation(function):
).count()
if user_client <= 0:
return Response(
{"message": "User does not exists."},
status=status.HTTP_400_BAD_REQUEST
return error_message(
'400', "User does not exists.",
'failed', status.HTTP_400_BAD_REQUEST
)
manager = models.User.objects.filter(
......@@ -517,43 +516,88 @@ def AssetStockValidation(function):
).count()
if manager <= 0:
return Response(
{"message": "User for manager does not exists."},
status=status.HTTP_400_BAD_REQUEST
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 Response(
{"message": "Asset does not exists."},
status=status.HTTP_400_BAD_REQUEST
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 Response(
{"message": "Asset Group does not exists."},
status=status.HTTP_400_BAD_REQUEST
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 Response(
{"message": "Invalid Asset Type"},
status=status.HTTP_400_BAD_REQUEST
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
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