def get_previous_evidence_and_feedback(evidence_id): evidence = evidence_service.get_evidence_by_id(evidence_id) if not evidence: abort(404) if evidence.status not in ['assessed', 'rejected']: abort(404) evidence_data = evidence.serialize() if evidence_data: domain_criteria = domain_criteria_service.get_criteria_by_domain_id( evidence_data['domainId']) evidence_data['domain_criteria'] = [ x.serialize() for x in domain_criteria ] evidence_data['domain_price_maximum'] = evidence.domain.price_maximum feedback = evidence_assessment_service.find( evidence_id=evidence.id).one_or_none() if feedback: evidence_data['feedback'] = feedback.serialize() assessor = users.find(id=int(feedback.user_id)).one_or_none() evidence_data['assessor'] = assessor.name if assessor else '' evidence_data['domainName'] = evidence.domain.name supplier = suppliers.get_supplier_by_code(evidence.supplier_code) evidence_data['supplierName'] = supplier.name if supplier else '' try: evidence_data['criteriaNeeded'] = int( DomainCriteria( domain_id=evidence_data.get('domainId', None), rate=evidence_data.get('maxDailyRate', None)).get_criteria_needed()) except DomainCriteriaInvalidRateException as e: abort(400, str(e)) return jsonify(evidence=evidence_data), 200
def update_evidence(evidence_id): evidence = evidence_service.get_evidence_by_id(evidence_id) if not evidence or current_user.supplier_code != evidence.supplier_code: not_found("No evidence for id '%s' found" % (evidence_id)) if evidence.status != 'draft': abort('Only draft submissions can be edited') data = get_json_from_request() publish = False if 'publish' in data and data['publish']: del data['publish'] publish = True if 'maxDailyRate' in data: try: data['maxDailyRate'] = int(data['maxDailyRate']) except ValueError as e: data['maxDailyRate'] = 0 # Validate the evidence request data errors = EvidenceDataValidator(data, evidence=evidence).validate(publish=publish) if len(errors) > 0: abort(', '.join(errors)) if publish: evidence.submit() if current_app.config['JIRA_FEATURES']: create_evidence_assessment_in_jira.delay(evidence_id) try: send_evidence_assessment_requested_notification( evidence.domain_id, current_user.email_address) except Exception as e: current_app.logger.warn( 'Failed to send requested assessment email for evidence id: {}, {}' .format(evidence_id, e)) evidence.data = data evidence_service.save_evidence(evidence) try: publish_tasks.evidence.delay(publish_tasks.compress_evidence(evidence), 'updated', name=current_user.name, domain=evidence.domain.name, supplier_code=current_user.supplier_code) if publish: publish_tasks.evidence.delay( publish_tasks.compress_evidence(evidence), 'submitted', name=current_user.name, domain=evidence.domain.name, supplier_code=current_user.supplier_code) except Exception as e: pass return jsonify(evidence.serialize())
def create_evidence_assessment_in_jira(evidence_id): evidence = evidence_service.get_evidence_by_id(evidence_id) if not evidence: return False marketplace_jira = get_marketplace_jira() marketplace_jira.create_evidence_approval_task(evidence)
def __init__(self, evidence_id=None, actioned_by=None): if not actioned_by or not str(actioned_by).isdigit(): raise DomainApprovalException('An admin user id must be supplied') self.user = users.get_by_id(int(actioned_by)) if not self.user or self.user.role != 'admin': raise DomainApprovalException('Invalid user id in actioned_by') self.evidence = evidence_service.get_evidence_by_id(evidence_id) if not self.evidence or not self.evidence.status == 'submitted': raise DomainApprovalException('Evidence id is invalid or is not submitted') self.actioned_by = actioned_by
def delete_draft_evidence(evidence_id, actioned_by): evidence = evidence_service.get_evidence_by_id(evidence_id) if not evidence or not evidence.status == 'draft': return False evidence_service.delete(evidence) audit_service.log_audit_event( audit_type=audit_types.evidence_draft_deleted, user=actioned_by, data={ "id": evidence.id, "domainId": evidence.domain_id, "briefId": evidence.brief_id, "status": evidence.status, "supplierCode": evidence.supplier_code, "data": evidence.data }, db_object=evidence ) return True
def get_evidence(evidence_id): evidence = evidence_service.get_evidence_by_id(evidence_id) if not evidence or current_user.supplier_code != evidence.supplier_code: not_found("No evidence for id '%s' found" % (evidence_id)) data = evidence.serialize() data['failed_criteria'] = {} data['previous_evidence_id'] = None previous_evidence = evidence_service.get_previous_submitted_evidence_for_supplier_and_domain( evidence.id, evidence.domain.id, current_user.supplier_code) if previous_evidence and previous_evidence.status == 'rejected': previous_assessment = evidence_assessment_service.get_assessment_for_rejected_evidence( previous_evidence.id) if previous_assessment: data['failed_criteria'] = previous_assessment.data.get( 'failed_criteria', {}) data['previous_evidence_id'] = previous_evidence.id return jsonify(data)
def evidence_approve(evidence_id): json_payload = get_json_from_request() try: action = DomainApproval( actioned_by=json_payload.get('actioned_by', None), evidence_id=evidence_id ) evidence_assessment = action.approve_domain() except DomainApprovalException as e: abort(400, str(e)) try: evidence = evidence_service.get_evidence_by_id(evidence_id) if evidence: send_evidence_assessment_approval_notification(evidence) except Exception as e: current_app.logger.warn('Failed to send approval email for evidence id: {}, {}'.format(evidence_id, e)) return jsonify(evidence_assessment=evidence_assessment.serialize()), 200
def get_evidence_feedback(evidence_id): evidence = evidence_service.get_evidence_by_id(evidence_id) if not evidence or current_user.supplier_code != evidence.supplier_code: not_found("No evidence for id '%s' found" % (evidence_id)) if not evidence.status == 'rejected': abort('Only rejected submissions can contain feedback') evidence_assessment = evidence_assessment_service.get_assessment_for_rejected_evidence( evidence_id) if not evidence_assessment: abort('Failed to get the evidence assessment') try: domain_criteria = DomainCriteria(domain_id=evidence.domain.id, rate=evidence.data.get( 'maxDailyRate', None)) criteria_needed = domain_criteria.get_criteria_needed() except Exception as e: abort(str(e)) criteria_from_domain = {} domain_criteria = domain_criteria_service.get_criteria_by_domain_id( evidence.domain.id) for criteria in domain_criteria: criteria_from_domain[str(criteria.id)] = criteria.name criteria = {} failed_criteria = evidence_assessment.data.get('failed_criteria', {}) vfm = evidence_assessment.data.get('vfm', None) for criteria_id, criteria_response in evidence.get_criteria_responses( ).iteritems(): has_feedback = True if criteria_id in failed_criteria.keys() else False criteria[criteria_id] = { "response": criteria_response, "name": criteria_from_domain[criteria_id] if criteria_id in criteria_from_domain else '', "has_feedback": has_feedback, "assessment": failed_criteria[criteria_id] if has_feedback else {} } current_evidence = evidence_service.get_latest_evidence_for_supplier_and_domain( evidence.domain.id, current_user.supplier_code) data = { 'domain_id': evidence.domain.id, 'domain_name': evidence.domain.name, 'criteria': criteria, 'criteria_needed': criteria_needed, 'current_evidence_id': current_evidence.id if current_evidence.status == 'draft' else None, 'vfm': vfm } return jsonify(data)