예제 #1
0
def create_proc():
    """Create new Procedure."""
    form = CreateProcedureForm(request.form)
    validated = form.validate_on_submit()
    if validated:
        kwargs = {
            'name': form.name.data,
            'owner': form.owner.data,
            'project': form.project.data
        }
        procedure = Procedure.create(**kwargs)
        part_ids = [] if request.form['parts'] == '' else request.form[
            'parts'].split(',')
        vendor_part_ids = [] if request.form[
            'vendor_parts'] == '' else request.form['vendor_parts'].split(',')

        for part_id in part_ids:
            part = Part.get_by_id(part_id)
            procedure.parts.append(part)

        for vendor_part_id in vendor_part_ids:
            part = VendorPart.get_by_id(vendor_part_id)
            procedure.vendor_parts.append(part)

        procedure.save()
        jsonData = {'success': True, 'url': procedure.get_url()}
        return jsonify(jsonData), 200, {'ContentType': 'application/json'}
    else:
        part_ids = [] if request.form['parts'] == '' else request.form[
            'parts'].split(',')
        vendor_part_ids = [] if request.form[
            'vendor_parts'] == '' else request.form['vendor_parts'].split(',')
        parts = []
        vendor_parts = []
        for part_id in part_ids:
            part = Part.get_by_id(part_id)
            parts.append(part)

        for vendor_part_id in vendor_part_ids:
            part = VendorPart.get_by_id(vendor_part_id)
            vendor_parts.append(part)
        variables = {
            'vendor_parts': vendor_parts,
            'parts': parts,
            'current_part_ids': request.form['parts'],
            'current_vendor_part_ids': request.form['vendor_parts'],
            'form': form
        }
        return make_response(
            render_template('procedure/create_procedure.html', **variables),
            500)
예제 #2
0
def add_extra_product_component():
    form = AddExtraProductComponentForm(request.form)
    validated = form.validate_on_submit()
    if validated:
        quantity = form.quantity.data
        part_group = form.part_group.data
        part_id = form.part_id.data
        product_id = form.product_id.data
        product = Product.get_by_id(product_id)
        ordering = len(product.extra_components) + 1
        if part_group == 'Part':  # part_group from typeahead group, not class name
            part = Part.get_by_id(part_id)
            for i in range(quantity):
                epc = ExtraProductComponent.create(parent=product, part=part, ordering=ordering)
        elif part_group == 'Vendor Part':  # part_group from typeahead group, not class name
            vendor_part = VendorPart.get_by_id(part_id)
            for i in range(quantity):
                epc = ExtraProductComponent.create(parent=product, vendor_part=vendor_part, ordering=ordering)
        components_array = arrange_product_components(product)
        extra_components_array = arrange_extra_product_components(product)
        variables = {
            'success': True,
            'product': product,
            'components_array': components_array,
            'extra_components_array': extra_components_array
        }
        new_value = '{0} -  Quantity: {1}'.format(epc.get_part().get_descriptive_url(), quantity)
        product.add_change_log_entry(action='Add', field='Extra Component', new_value=new_value)
        return render_template('product/as-built/component_list.html', **variables)
    else:
        product_id = form.product_id.data
        product = Product.get_by_id(product_id)
        part = None
        if form.part_id.data:
            part_group = form.part_group.data
            part_id = form.part_id.data
            if part_group == 'Part':  # part_group from typeahead, not class name
                part = Part.get_by_id(part_id)
            elif part_group == 'Vendor Part':  # part_group from typeahead, not class name
                part = VendorPart.get_by_id(part_id)
        variables = {
            'form': form,
            'product': product,
            'part': part
        }
        response = make_response(render_template('product/add_product_component_modal.html', **variables), 500)
        return response
예제 #3
0
def get_anomaly_modal():
    form = CreateAnomalyForm(request.form)
    variables = {
        'form': form,
        'designs': [],
        'vendor_parts': [],
        'as_runs': []
    }
    record_id = request.form.get('record_id', None)
    record_class = request.form.get('record_class', None)
    if record_id:
        if record_class == Design.get_class_name():
            variables['designs'] = [Design.get_by_id(record_id)]
            form.affected.data = 'design'
        elif record_class == VendorPart.get_class_name():
            variables['vendor_parts'] = [VendorPart.get_by_id(record_id)]
            form.affected.data = 'design'
        elif record_class == AsRun.get_class_name():
            variables['as_runs'] = [AsRun.get_by_id(record_id)]
            form.affected.data = 'asrun'
    return render_template('anomaly/create_anomaly.html', **variables)
