def create_application(email_address=None, name=None):
    application = Application(status='saved',
                              data={
                                  'framework': 'digital-marketplace',
                                  'email': email_address
                              })

    db.session.add(application)
    db.session.flush()

    audit = AuditEvent(audit_type=AuditTypes.create_application,
                       user='',
                       data={},
                       db_object=application)

    db.session.add(audit)
    db.session.commit()

    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'created',
        name=name,
        email_address=email_address,
        from_expired=False)

    return application
def create_application():
    application_json = get_application_json()
    json_payload = get_json_from_request()
    application = Application()
    application.update_from_json(application_json)

    save_application(application)
    name = json_payload.get('name')
    updated_by = json_payload.get('updated_by')
    db.session.add(AuditEvent(
        audit_type=AuditTypes.create_application,
        user=updated_by,
        data={},
        db_object=application
    ))
    db.session.commit()
    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'created',
        name=name,
        email_address=updated_by,
        from_expired=True
    )

    return jsonify(application=application.serializable), 201
def update_application(application_id):
    application_json = get_application_json()

    application = Application.query.options(
        noload('supplier.*')
    ).get(application_id)
    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    if application.status == 'submitted' and application_json.get('status') == 'saved':
        db.session.add(AuditEvent(
            audit_type=AuditTypes.revert_application,
            user='',
            data={},
            db_object=application
        ))
        publish_tasks.application.delay(
            publish_tasks.compress_application(application),
            'reverted'
        )

    application.update_from_json(application_json)
    save_application(application)
    errors = ApplicationValidator(application).validate_all()

    return (
        jsonify(
            application=application.serializable,
            application_errors=errors),
        200)
def update_application_admin(application_id):
    application_json = get_application_json()

    application = Application.query.get(application_id)
    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    if application.status == 'submitted' or application.status == 'saved':
        db.session.add(AuditEvent(
            audit_type=AuditTypes.update_application_admin,
            user='',
            data={
                'old': application.serialize(),
                'new': application_json
            },
            db_object=application
        ))

        application.update_from_json(application_json)
        save_application(application)
        publish_tasks.application.delay(
            publish_tasks.compress_application(application),
            'updated'
        )

        return jsonify(application=application.serializable), 200
    else:
        return jsonify(application=application.serializable, errors=[{
            'serverity': 'error',
            'message': 'Application can only be updated when the status is submitted or saved'
        }]), 200
Ejemplo n.º 5
0
def update_application(application_id):
    application_json = get_application_json()

    application = Application.query.options(
        noload('supplier.*')).get(application_id)
    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    if application.status == 'submitted' and application_json.get(
            'status') == 'saved':
        db.session.add(
            AuditEvent(audit_type=AuditTypes.revert_application,
                       user='',
                       data={},
                       db_object=application))
        publish_tasks.application.delay(
            publish_tasks.compress_application(application), 'reverted')

    application.update_from_json(application_json)
    save_application(application)
    errors = ApplicationValidator(application).validate_all()
    agreement = get_current_agreement()

    return (jsonify(application=application.serializable,
                    agreement=agreement.serialize() if agreement else None,
                    application_errors=errors), 200)
Ejemplo n.º 6
0
def update_application_admin(application_id):
    application_json = get_application_json()

    application = Application.query.get(application_id)
    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    if application.status == 'submitted' or application.status == 'saved':
        db.session.add(
            AuditEvent(audit_type=AuditTypes.update_application_admin,
                       user='',
                       data={
                           'old': application.serialize(),
                           'new': application_json
                       },
                       db_object=application))

        application.update_from_json(application_json)
        save_application(application)
        publish_tasks.application.delay(
            publish_tasks.compress_application(application), 'updated')

        return jsonify(application=application.serializable), 200
    else:
        return jsonify(
            application=application.serializable,
            errors=[{
                'serverity':
                'error',
                'message':
                'Application can only be updated when the status is submitted or saved'
            }]), 200
