Example #1
0
 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)
Example #2
0
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'}
Example #3
0
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'}
Example #4
0
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'}
Example #5
0
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)
Example #6
0
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)
Example #7
0
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'}
Example #8
0
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'}
Example #9
0
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'}
Example #10
0
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)