Skip to content

Commit 54aa36d

Browse files
authored
[FIX] - catch missing orgbook entity and improve logging (#3301)
* data typing issues and clean up * better logging * better logging of errors * list of tuples * add celery decorator * rename var to match envvar * credential per mine_party_appt produces duplicates. * wrong class * don't invoke if being used by celery * query must excluded deleted permit_amendments * add check if cred not created * improve logging of problem states * make date a date, formatting * revered received date, update issue_Date validator * all datetimes, never dates * typo * names are important * only use datetime objects, no date objects * better typing ensure factory is producing a datetime and not a date * ensure second is non-zero for datetime * oops * brackets matter * what is happening? * scoping * factories making dates, should be datetimes. i have no idea anymore * idk why that today generator suck * pass callable * what * use jank * use work * huh? * typing dates as dates. some db columns are dates, others aren' * dates * handling incoming datetime for date column * probably failing on date comparison * type hinting is good * clean up logging * columns are dates * received date is parsed to datetime * expand on type hinting * pass function, not value
1 parent 2bf03e1 commit 54aa36d

File tree

11 files changed

+430
-248
lines changed

11 files changed

+430
-248
lines changed

services/core-api/app/api/mines/permits/permit/models/permit.py

+28-17
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ class Permit(SoftDeleteMixin, AuditMixin, Base):
3232
status_changed_timestamp = db.Column(db.DateTime)
3333
project_id = db.Column(db.String)
3434

35-
#if true, this permit is locked from any vc'ed issued for it.
36-
mines_act_permit_vc_locked = db.Column(db.Boolean, default=False)
35+
#if true, this permit is locked from any vc'ed issued for it.
36+
mines_act_permit_vc_locked = db.Column(db.Boolean, default=False)
3737

3838
_all_permit_amendments = db.relationship(
3939
'PermitAmendment',
@@ -43,7 +43,12 @@ class Permit(SoftDeleteMixin, AuditMixin, Base):
4343
order_by='desc(PermitAmendment.issue_date), desc(PermitAmendment.permit_amendment_id)',
4444
lazy='select')
4545

46-
_all_mines = db.relationship('Mine', lazy='select', secondary='mine_permit_xref', back_populates='_permit_identities', overlaps='mine,mine_permit_xref,all_mine_permit_xref')
46+
_all_mines = db.relationship(
47+
'Mine',
48+
lazy='select',
49+
secondary='mine_permit_xref',
50+
back_populates='_permit_identities',
51+
overlaps='mine,mine_permit_xref,all_mine_permit_xref')
4752

4853
permittee_appointments = db.relationship(
4954
'MinePartyAppointment',
@@ -66,8 +71,13 @@ class Permit(SoftDeleteMixin, AuditMixin, Base):
6671
is_exploration = db.Column(db.Boolean)
6772

6873
bonds = db.relationship(
69-
'Bond', lazy='select', secondary='bond_permit_xref', order_by='desc(Bond.issue_date)', back_populates='permit')
70-
reclamation_invoices = db.relationship('ReclamationInvoice', lazy='select', back_populates='permit')
74+
'Bond',
75+
lazy='select',
76+
secondary='bond_permit_xref',
77+
order_by='desc(Bond.issue_date)',
78+
back_populates='permit')
79+
reclamation_invoices = db.relationship(
80+
'ReclamationInvoice', lazy='select', back_populates='permit')
7181
exemption_fee_status_code = db.Column(
7282
db.String, db.ForeignKey('exemption_fee_status.exemption_fee_status_code'))
7383
exemption_fee_status_note = db.Column(db.String)
@@ -77,7 +87,8 @@ class Permit(SoftDeleteMixin, AuditMixin, Base):
7787
lazy='select',
7888
primaryjoin='and_(Permit.permit_guid == MineType.permit_guid, MineType.active_ind==True)')
7989

