def post(self, mine_guid): data = self.parser.parse_args() mine = Mine.find_by_mine_guid(mine_guid) if not mine: raise NotFound( 'There was no mine found with the provided mine_guid.') party = Party.find_by_party_guid(data.get('permittee_party_guid')) if not party: raise NotFound('Party not found') permit = Permit.find_by_permit_no(data.get('permit_no')) if permit: raise BadRequest("That permit number is already in use.") uploadedFiles = data.get('uploadedFiles', []) permit = Permit.create(mine.mine_guid, data.get('permit_no'), data.get('permit_status_code')) amendment = PermitAmendment.create( permit, data.get('received_date'), data.get('issue_date'), data.get('authorization_end_date'), 'OGP', description='Initial permit issued.') db.session.add(permit) db.session.add(amendment) for newFile in uploadedFiles: new_pa_doc = PermitAmendmentDocument( document_name=newFile['fileName'], document_manager_guid=newFile['document_manager_guid'], mine_guid=permit.mine_guid, ) amendment.related_documents.append(new_pa_doc) db.session.commit() permittee_start_date = data.get('issue_date'), permittee = MinePartyAppointment.create( mine.mine_guid, data.get('permittee_party_guid'), 'PMT', start_date=permittee_start_date, processed_by=self.get_user_info(), permit_guid=permit.permit_guid) db.session.add(permittee) db.session.commit() return permit
def get(self, permit_guid, mine_guid): permit = Permit.find_by_permit_guid_or_no(permit_guid) if not permit: raise NotFound('Permit not found.') if not str(permit.mine_guid) == mine_guid: raise BadRequest('Permit and mine_guid mismatch.') return permit
def post(self, mine_guid, permit_guid, permit_amendment_guid=None): if permit_amendment_guid: raise BadRequest('Unexpected permit_amendement_guid.') permit = Permit.find_by_permit_guid(permit_guid) if not permit: raise NotFound('Permit does not exist.') if not str(permit.mine_guid) == mine_guid: raise BadRequest( 'Permits mine_guid and provided mine_guid mismatch.') data = self.parser.parse_args() current_app.logger.info(f'creating permit_amendment with >> {data}') party = Party.find_by_party_guid(data.get('permittee_party_guid')) if not party: raise NotFound('Party not found') party_is_active_permittee = False permittees = MinePartyAppointment.find_by_permit_guid(permit_guid) for permittee in permittees: if permittee.end_date is None: if permittee.party_guid == party.party_guid: party_is_active_permittee = True else: # inactive old permittees permittee.end_date = datetime.utcnow() permittee.save() if not party_is_active_permittee: new_permittee = MinePartyAppointment.create(permit.mine_guid, data.get( 'permittee_party_guid'), 'PMT', datetime.utcnow(), None, self.get_user_info(), permit_guid, True) new_permittee.save() new_pa = PermitAmendment.create( permit, data.get('received_date'), data.get('issue_date'), data.get('authorization_end_date'), data.get('permit_amendment_type_code', 'AMD'), description=data.get('description')) uploadedFiles = data.get('uploadedFiles', []) for newFile in uploadedFiles: new_pa_doc = PermitAmendmentDocument( document_name=newFile['fileName'], document_manager_guid=newFile['document_manager_guid'], mine_guid=permit.mine_guid, ) new_pa.related_documents.append(new_pa_doc) new_pa.save() return new_pa
def post(self, mine_guid): mine = Mine.find_by_mine_guid(mine_guid) if not mine: raise NotFound('Mine not found') data = self.parser.parse_args() mine_report_definition = MineReportDefinition.find_by_mine_report_definition_guid( data['mine_report_definition_guid']) permit = Permit.find_by_permit_guid_or_no(data['permit_guid']) if mine_report_definition is None: raise BadRequest('A report must be selected from the list.') if permit and permit.mine_guid != mine.mine_guid: raise BadRequest( 'The permit must be associated with the selected mine.') mine_report = MineReport.create( mine_report_definition_id=mine_report_definition. mine_report_definition_id, mine_guid=mine.mine_guid, due_date=data.get('due_date'), received_date=data['received_date'], submission_year=data['submission_year'], permit_id=permit.permit_id if permit else None) submissions = data.get('mine_report_submissions') if submissions: submission = submissions[-1] if len(submission.get('documents')) > 0: submission_status = data.get( 'mine_report_submission_status') if data.get( 'mine_report_submission_status') else 'NRQ' report_submission = MineReportSubmission( mine_report_submission_status_code=submission_status, submission_date=datetime.utcnow()) for submission_doc in submission.get('documents'): mine_doc = MineDocument( mine_guid=mine.mine_guid, document_name=submission_doc['document_name'], document_manager_guid=submission_doc[ 'document_manager_guid']) if not mine_doc: raise BadRequest( 'Unable to register uploaded file as document') mine_doc.save() report_submission.documents.append(mine_doc) mine_report.mine_report_submissions.append(report_submission) try: mine_report.save() except Exception as e: raise InternalServerError(f'Error when saving: {e}') return mine_report, 201
def test_permit_model_validate_permit_no(): with pytest.raises(AssertionError) as e: Permit(permit_guid=uuid.uuid4(), mine_guid=uuid.uuid4(), permit_no='', permit_status_code='O', received_date=datetime.today(), issue_date=datetime.today()) assert 'Permit number is not provided.' in str(e.value)
def test_permit_model_validate_permit_no_max_char(): with pytest.raises(AssertionError) as e: Permit(permit_guid=uuid.uuid4(), mine_guid=uuid.uuid4(), permit_no='6' * 17, permit_status_code='O', received_date=datetime.today(), issue_date=datetime.today()) assert 'Permit number must not exceed 16 characters.' in str(e.value)
def get(self): result = "" now_info = "" response_message = "" try: permit_no = request.args.get('a_PermitNumber') permit_prefix = permit_no.split("-")[0] permits = Permit.find_by_permit_no_all(permit_no) for permit in permits: mine = Mine.find_by_mine_guid(str(permit.mine_guid)) # Mine must be operating. if not mine.mine_status or mine.mine_status[ 0].mine_status_xref.mine_operation_status_code != "OP": break if permit_prefix not in ["CX", "MX"]: break for permit_amendment in permit.permit_amendments: if (permit_amendment.authorization_end_date - datetime.utcnow().date()).days > 30: #only want permits that expire 30 days or further in the future if permit_amendment.now_identity: now_info = now_info + str( permit_amendment.now_identity.now_number ) + " - " + str( permit_amendment.authorization_end_date) + '\r' else: now_info = now_info + " - " + str( permit_amendment.authorization_end_date) + '\r' break if now_info != "": result = "Success" else: result = "Failure" response_message = "NoValidNowsForPermit" except Exception as e: current_app.logger.error(str(e)) result = "Failure" now_info = "" response_message = "Unhandled Exception" return { "a_Result": result, "a_NoWInfo": now_info, "a_ResponseMessage": response_message, "a_Timestamp": datetime.utcnow() }
def get(self): result = "" mine_info = "" response_message = "" try: permit_no = request.args.get('a_PermitNumber') permit_prefix = permit_no.split("-")[0] type_of_deemed_auth = request.args.get('a_TypeofDeemedAuth') permits = Permit.find_by_permit_no_all(permit_no) for permit in permits: mine = Mine.find_by_mine_guid(str(permit.mine_guid)) # Mine must be operating. if not mine.mine_status or mine.mine_status[ 0].mine_status_xref.mine_operation_status_code != "OP": break # IP SURVEYS (Induced): Valid MMS mine types: 'CX','ES','EU' # There may be need of a check against mine_tenure_type_code IN ["MIN", "COL"] and mine_disturbance_code IN ["SUR", "UND"] # but this data is inconsistant for now. if type_of_deemed_auth == "INDUCED" and permit_prefix not in [ "CX", "MX" ]: break # DRILL PROGRAM (Drill): Valid MMS mine types: 'CS','CU','MS','MU','IS','IU' if type_of_deemed_auth != "INDUCED" and permit_prefix not in [ "C", "M" ]: break mine_info = mine_info + mine.mine_no + ' - ' + mine.mine_name + '\r\c' if mine_info != "": result = "Success" else: result = "Failure" response_message = "NoValidMinesForPermit" except Exception as e: current_app.logger.error(str(e)) result = "Failure" mine_info = "" response_message = "Unhandled Exception" return { "a_Result": result, "a_MineInfo": mine_info, "a_ResponseMessage": response_message, "a_Timestamp": datetime.utcnow() }
def put(self, bond_guid): # Get the bond and validate that it can be transferred bond = Bond.find_by_bond_guid(bond_guid) if bond is None: raise NotFound('No bond was found with the guid provided.') if bond.bond_status_code != "ACT": raise BadRequest('Only active bonds can be transferred.') # Get the permit to transfer the bond to and validate it permit_guid = request.json.get('permit_guid', None) if not permit_guid: raise BadRequest('permit_guid is required.') permit = Permit.find_by_permit_guid(permit_guid) if not permit: raise BadRequest( 'No permit was found with the permit_guid provided.') if permit.permit_guid == bond.permit.permit_guid: raise BadRequest( 'This bond is already associated with this permit.') if bond.permit.mine_guid != permit.mine_guid: raise BadRequest( 'You can only transfer to a permit on the same mine.') # Get the note to apply to the bond and the transferred bond note = request.json.get('note', None) if note: bond.note = note # Release the bond bond.bond_status_code = "REL" # Create the new "transferred bond" new_bond_json = marshal(bond, BOND) del new_bond_json['bond_id'] del new_bond_json['bond_guid'] del new_bond_json['permit_guid'] del new_bond_json['permit_no'] del new_bond_json['payer'] new_bond_json['bond_status_code'] = 'ACT' new_bond_json['note'] = note try: new_bond = Bond._schema().load(new_bond_json) except MarshmallowError as e: raise InternalServerError(e) permit.bonds.append(new_bond) bond.save() new_bond.save() return new_bond
def put(self, permit_guid, mine_guid): permit = Permit.find_by_permit_guid(permit_guid) if not permit: raise NotFound('Permit not found.') if not str(permit.mine_guid) == mine_guid: raise BadRequest('Permit and mine_guid mismatch.') data = self.parser.parse_args() for key, value in data.items(): if key in ['permit_no', 'mine_guid', 'uploadedFiles']: continue # non-editable fields from put setattr(permit, key, value) permit.save() return permit
def get(self): result = "" now_info = "" response_message = "" try: mine_no = request.args.get('a_MineNumber') mine = Mine.find_by_mine_no(mine_no) # Mine must be operating. if mine.mine_status or mine.mine_status[ 0].mine_status_xref.mine_operation_status_code != "OP": permits = Permit.find_by_mine_guid(mine.mine_guid) for permit in permits: for permit_amendment in permit.permit_amendments: if permit_amendment.now_identity: now_info = now_info + str( permit_amendment.now_identity.now_number ) + " - " + str( permit_amendment.authorization_end_date) + '\r' else: now_info = now_info + " - " + str( permit_amendment.authorization_end_date) + '\r' break if now_info != "": result = "Success" else: result = "Failure" response_message = "NoValidNowsForMine" except Exception as e: current_app.logger.error(str(e)) result = "Failure" now_info = "" response_message = "Unhandled Exception" return { "a_Result": result, "a_NoWInfo": now_info, "a_ResponseMessage": response_message, "a_Timestamp": datetime.utcnow() }
def post(self): try: bond = Bond._schema().load(request.json['bond']) except MarshmallowError as e: raise BadRequest(e) permit = Permit.find_by_permit_guid(request.json['permit_guid']) if permit is None: raise BadRequest('No permit was found with the guid provided.') bond.permit = permit for doc in bond.documents: doc.mine_guid = permit.mine_guid bond.save() return bond, 201
def get(self): mine_guid = request.args.get('mine_guid', None) if mine_guid is None: raise BadRequest('Please provide a mine_guid.') mine = Mine.find_by_mine_guid(mine_guid) if mine is None: return [] permits = Permit.find_by_mine_guid(mine.mine_guid) if not permits: return [] bonds = [bond for permit in permits for bond in permit.bonds] return bonds
def post(self): try: reclamation_invoice = ReclamationInvoice._schema().load( request.json['reclamation_invoice']) except MarshmallowError as e: raise BadRequest(e) permit = Permit.find_by_permit_guid(request.json['permit_guid']) if permit is None: raise BadRequest('No permit was found with the guid provided.') reclamation_invoice.permit = permit for doc in reclamation_invoice.documents: doc.mine_guid = permit.mine_guid reclamation_invoice.save() return reclamation_invoice, 201
def get(self): mine_guid = request.args.get('mine_guid', None) if mine_guid is None: raise BadRequest('Please provide a mine_guid.') mine = Mine.find_by_mine_guid(mine_guid) if mine is None: return [] permits = Permit.find_by_mine_guid(mine.mine_guid) if not permits: return [] reclamation_invoices = [ reclamation_invoice for permit in permits for reclamation_invoice in permit.reclamation_invoices ] return reclamation_invoices
def post(self): data = self.parser.parse_args() mine = Mine.find_by_mine_guid(data['mine_guid']) permit = Permit.find_by_permit_guid(data['permit_guid']) err_str = '' if not mine: err_str += 'Mine not Found. ' if not permit: err_str += 'Permit not Found. ' if mine and not mine.major_mine_ind: err_str += 'Permit Applications can only be created on mines where major_mine_ind=True' if err_str: raise BadRequest(err_str) new_now = NOWApplicationIdentity(mine_guid=data['mine_guid'], permit=permit) new_now.now_application = NOWApplication( notice_of_work_type_code=data['notice_of_work_type_code'], now_application_status_code='REC', submitted_date=data['submitted_date'], received_date=data['received_date']) new_now.save() return new_now, 201
def get(self): mine_guid = request.args.get('mine_guid', None) if mine_guid is None: raise BadRequest('Please provide a mine_guid.') mine = Mine.find_by_mine_guid(mine_guid) if mine is None: return [] permits = Permit.find_by_mine_guid(mine.mine_guid) if not permits: return [] bonds = [bond for permit in permits for bond in permit.bonds] if jwt.validate_roles([MINESPACE_PROPONENT]): bonds = marshal(bonds, BOND_MINESPACE) return bonds
def test_permit_model_find_by_permit_guid(db_session): permit_guid = PermitFactory().permit_guid permit = Permit.find_by_permit_guid(str(permit_guid)) assert permit.permit_guid == permit_guid
def test_permit_model_find_by_mine_guid(db_session): mine_guid = MineFactory(mine_permit=1).mine_guid permits = Permit.find_by_mine_guid(str(mine_guid)) assert permits[0].mine_guid == mine_guid
def post(self, mine_guid, permit_guid, permit_amendment_guid=None): if permit_amendment_guid: raise BadRequest('Unexpected permit_amendement_guid.') permit = Permit.find_by_permit_guid(permit_guid) if not permit: raise NotFound('Permit does not exist.') if not str(permit.mine_guid) == mine_guid: raise BadRequest('Permits mine_guid and provided mine_guid mismatch.') data = self.parser.parse_args() current_app.logger.info(f'creating permit_amendment with >> {data}') party = Party.find_by_party_guid(data.get('permittee_party_guid')) if not party: raise NotFound('Party not found') permittees = MinePartyAppointment.find_by_permit_guid(permit_guid) if not permittees: raise NotFound('Party appointments not found') permit_issue_datetime = data.get('issue_date') # convert permit_issue_date to a date object to compare with permittee start_date, #Both dates are stored in the DB as Dates, and are being converted to SQLAlchemy dateTimes in the modals, but for some reason being returned as Python Dates. permit_issue_date = datetime.date(permit_issue_datetime) is_historical_permit = False new_end_dates = MinePartyAppointment.find_appointment_end_dates( permit_guid, permit_issue_date) for permittee in permittees: # check if the new appointment is older than the current appointment, if so create a new permittee appointment if permittee.start_date > permit_issue_date: is_historical_permit = True else: # if the amendment is the newest, change the end dates of the other appointments position = new_end_dates.index(permittee.start_date) if new_end_dates.index(permittee.start_date) == 0: permittee.save() else: permittee.end_date = new_end_dates[position - 1] permittee.save() permittee_start_date = permit_issue_date position = new_end_dates.index(permit_issue_date) permittee_end_date = new_end_dates[position - 1] if is_historical_permit else None # create a new appointment, so every amendment is associated with a permittee new_permittee = MinePartyAppointment.create( permit.mine_guid, data.get('permittee_party_guid'), 'PMT', self.get_user_info(), start_date=permittee_start_date, end_date=permittee_end_date, permit_guid=permit_guid) new_permittee.save() new_pa = PermitAmendment.create( permit, data.get('received_date'), data.get('issue_date'), data.get('authorization_end_date'), data.get('permit_amendment_type_code', 'AMD'), description=data.get('description')) uploadedFiles = data.get('uploadedFiles', []) for newFile in uploadedFiles: new_pa_doc = PermitAmendmentDocument( document_name=newFile['fileName'], document_manager_guid=newFile['document_manager_guid'], mine_guid=permit.mine_guid, ) new_pa.related_documents.append(new_pa_doc) new_pa.save() return new_pa
def get(self, mine_guid): results = Permit.find_by_mine_guid(mine_guid) return results