def generate_part_number(category: str, part_pk: int) -> str: ''' Generate Internal Part Number (IPN) ''' try: ipn = str(part_pk).zfill(settings.IPN_UNIQUE_ID_LENGTH) except: return None if settings.IPN_USE_FIXED_PREFIX: prefix_id = settings.IPN_PREFIX else: CATEGORY_CODES = config_interface.load_file(settings.CONFIG_CATEGORIES)['CODES'] for key in CATEGORY_CODES.keys(): if key in category: break try: prefix_id = CATEGORY_CODES[key] except: return None if prefix_id: ipn = '-'.join([prefix_id, ipn]) if settings.IPN_USE_VARIANT_SUFFIX: ipn = '-'.join([ipn, settings.IPN_VARIANT_SUFFIX]) return ipn
def kicad_settings_window(): ''' KiCad settings window ''' kicad_user_settings = config_interface.load_file(settings.CONFIG_KICAD) KICAD_SYMBOLS_PATH = kicad_user_settings['KICAD_SYMBOLS_PATH'] KICAD_TEMPLATES_PATH = kicad_user_settings['KICAD_TEMPLATES_PATH'] KICAD_FOOTPRINTS_PATH = kicad_user_settings['KICAD_FOOTPRINTS_PATH'] kicad_layout = [ [ sg.Text('Select Symbol Libraries Folder:'), sg.InputText(KICAD_SYMBOLS_PATH, key='library'), sg.FolderBrowse(target='library', initial_folder=KICAD_SYMBOLS_PATH), ], [ sg.Text('Select Symbol Templates Folder:'), sg.InputText(KICAD_TEMPLATES_PATH, key='template'), sg.FolderBrowse(target='template', initial_folder=KICAD_TEMPLATES_PATH), ], [ sg.Text('Select Footprint Libraries Folder:'), sg.InputText(KICAD_FOOTPRINTS_PATH, key='footprint'), sg.FolderBrowse(target='footprint', initial_folder=KICAD_FOOTPRINTS_PATH), ], [ sg.Button('Save', size=(10, 1)), ], ] kicad_window = sg.Window('KiCad Settings', kicad_layout, location=(500, 500)) kcd_event, kcd_values = kicad_window.read() if kcd_event == sg.WIN_CLOSED: # if user closes window pass else: new_settings = { 'KICAD_SYMBOLS_PATH': kcd_values['library'], 'KICAD_TEMPLATES_PATH': kcd_values['template'], 'KICAD_FOOTPRINTS_PATH': kcd_values['footprint'], } for name, path in new_settings.items(): if path == '': cprint(f'[INFO]\tWarning: KiCad {name} path is empty', silent=settings.SILENT) # Check if path has trailing slash elif path[-1] != os.sep: new_settings[name] = path + os.sep # Read user settings file kicad_user_settings = {**kicad_user_settings, **new_settings} # Write to user settings file config_interface.dump_file(kicad_user_settings, settings.CONFIG_KICAD) kicad_window.close() return
def setup_environment() -> bool: if not check_environment(): # SETUP the Digikey authentication see https://developer.digikey.com/documentation/organization#production digikey_api_settings = config_interface.load_file( settings.CONFIG_DIGIKEY_API) os.environ['DIGIKEY_CLIENT_ID'] = digikey_api_settings[ 'DIGIKEY_CLIENT_ID'] os.environ['DIGIKEY_CLIENT_SECRET'] = digikey_api_settings[ 'DIGIKEY_CLIENT_SECRET'] return check_environment()
def search_api_settings_window(): ''' Part search API settings window ''' user_settings = config_interface.load_file(settings.CONFIG_DIGIKEY_API) search_api_layout = [ [ sg.Text('Enter Digi-Key API Client ID:'), sg.InputText(user_settings['DIGIKEY_CLIENT_ID'], key='client_id'), ], [ sg.Text('Enter Digi-Key API Client Secret:'), sg.InputText(user_settings['DIGIKEY_CLIENT_SECRET'], key='client_secret'), ], [ sg.Button('Test', size=(15, 1)), sg.Button('Save', size=(15, 1)), ], ] search_api_window = sg.Window('Digi-Key API (v3) Settings', search_api_layout, location=(500, 500)) while True: api_event, api_values = search_api_window.read() def save_settings(user_settings: dict): new_settings = { 'DIGIKEY_CLIENT_ID': api_values['client_id'], 'DIGIKEY_CLIENT_SECRET': api_values['client_secret'], } user_settings = {**user_settings, **new_settings} config_interface.dump_file(user_settings, settings.CONFIG_DIGIKEY_API) if api_event == sg.WIN_CLOSED: search_api_window.close() return elif api_event == 'Test': # Automatically save settings save_settings(user_settings) if digikey_api.test_digikey_api_connect(): result_message = f'Sucessfully connected to Digi-Key API' else: result_message = f'Failed to connect to Digi-Key API' sg.popup_ok(result_message, title='Digi-Key API Connect Test', location=(500, 500)) else: save_settings(user_settings) search_api_window.close() return
def load_kicad_settings(): global CONFIG_KICAD global KICAD_SYMBOLS_PATH global KICAD_TEMPLATES_PATH global KICAD_FOOTPRINTS_PATH global ENABLE_KICAD kicad_user_settings = config_interface.load_file(CONFIG_KICAD, silent=False) if kicad_user_settings: KICAD_SYMBOLS_PATH = kicad_user_settings.get('KICAD_SYMBOLS_PATH', None) KICAD_TEMPLATES_PATH = kicad_user_settings.get('KICAD_TEMPLATES_PATH', None) KICAD_FOOTPRINTS_PATH = kicad_user_settings.get('KICAD_FOOTPRINTS_PATH', None) ENABLE_KICAD = kicad_user_settings.get('KICAD_ENABLE', None)
def generate_part_number(category: str, part_pk: int) -> str: ''' Generate Internal Part Number (IPN) based on category ''' CATEGORY_CODES = config_interface.load_file( settings.CONFIG_CATEGORIES)['CODES'] for key in CATEGORY_CODES.keys(): if key in category: break try: category_id = CATEGORY_CODES[key] unique_id = str(part_pk).zfill(6) variant_id = '00' except: return None return f'{category_id}-{unique_id}-{variant_id}'
def load_from_file(search_file, test_mode=False) -> dict: ''' Fetch Digi-Key part data from file ''' cache_valid = settings.CACHE_VALID_DAYS * 24 * 3600 # Load data from file if cache enabled if settings.CACHE_ENABLED: try: part_data = config_interface.load_file(search_file) except FileNotFoundError: return None if part_data: # Check cache validity try: # Get timestamp timestamp = int(time.time() - part_data['search_timestamp']) except KeyError: timestamp = int(time.time()) if timestamp < cache_valid or test_mode: return part_data return None
# Build result success = False if (status == 'original') or (status == 'fake_alternate'): if new_part: success = True elif status == 'alternate_mpn': if not new_part: success = True else: pass return success # Load test samples samples = config_interface.load_file( os.path.abspath(os.path.join('tests', 'test_samples.yaml'))) PART_TEST_SAMPLES = {} for category in PART_CATEGORIES: PART_TEST_SAMPLES.update({category: samples[category]}) # Store results exit_code = 0 kicad_results = {} inventree_results = {} if __name__ == '__main__': if settings.ENABLE_TEST: if ENABLE_INVENTREE: pretty_test_print('\n[MAIN]\tConnecting to Inventree') inventree_connect = inventree_interface.connect_to_server() if inventree_connect:
PROJECT_DIR = os.path.abspath(os.path.dirname(sys.executable)) else: PROJECT_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # InvenTree API sys.path.append(os.path.join(PROJECT_DIR, 'database', 'inventree-python')) # Digi-Key API sys.path.append(os.path.join(PROJECT_DIR, 'search', 'digikey_api')) # KiCad Library Utils sys.path.append(os.path.join(PROJECT_DIR, 'kicad')) # Tests sys.path.append(os.path.join(PROJECT_DIR, 'tests')) # VERSION CONFIG_VERSION = os.path.join(PROJECT_DIR, 'config', 'version.yaml') version_info = config_interface.load_file(CONFIG_VERSION, silent=False) try: version = '.'.join([str(v) for v in version_info.values()]) except: version = '0.0.alpha' # CONFIG FILES CONFIG_TEMPLATES = os.path.join(PROJECT_DIR, 'config', '') CONFIG_USER_FILES = os.path.join(PROJECT_DIR, 'config', 'user_files', '') def create_user_config_files(): global CONFIG_TEMPLATES global CONFIG_USER_FILES # Create user files folder if it does not exists
import sys import config.settings as settings from common.tools import cprint from config import config_interface from database import inventree_api, inventree_interface SETUP_CATEGORIES = True SETUP_PARAMETERS = True if __name__ == '__main__': if SETUP_CATEGORIES or SETUP_PARAMETERS: cprint('\n[MAIN]\tStarting InvenTree setup', silent=settings.SILENT) # Load category configuration file categories = config_interface.load_file( settings.CONFIG_CATEGORIES)['CATEGORIES'] # cprint(categories) cprint('[MAIN]\tConnecting to Inventree', silent=settings.SILENT) inventree_connect = inventree_interface.connect_to_server() if not inventree_connect: sys.exit(-1) if SETUP_CATEGORIES: for category in categories.keys(): cprint(f'\n[MAIN]\tCreating {category.upper()}') category_pk, is_category_new = inventree_api.create_category( parent=None, name=category) if is_category_new: cprint(
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): PROJECT_DIR = os.path.abspath(os.path.dirname(sys.executable)) else: PROJECT_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # InvenTree API sys.path.append(os.path.join(PROJECT_DIR, 'database', 'inventree-python')) # Digi-Key API sys.path.append(os.path.join(PROJECT_DIR, 'search', 'digikey_api')) # KiCad Library Utils sys.path.append(os.path.join(PROJECT_DIR, 'kicad')) # Tests sys.path.append(os.path.join(PROJECT_DIR, 'tests')) # VERSION CONFIG_VERSION = os.path.join(PROJECT_DIR, 'config', 'version.yaml') version_info = config_interface.load_file(CONFIG_VERSION, silent=False) try: version = '.'.join([str(v) for v in version_info.values()]) except: version = '0.0.alpha' # CONFIG FILES CONFIG_ROOT = os.path.join(PROJECT_DIR, 'config', '') CONFIG_USER_FILES = os.path.join(PROJECT_DIR, 'config', 'user_files', '') def create_user_config_files(): global CONFIG_ROOT global CONFIG_USER_FILES # Create user files folder if it does not exists