Пример #1
0
def generate_docs(invoice,
                  target_folder=None,
                  serialno=None,
                  register=False,
                  efield=None):
    """
    Generates all the Customs related documentation given a CustomsInvoice
    (or subclass) instance.

    :param invoice: The invoice object with customs information
    :type invoice: :class:`tendril.sourcing.customs.CustomsInvoice`
    :param target_folder: The folder in which the generated files
                          should be written to. Auto sets to Instance scratch
                          folder if None
    :type target_folder: str
    :param serialno: The serial number of the Customs documentation set.
                     Autogenerates if None.
    :type serialno: str
    :param register: Whether or not to register in the docstore.
                     Default False.
    :type register: bool
    :param efield: Additional short note to identify the document in the
                   store. Autogenerates from invoice if None.
    :type efield: str
    :return: The serial number of the generated document set.

    .. rubric:: Included Document Sets

    * Sumbmittable Documents, generated by :func:`gen_submitdocs`
    * Verification Documents, generated by :func:`gen_verificationdocs`

    """
    if efield is None:
        efield = ' '.join([invoice.vendor_name, str(invoice.inv_no)])
    if serialno is None:
        if os.path.exists(os.path.join(invoice.source_folder, 'wsno')):
            with open(os.path.join(invoice.source_folder, 'wsno'), 'r') as f:
                serialno = f.readline()
        else:
            serialno = serialnos.get_serialno(series='PINV',
                                              efield=efield,
                                              register=register)
    if target_folder is None:
        target_folder = invoice.source_folder
    files = gen_submitdocs(invoice, target_folder, serialno=serialno)
    files.extend(
        gen_verificationdocs(invoice, target_folder, serialno=serialno))
    files.extend(invoice.source_files)
    if register is True:
        for document in files:
            docstore.register_document(serialno=serialno,
                                       docpath=document[0],
                                       doctype=document[1],
                                       efield=efield,
                                       series='PINV')
    return serialno
Пример #2
0
 def _generate_am(self, manifestsfolder, sno, prod_ord_sno, indent_sno,
                  verbose=True, register=False, session=None):
     ampath = gen_pcb_am(self._ident, manifestsfolder, sno,
                         productionorderno=prod_ord_sno,
                         indentsno=indent_sno, scaffold=self.scaffold,
                         verbose=verbose, session=session)
     if register is True:
         docstore.register_document(serialno=sno, docpath=ampath,
                                    doctype='ASSEMBLY MANIFEST',
                                    verbose=verbose, session=session)
Пример #3
0
 def _generate_docs(self, manifestsfolder, indent_sno=None, prod_ord_sno=None,
                    register=False, session=None):
     dmpath = gen_delta_pcb_am(
             self._orig_modulename, self._target_modulename,
             outfolder=manifestsfolder, sno=self._sno,
             indentsno=indent_sno, productionorderno=prod_ord_sno
     )
     if register is True:
         docstore.register_document(serialno=self._sno, docpath=dmpath,
                                    doctype='DELTA ASSEMBLY MANIFEST',
                                    session=session)
Пример #4
0
 def _dump_cobom(self, outfolder, register=False,
                 verbose=True, session=None):
     with open(os.path.join(outfolder, 'cobom.csv'), 'w') as f:
         self._cobom.dump(f)
     if register is True:
         docstore.register_document(
                 serialno=self.serialno,
                 docpath=os.path.join(outfolder, 'cobom.csv'),
                 doctype='PRODUCTION COBOM CSV', efield=self.title,
                 verbose=verbose, session=session
         )
Пример #5
0
 def _generate_doc(self, outfolder, register=False, verbose=True,
                   session=None):
     indentpath, indentsno = gen_stock_idt_from_cobom(
         outfolder, self.serialno, self.title, self.context, self._cobom,
         verbose=verbose
         )
     if register is True:
         docstore.register_document(
             serialno=self.serialno, docpath=indentpath,
             doctype='INVENTORY INDENT', efield=self.title,
             verbose=verbose, session=session
         )
Пример #6
0
 def _generate_doc(self, outfolder=None, register=False, session=None):
     outpath = gen_production_order(
             outfolder, self.serialno, self._yaml_data, self.lines,
             sourcing_orders=self._sourcing_order_snos,
             verbose=False, root_orders=self.root_order_snos
     )
     if register is True:
         docstore.register_document(
             serialno=self.serialno, docpath=outpath,
             doctype='PRODUCTION ORDER', efield=self.title,
             verbose=False, session=session
         )
