示例#1
0
文件: views.py 项目: chintal/tendril
def new_production_order():
    form = CreateProductionOrderForm()
    stage = {'crumbroot': '/production'}
    if form.validate_on_submit():
        try:
            sno = form.prod_order_sno.sno.data
            with get_session() as session:
                title = form.prod_order_title.data.strip()
                if not sno:
                    sno = get_serialno(series='PROD', efield=title,
                                       register=True, session=session)
                else:
                    # additional sno validation?
                    pass

                cards = {x['ident']: int(x['qty']) for x in form.modules.data if x['ident']}
                deltas = [{'orig-cardname': x['orig_cardname'],
                           'target-cardname': x['target_cardname'],
                           'sno': x['sno']}
                          for x in form.deltas.data if x['sno']]
                requested_by = get_username_from_full_name(full_name=form.user.data,
                                                           session=session)
                # Construct Production Order
                prod_order = order.ProductionOrder(sno=sno)
                prod_order.create(
                    title=form.prod_order_title.data.strip(),
                    desc=form.desc.data.strip(),
                    cards=cards,
                    deltas=deltas,
                    sourcing_order_snos=None,
                    root_order_snos=form.root_order_sno.data,
                    ordered_by=requested_by,
                )
                # Check for Authorization
                # Nothing right now.
                # Create Order

                # TODO detach at this point
                fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
                if not os.path.exists(fe_workspace_path):
                    os.makedirs(fe_workspace_path)
                workspace_path = os.path.join(fe_workspace_path, get_tempname())
                os.makedirs(workspace_path)
                prod_order.process(outfolder=workspace_path,
                                   register=True, session=session)
                shutil.rmtree(workspace_path)
                # Redirect to Created Order
            return redirect(url_for('.production_orders', order_sno=str(sno)))
        except AuthChainNotValidError:
            stage['auth_not_valid'] = True

    stage_crumbs = {'breadcrumbs': [Crumb(name="Production", path=""),
                                    Crumb(name="Orders", path="order/"),
                                    Crumb(name="New", path="order/new")],
                    }
    stage.update(stage_crumbs)
    pagetitle = "Create New Production Order"
    return render_template('production_order_new.html', stage=stage, form=form,
                           pagetitle=pagetitle)
示例#2
0
def test_fsutils_tempfs():
    assert os.path.exists(fsutils.TEMPDIR)
    assert os.path.isdir(fsutils.TEMPDIR)
    assert isinstance(fsutils.temp_fs, FS)
    assert isinstance(fsutils.temp_fs, OSFS)
    tempname = fsutils.get_tempname()
    assert isinstance(tempname, str)
    assert not os.path.exists(os.path.join(fsutils.TEMPDIR, tempname))
def test_fsutils_tempfs():
    assert os.path.exists(fsutils.TEMPDIR)
    assert os.path.isdir(fsutils.TEMPDIR)
    assert isinstance(fsutils.temp_fs, FS)
    assert isinstance(fsutils.temp_fs, OSFS)
    tempname = fsutils.get_tempname()
    assert isinstance(tempname, str)
    assert not os.path.exists(os.path.join(fsutils.TEMPDIR, tempname))
示例#4
0
 def graphs(self):
     if self._parser is not None:
         # rng = self.get_range()
         rng = None
         path = os.path.join(TEMPDIR, 'hist_' + get_tempname() + '.png')
         hist = make_histogram(path, [float(x) for x in self._collected],
                               xlabel=self.desc, x_range=rng)
         return [(hist, self._parent.desc)]
     return []
示例#5
0
 def graphs(self):
     if self._parser is not None:
         # rng = self.get_range()
         rng = None
         path = os.path.join(TEMPDIR, 'hist_' + get_tempname() + '.png')
         hist = make_histogram(path, [float(x) for x in self._collected],
                               xlabel=self.desc,
                               x_range=rng)
         return [(hist, self._parent.desc)]
     return []
