Compare commits

...
5 Commits
Author SHA1 Message Date
Break27 123df61930 fix: clearer error reporting 2026-08-21 17:15:58 +08:00
Break27 83a3d9a10c fix: clearer error reporting 2026-08-21 17:02:06 +08:00
Break27 7d670eee21 fix: clearer error reporting 2026-08-21 16:55:06 +08:00
Break27 b682211d22 fix: crm web frontend breaking update 2026-08-21 15:55:02 +08:00
Break27 f8c0f7280e fix: indentation 2026-08-14 14:13:22 +08:00
+17 -12
View File
@@ -156,11 +156,11 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
for key, col in map(lambda k: (k, self.headers[k]), keys): for key, col in map(lambda k: (k, self.headers[k]), keys):
value = str(self.wb.active.cell(row, col).value) value = str(self.wb.active.cell(row, col).value)
self.indices.setdefault(key, dict())[value] = row self.indices.setdefault(key, dict())[value] = row
def at(self, axis: str, index) -> dict: def at(self, axis: str, index) -> dict:
if (a := self.indices.get(axis)) is None or (b := dict.get(a, index)) is None: return dict() if (a := self.indices.get(axis)) is None or (b := dict.get(a, index)) is None: return dict()
return { k: self.wb.active.cell(b, c).value for k, c in self.headers.items() } return { k: self.wb.active.cell(b, c).value for k, c in self.headers.items() }
try: try:
logger.info('Downloading product list...') logger.info('Downloading product list...')
click("header .okki-space .okki-space-item:nth-child(1) button") click("header .okki-space .okki-space-item:nth-child(1) button")
@@ -210,13 +210,12 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
@classmethod @classmethod
def perform(cls): def perform(cls):
try: spin = driver.find_elements(By.CSS_SELECTOR, ".okki-spin")
except: spin = None
if spin:
sleep(parameters['interval'])
return True
if status == Status.RUNNING: if status == Status.RUNNING:
try:
if driver.find_elements(By.CSS_SELECTOR, ".okki-spin"):
sleep(parameters['interval'])
return True
except: pass
t1.start() t1.start()
return False return False
@@ -263,6 +262,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
profile = None profile = None
progress = { 'task': '' } progress = { 'task': '' }
selection = 0 selection = 0
errors = set()
sp.add(pairs=[ (k.lower(), v) for k, v in flow ]) sp.add(pairs=[ (k.lower(), v) for k, v in flow ])
sp.set('actions', lambda: flow.capabilities()) sp.set('actions', lambda: flow.capabilities())
@@ -281,6 +281,8 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
name = options.pop('profile') name = options.pop('profile')
profile = next(filter(lambda o: o.name == name, profiles)) profile = next(filter(lambda o: o.name == name, profiles))
except (IndexError, KeyError): except (IndexError, KeyError):
logger.error('Operation failed:\n\n%s' % ', '.join(errors)) if errors else None
errors.clear()
logger.info('Done') logger.info('Done')
status = Status.READY status = Status.READY
continue continue
@@ -332,6 +334,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
if len(data) == 0: if len(data) == 0:
logger.warning('Server returned an empty response') logger.warning('Server returned an empty response')
errors.add(profile.name)
continue continue
logger.info('Initializing Workbook...') logger.info('Initializing Workbook...')
@@ -459,6 +462,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
if sheet.max_row < 2: if sheet.max_row < 2:
logger.warning("No data; skipping") logger.warning("No data; skipping")
errors.add(profile.name)
continue continue
try: try:
@@ -486,9 +490,9 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
driver.get(WEBURL % 'order/importOrder') driver.get(WEBURL % 'order/importOrder')
click(".product-import-img-box .import-img-radio:nth-child(2) .mm-radio-group > label:nth-child(2) .mm-radio-input", condition=None) click(".product-import-img-box .import-img-radio:nth-child(2) .mm-radio-group > label:nth-child(2) .mm-radio-input", condition=None)
click(".product-import-img-box .mm-selector-rendered") click(".import-order-item .okki-select")
click(".mm-outside.mm-select-dropdown ul li:nth-child(%d) span" % (1 if options.get('draft') else 6)) click(".okki-select-dropdown .rc-virtual-list-holder-inner > div:nth-child(%d)" % (1 if options.get('draft') else 6))
locate(".big-file-upload input", wait=False).send_keys(str(file)) locate(".import-order-item .big-file-upload input", wait=False).send_keys(str(file))
click(".product-import-img-footer button") click(".product-import-img-footer button")
logger.info('Done') logger.info('Done')
except Skip: except Skip:
@@ -518,7 +522,8 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
flow.react(Sleep) flow.react(Sleep)
if ok is None: if ok is None:
logger.warning('Nothing to do; skipping') logger.warning('Data import failed completely; skipping')
errors.add(profile.name)
continue continue
click(ok, condition=None) click(ok, condition=None)