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
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)
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)
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 )
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 )
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 )
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 )
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))
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)
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))
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)
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)
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
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