예제 #4
0
def remove_design():
    anomaly_id = request.values['anomaly_id']
    anomaly = Anomaly.get_by_id(anomaly_id)
    design_id = request.values['design_id']
    design_class = request.values['design_class']
    record = None
    if design_class == 'design':
        record = Design.get_by_id(design_id)
        anomaly.designs.remove(record)
    elif design_class == 'vendorpart':
        record = VendorPart.get_by_id(design_id)
        anomaly.vendor_parts.remove(record)
    anomaly.add_change_log_entry(action='Remove', field='Design/Part', original_value=record.get_descriptive_url())
    anomaly.save()
    return jsonify({'success': True}), 200, {'ContentType': 'application/json'}
예제 #5
0
def remove_part():
    procedure_id = request.form.get('procedure_id')
    part_type = request.form.get('part_type')
    part_id = request.form.get('part_id')
    proc = Procedure.get_by_id(procedure_id)
    part = None
    if part_type == "designs":
        part = Part.get_by_id(part_id)
        proc.parts.remove(part)
    elif part_type == "vendor_parts":
        part = VendorPart.get_by_id(part_id)
        proc.vendor_parts.remove(part)
    proc.add_change_log_entry(action='Remove',
                              field='Part',
                              original_value=part.get_descriptive_url())
    proc.save()
    jsonData = {'success': True, 'partId': part_id}
    return jsonify(jsonData), 200, {'ContentType': 'application/json'}
예제 #6
0
def get_record_by_id_and_class(record_id, record_class):
    # TODO: Try to find a better way that doesn't involve so much dynamic loading
    record = None
    record_class = record_class.lower()  # Just in case
    if record_class == 'anomaly':
        from pid.anomaly.models import Anomaly
        record = Anomaly.get_by_id(record_id)
    elif record_class == 'asrun':
        from pid.asrun.models import AsRun
        record = AsRun.get_by_id(record_id)
    elif record_class == 'build':
        from pid.product.models import Build
        record = Build.get_by_id(record_id)
    elif record_class == 'design':
        from pid.design.models import Design
        record = Design.get_by_id(record_id)
    elif record_class == 'eco':
        from pid.eco.models import ECO
        record = ECO.get_by_id(record_id)
    elif record_class == 'part':
        from pid.part.models import Part
        record = Part.get_by_id(record_id)
    elif record_class == 'procedure':
        from pid.procedure.models import Procedure
        record = Procedure.get_by_id(record_id)
    elif record_class == 'product':
        from pid.product.models import Product
        record = Product.get_by_id(record_id)
    elif record_class == 'specification':
        from pid.specification.models import Specification
        record = Specification.get_by_id(record_id)
    elif record_class == 'task':
        from pid.task.models import Task
        record = Task.get_by_id(record_id)
    elif record_class == 'vendorbuild':
        from pid.vendorproduct.models import VendorBuild
        record = VendorBuild.get_by_id(record_id)
    elif record_class == 'vendorpart':
        from pid.vendorpart.models import VendorPart
        record = VendorPart.get_by_id(record_id)
    elif record_class == 'vendorproduct':
        from pid.vendorproduct.models import VendorProduct
        record = VendorProduct.get_by_id(record_id)
    return record
예제 #7
0
def add_design():
    anomaly_id = request.values['anomaly_id']
    design_id = request.values['design_id']
    vendor_part_id = request.values['vendor_part_id']
    anomaly = Anomaly.get_by_id(anomaly_id)
    record = None
    if design_id:
        record = Design.get_by_id(design_id)
        anomaly.designs.append(record)
    elif vendor_part_id:
        record = VendorPart.get_by_id(vendor_part_id)
        anomaly.vendor_parts.append(record)
    anomaly.add_change_log_entry(action='Add', field='Design/Part', new_value=record.get_descriptive_url())
    anomaly.save()
    variables = {
        'anomaly': anomaly,
        'design': record
    }
    return render_template('anomaly/anomaly_design_row.html', **variables)
예제 #8
0
def add_part():
    procedure_id = request.form.get('procedure_id')
    record_id = request.form.get('record_id')
    record_class = request.form.get('record_class')
    proc = Procedure.get_by_id(procedure_id)
    part = None
    if record_class == "part":
        part = Part.get_by_id(record_id)
        proc.parts.append(part)
    elif record_class == "vendorpart":
        part = VendorPart.get_by_id(record_id)
        proc.vendor_parts.append(part)
    proc.add_change_log_entry(action='Add',
                              field='Part',
                              new_value=part.get_descriptive_url())
    proc.save()
    return render_template('procedure/procedure_part.html',
                           part=part,
                           proc=proc)