80-
_mine_associations = db.relationship('MinePermitXref', overlaps='_all_mines,all_mine_permit_xref,mine_permit_xref')
90+
_mine_associations = db.relationship(
91+
'MinePermitXref', overlaps='_all_mines,all_mine_permit_xref,mine_permit_xref')
8192

8293
# Liability on permit after permit is closed
8394
remaining_static_liability = db.Column(db.Numeric(16, 2))
@@ -113,7 +124,7 @@ def current_permittee_digital_wallet_connection_state(self):
113124
return ""
114125

115126
@hybrid_property
116-
def permit_amendments(self):
127+
def permit_amendments(self) -> list[PermitAmendment]:
117128
if not self._context_mine:
118129
raise Exception('this getter is only available if _context_mine has been set')
119130
return [
@@ -171,55 +182,55 @@ def delete(self):
171182
super(Permit, self).delete()
172183

173184
@classmethod
174-
def find_by_permit_guid(cls, _id, mine_guid=None):
185+
def find_by_permit_guid(cls, _id, mine_guid=None) -> "Permit":
175186
pmt = cls.query.filter_by(permit_guid=_id, deleted_ind=False).first()
176187
if pmt and mine_guid:
177188
pmt._context_mine = [m for m in pmt._all_mines if str(m.mine_guid) == str(mine_guid)][0]
178189
return pmt
179190

180191
@classmethod
181-
def find_by_permit_id(cls, _id):
192+
def find_by_permit_id(cls, _id) -> "Permit":
182193
return cls.query.filter_by(permit_id=_id, deleted_ind=False).first()
183194

184195
@classmethod
185-
def find_by_mine_guid(cls, _id):
196+
def find_by_mine_guid(cls, _id) -> list["Permit"]:
186197
return cls.query.filter_by(
187198
mine_guid=_id, deleted_ind=False).filter(cls.permit_status_code != 'D').all()
188199

189200
@classmethod
190-
def find_by_permit_no(cls, _permit_no):
201+
def find_by_permit_no(cls, _permit_no) -> "Permit":
191202
return cls.query.filter_by(
192203
permit_no=_permit_no, deleted_ind=False).filter(cls.permit_status_code != 'D').first()
193204

194205
@classmethod
195-
def find_by_permit_no_deleted_in_draft(cls, _permit_no):
206+
def find_by_permit_no_deleted_in_draft(cls, _permit_no) -> "Permit":
196207
return cls.query.filter(
197208
and_(
198209
cls.permit_no.like(_permit_no + '%'), cls.deleted_ind == True,
199210
cls.permit_status_code == 'D')).order_by(cls.permit_id.desc()).first()
200211

201212
@classmethod
202-
def find_by_permit_no_all(cls, _permit_no):
213+
def find_by_permit_no_all(cls, _permit_no) -> list["Permit"]:
203214
return cls.query.filter_by(
204215
permit_no=_permit_no, deleted_ind=False).filter(cls.permit_status_code != 'D').all()
205216

206217
@classmethod
207-
def find_by_permit_guid_or_no(cls, _permit_guid_or_no):
218+
def find_by_permit_guid_or_no(cls, _permit_guid_or_no) -> "Permit":
208219
result = cls.find_by_permit_guid(_permit_guid_or_no)
209220
if not result:
210221
result = cls.find_by_permit_no(_permit_guid_or_no)
211222
return result
212223

213224
@classmethod
214-
def find_by_now_application_guid(cls, _now_application_guid):
225+
def find_by_now_application_guid(cls, _now_application_guid) -> "Permit":
215226
permit_amendment = PermitAmendment.find_by_now_application_guid(_now_application_guid)
216227
if permit_amendment is not None:
217228
permit = Permit.find_by_permit_id(permit_amendment.permit_id)
218229
permit._context_mine = permit_amendment.mine
219230
return permit
220231
return None
221232

222-
def assign_permit_no(self, notice_of_work_type_code):
233+
def assign_permit_no(self, notice_of_work_type_code) -> None:
223234
permit_prefix = notice_of_work_type_code if notice_of_work_type_code != 'S' else 'G'
224235
if permit_prefix in ['M', 'C'] and self.is_exploration:
225236
permit_prefix = permit_prefix + 'X'
@@ -292,4 +303,4 @@ def validate_exemption_fee_status(cls,
292303
or mine_tenure_type_code == "PRL") and exemption_fee_status_code != 'MIP':
293304
raise AssertionError('Exemption fee should be "Pits/Quarry" for this permit')
294305

295-
return exemption_fee_status_code
306+
return exemption_fee_status_code

services/core-api/app/api/mines/permits/permit_amendment/models/permit_amendment.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import uuid
22
from datetime import date, datetime
3+
from typing import Union
34

45
from app.api.constants import *
56
from app.api.mines.permits.permit_amendment.models.permit_amendment_document import (
6-
PermitAmendmentDocument,
7-
)
7+
PermitAmendmentDocument, )
88
from app.api.mines.permits.permit_conditions.models.permit_conditions import (
9-
PermitConditions,
10-
)
9+
PermitConditions, )
1110
from app.api.utils.models_mixins import AuditMixin, Base, SoftDeleteMixin
1211
from app.api.verifiable_credentials.aries_constants import IssueCredentialIssuerState
1312
from app.extensions import db
@@ -29,9 +28,9 @@ class PermitAmendment(SoftDeleteMixin, AuditMixin, Base):
2928
mine_guid = db.Column(UUID(as_uuid=True), db.ForeignKey('mine.mine_guid'), nullable=False)
3029
permit_amendment_guid = db.Column(UUID(as_uuid=True), server_default=FetchedValue())
3130
permit_id = db.Column(db.Integer, db.ForeignKey('permit.permit_id'), nullable=False)
32-
received_date = db.Column(db.DateTime, nullable=False)
33-
issue_date: date = db.Column(db.DateTime, nullable=False)
34-
authorization_end_date = db.Column(db.DateTime, nullable=False)
31+
received_date: date = db.Column(db.Date, nullable=False) # db column is date
32+
issue_date: date = db.Column(db.Date, nullable=False) # db column is date
33+
authorization_end_date: date = db.Column(db.Date, nullable=False) # db column is date
3534
permit_amendment_status_code = db.Column(
3635
db.String(3), db.ForeignKey('permit_amendment_status_code.permit_amendment_status_code'))
3736
permit_amendment_type_code = db.Column(
@@ -294,18 +293,21 @@ def validate_received_date(self, key, received_date):
294293
return received_date
295294

296295
@validates('issue_date')
297-
def validate_issue_date(self, key, issue_date):
296+
def validate_issue_date(self, key, issue_date: Union[date, datetime]) -> date:
298297
# TODO DO NOT REMOVE NEXT LINE. If this validation removed then exception will be thrown on permit creation/editing:
299298
# "permit_amendment" violates foreign key constraint "permit_amendment_mine_permit_xref_mine_guid_permit_no_fk"
300299
# DETAIL: Key (mine_guid, permit_id)=(28966bf7-8e65-4cc4-b077-b248b6a136ef, 212) is not present in table "mine_permit_xref".
301300
original_permit_amendment = self.query.filter_by(permit_id=self.permit_id).filter_by(
302301
permit_amendment_type_code='OGP').first()
303302

303+
if isinstance(issue_date, datetime):
304+
issue_date = issue_date.date()
305+
304306
if issue_date:
305307
if issue_date.isoformat() == '9999-12-31':
306308
raise AssertionError(
307309
'Permit amendment issue date should be set to null if not known.')
308-
if self.permit_amendment_status_code != 'DFT' and issue_date > datetime.today():
310+
if self.permit_amendment_status_code != 'DFT' and issue_date > date.today():
309311
raise AssertionError('Permit amendment issue date cannot be set to the future.')
310312
return issue_date
311313

0 commit comments

Comments
 (0)