Source code for tendril.dox.indent

# Copyright (C) 2015 Chintalagiri Shashank
#
# This file is part of Tendril.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
Indent Dox Module (:mod:`tendril.dox.indent`)
=============================================

This module provides functions to generate stock / inventory indents.

The functions here use the :mod:`tendril.dox.render` module to actually
produce the output files after constructing the appropriate stage.

.. seealso:: :mod:`tendril.dox`

.. rubric:: Document Generators

.. autosummary::

    gen_stock_idt_from_cobom


"""

import render
import os

import docstore
import labelmaker

from tendril.entityhub import serialnos
from tendril.utils.db import with_db
from tendril.boms.outputbase import load_cobom_from_file


[docs]def gen_stock_idt_from_cobom(outfolder, sno, title, carddict, cobom, verbose=True): """ Generates a stock indent from a :class:`tendril.boms.outputbase.CompositeOutputBom` instance. This function also adds ``IDT`` labels for all the stock / inventory items that are requested for by the indent to the :data:`tendril.dox.labelmaker.manager`, though the caller should make sure that the labels are written out after the fact. .. note:: This function does not register the document in the :mod:`tendril.dox.docstore`. You should use the output file path (returned by this function) to register the document when desired. :param outfolder: The folder within which the output PDF should be created. :type outfolder: str :param sno: The serial number of the Indent :type sno: str :param title: The title of the Indent :param carddict: Either a pre-constructed string, or a dictionary containing the list of card types included for the indent (keys) and the quantity for each (values). :type carddict: dict or str :param cobom: The composite output BOM, including the BOMs for the cards that the indent is being constructed for. :type cobom: :class:`tendril.boms.outputbase.CompositeOutputBom` :return: The output file path. .. rubric:: Template Used ``tendril\dox\\templates\indent_stock_template.tex`` (:download:`Included version <../../tendril/dox/templates/indent_stock_template.tex>`) .. rubric:: Stage Keys Provided .. list-table:: * - ``sno`` - The serial number of the indent. * - ``title`` - Whether the device is a PCB or a Cable. * - ``lines`` - List of dictionaries, each containing the ``ident`` and ``qty`` of one line in the indent. * - ``cards`` - A string listing out the various cards the indent was generated to request components for. """ outpath = os.path.join(outfolder, str(sno) + '.pdf') cards = "" if isinstance(carddict, dict): for card, qty in sorted(carddict.iteritems()): cards += card + ' x' + str(qty) + ', ' elif isinstance(carddict, str): cards = carddict indentsno = sno lines = [] for idx, line in enumerate(cobom.lines): lines.append({'ident': line.ident, 'qty': line.quantity}) stage = {'title': title, 'sno': indentsno, 'lines': lines, 'cards': cards} template = 'indent_stock_template.tex' render.render_pdf(stage, template, outpath, verbose=verbose) return outpath, indentsno
[docs]def get_all_indents_docs(limit=None, snos=None): if snos is None: return docstore.get_docs_list_for_sno_doctype( serialno=None, doctype='INVENTORY INDENT', limit=limit ) else: rval = [] for sno in snos: rval.extend(docstore.get_docs_list_for_sno_doctype( serialno=sno, doctype='INVENTORY INDENT', limit=None )) return rval
[docs]def get_all_indent_snos(limit=None): snos = docstore.controller.get_snos_by_document_doctype( doctype='INVENTORY INDENT', limit=limit ) rval = {'snos': []} for sno in snos: rval['snos'].append({'sno': sno.sno, 'efield': sno.efield}) return rval
[docs]def get_all_indent_sno_strings(limit=None): snos = docstore.controller.get_snos_by_document_doctype( doctype='INVENTORY INDENT', limit=limit ) return [x.sno for x in snos]