예제 #9
0
def get_procedure_modal():
    form = CreateProcedureForm(request.form)
    vendor_parts = []
    parts = []
    table = request.form.get('table', None)
    part_id = request.form.get('part_id', None)
    if table:
        if table == 'vendor_parts':
            vendor_parts.append(VendorPart.get_by_id(part_id))
        elif table == 'designs':
            parts.append(Part.get_by_id(part_id))

    variables = {
        'vendor_parts': vendor_parts,
        'parts': parts,
        'current_part_ids': ','.join([str(x.id) for x in parts]),
        'current_vendor_part_ids': ','.join([str(x.id) for x in vendor_parts]),
        'form': form
    }
    return render_template('procedure/create_procedure.html', **variables)
예제 #10
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)
예제 #11
0
    def validate(self):
        """Validate the form."""
        initial_validation = super(CreateVendorBuildForm, self).validate()
        errors = False
        data = {}
        if not initial_validation:
            errors = True

        vendor_part = VendorPart.get_by_id(self.vendor_part_id.data)
        existing_serial_numbers = VendorProduct.get_serial_numbers_for_vendor_part(vendor_part)

        if self.product_type.data == 's/n':
            # TODO: Try to move some of this to an external function, very messy now
            return_serial_numbers = []
            # TODO: Improve these replaces
            serial_numbers = self.serial_numbers.data.strip().replace(' , ', ',').replace(', ', ',').replace(' ,', ',').replace(' ', ',')  # In case user uses space instead of comma
            if len(serial_numbers) == 0:
                self.serial_numbers.errors.append('No S/N(s) entered')
                errors = True
            else:
                # First check for comma separated serial_numbers
                if ',' in serial_numbers:
                    serial_numbers_array = serial_numbers.split(',')
                    for sn in serial_numbers_array:
                        if sn in existing_serial_numbers:
                            self.serial_numbers.errors.append('S/N {0} already exists'.format(sn))
                            errors = True
                        else:
                            return_serial_numbers.append(sn)
                # Only one S/N present most likely, just append it
                else:
                    if serial_numbers in existing_serial_numbers:
                        self.serial_numbers.errors.append('S/N {0} already exists'.format(serial_numbers))
                        errors = True
                    else:
                        return_serial_numbers.append(serial_numbers)
            data['serial_numbers'] = return_serial_numbers
        elif self.product_type.data == 'lot':
            return_lot_record = None
            lot_record = self.lot_record.data.strip()
            if len(lot_record) == 0:
                self.lot_record.errors.append('No LOT record entered')
                errors = True
            else:
                return_lot_record = lot_record
            if lot_record in existing_serial_numbers:
                self.lot_record.errors.append('LOT record {0} already exists'.format(lot_record))
                errors = True
            else:
                data['lot_record'] = return_lot_record
        elif self.product_type.data == 'stock':
            # TODO: Check if STCK already exists
            if 'STCK' in existing_serial_numbers:
                self.product_type.errors.append('STCK already exists')
                errors = True
            else:
                data['is_stock'] = True

        if errors:
            return False, None

        return True, data
예제 #12
0
def create_anomaly():
    """Create new anomaly."""
    form = CreateAnomalyForm(request.form)
    validated = form.validate_on_submit()
    if validated:
        variables = {
            'name': form.name.data,
            'criticality': form.criticality.data,
            'owner': form.owner.data,
            'anomaly_type': form.affected.data
        }
        anomaly = Anomaly.create(**variables)
        if form.affected.data == 'design':
            for design_id in form.designs.data.split(','):
                design = Design.get_by_id(design_id)
                if design != None:
                    anomaly.designs.append(design)
                    design.anomalies.append(anomaly)
                    design.save()
            for vendor_part_id in form.vendor_parts.data.split(','):
                vendor_part = VendorPart.get_by_id(vendor_part_id)
                if vendor_part != None:
                    anomaly.vendor_parts.append(vendor_part)
                    vendor_part.anomalies.append(anomaly)
                    vendor_part.save()
            anomaly.save()
        elif form.affected.data == 'asrun':
            for as_run_id in form.as_runs.data.split(','):
                as_run = AsRun.get_by_id(as_run_id)
                if as_run != None:
                    anomaly.as_runs.append(as_run)
                    as_run.anomalies.append(anomaly)
                    as_run.save()
            anomaly.save()
        jsonData = {
            'success': True,
            'url': anomaly.get_url()
        }
        return jsonify(jsonData), 200, {'ContentType': 'application/json'}
    else:
        designs = []
        vendor_parts = []
        as_runs = []
        print(form.designs.data)
        for design_id in form.designs.data.split(','):
            design = Design.get_by_id(design_id)
            if design != None:
                designs.append(design)
        for vendor_part_id in form.vendor_parts.data.split(','):
            vendor_part = VendorPart.get_by_id(vendor_part_id)
            if vendor_part != None:
                vendor_parts.append(vendor_part)
        for as_run_id in form.as_runs.data.split(','):
            as_run = AsRun.get_by_id(as_run_id)
            if as_run != None:
                as_runs.append(as_run)
        variables = {
            'form': form,
            'designs': designs,
            'vendor_parts': vendor_parts,
            'as_runs': as_runs
        }
        return make_response(render_template('anomaly/create_anomaly.html', **variables), 500)
