def __init__(self): self.workflow_log = WorkflowLog.create( ) # Creates first entry in WorkflowLog __init__ if current_user.padawan: approver = Approver.create(approver_id=current_user.supervisor_id, capacity='Supervisor') self.approvers.append(approver)
def update_anomaly(): id = request.form['pk'] # UID for field will be ala [fieldname]-[classname]-[id]-editable, field name will be first section always field = request.form['name'].split('-')[0] field_value = request.form['value'] original_value = None anomaly = Anomaly.get_by_id(id) if field == 'name': original_value = anomaly.name anomaly.update(name=field_value) elif field == 'summary': original_value = anomaly.summary anomaly.update(summary=field_value) elif field == 'analysis': original_value = anomaly.analysis anomaly.update(analysis=field_value) elif field == 'software_version': original_value = anomaly.software_version anomaly.update(software_version=field_value) elif field == 'criticality': if anomaly.criticality: original_value = anomaly.criticality.name criticality = Criticality.get_by_id(field_value) anomaly.update(criticality=criticality) field_value = criticality.name if criticality else None elif field == 'corrective_action': original_value = anomaly.corrective_action anomaly.update(corrective_action=field_value) elif field == 'project': if anomaly.project: original_value = anomaly.project.name project = Project.get_by_id(field_value) anomaly.update(project=project) field_value = project.name if project else None elif field == 'owner': if anomaly.owner: original_value = anomaly.owner.get_name() if anomaly.owner.padawan: for approver in anomaly.approvers: if approver.approver == anomaly.owner.supervisor and approver.capacity == 'Supervisor': anomaly.approvers.remove(approver) approver.delete() owner = User.get_by_id(field_value) if owner.padawan: approver = Approver.create(approver_id=owner.supervisor_id, capacity='Supervisor') anomaly.approvers.append(approver) anomaly.update(owner=owner) field_value = owner.get_name() if owner else None elif field == 'thumbnail_id': thumbnail_id = None if field_value == 'default' else field_value anomaly.update(thumbnail_id=thumbnail_id) return render_template('shared/thumbnail_return.html', record=anomaly) anomaly.add_change_log_entry(action='Edit', field=field.title().replace('_', ' '), original_value=original_value, new_value=field_value) return jsonify({'success': True}), 200, {'ContentType': 'application/json'}
def update_product(): id = request.form['pk'] # UID for field will be ala [fieldname]-[classname]-[id]-editable, field name will be first section always field = request.form['name'].split('-')[0] field_value = request.form['value'] # TODO: Check if product exists product = Product.get_by_id(id) original_value = None if field == 'hardware_type': if product.hardware_type: original_value = product.hardware_type.name hardware_type = HardwareType.get_by_id(field_value) product.update(hardware_type=hardware_type) field_value = hardware_type.name if hardware_type else None elif field == 'measured_mass': original_value = product.measured_mass product.update(measured_mass=float(field_value)) elif field == 'owner': if product.owner: original_value = product.owner.get_name() if product.owner.padawan: for approver in product.approvers: if approver.approver == product.owner.supervisor and approver.capacity == 'Supervisor': product.approvers.remove(approver) approver.delete() owner = User.get_by_id(field_value) if owner.padawan: approver = Approver.create(approver_id=owner.supervisor_id, capacity='Supervisor') product.approvers.append(approver) product.update(owner=owner) field_value = owner.get_name() if owner else None elif field == 'project': if product.project: original_value = product.project.name project = Project.get_by_id(field_value) product.update(project=project) field_value = project.name if project else None elif field == 'notes': original_value = product.notes product.update(notes=field_value) elif field == 'summary': original_value = product.summary product.update(summary=field_value) elif field == 'thumbnail_id': thumbnail_id = None if field_value == 'default' else field_value product.update(thumbnail_id=thumbnail_id) return render_template('shared/thumbnail_return.html', record=product) product.add_change_log_entry(action='Edit', field=field.title().replace('_', ' '), original_value=original_value, new_value=field_value) return jsonify({'success': True}), 200, {'ContentType': 'application/json'}
def update_specification(): id = request.form['pk'] # UID for field will be ala [fieldname]-[classname]-[id]-editable, field name will be first section always field = request.form['name'].split('-')[0] field_value = request.form['value'] specification = Specification.get_by_id(id) original_value = None if field == 'name': original_value = specification.name specification.update(name=field_value) elif field == 'scope': original_value = specification.scope specification.update(scope=field_value) elif field == 'summary': original_value = specification.summary specification.update(summary=field_value) elif field == 'owner': if specification.owner: original_value = specification.owner.get_name() if specification.owner.padawan: for approver in specification.approvers: if approver.approver == specification.owner.supervisor and approver.capacity == 'Supervisor': specification.approvers.remove(approver) approver.delete() owner = User.get_by_id(field_value) if owner.padawan: approver = Approver.create(approver_id=owner.supervisor_id, capacity='Supervisor') specification.approvers.append(approver) specification.update(owner=owner) field_value = owner.get_name() if owner else None elif field == 'thumbnail_id': thumbnail_id = None if field_value == 'default' else field_value specification.update(thumbnail_id=thumbnail_id) return render_template('shared/thumbnail_return.html', record=specification) specification.add_change_log_entry(action='Edit', field=field.title().replace('_', ' '), original_value=original_value, new_value=field_value) return jsonify({'success': True}), 200, {'ContentType': 'application/json'}
def dashboard(): user = current_user # TODO: Add prefix option to forms so form field ids are unique anomalies_for_user = Anomaly.find_all_anomalies_for_user(user) as_runs_for_user = AsRun.find_all_as_runs_for_user(user) designs_for_user = Design.find_all_designs_for_user(user) ecos_for_user = ECO.find_all_ecos_for_user(user) products_for_user = Product.find_all_products_for_user(user) vendor_products_for_user = VendorProduct.find_all_vendor_products_for_user( user) vendor_parts_for_user = VendorPart.find_all_vendor_parts_for_user(user) procedures_for_user = Procedure.find_all_distinct_procedures_for_user(user) specifications = Specification.find_all_distinct_specifications() records_awaiting_approval = [] for record_list in [ anomalies_for_user, as_runs_for_user, designs_for_user, ecos_for_user, procedures_for_user, products_for_user, specifications, vendor_parts_for_user, vendor_products_for_user ]: for record in record_list: if record.state == record.workflow.get_approval_state(): records_awaiting_approval.append(record) variables = { 'anomalies_for_user': anomalies_for_user, 'designs_for_user': designs_for_user, 'ecos_for_user': ecos_for_user, 'products_for_user': products_for_user, 'vendor_products_for_user': vendor_products_for_user, 'vendor_parts_for_user': vendor_parts_for_user, 'procedures_for_user': procedures_for_user, 'specifications': specifications, 'users': User.query.all(), 'bookmarks': process_bookmarks(user), 'saved_searches': user.saved_searches, 'settings': Settings.get_settings(), 'approvals': Approver.get_open_approvals_for_user(user), 'records_awaiting_approval': records_awaiting_approval } return render_template('backend/dashboard.html', **variables)
def revise_specification(): form = ReviseSpecificationForm(request.form) if request.method == 'POST': validated = form.validate_on_submit() old_specification_id = request.form['specification_id'] old_spec = Specification.get_by_id(old_specification_id) if validated: new_revision = old_spec.find_next_revision() reason = form.revision_reason.data new_owner_id = form.owner.data.id # Get the old bits while we can links = old_spec.links documents = old_spec.documents images = old_spec.images references_to = old_spec.references_to old_revision = old_spec.revision # TODO: changelog, revisionlog replace_values = { 'revision': new_revision, 'revision_reason': reason, 'owner_id': new_owner_id, 'created_by': current_user, 'state': old_spec.workflow.initial_state, 'self_approved': Specification.self_approved.default.arg } spec = old_spec.clone(replace_values) # After this point, old_design is the same as design, a cloned instance # Clone links for old_link in links: link = old_link.clone() spec.links.append(link) # Clone documents for old_document in documents: document = old_document.clone_document(spec) spec.documents.append(document) # Clone images for old_image in images: image = old_image.clone_image(spec) spec.images.append(image) # Clone what this references for reference in references_to: Reference.create(by_id=spec.id, by_class=spec.get_class_name(), to_id=reference.to_id, to_class=reference.to_class) # Create new change log and new workflow log spec.change_log = ChangeLog.create() spec.workflow_log = WorkflowLog.create() # Add supervisor approval if user is a padawan if current_user.padawan: approver = Approver.create(approver_id=current_user.supervisor_id, capacity='Supervisor') spec.approvers.append(approver) spec.save() # Update revision log spec.revision_log.add_entry(spec.revision, reason, current_user) jsonData = { 'success': True, 'specId': spec.id, 'url': spec.get_url() } return jsonify(jsonData), 200, {'ContentType': 'application/json'} else: return make_response(render_template('specification/revise_specification.html', form=form, spec=old_spec), 500)
def update_vendor_part(): # TODO: Check that field should actually be allowed to change. As in, don't change design number for instance id = request.form['pk'] # UID for field will be ala [fieldname]-[classname]-[id]-editable, field name will be first section always field = request.form['name'].split('-')[0] field_value = request.form['value'] original_value = None # TODO: Check if design exists vendor_part = VendorPart.get_by_id(id) if field == 'name': original_value = vendor_part.name vendor_part.update(name=field_value) elif field == 'summary': original_value = vendor_part.summary vendor_part.update(summary=field_value) elif field == 'project': if vendor_part.project: original_value = vendor_part.project.name project = Project.get_by_id(field_value) vendor_part.update(project=project) field_value = project.name if project else None elif field == 'owner': if vendor_part.owner: original_value = vendor_part.owner.get_name() if vendor_part.owner.padawan: for approver in vendor_part.approvers: if approver.approver == vendor_part.owner.supervisor and approver.capacity == 'Supervisor': vendor_part.approvers.remove(approver) approver.delete() owner = User.get_by_id(field_value) if owner.padawan: approver = Approver.create(approver_id=owner.supervisor_id, capacity='Supervisor') vendor_part.approvers.append(approver) vendor_part.update(owner=owner) field_value = owner.get_name() if owner else None elif field == 'vendor': if vendor_part.vendor: original_value = vendor_part.vendor.name vendor = Company.get_by_id(field_value) vendor_part.update(vendor=vendor) field_value = vendor.name if vendor else None elif field == 'notes': original_value = vendor_part.notes vendor_part.update(notes=field_value) elif field == 'material': original_material = None original_material_spec = None if vendor_part.material: original_material = vendor_part.material.name if vendor_part.material_specification: original_material_spec = vendor_part.material_specification.name material = Material.get_by_id(field_value) vendor_part.update( material=material, material_specification=None ) # To ensure we don't have a mat_spec linked with old material material_name = None material_specifications = None if material: material_name = material.name material_specifications = material.specifications vendor_part.add_change_log_entry(action='Edit', field='Material', original_value=original_material, new_value=material_name) if original_material_spec: vendor_part.add_change_log_entry( action='Edit', field='Material Specification', original_value=original_material_spec) variables = { 'vendor_part': vendor_part, 'material_specifications': material_specifications } return render_template( 'vendorpart/ajax_select_material_specification.html', **variables) elif field == 'material_specification': if vendor_part.material_specification: original_value = vendor_part.material_specification.name material_specification = MaterialSpecification.get_by_id(field_value) vendor_part.update(material_specification=material_specification) field_value = material_specification.name if material_specification else None elif field == 'thumbnail_id': thumbnail_id = None if field_value == 'default' else field_value vendor_part.update(thumbnail_id=thumbnail_id) return render_template('shared/thumbnail_return.html', record=vendor_part) elif field == 'current_best_estimate': original_value = vendor_part.current_best_estimate original_predicted_best_estimate = vendor_part.predicted_best_estimate current_best_estimate = float(field_value) predicted_best_estimate = current_best_estimate * ( 1 + (vendor_part.uncertainty / 100)) # PBE = CBE * (1+%Unc) vendor_part.update(current_best_estimate=current_best_estimate, predicted_best_estimate=predicted_best_estimate) vendor_part.update_parents_mass( ) # Updates parts where this is a component vendor_part.add_change_log_entry(action='Edit', field='Current Best Estimate', original_value=original_value, new_value=current_best_estimate) vendor_part.add_change_log_entry( action='Edit', field='Predicted Best Estimate', original_value=original_predicted_best_estimate, new_value=predicted_best_estimate) return render_template('vendorpart/mass_fields.html', vendor_part=vendor_part) elif field == 'uncertainty': original_value = vendor_part.uncertainty original_predicted_best_estimate = vendor_part.predicted_best_estimate uncertainty = float(field_value) predicted_best_estimate = vendor_part.current_best_estimate * ( 1 + (uncertainty / 100)) # PBE = CBE * (1+%Unc) vendor_part.update(uncertainty=uncertainty, predicted_best_estimate=predicted_best_estimate) vendor_part.update_parents_mass( ) # Updates parts where this is a component vendor_part.add_change_log_entry(action='Edit', field='Uncertainty', original_value=original_value, new_value=uncertainty) vendor_part.add_change_log_entry( action='Edit', field='Predicted Best Estimate', original_value=original_predicted_best_estimate, new_value=predicted_best_estimate) return render_template('vendorpart/mass_fields.html', vendor_part=vendor_part) vendor_part.add_change_log_entry(action='Edit', field=field.title().replace('_', ' '), original_value=original_value, new_value=field_value) return jsonify({'success': True}), 200, {'ContentType': 'application/json'}
def revise_design(): form = ReviseDesignForm(request.form) validated = form.validate_on_submit() if not validated: design_id = form.design_id.data design = Design.get_by_id(design_id) variables = {'design': design, 'form': form} return make_response( render_template('design/revise_design_modal.html', **variables), 500) old_design_id = form.design_id.data new_revision = form.revision.data reason = form.revision_reason.data new_owner = form.owner.data include_parts = request.form['include_parts'] old_design = Design.get_by_id(old_design_id) # Get the old bits while we can parts = old_design.parts links = old_design.links documents = old_design.documents images = old_design.images references_to = old_design.references_to # TODO: Duplicate anomalies, ecos, specifications, produres, family, changelog, revisionlog replace_values = { 'revision': new_revision, 'owner': new_owner, 'created_by': current_user, 'state': old_design.workflow.initial_state, 'export_control': old_design. export_control, # Because make_transient uses default values 'self_approved': Design.self_approved.default.arg } design = old_design.clone( replace_values ) # After this point, old_design is the same as design, a cloned instance # Clone all parts if include_parts == 'all': for old_part in parts: # TODO: Parent? Changelog? components = old_part.components replace_values = {'design': design} part = old_part.clone(replace_values) for old_component in components: replace_values = { 'parent': part, 'part': old_component.part, 'vendor_part': old_component.vendor_part, 'quantity': old_component. quantity # Because make_transient uses default values } old_component.clone(replace_values) # Clone selected parts else: include_selected_parts = request.form.getlist('include_selected_parts') for part_id in include_selected_parts: # TODO: Parent? Changelog? old_part = Part.get_by_id(part_id) components = old_part.components replace_values = {'design': design} part = old_part.clone(replace_values) for old_component in components: replace_values = { 'parent': part, 'part': old_component.part, 'vendor_part': old_component.vendor_part, 'quantity': old_component. quantity # Because make_transient uses default values } old_component.clone(replace_values) # Clone links for old_link in links: link = old_link.clone() design.links.append(link) # Clone documents for old_document in documents: document = old_document.clone_document(design) design.documents.append(document) # Clone images for old_image in images: image = old_image.clone_image(design) design.images.append(image) # Clone what this references for reference in references_to: Reference.create(by_id=design.id, by_class=design.get_class_name(), to_id=reference.to_id, to_class=reference.to_class) # Create new change log and new workflow log design.change_log = ChangeLog.create() design.workflow_log = WorkflowLog.create() # Add supervisor approval if user is a padawan if current_user.padawan: approver = Approver.create(approver_id=current_user.supervisor_id, capacity='Supervisor') design.approvers.append(approver) design.save() # Update any references in part components from old revision to new revision PartComponent.update_part_component_references(design) # Update revision log design.revision_log.add_entry(design.revision, reason, current_user) jsonData = {'success': True, 'url': design.get_url()} return jsonify(jsonData), 200, {'ContentType': 'application/json'}
def update_vendor_product(): id = request.form['pk'] # UID for field will be ala [fieldname]-[classname]-[id]-editable, field name will be first section always field = request.form['name'].split('-')[0] field_value = request.form['value'] # TODO: Check if product exists vendor_product = VendorProduct.get_by_id(id) original_value = None jsonData = {} if field == 'hardware_type': if vendor_product.hardware_type: original_value = vendor_product.hardware_type.name hardware_type = HardwareType.get_by_id(field_value) vendor_product.update(hardware_type=hardware_type) field_value = hardware_type.name if hardware_type else None elif field == 'measured_mass': original_value = vendor_product.measured_mass vendor_product.update(measured_mass=float(field_value)) vendor_product.add_change_log_entry(action='Edit', field='Measured Mass', original_value=original_value, new_value=field_value) variables = {'vendor_product': vendor_product} return render_template('vendorproduct/mass_field.html', **variables) elif field == 'owner': if vendor_product.owner: original_value = vendor_product.owner.get_name() if vendor_product.owner.padawan: for approver in vendor_product.approvers: if approver.approver == vendor_product.owner.supervisor and approver.capacity == 'Supervisor': vendor_product.approvers.remove(approver) approver.delete() owner = User.get_by_id(field_value) if owner.padawan: approver = Approver.create(approver_id=owner.supervisor_id, capacity='Supervisor') vendor_product.approvers.append(approver) vendor_product.update(owner=owner) field_value = owner.get_name() if owner else None elif field == 'project': if vendor_product.project: original_value = vendor_product.project.name project = Project.get_by_id(field_value) vendor_product.update(project=project) field_value = project.name if project else None elif field == 'notes': original_value = vendor_product.notes vendor_product.update(notes=field_value) elif field == 'summary': original_value = vendor_product.summary vendor_product.update(summary=field_value) elif field == 'thumbnail_id': thumbnail_id = None if field_value == 'default' else field_value vendor_product.update(thumbnail_id=thumbnail_id) return render_template('shared/thumbnail_return.html', record=vendor_product) elif field == 'serial_number': original_value = vendor_product.serial_number try: vendor_product.update(serial_number=field_value) except: return jsonify(jsonData), 500, {'ContentType': 'application/json'} jsonData = {'url': vendor_product.get_url()} # Return URL to reload page with new S/N vendor_product.add_change_log_entry(action='Edit', field=field.title().replace('_', ' '), original_value=original_value, new_value=field_value) return jsonify(jsonData), 200, {'ContentType': 'application/json'}
def revise_procedure(): form = ReviseProcedureForm(request.form) validated = form.validate_on_submit() old_procedure_id = request.form['procedure_id'] old_proc = Procedure.get_by_id(old_procedure_id) if validated: new_revision = old_proc.find_next_revision() reason = request.form['revision_reason'] links = old_proc.links documents = old_proc.documents images = old_proc.images parts = old_proc.parts vendor_parts = old_proc.vendor_parts references_to = old_proc.references_to old_revision = old_proc.revision replace_values = { 'revision': new_revision, 'revision_reason': reason, 'created_by': current_user, 'state': old_proc.workflow.initial_state, 'self_approved': Procedure.self_approved.default.arg } proc = old_proc.clone( replace_values ) # After this point, old_proc is the same as proc, a cloned instance # Clone links for old_link in links: link = old_link.clone() proc.links.append(link) # Clone documents for old_document in documents: document = old_document.clone_document(proc) proc.documents.append(document) # Clone images for old_image in images: image = old_image.clone_image(proc) proc.images.append(image) # Clone parts for old_part in parts: proc.parts.append(old_part) # CLone vendor parts for old_part in vendor_parts: proc.vendor_parts.append(old_part) # Clone what this references for reference in references_to: Reference.create(by_id=proc.id, by_class=proc.get_class_name(), to_id=reference.to_id, to_class=reference.to_class) # Create new change log and new workflow log proc.change_log = ChangeLog.create() proc.workflow_log = WorkflowLog.create() # Add supervisor approval if user is a padawan if current_user.padawan: approver = Approver.create(approver_id=current_user.supervisor_id, capacity='Supervisor') proc.approvers.append(approver) proc.save() # Update revision log proc.revision_log.add_entry(proc.revision, reason, current_user) jsonData = {'success': True, 'url': proc.get_url()} return jsonify(jsonData), 200, {'ContentType': 'application/json'} else: return make_response( render_template('procedure/revise_procedure.html', form=form, proc=old_proc), 500)