Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 4
0
 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
Esempio n. 5
0
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
Esempio n. 6
0
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)
Esempio n. 7
0
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
Esempio n. 8
0
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)