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
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)
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
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
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)
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)
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)
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)