Skip to content

Commit 08e90fa

Browse files
authored
Requirement to create many enforcements (#634)
* Inspection requirements refinements * requirement - enforcement many to many * requirement to create many enforcement actions
1 parent cb0dbbd commit 08e90fa

39 files changed

+1069
-1063
lines changed

compliance-api/src/compliance_api/models/administrative_penalty.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -330,29 +330,6 @@ def get_count_by_project_nd_case_file_id(cls, project_id: int, case_file_id: int
330330
)
331331
return result.administrative_penalty_count if result else 0
332332

333-
@classmethod
334-
def does_administrative_penalty_exists_by_requirement_ids(
335-
cls, requirement_ids: list[int], administrative_penalty_id: int = None
336-
):
337-
"""Check if an administrative penalty exists by requirement ids."""
338-
query = cls.query.join(
339-
AdministrativePenaltyInspectionRequirementMap,
340-
AdministrativePenaltyInspectionRequirementMap.administrative_penalty_id
341-
== cls.id,
342-
).filter(
343-
AdministrativePenaltyInspectionRequirementMap.inspection_requirement_id.in_(
344-
requirement_ids
345-
),
346-
AdministrativePenaltyInspectionRequirementMap.is_deleted.is_(False),
347-
AdministrativePenaltyInspectionRequirementMap.is_active.is_(True),
348-
cls.is_deleted.is_(False),
349-
)
350-
351-
if administrative_penalty_id:
352-
query = query.filter(cls.id != administrative_penalty_id)
353-
354-
return query.first() is not None
355-
356333
@classmethod
357334
def get_administrative_penalties_by_case_files(
358335
cls, case_file_ids: list[int], open_aps_only: bool = False

compliance-api/src/compliance_api/models/charge_recommendation.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -376,37 +376,3 @@ def get_count_by_project_nd_case_file_id(
376376
.first()
377377
)
378378
return result.charge_recommendation_count if result else 0
379-
380-
@classmethod
381-
@with_session
382-
def does_charge_recommendation_exists_by_requirement_ids(
383-
cls,
384-
requirement_ids: list[int],
385-
charge_recommendation_id: int = None,
386-
session=None,
387-
):
388-
"""Check if a charge recommendation exists by requirement ids."""
389-
query = (
390-
session.query(cls)
391-
.join(
392-
ChargeRecommendationInspectionRequirementMap,
393-
cls.id
394-
== ChargeRecommendationInspectionRequirementMap.charge_recommendation_id,
395-
)
396-
.filter(
397-
and_(
398-
ChargeRecommendationInspectionRequirementMap.inspection_requirement_id.in_(
399-
requirement_ids
400-
),
401-
cls.is_active.is_(True),
402-
cls.is_deleted.is_(False),
403-
ChargeRecommendationInspectionRequirementMap.is_active.is_(True),
404-
ChargeRecommendationInspectionRequirementMap.is_deleted.is_(False),
405-
)
406-
)
407-
)
408-
409-
if charge_recommendation_id:
410-
query = query.filter(cls.id != charge_recommendation_id)
411-
412-
return query.first() is not None

compliance-api/src/compliance_api/models/order.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -246,29 +246,6 @@ def get_count_by_project_nd_case_file_id(cls, project_id: int, case_file_id: int
246246
)
247247
return result.order_count if result else 0
248248

249-
@classmethod
250-
def does_order_exists_by_requirement_ids(
251-
cls, requirement_ids: list[int], order=None
252-
):
253-
"""Check if an order exists by requirement ids."""
254-
query = cls.query.join(
255-
OrderInspectionRequirementMap,
256-
OrderInspectionRequirementMap.order_id == cls.id,
257-
).filter(
258-
OrderInspectionRequirementMap.inspection_requirement_id.in_(
259-
requirement_ids
260-
),
261-
cls.is_deleted.is_(False),
262-
)
263-
264-
# Only filter by order_replace_status if order is provided
265-
if order and hasattr(order, "order_replace_status"):
266-
query = query.filter(cls.order_replace_status == order.order_replace_status)
267-
268-
if order and order.id:
269-
query = query.filter(cls.id != order.id)
270-
return query.first()
271-
272249
@classmethod
273250
def get_by_order_number(cls, order_number: str):
274251
"""Find an order by order number."""

compliance-api/src/compliance_api/models/restorative_justice.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -301,37 +301,3 @@ def get_count_by_project_nd_case_file_id(
301301
)
302302
.count()
303303
)
304-
305-
@classmethod
306-
@with_session
307-
def does_restorative_justice_exists_by_requirement_ids(
308-
cls,
309-
requirement_ids: list[int],
310-
restorative_justice_id: int = None,
311-
session=None,
312-
):
313-
"""Check if a restorative justice exists by requirement ids."""
314-
query = (
315-
session.query(cls)
316-
.join(
317-
RestorativeJusticeInspectionRequirementMap,
318-
cls.id
319-
== RestorativeJusticeInspectionRequirementMap.restorative_justice_id,
320-
)
321-
.filter(
322-
and_(
323-
RestorativeJusticeInspectionRequirementMap.inspection_requirement_id.in_(
324-
requirement_ids
325-
),
326-
cls.is_active.is_(True),
327-
cls.is_deleted.is_(False),
328-
RestorativeJusticeInspectionRequirementMap.is_active.is_(True),
329-
RestorativeJusticeInspectionRequirementMap.is_deleted.is_(False),
330-
)
331-
)
332-
)
333-
334-
if restorative_justice_id:
335-
query = query.filter(cls.id != restorative_justice_id)
336-
337-
return query.first() is not None

compliance-api/src/compliance_api/models/violation_ticket.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -265,24 +265,6 @@ def get_count_by_project_and_case_file_id(cls, project_id: int, case_file_id: in
265265
)
266266
return query.count()
267267

268-
@classmethod
269-
def does_violation_ticket_exists_by_requirement_ids(
270-
cls, requirement_ids: list[int], violation_ticket_id: int = None
271-
):
272-
"""Check if a violation ticket exists by requirement ids."""
273-
query = cls.query.join(
274-
ViolationTicketInspectionRequirementMap,
275-
ViolationTicketInspectionRequirementMap.violation_ticket_id == cls.id,
276-
).filter(
277-
ViolationTicketInspectionRequirementMap.inspection_requirement_id.in_(
278-
requirement_ids
279-
),
280-
cls.is_deleted.is_(False),
281-
)
282-
if violation_ticket_id:
283-
query = query.filter(cls.id != violation_ticket_id)
284-
return query.first()
285-
286268
@classmethod
287269
def get_by_vt_number(cls, vt_number: str):
288270
"""Find a violation ticket by vt number."""

compliance-api/src/compliance_api/models/warning_letter.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -246,21 +246,3 @@ def get_count_by_project_nd_case_file_id(cls, project_id: int, case_file_id: int
246246
.first()
247247
)
248248
return result.warning_letter_count if result else 0
249-
250-
@classmethod
251-
def does_warning_letter_exists_by_requirement_ids(
252-
cls, requirement_ids: list[int], warning_letter_id: int = None
253-
):
254-
"""Check if a warning letter exists by requirement ids."""
255-
query = cls.query.join(
256-
WarningLetterInspectionRequirementMap,
257-
WarningLetterInspectionRequirementMap.warning_letter_id == cls.id,
258-
).filter(
259-
WarningLetterInspectionRequirementMap.inspection_requirement_id.in_(
260-
requirement_ids
261-
),
262-
cls.is_deleted.is_(False),
263-
)
264-
if warning_letter_id:
265-
query = query.filter(cls.id != warning_letter_id)
266-
return query.first()

compliance-api/src/compliance_api/resources/case_file.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ class CaseFile(Resource):
199199
"""Resource for managing a single CaseFile."""
200200

201201
@staticmethod
202+
@auth.require
202203
@ApiHelper.swagger_decorators(API, endpoint_description="Fetch a CaseFile by id")
203204
@API.response(code=200, model=case_file_list_model, description="Success")
204205
@API.response(404, "Not Found")
@@ -340,6 +341,7 @@ def post(case_file_id):
340341
return CaseFileLinkSchema().dump(created_link), HTTPStatus.CREATED
341342

342343
@staticmethod
344+
@auth.require
343345
@ApiHelper.swagger_decorators(API, endpoint_description="Get all linked case files")
344346
@API.response(code=200, model=[case_file_option_schema], description="Success")
345347
def get(case_file_id):

compliance-api/src/compliance_api/resources/complaint.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ class Complaint(Resource):
184184
"""Resource for managing a single Complaint."""
185185

186186
@staticmethod
187+
@auth.require
187188
@ApiHelper.swagger_decorators(API, endpoint_description="Fetch a complaint by id")
188189
@API.response(code=200, model=complaint_list_model, description="Success")
189190
@API.response(404, "Not Found")
@@ -228,6 +229,7 @@ class ComplaintRequirementDetails(Resource):
228229
"""Resource for managing a Complaint requirement details.."""
229230

230231
@staticmethod
232+
@auth.require
231233
@ApiHelper.swagger_decorators(
232234
API, endpoint_description="Fetch a complaint requirement details"
233235
)
@@ -245,6 +247,7 @@ class ComplaintContact(Resource):
245247
"""Resource for managing a Complaint Contact."""
246248

247249
@staticmethod
250+
@auth.require
248251
@ApiHelper.swagger_decorators(
249252
API, endpoint_description="Fetch a complaint source contact"
250253
)

compliance-api/src/compliance_api/resources/section.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from flask_restx import Namespace, Resource
66

7+
from compliance_api.auth import auth
8+
79
from ..schemas import SectionSchema
810
from ..services.section import SectionService
911
from ..utils.util import cors_preflight
@@ -23,6 +25,7 @@ class Sections(Resource):
2325
"""Resource for managing sections."""
2426

2527
@staticmethod
28+
@auth.require
2629
@API.response(code=200, description="Success", model=[section_list_model])
2730
@ApiHelper.swagger_decorators(API, endpoint_description="Fetch all active sections")
2831
def get():

compliance-api/src/compliance_api/services/administrative_penalty.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,6 @@ def create_administrative_penalty(cls, administrative_penalty_data):
146146
EnforcementActionOptionEnum.ADMINISTRATIVE_PENALTY_RECOMMENDATION.value,
147147
)
148148

