Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Sign in
Toggle navigation
R
red-ci-cd
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
red-group-test
red-ci-cd
Commits
83ad148a
Commit
83ad148a
authored
Mar 20, 2020
by
Gladys Forte
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
{devbugfix} validations asset type, asset group, initial api for dashboard
parent
739f8644
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
207 additions
and
100 deletions
+207
-100
app/applicationlayer/ams/asset/views.py
app/applicationlayer/ams/asset/views.py
+2
-5
app/applicationlayer/ams/asset_group/serializers.py
app/applicationlayer/ams/asset_group/serializers.py
+2
-2
app/applicationlayer/ams/asset_group/views.py
app/applicationlayer/ams/asset_group/views.py
+51
-11
app/applicationlayer/ams/asset_stock/views.py
app/applicationlayer/ams/asset_stock/views.py
+7
-25
app/applicationlayer/ams/asset_type/serializers.py
app/applicationlayer/ams/asset_type/serializers.py
+1
-1
app/applicationlayer/ams/asset_type/views.py
app/applicationlayer/ams/asset_type/views.py
+54
-10
app/helper/decorators.py
app/helper/decorators.py
+90
-46
No files found.
app/applicationlayer/ams/asset/views.py
View file @
83ad148a
...
...
@@ -98,7 +98,7 @@ class AMSAssetViewSet(viewsets.ModelViewSet):
log_save
(
enums
.
LogEnum
.
UPDATE
.
value
,
enums
.
LogEntitiesEnum
.
AMS
Repor
t
.
value
,
enums
.
LogEntitiesEnum
.
AMS
Asse
t
.
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
:
...
...
app/applicationlayer/ams/asset_group/serializers.py
View file @
83ad148a
...
...
@@ -18,7 +18,7 @@ class AssetGroupSerializerList(serializers.ModelSerializer):
class
Meta
:
model
=
models
.
AMSAssetGroup
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'c
reated_by'
,
'c
ode'
]
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
app/applicationlayer/ams/asset_group/views.py
View file @
83ad148a
...
...
@@ -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
)
...
...
app/applicationlayer/ams/asset_stock/views.py
View file @
83ad148a
...
...
@@ -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
...
...
app/applicationlayer/ams/asset_type/serializers.py
View file @
83ad148a
...
...
@@ -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
app/applicationlayer/ams/asset_type/views.py
View file @
83ad148a
...
...
@@ -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
,
...
...
app/helper/decorators.py
View file @
83ad148a
...
...
@@ -422,26 +422,28 @@ def AssetValidation(function):
def
wrapper
(
self
,
request
,
*
args
,
**
kwargs
):
form
=
request
.
data
if
'name'
not
in
form
:
return
Respons
e
(
{
"message"
:
"The key name is required"
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'400'
,
"The key name is required"
,
'failed'
,
status
.
HTTP_400_BAD_REQUEST
)
if
len
(
form
[
'name'
])
==
0
:
return
Respons
e
(
{
"message"
:
"Asset name is required"
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"Asset with this name already exists."
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'400'
,
"Asset with this name already exists."
,
'failed'
,
status
.
HTTP_400_BAD_REQUEST
)
if
'asset_type'
not
in
form
:
return
Respons
e
(
{
"message"
:
"The key asset_type is required"
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"Invalid Asset Type"
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"unique identifier already exists."
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"User does not exists."
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"User for manager does not exists."
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"Asset does not exists."
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"Asset Group does not exists."
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Respons
e
(
{
"message"
:
"Invalid Asset Type"
}
,
status
=
status
.
HTTP_400_BAD_REQUEST
return
error_messag
e
(
'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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment