aboutsummaryrefslogtreecommitdiff
path: root/src/ee/order/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ee/order/__init__.py')
-rw-r--r--src/ee/order/__init__.py81
1 files changed, 47 insertions, 34 deletions
diff --git a/src/ee/order/__init__.py b/src/ee/order/__init__.py
index 5350667..56d233f 100644
--- a/src/ee/order/__init__.py
+++ b/src/ee/order/__init__.py
@@ -2,6 +2,7 @@ from functools import total_ordering
from pathlib import Path
from typing import List, Tuple
+from ee import EeException
from ee.part import PartDb, load_db, save_db
from ee.xml import types, bom_file_utils
@@ -12,12 +13,17 @@ __all__ = ["create_order"]
class PartInfo(object):
def __init__(self, part: types.Part):
self.part = part
- self.id = part.id
- self.pn = bom_file_utils.find_pn(part)
+ self.ref = next((ref.referenceProp for ref in bom_file_utils.schematic_references(part)), None)
+ self.pn = next((p.valueProp for p in bom_file_utils.part_numbers(part)), None)
self.available_from: List[Tuple[str, types.Part]] = []
+ rl = part.referencesProp = part.referencesProp or types.ReferencesList() # type: types.ReferencesList
+ rl.schematic_referenceProp = rl.schematic_referenceProp or []
+ rl.part_numberProp = rl.part_numberProp or []
+ rl.supplier_part_numberProp = rl.supplier_part_numberProp or []
+
def __lt__(self, other: "PartInfo"):
- return self.part.idProp == other.part.idProp
+ return self.ref == other.ref
def create_order(schematic_path: Path, out_path: Path, part_db_dirs: List[Path], fail_on_missing_parts: bool):
@@ -30,28 +36,41 @@ def create_order(schematic_path: Path, out_path: Path, part_db_dirs: List[Path],
infos = [PartInfo(sch) for sch in sch_db.iterparts()]
for info in infos:
- print("Resolving {}".format(info.id))
-
- for distributor, db in dbs:
- for p in db.iterparts(sort=True):
- if info.pn:
- p_pn: str = bom_file_utils.find_pn(p)
-
- if info.pn == p_pn:
- info.available_from.append((distributor, p))
-
- for sch_pn_ in bom_file_utils.part_numbers(info.part):
- sch_pn: types.PartNumber = sch_pn_
-
- for p_pn_ in bom_file_utils.part_numbers(p):
- p_pn: types.PartNumber = p_pn_
-
- if sch_pn.distributorProp == p_pn.distributorProp and sch_pn.value == p_pn.value:
- if p.idProp not in info.available_from:
- info.available_from.append((distributor, p))
+ print("Resolving {}".format(info.ref))
+
+ sch_part_numbers = info.part.referencesProp.part_number
+ sch_supplier_part_numbers: List[types.SupplierPartNumber] = info.part.referencesProp.supplier_part_number
+
+ for supplier, db in dbs:
+ for supplier_part in db.iterparts(sort=True):
+ found = None
+ for sch_pn in sch_part_numbers:
+ for pn in bom_file_utils.part_numbers(supplier_part):
+ if sch_pn.valueProp == pn.valueProp:
+ found = supplier_part
+ break
+ if found:
+ break
+
+ if found:
+ info.available_from.append((supplier, found))
+ break
+
+ found = None
+ for sch_spn in sch_supplier_part_numbers:
+ for spn in bom_file_utils.supplier_part_numbers(supplier_part):
+ if sch_spn.valueProp == spn.valueProp and sch_spn.supplierProp == spn.supplierProp:
+ found = supplier_part
+ break
+ if found:
+ break
+
+ if found:
+ info.available_from.append((supplier, found))
+ break
for info in infos:
- print("Resolved {} to {}".format(info.id, info.available_from))
+ print("Resolved {} to {}".format(info.ref, info.available_from))
warnings = []
has_missing_parts = False
@@ -59,28 +78,22 @@ def create_order(schematic_path: Path, out_path: Path, part_db_dirs: List[Path],
if len(info.available_from) == 0:
has_missing_parts = True
warnings.append("Could not find {} in any database, part numbers: {}".
- format(info.id, ", ".join([p.value for p in bom_file_utils.part_numbers(info.part)])))
+ format(info.ref, ", ".join([p.value for p in bom_file_utils.part_numbers(info.part)])))
for w in sorted(warnings):
print(w)
if has_missing_parts and fail_on_missing_parts:
- print("has missing parts")
- return False
+ raise EeException("The order has parts that can't be found from any supplier")
for info in infos:
- part = types.Part(id=info.part.id,
- schema_reference=info.part.schema_reference,
- part_numbers=types.PartNumberList())
-
- part_numbers = part.part_numbersProp.part_number
-
if len(info.available_from) == 0:
continue
- distributor, distributor_part = info.available_from[0]
+ supplier, supplier_part = info.available_from[0]
- part_numbers.append(types.PartNumber(value=distributor_part.id, distributor=distributor))
+ references = types.ReferencesList(schematic_reference=info.part.referencesProp.schematic_reference)
+ part = types.Part(uri=supplier_part.uri, references=references)
out_parts.add_entry(part, True)