示例#6
0
def get_production_order_manifest_set(serialno):
    workspace = temp_fs.makeopendir(get_tempname())
    children = serialnos.get_child_serialnos(sno=serialno)
    manifests = []
    for child in children:
        files = []

        am = docstore.get_docs_list_for_sno_doctype(serialno=child,
                                                    doctype='ASSEMBLY MANIFEST')
        if len(am) == 1:
            uam = am[0]
            copyfile(uam.fs, uam.path, workspace, uam.filename, overwrite=True)
            files = [workspace.getsyspath(uam.filename)]
        elif len(am) > 1:
            raise ValueError(
                    "Found {0} manifests for {2}".format(len(am), child)
            )

        dms = docstore.get_docs_list_for_sno_doctype(
                serialno=child, doctype='DELTA ASSEMBLY MANIFEST'
        )
        if len(dms):
            for dm in dms:
                copyfile(dm.fs, dm.path, workspace, dm.filename,
                         overwrite=True)
                files.append(workspace.getsyspath(dm.filename))

        if len(files) > 1:
            wdmfile = merge_pdf(
                files,
                os.path.join(workspace.getsyspath('/'),
                             os.path.splitext(am[0].filename)[0] + '-wdm.pdf'),
                remove_sources=True
            )
            manifests.append(wdmfile)
        elif len(files) == 1:
            manifests.append(files[0])

    if len(manifests):
        output = merge_pdf(
            manifests,
            os.path.join(workspace.getsyspath('/'), serialno + '.pdf'),
            remove_sources=True
        )
        return output
    return None
示例#7
0
def get_production_order_manifest_set(serialno):
    workspace = temp_fs.makeopendir(get_tempname())
    children = serialnos.get_child_serialnos(sno=serialno)
    manifests = []
    for child in children:
        files = []

        am = docstore.get_docs_list_for_sno_doctype(
            serialno=child, doctype='ASSEMBLY MANIFEST')
        if len(am) == 1:
            uam = am[0]
            copyfile(uam.fs, uam.path, workspace, uam.filename, overwrite=True)
            files = [workspace.getsyspath(uam.filename)]
        elif len(am) > 1:
            raise ValueError("Found {0} manifests for {2}".format(
                len(am), child))

        dms = docstore.get_docs_list_for_sno_doctype(
            serialno=child, doctype='DELTA ASSEMBLY MANIFEST')
        if len(dms):
            for dm in dms:
                copyfile(dm.fs,
                         dm.path,
                         workspace,
                         dm.filename,
                         overwrite=True)
                files.append(workspace.getsyspath(dm.filename))

        if len(files) > 1:
            wdmfile = merge_pdf(
                files,
                os.path.join(workspace.getsyspath('/'),
                             os.path.splitext(am[0].filename)[0] + '-wdm.pdf'),
                remove_sources=True)
            manifests.append(wdmfile)
        elif len(files) == 1:
            manifests.append(files[0])

    if len(manifests):
        output = merge_pdf(manifests,
                           os.path.join(workspace.getsyspath('/'),
                                        serialno + '.pdf'),
                           remove_sources=True)
        return output
    return None
示例#8
0
文件: views.py 项目: chintal/tendril
def get_indent_labels(indent_sno=None):
    rindent = InventoryIndent(sno=indent_sno)
    fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
    if not os.path.exists(fe_workspace_path):
        os.makedirs(fe_workspace_path)
    workspace_path = os.path.join(fe_workspace_path, get_tempname())
    os.makedirs(workspace_path)
    labelmanager = get_manager()
    rindent.make_labels(label_manager=labelmanager)
    rfile = labelmanager.generate_pdf(workspace_path, force=True)

    if not rfile:
        return "Didn't get a manifest set!"
    try:
        content = open(rfile).read()
        return Response(content, mimetype="application/pdf")
    except IOError as exc:
        return str(exc)
示例#9
0
def get_indent_labels(indent_sno=None):
    rindent = InventoryIndent(sno=indent_sno)
    fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
    if not os.path.exists(fe_workspace_path):
        os.makedirs(fe_workspace_path)
    workspace_path = os.path.join(fe_workspace_path, get_tempname())
    os.makedirs(workspace_path)
    labelmanager = get_manager()
    rindent.make_labels(label_manager=labelmanager)
    rfile = labelmanager.generate_pdf(workspace_path, force=True)

    if not rfile:
        return "Didn't get a manifest set!"
    try:
        content = open(rfile).read()
        return Response(content, mimetype="application/pdf")
    except IOError as exc:
        return str(exc)
示例#10
0
文件: views.py 项目: chintal/tendril
def get_device_labels(order_sno=None):
    production_order = order.ProductionOrder(order_sno)
    fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
    if not os.path.exists(fe_workspace_path):
        os.makedirs(fe_workspace_path)
    workspace_path = os.path.join(fe_workspace_path, get_tempname())
    os.makedirs(workspace_path)
    labelmanager = get_manager()
    production_order.make_labels(label_manager=labelmanager,
                                 include_main_indent=False)
    rfile = labelmanager.generate_pdf(workspace_path, force=True)

    if not rfile:
        return "Didn't get a manifest set!"
    try:
        content = open(rfile).read()
        return Response(content, mimetype="application/pdf")
    except IOError as exc:
        return str(exc)
