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
1a61c3d3
Commit
1a61c3d3
authored
Sep 06, 2019
by
Gladys Forte
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #67 in RMS/api-main-service from gladys-dev2 to RMSv2
* commit '
9ac77de2
': post api form
parents
03ea872b
9ac77de2
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
716 additions
and
104 deletions
+716
-104
app/applicationlayer/management/changerequest/serializers.py
app/applicationlayer/management/changerequest/serializers.py
+6
-6
app/applicationlayer/management/changerequest/views.py
app/applicationlayer/management/changerequest/views.py
+233
-86
app/applicationlayer/urls.py
app/applicationlayer/urls.py
+2
-1
app/applicationlayer/utils.py
app/applicationlayer/utils.py
+44
-1
app/businesslayer/changerequest/change_request.py
app/businesslayer/changerequest/change_request.py
+255
-0
app/businesslayer/changerequest/change_request_template.py
app/businesslayer/changerequest/change_request_template.py
+57
-0
app/entities/migrations/0012_auto_20190906_1429.py
app/entities/migrations/0012_auto_20190906_1429.py
+65
-0
app/entities/models.py
app/entities/models.py
+54
-10
No files found.
app/applicationlayer/management/changerequest/serializers.py
View file @
1a61c3d3
...
@@ -45,7 +45,7 @@ class ChangeRequestTemplateDetailsSerializer(
...
@@ -45,7 +45,7 @@ class ChangeRequestTemplateDetailsSerializer(
class
Meta
:
class
Meta
:
model
=
models
.
ChangeRequestTemplateDetails
model
=
models
.
ChangeRequestTemplateDetails
fields
=
'__all__'
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'deleted_at'
]
read_only_fields
=
[
'created'
,
'deleted_at'
,
'code'
]
class
ChangeRequestFormHeaderSerializer
(
class
ChangeRequestFormHeaderSerializer
(
...
@@ -82,7 +82,7 @@ class ChangeRequestFormHeaderSerializer(
...
@@ -82,7 +82,7 @@ class ChangeRequestFormHeaderSerializer(
class
Meta
:
class
Meta
:
model
=
models
.
ChangeRequestFormHeader
model
=
models
.
ChangeRequestFormHeader
fields
=
'__all__'
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'deleted_at'
]
read_only_fields
=
[
'created'
,
'deleted_at'
,
'form_code'
]
class
ChangeRequestFormApproversSerializer
(
class
ChangeRequestFormApproversSerializer
(
...
@@ -112,7 +112,7 @@ class ChangeRequestFormApproversSerializer(
...
@@ -112,7 +112,7 @@ class ChangeRequestFormApproversSerializer(
class
Meta
:
class
Meta
:
model
=
models
.
ChangeRequestFormApprovers
model
=
models
.
ChangeRequestFormApprovers
fields
=
'__all__'
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'deleted_at'
]
read_only_fields
=
[
'created'
,
'deleted_at'
,
'code'
]
class
ChangeRequestFormStakeHoldersSerializer
(
class
ChangeRequestFormStakeHoldersSerializer
(
...
@@ -121,7 +121,7 @@ class ChangeRequestFormStakeHoldersSerializer(
...
@@ -121,7 +121,7 @@ class ChangeRequestFormStakeHoldersSerializer(
class
Meta
:
class
Meta
:
model
=
models
.
ChangeRequestFormStakeHolders
model
=
models
.
ChangeRequestFormStakeHolders
fields
=
'__all__'
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'deleted_at'
]
read_only_fields
=
[
'created'
,
'deleted_at'
,
'code'
]
class
ChangeRequestFormAttachmentsSerializer
(
class
ChangeRequestFormAttachmentsSerializer
(
...
@@ -130,7 +130,7 @@ class ChangeRequestFormAttachmentsSerializer(
...
@@ -130,7 +130,7 @@ class ChangeRequestFormAttachmentsSerializer(
class
Meta
:
class
Meta
:
model
=
models
.
ChangeRequestFormAttachments
model
=
models
.
ChangeRequestFormAttachments
fields
=
'__all__'
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'deleted_at'
]
read_only_fields
=
[
'created'
,
'deleted_at'
,
'code'
]
class
ChangeRequestFormDetailsSerializer
(
class
ChangeRequestFormDetailsSerializer
(
...
@@ -139,4 +139,4 @@ class ChangeRequestFormDetailsSerializer(
...
@@ -139,4 +139,4 @@ class ChangeRequestFormDetailsSerializer(
class
Meta
:
class
Meta
:
model
=
models
.
ChangeRequestFormDetails
model
=
models
.
ChangeRequestFormDetails
fields
=
'__all__'
fields
=
'__all__'
read_only_fields
=
[
'created'
,
'deleted_at'
]
read_only_fields
=
[
'created'
,
'deleted_at'
,
'code'
]
app/applicationlayer/management/changerequest/views.py
View file @
1a61c3d3
...
@@ -19,14 +19,8 @@ from django.db.models import Q
...
@@ -19,14 +19,8 @@ from django.db.models import Q
import
requests
import
requests
from
django.conf
import
settings
from
django.conf
import
settings
from
rest_framework.exceptions
import
ValidationError
from
rest_framework.exceptions
import
ValidationError
# from app.applicationlayer.management.changerequest.utilities import (
from
django.db
import
transaction
,
IntegrityError
,
connection
# logged_user, number_generator,
from
app.applicationlayer.utils
import
QuerySetHelper
# QuerySetHelper, get_group_details,
# get_account_details, get_companies_details,
# cancel_overdue,
# send_mail_requestor, send_mail_vendor,
# get_allowed_company, next_appover_email
# )
class
ChangeRequestTemplatesViewset
(
meviewsets
.
ModelViewSet
):
class
ChangeRequestTemplatesViewset
(
meviewsets
.
ModelViewSet
):
...
@@ -87,88 +81,106 @@ class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
...
@@ -87,88 +81,106 @@ class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
status
=
status
.
HTTP_500_INTERNAL_SERVER_ERROR
)
status
=
status
.
HTTP_500_INTERNAL_SERVER_ERROR
)
# @transaction.atomic
# @transaction.atomic
def
create
(
self
,
request
,
*
args
,
**
kwargs
):
#
def create(self, request, *args, **kwargs):
serializer
=
self
.
get_serializer
(
data
=
request
.
data
)
#
serializer = self.get_serializer(data=request.data)
serializer
.
is_valid
(
raise_exception
=
True
)
#
serializer.is_valid(raise_exception=True)
if
not
template_no
.
lower
()
==
'tmp'
:
#
if not template_no.lower() == 'tmp':
print
(
'not tmp'
)
#
print('not tmp')
form
=
request
.
data
[
'template_no'
]
#
form = request.data['template_no']
prefix
=
request
.
data
[
'requested_to_template_id'
]
#
prefix = request.data['requested_to_template_id']
instance
=
models
.
ChangeRequestTemplateHeader
.
objects
.
filter
(
#
instance = models.ChangeRequestTemplateHeader.objects.filter(
Q
(
requested_to_template_id
=
prefix
)
&
#
Q(requested_to_template_id=prefix) &
Q
(
deleted_at
=
None
)
#
Q(deleted_at=None)
)
.
first
()
#
).first()
if
instance
and
instance
.
template_no
!=
request
.
data
[
'template_no'
]:
# if instance and instance.template_no != request.data['template_no']:
return
Response
(
# return Response(
{
'message'
:
"CR number prefix already exist"
},
# {'message': "CR number prefix already exist"},
status
=
status
.
HTTP_400_BAD_REQUEST
# status=status.HTTP_400_BAD_REQUEST
)
# )
else
:
# else:
models
.
ChangeRequestTemplateHeader
.
objects
.
filter
(
# models.ChangeRequestTemplateHeader.objects.filter(
template_no
=
template_no
# template_no=template_no
)
.
update
(
# ).update(
deleted_at
=
datetime
.
now
()
# deleted_at=datetime.now()
)
# )
models
.
ChangeRequestTemplateStakeHolders
.
objects
.
filter
(
# models.ChangeRequestTemplateStakeHolders.objects.filter(
template_no
=
template_no
# template_no=template_no
)
.
update
(
# ).update(
deleted_at
=
datetime
.
now
()
# deleted_at=datetime.now()
)
# )
models
.
ChangeRequestTemplateAttachments
.
objects
.
filter
(
# models.ChangeRequestTemplateAttachments.objects.filter(
template_no
=
template_no
# template_no=template_no
)
.
update
(
# ).update(
deleted_at
=
datetime
.
now
()
# deleted_at=datetime.now()
)
# )
models
.
ChangeRequestTemplateDetails
.
objects
.
filter
(
# models.ChangeRequestTemplateDetails.objects.filter(
template_no
=
template_no
# template_no=template_no
)
.
update
(
# ).update(
deleted_at
=
datetime
.
now
()
# deleted_at=datetime.now()
)
# )
models
.
ChangeRequestTemplateApprovers
.
objects
.
filter
(
# models.ChangeRequestTemplateApprovers.objects.filter(
template_no
=
template_no
# template_no=template_no
)
.
update
(
# ).update(
deleted_at
=
datetime
.
now
()
# deleted_at=datetime.now()
)
# )
series
=
template_no
# series = template_no
template_id
=
request
.
data
[
'requested_to_template_id'
]
# template_id = request.data['requested_to_template_id']
check_prefix
=
models
.
ChangeRequestTemplateHeader
.
objects
.
filter
(
# check_prefix = models.ChangeRequestTemplateHeader.objects.filter(
Q
(
requested_to_template_id
=
template_id
)
&
# Q(requested_to_template_id=template_id) &
Q
(
deleted_at
=
None
)
# Q(deleted_at=None)
)
# )
if
check_prefix
.
count
()
>
0
and
template_no
.
lower
()
==
'tmp'
:
# if check_prefix.count() > 0 and template_no.lower() == 'tmp':
return
Response
(
# return Response(
{
'message'
:
"CR number prefix already exist"
},
# {'message': "CR number prefix already exist"},
status
=
status
.
HTTP_400_BAD_REQUEST
# status=status.HTTP_400_BAD_REQUEST
)
# )
self
.
perform_create
(
serializer
)
# self.perform_create(serializer)
if
template_no
.
lower
()
==
'tmp'
:
# if template_no.lower() == 'tmp':
id
=
serializer
.
data
[
'id'
]
# id = serializer.data['id']
db_counter
=
models
.
ChangeRequestTemplateHeader
.
objects
.
filter
(
# db_counter = models.ChangeRequestTemplateHeader.objects.filter(
deleted_at
=
None
# deleted_at=None
)
.
count
()
# ).count()
db_counter
=
db_counter
+
2
# db_counter = db_counter + 2
db_counter
=
db_counter
-
1
# db_counter = db_counter - 1
models
.
ChangeRequestTemplateHeader
.
objects
.
filter
(
id
=
id
)
.
update
(
# models.ChangeRequestTemplateHeader.objects.filter(id=id).update(
set__template_no
=
number_generator
(
"TMP"
,
db_counter
)
# set__template_no=number_generator("TMP", db_counter)
)
# )
series
=
number_generator
(
"TMP"
,
db_counter
)
# series = number_generator("TMP", db_counter)
headers
=
self
.
get_success_headers
(
serializer
.
data
)
# headers = self.get_success_headers(serializer.data)
return
Response
(
# return Response(
data
=
{
"code"
:
series
},
# data={"code": series},
status
=
status
.
HTTP_201_CREATED
,
headers
=
headers
# status=status.HTTP_201_CREATED, headers=headers
)
# )
class
ChangeRequestTemplateApproversViewset
(
meviewsets
.
ModelViewSet
):
queryset
=
models
.
ChangeRequestTemplateApprovers
.
objects
.
all
()
serializer_class
=
serializers
.
ChangeRequestTemplateApproversSerializer
pagination_class
=
paginators
.
SimplePageNumberPagination
def
list
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
queryset
=
self
.
queryset
.
filter
(
deleted_at
=
None
)
self
.
queryset
=
QuerySetHelper
.
Sort
(
self
)
# self.queryset = QuerySetHelper.Filter(self)
return
super
(
ChangeRequestTemplateApproversViewset
,
self
)
.
list
(
request
)
def
retrieve
(
self
,
request
,
*
args
,
**
kwargs
):
instance
=
self
.
queryset
.
filter
(
deleted_at
=
None
)
.
first
()
serializer
=
self
.
get_serializer
(
instance
)
return
Response
(
serializer
.
data
)
class
ChangeRequestTemplatePost
(
APIView
):
class
ChangeRequestTemplatePost
(
APIView
):
#
@transaction.atomic()
@
transaction
.
atomic
()
def
post
(
self
,
request
):
def
post
(
self
,
request
):
template_header
=
request
.
data
template_header
=
request
.
data
...
@@ -176,6 +188,7 @@ class ChangeRequestTemplatePost(APIView):
...
@@ -176,6 +188,7 @@ class ChangeRequestTemplatePost(APIView):
data_list_approver
=
[]
data_list_approver
=
[]
data_list_stake
=
[]
data_list_stake
=
[]
data_list_attach
=
[]
data_list_attach
=
[]
data_list_detail
=
[]
template_header_data
=
{
template_header_data
=
{
'requested_to_template_name'
:
template_header
[
'requested_to_template_name'
],
'requested_to_template_name'
:
template_header
[
'requested_to_template_name'
],
...
@@ -194,8 +207,9 @@ class ChangeRequestTemplatePost(APIView):
...
@@ -194,8 +207,9 @@ class ChangeRequestTemplatePost(APIView):
tmp_approvers
=
template_header
[
'tmp_approvers'
]
tmp_approvers
=
template_header
[
'tmp_approvers'
]
tmp_stakes
=
template_header
[
'tmp_stakes'
]
tmp_stakes
=
template_header
[
'tmp_stakes'
]
tmp_attachments
=
template_header
[
'tmp_attachments'
]
tmp_attachments
=
template_header
[
'tmp_attachments'
]
tmp_details
=
template_header
[
'tmp_details'
]
#
sp1 = transaction.savepoint() # nothing will save to db
sp1
=
transaction
.
savepoint
()
# nothing will save to db
serializer
=
serializers
.
ChangeRequestTemplatesSerializer
(
serializer
=
serializers
.
ChangeRequestTemplatesSerializer
(
data
=
template_header_data
)
data
=
template_header_data
)
...
@@ -243,7 +257,15 @@ class ChangeRequestTemplatePost(APIView):
...
@@ -243,7 +257,15 @@ class ChangeRequestTemplatePost(APIView):
# create template details
# create template details
for
tmp_detail
in
tmp_details
:
tmp_detail
[
'template_no'
]
=
tmp_id
data_list_detail
.
append
(
tmp_detail
)
serializerDetail
=
serializers
.
ChangeRequestTemplateDetailsSerializer
(
data
=
data_list_detail
,
many
=
True
)
if
serializerDetail
.
is_valid
(
raise_exception
=
True
):
serializerDetail
.
save
()
message
=
{
message
=
{
'code'
:
201
,
'code'
:
201
,
...
@@ -254,6 +276,131 @@ class ChangeRequestTemplatePost(APIView):
...
@@ -254,6 +276,131 @@ class ChangeRequestTemplatePost(APIView):
return
Response
(
message
,
status
=
status
.
HTTP_201_CREATED
)
return
Response
(
message
,
status
=
status
.
HTTP_201_CREATED
)
except
ValidationError
as
e
:
transaction
.
savepoint_rollback
(
sp1
)
message
=
{
'code'
:
400
,
'status'
:
'failed'
,
'message'
:
str
(
e
),
}
return
Response
(
message
,
status
=
status
.
HTTP_400_BAD_REQUEST
)
except
Exception
as
e
:
transaction
.
savepoint_rollback
(
sp1
)
message
=
{
'code'
:
500
,
'status'
:
'failed'
,
'message'
:
'Request was not able to process'
+
str
(
e
),
}
return
Response
(
message
,
status
=
status
.
HTTP_500_INTERNAL_SERVER_ERROR
)
class
ChangeRequestFormPost
(
APIView
):
# @transaction.atomic()
def
post
(
self
,
request
):
form_header
=
request
.
data
try
:
data_list_approver
=
[]
data_list_stake
=
[]
data_list_attach
=
[]
data_list_detail
=
[]
form_header_data
=
{
'requested_to_template_name'
:
form_header
[
'requested_to_template_name'
],
'requested_to_template_id'
:
form_header
[
'requested_to_template_id'
],
'requested_to_objective'
:
form_header
[
'requested_to_objective'
],
'requested_to_target_date'
:
form_header
[
'requested_to_target_date'
],
'requested_to_priority'
:
form_header
[
'requested_to_priority'
],
'description'
:
form_header
[
'description'
],
'status'
:
form_header
[
'status'
],
'company_desc'
:
form_header
[
'company_desc'
],
'department_desc'
:
form_header
[
'department_desc'
],
'requested_desc'
:
form_header
[
'requested_desc'
],
'old_form_code'
:
form_header
[
'old_form_code'
],
'requested_by_department'
:
form_header
[
'requested_by_department'
],
'requested_by_user'
:
form_header
[
'requested_by_user'
],
'requested_to_company'
:
form_header
[
'requested_to_company'
],
'requested_to_department'
:
form_header
[
'requested_to_department'
],
'requested_to_user'
:
form_header
[
'requested_to_user'
],
'template_no'
:
form_header
[
'template_no'
]
}
frm_approvers
=
form_header
[
'frm_approvers'
]
frm_stakes
=
form_header
[
'frm_stakes'
]
frm_attachments
=
form_header
[
'frm_attachments'
]
frm_details
=
form_header
[
'frm_details'
]
# sp1 = transaction.savepoint() # nothing will save to db
serializer
=
serializers
.
ChangeRequestFormHeaderSerializer
(
data
=
form_header_data
)
if
serializer
.
is_valid
(
raise_exception
=
True
):
serializer
.
save
()
frm_id
=
serializer
.
data
[
'form_code'
]
print
(
frm_id
)
# create template approvers
for
frm_approver
in
frm_approvers
:
frm_approver
[
'form_code'
]
=
frm_id
data_list_approver
.
append
(
frm_approver
)
serializerApprover
=
serializers
.
ChangeRequestFormApproversSerializer
(
data
=
data_list_approver
,
many
=
True
)
if
serializerApprover
.
is_valid
(
raise_exception
=
True
):
serializerApprover
.
save
()
# create template stakes
for
frm_stake
in
frm_stakes
:
frm_stake
[
'form_code'
]
=
frm_id
data_list_stake
.
append
(
frm_stake
)
serializerStake
=
serializers
.
ChangeRequestFormStakeHoldersSerializer
(
data
=
data_list_stake
,
many
=
True
)
if
serializerStake
.
is_valid
(
raise_exception
=
True
):
serializerStake
.
save
()
# create template attachments
for
frm_attachment
in
frm_attachments
:
frm_attachment
[
'form_code'
]
=
frm_id
data_list_attach
.
append
(
frm_attachment
)
serializerAttach
=
serializers
.
ChangeRequestFormAttachmentsSerializer
(
data
=
data_list_attach
,
many
=
True
)
if
serializerAttach
.
is_valid
(
raise_exception
=
True
):
serializerAttach
.
save
()
# create template details
for
frm_detail
in
frm_details
:
frm_detail
[
'form_code'
]
=
frm_id
data_list_detail
.
append
(
frm_detail
)
serializerDetail
=
serializers
.
ChangeRequestFormDetailsSerializer
(
data
=
data_list_detail
,
many
=
True
)
if
serializerDetail
.
is_valid
(
raise_exception
=
True
):
serializerDetail
.
save
()
message
=
{
'code'
:
201
,
'status'
:
'success'
,
'message'
:
'Form Details successfully saved!'
,
'results'
:
serializer
.
data
}
return
Response
(
message
,
status
=
status
.
HTTP_201_CREATED
)
except
ValidationError
as
e
:
except
ValidationError
as
e
:
# transaction.savepoint_rollback(sp1)
# transaction.savepoint_rollback(sp1)
message
=
{
message
=
{
...
...
app/applicationlayer/urls.py
View file @
1a61c3d3
...
@@ -19,7 +19,7 @@ router.register(r'modules', ModuleViewSet)
...
@@ -19,7 +19,7 @@ router.register(r'modules', ModuleViewSet)
router
.
register
(
r'notifications'
,
NotificationsViewset
)
router
.
register
(
r'notifications'
,
NotificationsViewset
)
router
.
register
(
r'template'
,
crviews
.
ChangeRequestTemplatesViewset
)
router
.
register
(
r'template'
,
crviews
.
ChangeRequestTemplatesViewset
)
#
router.register(r'template-approvers', crviews.ChangeRequestTemplateApproversViewset)
router
.
register
(
r'template-approvers'
,
crviews
.
ChangeRequestTemplateApproversViewset
)
# router.register(r'template-stakeholders', crviews.ChangeRequestTemplateStakeHoldersViewset)
# router.register(r'template-stakeholders', crviews.ChangeRequestTemplateStakeHoldersViewset)
# router.register(r'template-attachments', crviews.ChangeRequestTemplateAttachmentsViewset)
# router.register(r'template-attachments', crviews.ChangeRequestTemplateAttachmentsViewset)
# router.register(r'template-details', crviews.ChangeRequestTemplateDetailsViewset)
# router.register(r'template-details', crviews.ChangeRequestTemplateDetailsViewset)
...
@@ -35,4 +35,5 @@ urlpatterns = (
...
@@ -35,4 +35,5 @@ urlpatterns = (
path
(
''
,
include
(
router
.
urls
)),
path
(
''
,
include
(
router
.
urls
)),
path
(
'template-post/'
,
crviews
.
ChangeRequestTemplatePost
.
as_view
()),
path
(
'template-post/'
,
crviews
.
ChangeRequestTemplatePost
.
as_view
()),
path
(
'form-post/'
,
crviews
.
ChangeRequestFormPost
.
as_view
()),
)
)
app/applicationlayer/utils.py
View file @
1a61c3d3
...
@@ -65,4 +65,47 @@ def status_message_response(code, status, message, results):
...
@@ -65,4 +65,47 @@ def status_message_response(code, status, message, results):
'message'
:
message
,
'message'
:
message
,
'results'
:
results
'results'
:
results
}
}
return
message
return
message
\ No newline at end of file
class
QuerySetHelper
:
@
staticmethod
def
Sort
(
context
):
sort_field
=
context
.
request
.
query_params
.
get
(
'sort_field'
)
sort_order
=
context
.
request
.
query_params
.
get
(
'sort_order'
)
if
sort_field
and
sort_order
:
if
sort_order
.
lower
()
==
'asc'
:
context
.
queryset
=
context
.
queryset
.
order_by
(
sort_field
)
else
:
context
.
queryset
=
context
.
queryset
.
order_by
(
f
"-{sort_field}"
)
return
context
.
queryset
@
staticmethod
def
Search
(
context
):
search_field
=
context
.
request
.
query_params
.
get
(
'search-field'
)
search_key
=
context
.
request
.
query_params
.
get
(
'search-key'
)
if
search_field
and
search_key
:
context
.
queryset
=
context
.
queryset
(
__raw__
=
{
f
"{search_field}"
:
{
"$regex"
:
f
".*{search_key.lower()}.*"
}}
)
return
context
.
queryset
@
staticmethod
def
Filter
(
context
):
if
int
(
len
(
context
.
request
.
query_params
))
>
0
:
filtering_kwargs
=
{}
with_params
=
[]
common_params
=
(
'page'
,
'page-size'
,
'page_size'
,
'sort_order'
,
'sort_field'
)
for
field
,
value
in
context
.
request
.
GET
.
items
():
filtering_kwargs
=
{}
if
value
and
field
.
lower
()
not
in
common_params
:
filtering_kwargs
[
field
]
=
{
"$regex"
:
f
".*{value.lower()}.*"
}
filtering_kwargs
[
field
]
=
{
"$regex"
:
f
".*{value}.*"
}
# filtering_kwargs[field] = {"$regex" : f".*{value.lower()}.*"}
with_params
.
append
(
filtering_kwargs
)
raw_query
=
{
"$or"
:
with_params
}
context
.
queryset
=
context
.
queryset
(
__raw__
=
raw_query
)
return
context
.
queryset
\ No newline at end of file
app/businesslayer/changerequest/change_request.py
0 → 100644
View file @
1a61c3d3
from
django.shortcuts
import
render
from
app.entities
import
models
from
app.applicationlayer
import
paginators
from
datetime
import
datetime
from
rest_framework.response
import
Response
from
rest_framework
import
status
,
views
from
rest_framework.decorators
import
action
from
django.http
import
Http404
from
django.db.models
import
Q
def
list_by_user
(
user_id_number
):
return_queryset
=
None
try
:
approver
=
models
.
ChangeRequestFormApprovers
.
objects
.
filter
(
Q
(
user
=
user_id_number
)
&
Q
(
deleted_at
=
None
)
)
approver
=
[
data
[
'form_code'
]
for
data
in
approver
]
stake
=
models
.
ChangeRequestFormStakeHolders
.
objects
.
filter
(
Q
(
user
=
user_id_number
)
&
Q
(
deleted_at
=
None
)
)
stake
=
[
data
[
'form_code'
]
for
data
in
stake
]
headers
=
models
.
ChangeRequestFormHeader
.
objects
.
filter
(
deleted_at
=
None
,
requested_by_user
=
user_id_number
)
headers
=
[
data
[
'form_code'
]
for
data
in
headers
]
# # TODO: Include priviledges here
# req = get_allowed_company(user_id_number)
# results = req.json()['results']
# # Get the list of distincted group_no
# crViews = list(set(
# map(lambda x: x['group_pivots'],
# list(filter(lambda x: x['view_all_change_request'], results))
# )
# ))
# priviledgedList = models.ChangeRequestFormHeader.objects.filter(
# requested_to_department__in=crViews,
# deleted_at=None,
# )
# priviledgedCrs = [data['form_code'] for data in priviledgedList]
# form_code = list(set(stake + approver + headers + priviledgedCrs))
form_code
=
list
(
set
(
stake
+
approver
+
headers
))
return_queryset
=
models
.
ChangeRequestFormHeader
.
objects
.
filter
(
form_code__in
=
form_code
,
deleted_at
=
None
,
)
exclude
=
return_queryset
.
filter
(
status__iexact
=
'Draft'
,
requested_by_user__ne
=
user_id_number
)
exclude
=
[
data
[
'form_code'
]
for
data
in
exclude
]
return_queryset
=
return_queryset
.
filter
(
form_code__nin
=
exclude
)
except
Exception
as
e
:
pass
return
return_queryset
def
filter_base
(
base_queryset
,
company_requested_to
,
department_requested_to
,
date_modified_from
,
date_modified_to
,
date_required_from
,
date_required_to
,
form_type
):
return_queryset
=
base_queryset
try
:
if
company_requested_to
:
return_queryset
=
return_queryset
.
filter
(
requested_to_company__exact
=
company_requested_to
)
if
department_requested_to
:
return_queryset
=
return_queryset
.
filter
(
requested_to_department__exact
=
department_requested_to
)
if
form_type
==
'open'
:
return_queryset
=
return_queryset
.
filter
(
status__ne
=
'Closed'
)
elif
form_type
==
'closed'
:
return_queryset
=
return_queryset
.
filter
(
status
=
'Closed'
)
date_modified
=
[]
date_modified_not
=
[]
if
date_modified_from
and
date_modified_to
:
for
query
in
return_queryset
:
created
=
datetime
.
strftime
(
query
.
created
,
"
%
Y-
%
m-
%
d"
)
if
created
>=
date_modified_from
and
created
<=
date_modified_to
:
date_modified
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__in
=
date_modified
)
else
:
date_modified_not
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__nin
=
date_modified_not
)
date_required
=
[]
date_required_not
=
[]
if
date_required_from
and
date_required_to
:
for
query
in
return_queryset
:
try
:
if
query
.
requested_to_target_date
:
requested_to_target_date
=
datetime
.
strptime
(
query
.
requested_to_target_date
[:
-
1
],
"
%
Y-
%
m-
%
dT
%
H:
%
M:
%
S.
%
f"
)
requested_to_target_date
=
datetime
.
strftime
(
requested_to_target_date
,
"
%
Y-
%
m-
%
d"
)
if
requested_to_target_date
>=
date_required_from
and
requested_to_target_date
<=
date_required_to
:
date_required
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__in
=
date_required
)
else
:
date_required_not
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__nin
=
date_required_not
)
else
:
date_required_not
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__nin
=
date_required_not
)
except
ValueError
:
if
query
.
requested_to_target_date
:
requested_to_target_date
=
datetime
.
strptime
(
query
.
requested_to_target_date
[:
-
1
],
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
requested_to_target_date
=
datetime
.
strftime
(
requested_to_target_date
,
"
%
Y-
%
m-
%
d"
)
if
requested_to_target_date
>=
date_required_from
and
requested_to_target_date
<=
date_required_to
:
date_required
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__in
=
date_required
)
else
:
date_required_not
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__nin
=
date_required_not
)
else
:
date_required_not
.
append
(
query
.
id
)
return_queryset
=
return_queryset
.
filter
(
id__nin
=
date_required_not
)
return_queryset
except
Exception
as
e
:
pass
return
return_queryset
def
filter_overdue
(
base_queryset
):
return_queryset
=
base_queryset
try
:
now
=
datetime
.
now
()
overdue
=
[]
for
query
in
return_queryset
:
try
:
if
query
.
requested_to_target_date
:
requested_to_target_date
=
datetime
.
strptime
(
query
.
requested_to_target_date
[:
-
1
],
"
%
Y-
%
m-
%
dT
%
H:
%
M:
%
S.
%
f"
)
if
(
requested_to_target_date
<
now
):
overdue
.
append
(
query
.
form_code
)
except
ValueError
:
#convert now
if
query
.
requested_to_target_date
:
requested_to_target_date
=
datetime
.
strptime
(
query
.
requested_to_target_date
[:
-
1
],
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
if
(
requested_to_target_date
<
now
):
overdue
.
append
(
query
.
form_code
)
return_queryset
=
return_queryset
.
filter
(
form_code__in
=
overdue
)
return_queryset
except
Exception
as
e
:
pass
return
return_queryset
def
filter_status
(
base_queryset
,
status
):
return_queryset
=
base_queryset
try
:
if
status
:
return_queryset
=
return_queryset
.
filter
(
status__iexact
=
status
)
return_queryset
except
Exception
as
e
:
pass
return
return_queryset
def
filter_awaiting
(
base_queryset
,
user_id_number
):
return_queryset
=
base_queryset
try
:
awaiting_included
=
[]
for
query
in
return_queryset
:
current_level
=
models
.
ChangeRequestFormApprovers
.
objects
.
filter
(
Q
(
form_code
=
query
.
form_code
)
&
Q
(
deleted_at
=
None
)
&
(
Q
(
action
=
''
)
|
Q
(
action
=
None
))
)
.
order_by
(
'level'
)
if
current_level
:
if
current_level
[
0
][
'user'
]
==
user_id_number
:
awaiting_included
.
append
(
query
.
form_code
)
return_queryset
=
return_queryset
.
filter
(
form_code__in
=
awaiting_included
)
except
Exception
as
e
:
pass
return
return_queryset
app/businesslayer/changerequest/change_request_template.py
0 → 100644
View file @
1a61c3d3
from
app.entities
import
models
def
get_template
(
self
,
code
):
try
:
template
=
{}
header
=
models
.
ChangeRequestTemplateHeader
.
objects
.
filter
(
template_no
=
code
)
.
values
()
approve
=
models
.
ChangeRequestTemplateApprovers
.
objects
.
filter
(
template_no
=
code
)
.
values
()
stakeholder
=
models
.
ChangeRequestTemplateStakeHolders
.
objects
.
filter
(
template_no
=
code
)
.
values
()
attachment
=
models
.
ChangeRequestTemplateAttachments
.
objects
.
filter
(
template_no
=
code
)
.
values
()
details
=
models
.
ChangeRequestTemplateDetails
.
objects
.
filter
(
template_no
=
code
)
.
values
()
task
=
models
.
ChangeRequestTemplateTasks
.
objects
.
filter
(
template_no
=
code
)
.
values
()
template
[
'header'
]
=
header
template
[
'aprrove'
]
=
approve
template
[
'stakeholder'
]
=
stakeholder
template
[
'attachment'
]
=
attachment
template
[
'details'
]
=
details
template
[
'task'
]
=
task
return
template
except
ChangeRequestTemplateHeader
.
DoesNotExist
:
raise
Http404
except
ChangeRequestTemplateApprovers
.
DoesNotExist
:
raise
Http404
except
ChangeRequestTemplateStakeHolders
.
DoesNotExist
:
raise
Http404
except
ChangeRequestTemplateAttachments
.
DoesNotExist
:
raise
Http404
except
ChangeRequestTemplateDetails
.
DoesNotExist
:
raise
Http404
except
ChangeRequestTemplateTasks
.
DoesNotExist
:
raise
Http404
app/entities/migrations/0012_auto_20190906_1429.py
0 → 100644
View file @
1a61c3d3
# Generated by Django 2.2 on 2019-09-06 14:29
from
django.conf
import
settings
from
django.db
import
migrations
,
models
import
django.db.models.deletion
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'entities'
,
'0011_auto_20190905_1756'
),
]
operations
=
[
migrations
.
AddField
(
model_name
=
'changerequestformapprovers'
,
name
=
'tmp_approver'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
'entities.ChangeRequestTemplateApprovers'
,
to_field
=
'code'
),
),
migrations
.
AddField
(
model_name
=
'changerequestformattachments'
,
name
=
'tmp_attach'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
'entities.ChangeRequestTemplateAttachments'
,
to_field
=
'code'
),
),
migrations
.
AddField
(
model_name
=
'changerequestformdetails'
,
name
=
'tmp_detail'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
'entities.ChangeRequestTemplateDetails'
,
to_field
=
'code'
),
),
migrations
.
AddField
(
model_name
=
'changerequestformstakeholders'
,
name
=
'tmp_stake'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
'entities.ChangeRequestTemplateStakeHolders'
,
to_field
=
'code'
),
),
migrations
.
AlterField
(
model_name
=
'changerequestformapprovers'
,
name
=
'delegation'
,
field
=
models
.
CharField
(
blank
=
True
,
max_length
=
50
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'changerequestformapprovers'
,
name
=
'user'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
settings
.
AUTH_USER_MODEL
,
to_field
=
'code'
),
),
migrations
.
AlterField
(
model_name
=
'changerequestformstakeholders'
,
name
=
'user'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
settings
.
AUTH_USER_MODEL
,
to_field
=
'code'
),
),
migrations
.
AlterField
(
model_name
=
'changerequesttemplateapprovers'
,
name
=
'delegation'
,
field
=
models
.
CharField
(
blank
=
True
,
max_length
=
50
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'changerequesttemplateapprovers'
,
name
=
'user'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
settings
.
AUTH_USER_MODEL
,
to_field
=
'code'
),
),
migrations
.
AlterField
(
model_name
=
'changerequesttemplatestakeholders'
,
name
=
'user'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
DO_NOTHING
,
to
=
settings
.
AUTH_USER_MODEL
,
to_field
=
'code'
),
),
]
app/entities/models.py
View file @
1a61c3d3
...
@@ -389,10 +389,12 @@ class BaseApprover(models.Model):
...
@@ -389,10 +389,12 @@ class BaseApprover(models.Model):
user
=
models
.
ForeignKey
(
user
=
models
.
ForeignKey
(
User
,
User
,
blank
=
True
,
null
=
True
,
on_delete
=
models
.
DO_NOTHING
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'code'
)
to_field
=
'code'
)
delegation
=
models
.
CharField
(
max_length
=
50
)
delegation
=
models
.
CharField
(
max_length
=
50
,
blank
=
True
,
null
=
True
)
created
=
models
.
DateTimeField
(
created
=
models
.
DateTimeField
(
blank
=
True
,
blank
=
True
,
null
=
True
)
null
=
True
)
...
@@ -407,6 +409,8 @@ class BaseApprover(models.Model):
...
@@ -407,6 +409,8 @@ class BaseApprover(models.Model):
class
BaseStakeholder
(
models
.
Model
):
class
BaseStakeholder
(
models
.
Model
):
user
=
models
.
ForeignKey
(
user
=
models
.
ForeignKey
(
User
,
User
,
blank
=
True
,
null
=
True
,
on_delete
=
models
.
DO_NOTHING
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'code'
)
to_field
=
'code'
)
delegation
=
models
.
CharField
(
delegation
=
models
.
CharField
(
...
@@ -661,7 +665,11 @@ class ChangeRequestFormHeader(BaseHeader):
...
@@ -661,7 +665,11 @@ class ChangeRequestFormHeader(BaseHeader):
def
save
(
self
,
*
args
,
**
kwargs
):
def
save
(
self
,
*
args
,
**
kwargs
):
super
(
ChangeRequestFormHeader
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
ChangeRequestFormHeader
,
self
)
.
save
(
*
args
,
**
kwargs
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM
.
value
,
self
.
id
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM
.
value
,
self
.
id
)
ChangeRequestFormHeader
.
objects
.
filter
(
id
=
self
.
id
)
.
update
(
form_code
=
code
)
# ChangeRequestFormHeader.objects.filter(id=self.id).update(form_code=code)
if
self
.
form_code
==
''
:
self
.
form_code
=
code
self
.
save
()
class
ChangeRequestFormApprovers
(
BaseApprover
):
class
ChangeRequestFormApprovers
(
BaseApprover
):
...
@@ -684,6 +692,12 @@ class ChangeRequestFormApprovers(BaseApprover):
...
@@ -684,6 +692,12 @@ class ChangeRequestFormApprovers(BaseApprover):
date_sent
=
models
.
DateTimeField
(
date_sent
=
models
.
DateTimeField
(
blank
=
True
,
blank
=
True
,
null
=
True
)
null
=
True
)
tmp_approver
=
models
.
ForeignKey
(
ChangeRequestTemplateApprovers
,
null
=
True
,
blank
=
True
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'code'
)
class
Meta
:
class
Meta
:
db_table
=
'change_request_form_approvers'
db_table
=
'change_request_form_approvers'
...
@@ -691,9 +705,12 @@ class ChangeRequestFormApprovers(BaseApprover):
...
@@ -691,9 +705,12 @@ class ChangeRequestFormApprovers(BaseApprover):
def
save
(
self
,
*
args
,
**
kwargs
):
def
save
(
self
,
*
args
,
**
kwargs
):
super
(
ChangeRequestFormApprovers
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
ChangeRequestFormApprovers
,
self
)
.
save
(
*
args
,
**
kwargs
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_APPROVER
.
value
,
self
.
id
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_APPROVER
.
value
,
self
.
id
)
ChangeRequestFormApprovers
.
objects
.
filter
(
id
=
self
.
id
)
.
update
(
code
=
code
)
#
ChangeRequestFormApprovers.objects.filter(id=self.id).update(code=code)
pass
if
self
.
code
==
''
:
self
.
code
=
code
self
.
created
=
datetime
.
now
()
self
.
save
()
class
ChangeRequestFormDetails
(
BaseDetails
):
class
ChangeRequestFormDetails
(
BaseDetails
):
...
@@ -705,6 +722,12 @@ class ChangeRequestFormDetails(BaseDetails):
...
@@ -705,6 +722,12 @@ class ChangeRequestFormDetails(BaseDetails):
on_delete
=
models
.
DO_NOTHING
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'form_code'
,
to_field
=
'form_code'
,
related_name
=
'frm_details'
)
related_name
=
'frm_details'
)
tmp_detail
=
models
.
ForeignKey
(
ChangeRequestTemplateDetails
,
null
=
True
,
blank
=
True
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'code'
)
class
Meta
:
class
Meta
:
db_table
=
'change_request_form_details'
db_table
=
'change_request_form_details'
...
@@ -712,9 +735,12 @@ class ChangeRequestFormDetails(BaseDetails):
...
@@ -712,9 +735,12 @@ class ChangeRequestFormDetails(BaseDetails):
def
save
(
self
,
*
args
,
**
kwargs
):
def
save
(
self
,
*
args
,
**
kwargs
):
super
(
ChangeRequestFormDetails
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
ChangeRequestFormDetails
,
self
)
.
save
(
*
args
,
**
kwargs
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_DETAIL
.
value
,
self
.
id
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_DETAIL
.
value
,
self
.
id
)
ChangeRequestFormDetails
.
objects
.
filter
(
id
=
self
.
id
)
.
update
(
code
=
code
)
#
ChangeRequestFormDetails.objects.filter(id=self.id).update(code=code)
pass
if
self
.
code
==
''
:
self
.
code
=
code
self
.
created
=
datetime
.
now
()
self
.
save
()
class
ChangeRequestFormStakeHolders
(
BaseStakeholder
):
class
ChangeRequestFormStakeHolders
(
BaseStakeholder
):
...
@@ -729,6 +755,12 @@ class ChangeRequestFormStakeHolders(BaseStakeholder):
...
@@ -729,6 +755,12 @@ class ChangeRequestFormStakeHolders(BaseStakeholder):
date_added
=
models
.
DateTimeField
(
date_added
=
models
.
DateTimeField
(
blank
=
True
,
blank
=
True
,
null
=
True
)
null
=
True
)
tmp_stake
=
models
.
ForeignKey
(
ChangeRequestTemplateStakeHolders
,
null
=
True
,
blank
=
True
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'code'
)
class
Meta
:
class
Meta
:
db_table
=
'change_request_form_stakeholders'
db_table
=
'change_request_form_stakeholders'
...
@@ -736,9 +768,12 @@ class ChangeRequestFormStakeHolders(BaseStakeholder):
...
@@ -736,9 +768,12 @@ class ChangeRequestFormStakeHolders(BaseStakeholder):
def
save
(
self
,
*
args
,
**
kwargs
):
def
save
(
self
,
*
args
,
**
kwargs
):
super
(
ChangeRequestFormStakeHolders
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
ChangeRequestFormStakeHolders
,
self
)
.
save
(
*
args
,
**
kwargs
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_STAKE
.
value
,
self
.
id
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_STAKE
.
value
,
self
.
id
)
ChangeRequestFormStakeHolders
.
objects
.
filter
(
id
=
self
.
id
)
.
update
(
code
=
code
)
#
ChangeRequestFormStakeHolders.objects.filter(id=self.id).update(code=code)
pass
if
self
.
code
==
''
:
self
.
code
=
code
self
.
created
=
datetime
.
now
()
self
.
save
()
class
ChangeRequestFormAttachments
(
BaseAttachment
):
class
ChangeRequestFormAttachments
(
BaseAttachment
):
...
@@ -750,6 +785,12 @@ class ChangeRequestFormAttachments(BaseAttachment):
...
@@ -750,6 +785,12 @@ class ChangeRequestFormAttachments(BaseAttachment):
on_delete
=
models
.
DO_NOTHING
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'form_code'
,
to_field
=
'form_code'
,
related_name
=
'frm_attachments'
)
related_name
=
'frm_attachments'
)
tmp_attach
=
models
.
ForeignKey
(
ChangeRequestTemplateAttachments
,
null
=
True
,
blank
=
True
,
on_delete
=
models
.
DO_NOTHING
,
to_field
=
'code'
)
class
Meta
:
class
Meta
:
db_table
=
'change_request_form_attachments'
db_table
=
'change_request_form_attachments'
...
@@ -757,9 +798,12 @@ class ChangeRequestFormAttachments(BaseAttachment):
...
@@ -757,9 +798,12 @@ class ChangeRequestFormAttachments(BaseAttachment):
def
save
(
self
,
*
args
,
**
kwargs
):
def
save
(
self
,
*
args
,
**
kwargs
):
super
(
ChangeRequestFormAttachments
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
ChangeRequestFormAttachments
,
self
)
.
save
(
*
args
,
**
kwargs
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_ATTACH
.
value
,
self
.
id
)
code
=
number_generator
(
enums
.
GenerateCode
.
FORM_ATTACH
.
value
,
self
.
id
)
ChangeRequestFormAttachments
.
objects
.
filter
(
id
=
self
.
id
)
.
update
(
code
=
code
)
#
ChangeRequestFormAttachments.objects.filter(id=self.id).update(code=code)
pass
if
self
.
code
==
''
:
self
.
code
=
code
self
.
created
=
datetime
.
now
()
self
.
save
()
"""
"""
...
...
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