Пример #7
0
 def _dump_order_yaml(self, outfolder=None, register=False, session=None):
     self._build_yaml_data()
     with open(os.path.join(outfolder, 'order.yaml'), 'w') as f:
         f.write(yaml.dump(self._yaml_data, default_flow_style=False))
     if register is True:
         docstore.register_document(
                 serialno=self.serialno,
                 docpath=os.path.join(outfolder, 'order.yaml'),
                 doctype='PRODUCTION ORDER YAML',
                 verbose=False, efield=self.title,
                 session=session
         )
Пример #8
0
 def _generate_doc(self, outfolder=None, register=False, session=None):
     outpath = gen_production_order(
             outfolder, self.serialno, self._yaml_data, self.lines,
             sourcing_orders=self._sourcing_order_snos,
             verbose=False, root_orders=self.root_order_snos
     )
     if register is True:
         docstore.register_document(
             serialno=self.serialno, docpath=outpath,
             doctype='PRODUCTION ORDER', efield=self.title,
             verbose=False, session=session
         )
Пример #9
0
 def _dump_order_yaml(self, outfolder=None, register=False, session=None):
     self._build_yaml_data()
     with open(os.path.join(outfolder, 'order.yaml'), 'w') as f:
         f.write(yaml.dump(self._yaml_data, default_flow_style=False))
     if register is True:
         docstore.register_document(
                 serialno=self.serialno,
                 docpath=os.path.join(outfolder, 'order.yaml'),
                 doctype='PRODUCTION ORDER YAML',
                 verbose=False, efield=self.title,
                 session=session
         )
Пример #10
0
def publish_and_print(serialno, devicetype, suites=None,
                      print_to_paper=False):
    from tendril.dox import testing
    if suites is not None:
        pdfpath = testing.render_test_report_standalone(serialno, devicetype,
                                                        suites)
    else:
        pdfpath = testing.render_test_report(serialno=serialno)
        register_document(serialno=serialno, docpath=pdfpath,
                          doctype='TEST-RESULT', efield=devicetype,
                          series='TEST/' + serialnos.get_series(sno=serialno))
    if PRINTER_NAME and print_to_paper:
        os.system('lp -d {1} -o media=a4 {0}'.format(pdfpath, PRINTER_NAME))
Пример #11
0
 def _dump_cobom(self,
                 outfolder,
                 register=False,
                 verbose=True,
                 session=None):
     with open(os.path.join(outfolder, 'cobom.csv'), 'w') as f:
         self._cobom.dump(f)
     if register is True:
         docstore.register_document(serialno=self.serialno,
                                    docpath=os.path.join(
                                        outfolder, 'cobom.csv'),
                                    doctype='PRODUCTION COBOM CSV',
                                    efield=self.title,
                                    verbose=verbose,
                                    session=session)
Пример #12
0
def publish_and_print(serialno, devicetype, suites=None, print_to_paper=False):
    from tendril.dox import testing

    if suites is not None:
        pdfpath = testing.render_test_report_standalone(serialno, devicetype, suites)
    else:
        pdfpath = testing.render_test_report(serialno=serialno)
        register_document(
            serialno=serialno,
            docpath=pdfpath,
            doctype="TEST-RESULT",
            efield=devicetype,
            series="TEST/" + serialnos.get_series(sno=serialno),
        )
    if PRINTER_NAME and print_to_paper:
        os.system("lp -d {1} -o media=a4 {0}".format(pdfpath, PRINTER_NAME))
Пример #13
0
 def _generate_docs(self,
                    manifestsfolder,
                    indent_sno=None,
                    prod_ord_sno=None,
                    register=False,
                    session=None):
     dmpath = gen_delta_pcb_am(self._orig_modulename,
                               self._target_modulename,
                               outfolder=manifestsfolder,
                               sno=self._sno,
                               indentsno=indent_sno,
                               productionorderno=prod_ord_sno)
     if register is True:
         docstore.register_document(serialno=self._sno,
                                    docpath=dmpath,
                                    doctype='DELTA ASSEMBLY MANIFEST',
                                    session=session)
