コード例 #1
0
def indent(indent_sno=None):
    if indent_sno is None:
        docs = dxindent.get_all_indents_docs()
        stage = {
            'docs':
            docs,
            'crumbroot':
            '/inventory',
            'breadcrumbs': [
                Crumb(name="Inventory", path=""),
                Crumb(name="Indent", path="indent/")
            ],
        }
        return render_template('indent.html',
                               stage=stage,
                               pagetitle="All Indents")
    else:
        indent_obj = InventoryIndent(indent_sno)
        stage = {
            'indent':
            indent_obj,
            'crumbroot':
            '/inventory',
            'breadcrumbs': [
                Crumb(name="Inventory", path=""),
                Crumb(name="Indent", path="indent/"),
                Crumb(name=indent_sno, path="indent/" + indent_sno)
            ],  # noqa
        }
        return render_template('indent_detail.html',
                               stage=stage,
                               pagetitle="Stock Indent " + indent_sno)
コード例 #2
0
ファイル: forms.py プロジェクト: chintal/tendril
    def _setup_for_supplementary(self):
        if self.parent_indent_sno_str is None:
            self.is_supplementary = False
        else:
            self.is_supplementary = True
            parent_indent = InventoryIndent(self.parent_indent_sno_str)
            prod_ord_sno_str = parent_indent.prod_order_sno
            if len(parent_indent.root_order_snos):
                root_ord_sno_str = parent_indent.root_order_snos[0]
            else:
                root_ord_sno_str = None

            parent_indent_title = parent_indent.title

            self.indent_title.data = "Supplement to " + \
                                     self.parent_indent_sno_str

            if not self.prod_order_sno.data:
                self.prod_order_sno.data = prod_ord_sno_str
            read_only(self.prod_order_sno)

            if not self.root_order_sno.data:
                self.root_order_sno.data = root_ord_sno_str
            read_only(self.root_order_sno)

            if not self.parent_indent_sno.data:
                self.parent_indent_sno.data = self.parent_indent_sno_str

        read_only(self.parent_indent_sno)
コード例 #3
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)
コード例 #4
0
ファイル: forms.py プロジェクト: chintal/tendril
 def get_supplementary_sno_default(self):
     parent_indent = InventoryIndent(self.parent_indent_sno_str)
     sindents = parent_indent.supplementary_indent_snos
     if len(sindents):
         sidx = str(max([int(x.split('.')[1]) for x in sindents]) + 1)
     else:
         sidx = '1'
     serialno_str = '.'.join([self.parent_indent_sno_str, sidx])
     return serialno_str
コード例 #5
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)
コード例 #6
0
ファイル: order.py プロジェクト: chintal/tendril
 def _process_indents(self, indent_sno=None, cobom=None, outfolder=None,
                      register=False, force=False, session=None):
     # Assume Indent is non-empty.
     # Create 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)
コード例 #7
0
ファイル: forms.py プロジェクト: chintal/tendril
 def __init__(self, auth_roles=None, admin_roles=None,
              parent_indent_sno=None, *args, **kwargs):
     if auth_roles is not None:
         self.auth_roles = auth_roles
     else:
         self.auth_roles = ['exec']
     if admin_roles is not None:
         self.admin_roles = admin_roles
     else:
         self.admin_roles = ['inventory_admin']
     if parent_indent_sno is not None:
         parent_indent = InventoryIndent(parent_indent_sno)
         self.parent_indent_sno_str = parent_indent.root_indent_sno
     else:
         self.parent_indent_sno_str = None
     super(CreateIndentForm, self).__init__(*args, **kwargs)
     self._setup_secure_fields()
     self._setup_for_supplementary()
     self._setup_sno_fields()
コード例 #8
0
ファイル: order.py プロジェクト: chintal/tendril
 def indents(self):
     if self._indents is None:
         from tendril.inventory.indent import InventoryIndent
         return [InventoryIndent(x) for x in self.indent_snos]
     else:
         return self._indents
コード例 #9
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)
コード例 #10
0
ファイル: order.py プロジェクト: SayCV/tendril
    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
コード例 #11
0
ファイル: order.py プロジェクト: chintal/tendril
    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
コード例 #12
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)