Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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()
Beispiel #4
0
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
Beispiel #5
0
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)
Beispiel #6
0
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}'
Beispiel #7
0
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
Beispiel #8
0
    # 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:
Beispiel #9
0
	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
Beispiel #10
0
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(
Beispiel #11
0
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