Пример #14
0
 def _generate_doc(self,
                   outfolder,
                   register=False,
                   verbose=True,
                   session=None):
     indentpath, indentsno = gen_stock_idt_from_cobom(outfolder,
                                                      self.serialno,
                                                      self.title,
                                                      self.context,
                                                      self._cobom,
                                                      verbose=verbose)
     if register is True:
         docstore.register_document(serialno=self.serialno,
                                    docpath=indentpath,
                                    doctype='INVENTORY INDENT',
                                    efield=self.title,
                                    verbose=verbose,
                                    session=session)
Пример #15
0
 def _generate_am(self,
                  manifestsfolder,
                  sno,
                  prod_ord_sno,
                  indent_sno,
                  verbose=True,
                  register=False,
                  session=None):
     ampath = gen_pcb_am(self._ident,
                         manifestsfolder,
                         sno,
                         productionorderno=prod_ord_sno,
                         indentsno=indent_sno,
                         scaffold=self.scaffold,
                         verbose=verbose,
                         session=session)
     if register is True:
         docstore.register_document(serialno=sno,
                                    docpath=ampath,
                                    doctype='ASSEMBLY MANIFEST',
                                    verbose=verbose,
                                    session=session)
Пример #16
0
    def _process(self, outfolder=None, manifestsfolder=None,
                 label_manager=None, register=False, force=False,
                 pb_class=None, stacked_pb=False, leaf_pb=True,
                 session=None):
        self._force = force

        if pb_class is None:
            pb_class = TendrilProgressBar

        if stacked_pb is True:
            pb = pb_class(max=8)
        else:
            pb = DummyProgressBar(max=8)

        pb.next(note="Constructing Resources for Production Order Generation")

        if outfolder is None:
            if self._order_yaml_path is not None:
                outfolder = os.path.split(self._order_yaml_path)[0]
            else:
                raise AttributeError('Output folder needs to be defined')

        if manifestsfolder is None:
            manifestsfolder = os.path.join(outfolder, 'manifests')
            if not os.path.exists(manifestsfolder):
                os.makedirs(manifestsfolder)

        if self._sno is None:
            self._sno = serialnos.get_serialno(
                    series='PROD', efield=self._title,
                    register=register, session=session
            )

        # Create Snomap
        if self._snomap_path is not None:
            with open(self._snomap_path, 'r') as f:
                self._snomap = SerialNumberMap(yaml.load(f), self._sno)
        else:
            self._snomap = SerialNumberMap({}, self._sno)

        self._snomap.set_session(session=session)
        if register is True:
            self._snomap.enable_creation()

        indent_sno = self._snomap.get_sno('indentsno')
        if register is True:
            serialnos.link_serialno(child=indent_sno, parent=self.serialno,
                                    verbose=False, session=session)

        # Create cards and deltas and so forth
        pb.next(note="Constructing Production Order Actions")
        actions = self.card_actions + self.delta_actions

        pb.next(note="Executing Production Order Actions")
        for action in actions:
            if register is False:
                action.scaffold = True
            action.set_session(session=session)
            action.commit(
                outfolder=manifestsfolder, indent_sno=indent_sno,
                prod_ord_sno=self._sno, register=register, session=session,
                pb_class=pb_class, stacked_pb=stacked_pb, leaf_pb=leaf_pb,
            )

        self._snomap.disable_creation()

        pb.next(note="Constructing Composite Output BOM")
        cobom = CompositeOutputBom(self.bomlist)

        # Assume Indent is non-empty.
        # Create indent
        pb.next(note="Creating Indent")
        indent = InventoryIndent(indent_sno, verbose=False, session=session)
        indent.create(cobom, title="FOR {0}".format(self.serialno),
                      desc=None, indent_type='production',
                      requested_by=self._ordered_by, force=force)
        indent.define_auth_chain(prod_order_sno=self.serialno,
                                 session=session, prod_order_scaffold=True)
        indent.process(outfolder=outfolder, register=register,
                       verbose=False, session=session)
        self._indents.append(indent)

        pb.next(note="Generating Production Order Document")
        # Make production order doc
        self._last_generated_at = arrow.utcnow().isoformat()
        if self._first_generated_at is None:
            self._first_generated_at = arrow.utcnow().isoformat()
        self._dump_order_yaml(outfolder=outfolder, register=register,
                              session=session)
        self._generate_doc(outfolder=outfolder, register=register,
                           session=session)

        pb.next(note="Generating Labels")
        self.make_labels(label_manager=label_manager, pb_class=pb_class,
                         stacked_pb=stacked_pb, leaf_pb=leaf_pb)

        pb.next(note="Finalizing Production Order")
        for action in actions:
            action.scaffold = False
            action.unset_session()
        self._snomap.dump_to_file(outfolder)
        self._snomap.unset_session()

        if register is True:
            docstore.register_document(
                    serialno=self.serialno,
                    docpath=os.path.join(outfolder, 'snomap.yaml'),
                    doctype='SNO MAP', efield=self.title,
                    verbose=False, session=session
            )
        pb.finish()
        self._defined = True