示例#11
0
 def _make_graph(self, color='black', lw=2, marker=None,
                 xscale='linear', yscale='linear',
                 xlabel='', ylabel=''):
     outpath = os.path.join(TEMPDIR,
                            'GRAPH_GROUP_' + get_tempname() + '.png'
                            )
     for graph in self._collected:
         pyplot.plot(graph[0], graph[1], color=color, lw=lw, marker=marker)
     pyplot.xscale(xscale)
     pyplot.yscale(yscale)
     pyplot.grid(True, which='major', color='0.3', linestyle='-')
     pyplot.grid(True, which='minor', color='0.3')
     pyplot.xlabel(xlabel, fontsize=20)
     pyplot.ylabel(ylabel, fontsize=20)
     pyplot.tick_params(axis='both', which='major', labelsize=16)
     pyplot.tick_params(axis='both', which='minor', labelsize=8)
     pyplot.tight_layout()
     pyplot.savefig(outpath)
     pyplot.close()
     return outpath
示例#12
0
def get_customs_invoice(serialno):
    documents = docstore.controller.get_sno_documents(serialno=serialno)
    inv_yaml = None
    for document in documents:
        if document.doctype == 'INVOICE-DATA-YAML':
            inv_yaml = document.docpath
    if not inv_yaml:
        raise ValueError('Invoice data not found for : ' + serialno)
    with docstore.docstore_fs.open(inv_yaml, 'r') as f:
        inv_data = yaml.load(f)

    inv_format = inv_data['invoice_format']

    if inv_format == 'analogdevices':
        from tendril.sourcing import pricelist
        invoice_class = pricelist.AnalogDevicesInvoice
    elif inv_format == 'digikey':
        from tendril.sourcing import digikey
        invoice_class = digikey.DigiKeyInvoice
    else:
        raise ValueError('Unrecognized Customs Invoice Format : ' +
                         inv_format)

    from tendril.sourcing import electronics
    vobj = electronics.get_vendor_by_name(inv_format)

    workspace_name = get_tempname()
    docstore.copy_docs_to_workspace(serialno=serialno,
                                    workspace=workspace_name,
                                    clearws=True,
                                    fs=temp_fs)

    invoice = invoice_class(
        vobj,
        temp_fs.getsyspath(
            fs.path.join(workspace_name, 'inv_data.yaml')
        )
    )

    temp_fs.removedir(workspace_name, recursive=True, force=True)
    return invoice
示例#13
0
文件: customs.py 项目: SayCV/tendril
def get_customs_invoice(serialno):
    documents = docstore.controller.get_sno_documents(serialno=serialno)
    inv_yaml = None
    for document in documents:
        if document.doctype == 'INVOICE-DATA-YAML':
            inv_yaml = document.docpath
    if not inv_yaml:
        raise ValueError('Invoice data not found for : ' + serialno)
    with docstore.docstore_fs.open(inv_yaml, 'r') as f:
        inv_data = yaml.load(f)

    inv_format = inv_data['invoice_format']

    if inv_format == 'analogdevices':
        from tendril.sourcing import pricelist
        invoice_class = pricelist.AnalogDevicesInvoice
    elif inv_format == 'digikey':
        from tendril.sourcing.vendors import digikey
        invoice_class = digikey.DigiKeyInvoice
    else:
        raise ValueError('Unrecognized Customs Invoice Format : ' +
                         inv_format)

    from tendril.sourcing import electronics
    vobj = electronics.get_vendor_by_name(inv_format)

    workspace_name = get_tempname()
    docstore.copy_docs_to_workspace(serialno=serialno,
                                    workspace=workspace_name,
                                    clearws=True,
                                    fs=temp_fs)

    invoice = invoice_class(
        vobj,
        temp_fs.getsyspath(
            fs.path.join(workspace_name, 'inv_data.yaml')
        )
    )

    temp_fs.removedir(workspace_name, recursive=True, force=True)
    return invoice
示例#14
0
 def _make_graph(self,
                 color='black',
                 lw=2,
                 marker=None,
                 xscale='linear',
                 yscale='linear',
                 xlabel='',
                 ylabel=''):
     outpath = os.path.join(TEMPDIR,
                            'GRAPH_GROUP_' + get_tempname() + '.png')
     for graph in self._collected:
         pyplot.plot(graph[0], graph[1], color=color, lw=lw, marker=marker)
     pyplot.xscale(xscale)
     pyplot.yscale(yscale)
     pyplot.grid(True, which='major', color='0.3', linestyle='-')
     pyplot.grid(True, which='minor', color='0.3')
     pyplot.xlabel(xlabel, fontsize=20)
     pyplot.ylabel(ylabel, fontsize=20)
     pyplot.tick_params(axis='both', which='major', labelsize=16)
     pyplot.tick_params(axis='both', which='minor', labelsize=8)
     pyplot.tight_layout()
     pyplot.savefig(outpath)
     pyplot.close()
     return outpath