Ejemplo n.º 7
0
def delete_application(application_id):
    """
    Delete a Application
    :param application_id:
    :return:
    """
    updater_json = validate_and_return_updater_request()
    application = Application.query.options(noload('supplier')).filter(
        Application.id == application_id).first_or_404()

    db.session.add(
        AuditEvent(audit_type=AuditTypes.delete_application,
                   user=updater_json['updated_by'],
                   data={},
                   db_object=application))
    application.status = 'deleted'

    users = User.query.filter(User.application_id == application_id).all()

    # this should go back to previous application id, not just none.
    for user in users:
        user.application = None

    try:
        db.session.commit()
        publish_tasks.application.delay(
            publish_tasks.compress_application(application), 'deleted')
    except IntegrityError as e:
        db.session.rollback()
        abort(400, "Database Error: {0}".format(e))

    return jsonify(message="done"), 200
def create_application(email_address=None, name=None):
    application = Application(
        status='saved',
        data={
            'framework': 'digital-marketplace',
            'email': email_address
        }
    )

    db.session.add(application)
    db.session.flush()

    audit = AuditEvent(
        audit_type=AuditTypes.create_application,
        user='',
        data={},
        db_object=application
    )

    db.session.add(audit)
    db.session.commit()

    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'created',
        name=name,
        email_address=email_address,
        from_expired=False
    )

    return application
def create_application():
    application_json = get_application_json()
    json_payload = get_json_from_request()
    application = Application()
    application.update_from_json(application_json)

    save_application(application)
    name = json_payload.get('name')
    updated_by = json_payload.get('updated_by')
    db.session.add(AuditEvent(
        audit_type=AuditTypes.create_application,
        user=updated_by,
        data={},
        db_object=application
    ))
    db.session.commit()
    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'created',
        name=name,
        email_address=updated_by,
        from_expired=True
    )

    return jsonify(application=application.serializable), 201
Ejemplo n.º 10
0
def application_approval(application_id, result):
    updater_json = validate_and_return_updater_request()

    application = Application.query.get(application_id)

    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    db.session.add(
        AuditEvent(audit_type=(AuditTypes.approve_application
                               if result else AuditTypes.reject_application),
                   user=updater_json['updated_by'],
                   data={},
                   db_object=application))
    application.set_approval(approved=result)
    db.session.commit()

    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'approved' if result else 'approval_rejected')
    return jsonify(application=application.serializable), 200
def delete_application(application_id):
    """
    Delete a Application
    :param application_id:
    :return:
    """
    updater_json = validate_and_return_updater_request()
    application = Application.query.options(
        noload('supplier')
    ).filter(
        Application.id == application_id
    ).first_or_404()

    db.session.add(AuditEvent(
        audit_type=AuditTypes.delete_application,
        user=updater_json['updated_by'],
        data={},
        db_object=application
    ))
    application.status = 'deleted'

    users = User.query.filter(
        User.application_id == application_id
    ).all()

    # this should go back to previous application id, not just none.
    for user in users:
        user.application = None

    try:
        db.session.commit()
        publish_tasks.application.delay(
            publish_tasks.compress_application(application),
            'deleted'
        )
    except IntegrityError as e:
        db.session.rollback()
        abort(400, "Database Error: {0}".format(e))

    return jsonify(message="done"), 200
def application_approval(application_id, result):
    updater_json = validate_and_return_updater_request()

    application = Application.query.get(application_id)

    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    db.session.add(AuditEvent(
        audit_type=(AuditTypes.approve_application if result else AuditTypes.reject_application),
        user=updater_json['updated_by'],
        data={},
        db_object=application
    ))
    application.set_approval(approved=result)
    db.session.commit()

    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'approved' if result else 'approval_rejected'
    )
    return jsonify(application=application.serializable), 200