예제 #13
0
def create_vendor_build():
    """Create new VendorBuild. Also creates one or more VendorProducts."""
    form = CreateVendorBuildForm(request.form)
    if request.method == 'GET':
        vendor_part = VendorPart.get_by_id(request.args.get('vendor_part_id'))
        existing_build_id = request.args.get('existing_build_id')
        if existing_build_id:
            existing_build = VendorBuild.get_by_id(existing_build_id)
            build_identifier = existing_build.build_identifier
        else:
            build_identifier = VendorBuild.get_next_build_identifier_for_vendor_part(vendor_part)
        lot_identifier = VendorProduct.get_next_lot_number_for_vendor_part(vendor_part)
        existing_serial_numbers = ','.join(VendorProduct.get_serial_numbers_for_vendor_part(vendor_part))
        # Pre-populate with values from vendor_part
        form.project.data = vendor_part.project
        form.vendor.data = vendor_part.vendor
        form.manufacturer.data = Company.get_company_by_name('N/A')
        variables = {
            'form': form,
            'vendor_part': vendor_part,
            'build_identifier': build_identifier,
            'lot_identifier': lot_identifier,
            'existing_serial_numbers': existing_serial_numbers,
            'existing_build_id': existing_build_id
        }
        return render_template('vendorproduct/create_vendor_build_modal.html', **variables)
    validated, data = form.validate_on_submit()
    if validated:
        vendor_part = VendorPart.get_by_id(form.vendor_part_id.data)
        vendor = vendor_part.vendor
        manufacturer = form.manufacturer.data
        owner = form.owner.data
        build_identifier = form.build_identifier.data
        # Create build
        if form.existing_build_id.data:
            build = VendorBuild.get_by_id(form.existing_build_id.data)
        else:
            build = VendorBuild.create(vendor_part=vendor_part, vendor=vendor, manufacturer=manufacturer,
                                       owner=owner, build_identifier=build_identifier)
        # For each s/n in s/n, create product
        summary = vendor_part.summary
        hardware_type = form.hardware_type.data
        project = form.project.data
        # Create serial numbers
        serial_numbers = data.get('serial_numbers', [])
        for sn in serial_numbers:
            product = VendorProduct.create(serial_number=sn, vendor_part=vendor_part, vendor_build=build,
                                           summary=summary, hardware_type=hardware_type,
                                           project=project, owner=owner)
        # Or create LOT product
        lot_record = data.get('lot_record', None)
        if lot_record:
            product = VendorProduct.create(serial_number=lot_record, vendor_part=vendor_part, vendor_build=build,
                                           summary=summary, hardware_type=hardware_type, product_type='LOT',
                                           project=project, owner=owner)
        # Or create STOCK product
        is_stock = data.get('is_stock', False)
        if is_stock:
            product = VendorProduct.create(serial_number='STCK', vendor_part=vendor_part, vendor_build=build,
                                           summary=summary, hardware_type=hardware_type, product_type='STOCK',
                                           project=project, owner=owner)

        jsonData = {
            'success': True,
            'product_number': product.product_number.replace(' ', '-'),  # Slugify product_number
            'url': product.get_url()
        }
        return jsonify(jsonData), 200, {'ContentType': 'application/json'}
    else:
        vendor_part = VendorPart.get_by_id(request.form['vendor_part_id'])
        build_identifier = VendorBuild.get_next_build_identifier_for_vendor_part(vendor_part)
        lot_identifier = VendorProduct.get_next_lot_number_for_vendor_part(vendor_part)
        existing_serial_numbers = ','.join(VendorProduct.get_serial_numbers_for_vendor_part(vendor_part))
        variables = {
            'form': form,
            'vendor_part': vendor_part,
            'build_identifier': build_identifier,
            'lot_identifier': lot_identifier,
            'existing_serial_numbers': existing_serial_numbers
        }
        response = make_response(render_template('vendorproduct/create_vendor_build_modal.html', **variables), 500)
        return response