示例#15
0
 def get_new_graph_path():
     return os.path.join(TEMPDIR, "graph" + get_tempname() + ".png")
示例#16
0
 def get_new_graph_path():
     return os.path.join(TEMPDIR, 'graph' + get_tempname() + '.png')
示例#17
0
def new_indent(indent_sno=None):
    form = CreateIndentForm(parent_indent_sno=indent_sno)
    stage = {'crumbroot': '/inventory'}
    if form.validate_on_submit():
        try:
            with get_session() as session:
                sno = form.indent_sno.sno.data
                if not sno:
                    if indent_sno is not None:
                        sno = form.get_supplementary_sno_default()
                        register_serialno(sno=sno,
                                          efield="WEB FRONTEND INDENT",
                                          session=session)
                    else:
                        sno = get_serialno(series='IDT',
                                           efield='WEB FRONTEND INDENT',
                                           register=True,
                                           session=session)
                else:
                    # additional sno validation?
                    pass
                nindent = InventoryIndent(sno=sno, session=session)
                # Construct COBOM
                obom = create_obom_from_listing(form.components.data,
                                                'MANUAL (WEB)')
                cobom = CompositeOutputBom([obom],
                                           name='MANUAL (WEB) {0}'.format(sno))

                requested_by = get_username_from_full_name(
                    full_name=form.user.data, session=session)

                icparams = {
                    'cobom': cobom,
                    'title': form.indent_title.data,
                    'desc': form.indent_desc.data,
                    'requested_by': requested_by,
                    'rdate': form.rdate.data or arrow.utcnow(),
                    'indent_type': form.indent_type.data,
                }
                nindent.create(**icparams)

                root_order_sno = form.root_order_sno.data
                prod_order_sno = form.prod_order_sno.data
                try:
                    nindent.define_auth_chain(prod_order_sno=prod_order_sno,
                                              root_order_sno=root_order_sno,
                                              session=session)
                except AuthChainNotValidError:
                    raise
                nindent.register_auth_chain(session=session)

                fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
                if not os.path.exists(fe_workspace_path):
                    os.makedirs(fe_workspace_path)
                workspace_path = os.path.join(fe_workspace_path,
                                              get_tempname())
                os.makedirs(workspace_path)

                nindent.process(outfolder=workspace_path,
                                register=True,
                                session=session)

                shutil.rmtree(workspace_path)
            return redirect(url_for('.indent', indent_sno=str(sno)))
        except AuthChainNotValidError:
            stage['auth_not_valid'] = True

    if indent_sno is None:
        stage_crumbs = {
            'breadcrumbs': [
                Crumb(name="Inventory", path=""),
                Crumb(name="Indent", path="indent/"),
                Crumb(name="New", path="indent/new")
            ],
        }
        pagetitle = "Create New Indent"
    else:
        stage_crumbs = {
            'breadcrumbs': [
                Crumb(name="Inventory", path=""),
                Crumb(name="Indent", path="indent/"),
                Crumb(name=indent_sno, path="indent/" + indent_sno),
                Crumb(name="New",
                      path='/'.join(["indent", indent_sno, "/new"])),
            ]
        }
        pagetitle = "New Supplementary Indent for " + indent_sno
    stage.update(stage_crumbs)
    return render_template('indent_new.html',
                           stage=stage,
                           form=form,
                           pagetitle=pagetitle)