Пример #17
0
    def _process(self, outfolder=None, manifestsfolder=None,
                 label_manager=None, register=False, force=False,
                 pb_class=None, stacked_pb=False, leaf_pb=True,
                 session=None):
        self._force = force

        if pb_class is None:
            pb_class = TendrilProgressBar

        if stacked_pb is True:
            pb = pb_class(max=8)
        else:
            pb = DummyProgressBar(max=8)

        pb.next(note="Constructing Resources for Production Order Generation")

        if outfolder is None:
            if self._order_yaml_path is not None:
                outfolder = os.path.split(self._order_yaml_path)[0]
            else:
                raise AttributeError('Output folder needs to be defined')

        if manifestsfolder is None:
            manifestsfolder = os.path.join(outfolder, 'manifests')
            if not os.path.exists(manifestsfolder):
                os.makedirs(manifestsfolder)

        if self._sno is None:
            self._sno = serialnos.get_serialno(
                    series='PROD', efield=self._title,
                    register=register, session=session
            )

        # Create Snomap
        if self._snomap_path is not None:
            with open(self._snomap_path, 'r') as f:
                self._snomap = SerialNumberMap(yaml.load(f), self._sno)
        else:
            self._snomap = SerialNumberMap({}, self._sno)

        self._snomap.set_session(session=session)
        if register is True:
            self._snomap.enable_creation()

        indent_sno = self._snomap.get_sno('indentsno')
        if register is True:
            serialnos.link_serialno(child=indent_sno, parent=self.serialno,
                                    verbose=False, session=session)

        # Create cards and deltas and so forth
        pb.next(note="Constructing Production Order Actions")
        actions = self.card_actions + self.delta_actions

        pb.next(note="Executing Production Order Actions")
        for action in actions:
            if register is False:
                action.scaffold = True
            action.set_session(session=session)
            action.commit(
                outfolder=manifestsfolder, indent_sno=indent_sno,
                prod_ord_sno=self._sno, register=register, session=session,
                pb_class=pb_class, stacked_pb=stacked_pb, leaf_pb=leaf_pb,
            )

        self._snomap.disable_creation()

        pb.next(note="Constructing Composite Output BOM")
        cobom = CompositeOutputBom(self.bomlist)

        pb.next(note="Creating Indent(s)")
        self._process_indents(
            indent_sno=indent_sno, cobom=cobom, outfolder=outfolder,
            register=register, force=force, session=session
        )

        pb.next(note="Generating Production Order Document")
        # Make production order doc
        self._last_generated_at = arrow.utcnow().isoformat()
        if self._first_generated_at is None:
            self._first_generated_at = arrow.utcnow().isoformat()
        self._dump_order_yaml(outfolder=outfolder, register=register,
                              session=session)
        self._generate_doc(outfolder=outfolder, register=register,
                           session=session)

        pb.next(note="Generating Labels")
        self.make_labels(label_manager=label_manager, pb_class=pb_class,
                         stacked_pb=stacked_pb, leaf_pb=leaf_pb)

        pb.next(note="Finalizing Production Order")
        for action in actions:
            action.scaffold = False
            action.unset_session()
        self._snomap.dump_to_file(outfolder)
        self._snomap.unset_session()

        if register is True:
            docstore.register_document(
                    serialno=self.serialno,
                    docpath=os.path.join(outfolder, 'snomap.yaml'),
                    doctype='SNO MAP', efield=self.title,
                    verbose=False, session=session
            )
        pb.finish()
        self._defined = True