def submit_application(application_id):
    current_time = pendulum.now('UTC').to_iso8601_string(extended=True)

    application = Application.query.get(application_id)
    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    if application.status == 'submitted':
        abort(400, 'Application is already submitted')

    errors = ApplicationValidator(application).validate_all()
    if errors:
        abort(400, 'Application has errors')

    json_payload = get_json_from_request()
    json_has_required_keys(json_payload, ['user_id'])
    user_id = json_payload['user_id']

    user = User.query.get(user_id)

    if application.type != 'edit':
        if user.application_id != application.id:
            abort(400, 'User is not authorized to submit application')
    else:
        if user.supplier_code != application.supplier_code:
            abort(400, 'User supplier code does not match application supplier code')

    current_agreement = Agreement.query.filter(
        Agreement.is_current == true()
    ).first_or_404()

    db.session.add(AuditEvent(
        audit_type=AuditTypes.submit_application,
        user=user_id,
        data={},
        db_object=application
    ))

    application.submit_for_approval()

    application.update_from_json({'submitted_at': current_time})

    signed_agreement = None
    if application.type != 'edit':
        # only create signed agreements on initial applications
        signed_agreement = SignedAgreement()
        signed_agreement.user_id = user_id
        signed_agreement.agreement_id = current_agreement.id
        signed_agreement.signed_at = current_time
        signed_agreement.application_id = application_id

        db.session.add(signed_agreement)

        if application.supplier_code:
            send_submitted_existing_seller_notification(application.id)
        else:
            send_submitted_new_seller_notification(application.id)

    db.session.commit()
    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'submitted'
    )
    return jsonify(application=application.serializable,
                   signed_agreement=signed_agreement)
Ejemplo n.º 14
0
def submit_application(application_id):
    current_time = pendulum.now('UTC').to_iso8601_string(extended=True)

    application = Application.query.get(application_id)
    if application is None:
        abort(404, "Application '{}' does not exist".format(application_id))

    if application.status == 'submitted':
        abort(400, 'Application is already submitted')

    errors = ApplicationValidator(application).validate_all()
    if errors:
        abort(400, 'Application has errors')

    json_payload = get_json_from_request()
    json_has_required_keys(json_payload, ['user_id'])
    user_id = json_payload['user_id']

    user = User.query.get(user_id)

    if application.type != 'edit':
        if user.application_id != application.id:
            abort(400, 'User is not authorized to submit application')
    else:
        if user.supplier_code != application.supplier_code:
            abort(
                400,
                'User supplier code does not match application supplier code')

    agreement = get_current_agreement()
    if agreement is None:
        abort(404, 'Current master agreement not found')

    db.session.add(
        AuditEvent(audit_type=AuditTypes.submit_application,
                   user=user_id,
                   data={},
                   db_object=application))

    application.submit_for_approval()

    application.update_from_json({'submitted_at': current_time})

    signed_agreement = None
    if application.type != 'edit':
        # only create signed agreements on initial applications
        signed_agreement = SignedAgreement()
        signed_agreement.user_id = user_id
        signed_agreement.agreement_id = agreement.id
        signed_agreement.signed_at = current_time
        signed_agreement.application_id = application_id

        db.session.add(signed_agreement)

        if application.supplier_code:
            send_submitted_existing_seller_notification(application.id)
        else:
            send_submitted_new_seller_notification(application.id)

    db.session.commit()
    publish_tasks.application.delay(
        publish_tasks.compress_application(application), 'submitted')
    return jsonify(application=application.serializable,
                   signed_agreement=signed_agreement)