示例#18
0
文件: views.py 项目: chintal/tendril
def new_production_order():
    form = CreateProductionOrderForm()
    stage = {'crumbroot': '/production'}
    if form.validate_on_submit():
        try:
            sno = form.prod_order_sno.sno.data
            with get_session() as session:
                title = form.prod_order_title.data.strip()
                if not sno:
                    sno = get_serialno(series='PROD',
                                       efield=title,
                                       register=True,
                                       session=session)
                else:
                    # additional sno validation?
                    pass

                cards = {
                    x['ident']: int(x['qty'])
                    for x in form.modules.data if x['ident']
                }
                deltas = [{
                    'orig-cardname': x['orig_cardname'],
                    'target-cardname': x['target_cardname'],
                    'sno': x['sno']
                } for x in form.deltas.data if x['sno']]
                requested_by = get_username_from_full_name(
                    full_name=form.user.data, session=session)
                # Construct Production Order
                prod_order = order.ProductionOrder(sno=sno)
                prod_order.create(
                    title=form.prod_order_title.data.strip(),
                    desc=form.desc.data.strip(),
                    cards=cards,
                    deltas=deltas,
                    sourcing_order_snos=None,
                    root_order_snos=form.root_order_sno.data,
                    ordered_by=requested_by,
                )
                # Check for Authorization
                # Nothing right now.
                # Create Order

                # TODO detach at this point
                fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
                if not os.path.exists(fe_workspace_path):
                    os.makedirs(fe_workspace_path)
                workspace_path = os.path.join(fe_workspace_path,
                                              get_tempname())
                os.makedirs(workspace_path)
                prod_order.process(outfolder=workspace_path,
                                   register=True,
                                   session=session)
                shutil.rmtree(workspace_path)
                # Redirect to Created Order
            return redirect(url_for('.production_orders', order_sno=str(sno)))
        except AuthChainNotValidError:
            stage['auth_not_valid'] = True

    stage_crumbs = {
        'breadcrumbs': [
            Crumb(name="Production", path=""),
            Crumb(name="Orders", path="order/"),
            Crumb(name="New", path="order/new")
        ],
    }
    stage.update(stage_crumbs)
    pagetitle = "Create New Production Order"
    return render_template('production_order_new.html',
                           stage=stage,
                           form=form,
                           pagetitle=pagetitle)
示例#19
0
文件: views.py 项目: chintal/tendril
def new_indent(indent_sno=None):
    form = CreateIndentForm(parent_indent_sno=indent_sno)
    stage = {'crumbroot': '/inventory'}
    if form.validate_on_submit():
        try:
            with get_session() as session:
                sno = form.indent_sno.sno.data
                if not sno:
                    if indent_sno is not None:
                        sno = form.get_supplementary_sno_default()
                        register_serialno(sno=sno, efield="WEB FRONTEND INDENT",
                                          session=session)
                    else:
                        sno = get_serialno(series='IDT',
                                           efield='WEB FRONTEND INDENT',
                                           register=True, session=session)
                else:
                    # additional sno validation?
                    pass
                nindent = InventoryIndent(sno=sno, session=session)
                # Construct COBOM
                obom = create_obom_from_listing(form.components.data,
                                                'MANUAL (WEB)')
                cobom = CompositeOutputBom([obom],
                                           name='MANUAL (WEB) {0}'.format(sno))

                requested_by = get_username_from_full_name(full_name=form.user.data,
                                                           session=session)

                icparams = {
                    'cobom': cobom,
                    'title': form.indent_title.data,
                    'desc': form.indent_desc.data,
                    'requested_by': requested_by,
                    'rdate': form.rdate.data or arrow.utcnow(),
                    'indent_type': form.indent_type.data,
                }
                nindent.create(**icparams)

                root_order_sno = form.root_order_sno.data
                prod_order_sno = form.prod_order_sno.data
                try:
                    nindent.define_auth_chain(prod_order_sno=prod_order_sno,
                                              root_order_sno=root_order_sno,
                                              session=session)
                except AuthChainNotValidError:
                    raise
                nindent.register_auth_chain(session=session)

                fe_workspace_path = os.path.join(TEMPDIR, 'frontend')
                if not os.path.exists(fe_workspace_path):
                    os.makedirs(fe_workspace_path)
                workspace_path = os.path.join(fe_workspace_path, get_tempname())
                os.makedirs(workspace_path)

                nindent.process(outfolder=workspace_path,
                                register=True, session=session)

                shutil.rmtree(workspace_path)
            return redirect(url_for('.indent', indent_sno=str(sno)))
        except AuthChainNotValidError:
            stage['auth_not_valid'] = True

    if indent_sno is None:
        stage_crumbs = {'breadcrumbs': [Crumb(name="Inventory", path=""),
                                        Crumb(name="Indent", path="indent/"),
                                        Crumb(name="New", path="indent/new")],
                        }
        pagetitle = "Create New Indent"
    else:
        stage_crumbs = {'breadcrumbs': [Crumb(name="Inventory", path=""),
                                        Crumb(name="Indent", path="indent/"),
                                        Crumb(name=indent_sno,
                                              path="indent/" + indent_sno),
                                        Crumb(name="New",
                                              path='/'.join(["indent",
                                                             indent_sno,
                                                             "/new"])),
                                        ]
                        }
        pagetitle = "New Supplementary Indent for " + indent_sno
    stage.update(stage_crumbs)
    return render_template('indent_new.html', stage=stage, form=form,
                           pagetitle=pagetitle)