80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from playwright.sync_api import TimeoutError as PlaywrightTimeoutError
|
|
from playwright.sync_api import sync_playwright
|
|
|
|
XLSX_DIR = Path(os.getenv('CKAL_XLSX_DIR', '/data/ckal-xlsx'))
|
|
CKAL_USERNAME = os.getenv('CKAL_USERNAME')
|
|
CKAL_PASSWORD = os.getenv('CKAL_PASSWORD')
|
|
|
|
|
|
def upload_file(xlsx_file: Path) -> None:
|
|
print(f'Verarbeite: {xlsx_file.name}', flush=True)
|
|
with sync_playwright() as p:
|
|
browser = p.chromium.launch(
|
|
headless=True,
|
|
chromium_sandbox=False,
|
|
args=['--disable-dev-shm-usage'],
|
|
)
|
|
page = browser.new_page(viewport={'width': 1400, 'height': 800})
|
|
page.on('dialog', lambda dialog: dialog.accept())
|
|
try:
|
|
page.goto(
|
|
'https://v2.ckalender.de/index.php?content=Login',
|
|
wait_until='domcontentloaded',
|
|
timeout=30000,
|
|
)
|
|
page.locator('[name="username"]').fill(CKAL_USERNAME)
|
|
page.locator('[name="password"]').fill(CKAL_PASSWORD)
|
|
page.locator('[name="password"]').press('Enter')
|
|
try:
|
|
page.wait_for_url(
|
|
lambda url: 'content=Login' not in str(url),
|
|
timeout=15000,
|
|
)
|
|
except PlaywrightTimeoutError as exc:
|
|
raise RuntimeError('CKalender-Login fehlgeschlagen.') from exc
|
|
|
|
page.goto(
|
|
'https://v2.ckalender.de/index.php?content=Admin.EventImport',
|
|
wait_until='domcontentloaded',
|
|
timeout=30000,
|
|
)
|
|
page.locator('[value="Excel"]').click()
|
|
upload = page.locator('input[type="file"]')
|
|
upload.wait_for(state='attached', timeout=15000)
|
|
upload.set_input_files(str(xlsx_file))
|
|
page.locator('[value="Append"]').click()
|
|
page.locator('[class="ui primary button"]').click()
|
|
page.wait_for_timeout(1500)
|
|
finally:
|
|
browser.close()
|
|
|
|
|
|
def main() -> int:
|
|
if not CKAL_USERNAME or not CKAL_PASSWORD:
|
|
print('FEHLER: CKAL_USERNAME/CKAL_PASSWORD fehlt.', file=sys.stderr)
|
|
return 1
|
|
|
|
XLSX_DIR.mkdir(parents=True, exist_ok=True)
|
|
files = sorted(XLSX_DIR.glob('*.xlsx'))
|
|
if not files:
|
|
print('Keine XLSX-Dateien vorhanden.', flush=True)
|
|
return 0
|
|
|
|
for xlsx_file in files:
|
|
try:
|
|
upload_file(xlsx_file)
|
|
xlsx_file.unlink()
|
|
print(f'Upload erfolgreich: {xlsx_file.name}', flush=True)
|
|
except Exception as exc:
|
|
print(f'FEHLER bei {xlsx_file.name}: {exc}', file=sys.stderr, flush=True)
|
|
return 1
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|