Ejemplo n.º 15
0
def create_application_from_supplier(code, application_type=None):
    json_payload = get_json_from_request()
    json_has_required_keys(json_payload, ["current_user"])
    current_user = json_payload["current_user"]

    supplier = Supplier.query.options(
        joinedload('domains'), joinedload('domains.assessments'),
        joinedload('domains.domain'), joinedload('domains.recruiter_info'),
        noload('domains.supplier'),
        noload('domains.assessments.briefs')).filter(
            Supplier.code == code).first_or_404()

    # hotfix for exception. shouldn't need to do this
    supplier.data = supplier.data or {}
    application_type = application_type or 'upgrade'
    existing_application = Application.query.options(
        joinedload('supplier')).filter(
            Application.supplier_code == supplier.code,
            or_(Application.status == 'submitted',
                Application.status == 'saved')).first()
    if existing_application:
        errors = ApplicationValidator(existing_application).validate_all()
        return jsonify(application=existing_application.serializable,
                       application_errors=errors)

    data = json.loads(supplier.json)

    data['status'] = 'saved'
    data = {
        key: data[key]
        for key in data if key not in [
            'id', 'contacts', 'domains', 'links', 'prices', 'frameworks',
            'steps', 'signed_agreements'
        ]
    }
    if data.get('products'):
        for product in data['products']:
            if product.get('links'):
                del product['links']
    application = Application()
    application.update_from_json(data)
    application.type = application_type

    db.session.add(application)
    db.session.flush()

    audit_type = application_type == 'edit' and AuditTypes.supplier_update or AuditTypes.create_application
    db.session.add(
        AuditEvent(audit_type=audit_type,
                   user='',
                   data={},
                   db_object=application))
    db.session.flush()

    if application_type != 'edit':
        notification_message = '{}\nApplication Id:{}\nBy: {} ({})'.format(
            data['name'], application.id, current_user['name'],
            current_user['email_address'])

        notification_text = 'An existing seller has started a new application'

        notify_team(notification_text, notification_message)

    # TODO stop using application_id on user
    supplier.update_from_json({'application_id': application.id})
    users = User.query.options(noload('supplier'),
                               noload('application')).filter(
                                   User.supplier_code == code
                                   and User.active == true()).all()

    for user in users:
        user.application_id = application.id

    db.session.commit()

    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'created',
        name=current_user['name'],
        email_address=current_user['email_address'],
        from_expired=False)
    return jsonify(application=application)
Ejemplo n.º 16
0
def create_application_from_supplier(code, application_type=None):
    json_payload = get_json_from_request()
    json_has_required_keys(json_payload, ["current_user"])
    current_user = json_payload["current_user"]

    supplier = Supplier.query.options(
        joinedload('domains'),
        joinedload('domains.assessments'),
        joinedload('domains.domain'),
        joinedload('domains.recruiter_info'),
        noload('domains.supplier'),
        noload('domains.assessments.briefs')
    ).filter(
        Supplier.code == code
    ).first_or_404()

    # hotfix for exception. shouldn't need to do this
    supplier.data = supplier.data or {}
    application_type = application_type or 'upgrade'
    existing_application = Application.query.options(
        joinedload('supplier')
    ).filter(
        Application.supplier_code == supplier.code,
        or_(Application.status == 'submitted', Application.status == 'saved')
    ).first()
    if existing_application:
        errors = ApplicationValidator(existing_application).validate_all()
        return jsonify(application=existing_application.serializable,
                       application_errors=errors)

    data = json.loads(supplier.json)

    data['status'] = 'saved'
    data = {key: data[key] for key in data if key not in ['id', 'contacts', 'domains', 'links',
                                                          'prices', 'frameworks', 'steps', 'signed_agreements']}
    if data.get('products'):
        for product in data['products']:
            if product.get('links'):
                del product['links']
    application = Application()
    application.update_from_json(data)
    application.type = application_type

    db.session.add(application)
    db.session.flush()

    audit_type = application_type == 'edit' and AuditTypes.supplier_update or AuditTypes.create_application
    db.session.add(AuditEvent(
        audit_type=audit_type,
        user='',
        data={},
        db_object=application
    ))
    db.session.flush()

    if application_type != 'edit':
        notification_message = '{}\nApplication Id:{}\nBy: {} ({})'.format(
            data['name'],
            application.id,
            current_user['name'],
            current_user['email_address']
        )

        notification_text = 'An existing seller has started a new application'

        notify_team(notification_text, notification_message)

    # TODO stop using application_id on user
    supplier.update_from_json({'application_id': application.id})
    users = User.query.options(
        noload('supplier'),
        noload('application')
    ).filter(
        User.supplier_code == code and User.active == true()
    ).all()

    for user in users:
        user.application_id = application.id

    db.session.commit()

    publish_tasks.application.delay(
        publish_tasks.compress_application(application),
        'created',
        name=current_user['name'],
        email_address=current_user['email_address'],
        from_expired=False
    )
    return jsonify(application=application)