Source code for tendril.sourcing.map

#!/usr/bin/env python
# encoding: utf-8

# Copyright (C) 2016 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/>.

"""
Docstring for map
"""

import os
import csv
import six
from future.utils import iteritems

from tendril.gedaif import gsymlib

from . import vendors
from .electronics import vendor_list

from .db import controller

from tendril.entityhub import projects
from tendril.utils.db import get_session
from tendril.utils import fsutils
from tendril.utils import config
from tendril.utils.terminal import TendrilProgressBar

from tendril.utils import log
logger = log.get_logger(__name__, log.INFO)


[docs]def gen_mapfile(vendor, idents, maxage=-1): pb = TendrilProgressBar(max=len(idents)) vendor_obj = controller.get_vendor(name=vendor.cname) for ident in idents: pb.next(note=ident) vpnos, strategy = vendor.search_vpnos(ident) if vpnos is not None: # pb.writeln("Found: {0}\n".format(ident)) avpnos = vpnos else: if strategy not in ['NODEVICE', 'NOVALUE', 'NOT_IMPL']: pb.writeln("Not Found: {0:40}::{1}\n".format(ident, strategy)) avpnos = [] with get_session() as session: # pb.writeln("{0:25} {1}\n".format(ident, avpnos)) controller.set_strategy(vendor=vendor_obj, ident=ident, strategy=strategy, session=session) controller.set_amap_vpnos(vendor=vendor_obj, ident=ident, vpnos=avpnos, session=session) pb.finish() vendor.map._dump_mapfile()
[docs]def gen_vendor_mapfile(vendor_obj, maxage=-1): """ :type vendor_obj: sourcing.vendors.VendorBase """ if isinstance(vendor_obj, int): vendor_obj = vendor_list[vendor_obj] if 'electronics' == vendor_obj.pclass: logger.info('Generating electronics mapfile for ' + vendor_obj.name) symlib = gsymlib.gen_symlib() symlib.sort(key=lambda x: x.ident) idents = [] for symbol in symlib: if symbol.ident.strip() != "": idents.append(symbol.ident) gen_mapfile(vendor_obj, idents, maxage) logger.info("Done Generating Electronics Vendor Map : " + vendor_obj.name) elif 'electronics_pcb' == vendor_obj.pclass: logger.info('Generating PCB mapfile for ' + vendor_obj.name) pcblib = projects.pcbs idents = [] for pcb, folder in iteritems(pcblib): idents.append(pcb) gen_mapfile(vendor_obj, idents, maxage) logger.info("Done Generating PCB Vendor Map File : " + vendor_obj.name) else: logger.warning('Vendor pclass is not recognized. Not generating map.') return
[docs]def export_vendor_map_audit(vendor_obj, max_age=-1): if isinstance(vendor_obj, int): vendor_obj = vendor_list[vendor_obj] mapobj = vendor_obj.map outp = os.path.join(config.VENDOR_MAP_AUDIT_FOLDER, vendor_obj.name + '-electronics-audit.csv') outf = fsutils.VersionedOutputFile(outp) outw = csv.writer(outf) total = mapobj.length() pb = TendrilProgressBar(max=total) for ident in mapobj.get_idents(): for vpno in mapobj.get_all_partnos(ident): try: vp = vendor_obj.get_vpart(vpno, ident, max_age) except vendors.VendorPartRetrievalError: logger.error( "Permanent Retrieval Error while getting part {0} from " "{1}. Removing from Map.".format(vpno, vendor_obj.name) ) mapobj.remove_apartno(vpno, ident) continue except: logger.error("Unhandled Error while getting part {0} from {1}" "".format(vpno, vendor_obj.name)) raise if isinstance(vp, vendors.VendorElnPartBase): row = [vp.ident, vp.vpno, vp.mpartno, vp.package, vp.vpartdesc, vp.manufacturer, vp.vqtyavail, vp.abs_moq] else: row = [vp.ident, vp.vpno, vp.mpartno, None, vp.vpartdesc, vp.manufacturer, vp.vqtyavail, vp.abs_moq] outw.writerow([six.text_type(s).encode("utf-8") for s in row]) pb.next(note=':'.join([ident, vpno])) # "\n%f%% %s;%s\nGenerating Vendor Map Audit" % ( # percentage, ident, vpno pb.finish() outf.close() logger.info("Written Vendor Map Audit to File : " + vendor_obj.name)