149-
# Check if administrative penalty already exists for the given requirements
150-
if AdministrativePenalty.does_administrative_penalty_exists_by_requirement_ids(
151-
administrative_penalty_data.get("inspection_requirement_ids", []),
152-
):
153-
raise UnprocessableEntityError(
154-
"Administrative Penalty already exists for these requirements."
155-
)
156149
administrative_penalty_obj = _create_ap_object(
157150
inspection, administrative_penalty_data
158151
)
@@ -202,17 +195,6 @@ def update_administrative_penalty(cls, administrative_penalty_id, update_data):
202195
EnforcementActionOptionEnum.ADMINISTRATIVE_PENALTY_RECOMMENDATION.value,
203196
)
204197

205-
# Check if administrative penalty already exists for the given requirements
206-
if (
207-
requirement_ids
208-
and AdministrativePenalty.does_administrative_penalty_exists_by_requirement_ids(
209-
requirement_ids, administrative_penalty_id
210-
)
211-
):
212-
raise UnprocessableEntityError(
213-
"Administrative Penalty already exists for these requirements."
214-
)
215-
216198
# Validate penalty_amount if decision is provided
217199
if (
218200
update_data.get("decision")
@@ -349,16 +331,6 @@ def link(cls, administrative_penalty_id, link):
349331
requirement_ids,
350332
EnforcementActionOptionEnum.ADMINISTRATIVE_PENALTY_RECOMMENDATION.value,
351333
)
352-
# Check if administrative penalty already exists for the given requirements
353-
if (
354-
requirement_ids
355-
and AdministrativePenalty.does_administrative_penalty_exists_by_requirement_ids(
356-
requirement_ids, administrative_penalty_id
357-
)
358-
):
359-
raise UnprocessableEntityError(
360-
"Administrative Penalty already exists for these requirements."
361-
)
362334
existing_requirements = (
363335
AdministrativePenaltyInspectionRequirementMap.get_by_inspection_and_administrative_penalty_id(
364336
inspection_id, administrative_penalty_id

0 commit comments

Comments
 (0)