This commit is contained in:
2026-04-12 10:21:36 +02:00
parent d04e02020c
commit 63bd1e73f2
7 changed files with 366 additions and 59 deletions

View File

@@ -154,3 +154,35 @@
{"ts":"2026-04-11T23:34:24Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop\",\"description\":\"Check if Photoshop is running\"},\"tool_response\":{\"stdout\":\"Binary file (standard input) matches\"","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-11T23:34:35Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_wzor6.py --imie_zenskie \"Agnieszka\" --imie_meskie \"Kamil\" --data \"05.07.2026\" --klient \"Oliwia Kiełb\"\",\","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-11T23:34:42Z","tool":"Bash","cmd":"\"C:/xampp/mysql/bin/mysql.exe\" --default-character-set=utf8mb4 -h host700513.hostido.net.pl -P 3306 -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' host700513_orderpro -e \"UPDATE order_items SET pr","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:02:36Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -i photoshop; ls \"d:/pomysloweprezenty.pl/projekty/ślub - buteleczki/Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - W","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:02:43Z","tool":"Bash","cmd":"tasklist //FI \"IMAGENAME eq Photoshop.exe\" 2>/dev/null | grep -ic photoshop\",\"description\":\"Count Photoshop processes\"},\"tool_response\":{\"stdout\":\"0\",\"stderr\":\"\",\"interrupted\":false","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:03:02Z","tool":"Bash","cmd":"powershell -Command \"Start-Process 'C:\\\\Program Files\\\\Adobe\\\\Adobe Photoshop 2026\\\\Photoshop.exe'\"\",\"description\":\"Start Photoshop 2026\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:03:16Z","tool":"Bash","cmd":"powershell -Command \"Start-Sleep -Seconds 8; (Get-Process Photoshop -ErrorAction SilentlyContinue).Count\"\",\"description\":\"Wait for Photoshop\"},\"tool_response\":{\"stdout\":\"1\",\"stderr\":\"\","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:03:33Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_explore_tmp.py","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:03:49Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/_explore_tmp.py 2>&1\",\"description\":\"Explore PSD structure\"},\"tool_response\":{\"stdout\":\"=== TOP LEVEL ===\\r\\nart:","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:05:11Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_rename_tmp.py","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:05:20Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/_rename_tmp.py 2>&1\",\"description\":\"Rename layers in PSD\"},\"tool_response\":{\"stdout\":\"OK: Dzi<7A>kujemy! -> naglowek","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:05:57Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor4.py","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:06:09Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Ania\" --imie_meskie \"Piotr\" --data \"15.08.2026\" --klient \"TEST Ania Piotr\" 2","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:06:15Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_explore_tmp.py\" \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_rename_tmp.py\"\",\"description\":\"Remove temp files\"},\","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:07:03Z","tool":"Bash","cmd":"mysql -h host700513.hostido.net.pl -u host700513_orderpro -p'hrDNtUBg9grwZ7syN77S' host700513_orderpro -e \"SELECT id, product_name_pattern, script_name, output_dir, is_active FROM project_mappings;\"","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:07:11Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro','","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:07:20Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro','","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:07:55Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ProjectMappingController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:07:59Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ProjectMappingController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:08:03Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ProjectMappingController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:09:07Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\n\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:11:28Z","tool":"Bash","cmd":"powershell -Command \"(Get-Process Photoshop -ErrorAction SilentlyContinue).Count\"\",\"description\":\"Check Photoshop\"},\"tool_response\":{\"stdout\":\"1\",\"stderr\":\"\",\"interrupted\":false,\"i","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:11:39Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Weronika\" --imie_meskie \"Martin\" --data \"04.06.2026\" --klient \"Martin Chiniew","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:11:47Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Marta\" --imie_meskie \"Bartosz\" --data \"18.09.2026\" --klient \"Marta Jankowska\","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:12:00Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Adrianna\" --imie_meskie \"Adam\" --data \"18.07.2026\" --klient \"Adrianna Bujnows","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:14:04Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor4.py","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:14:14Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Weronika\" --imie_meskie \"Martin\" --data \"04.06.2026\" --klient \"Martin Chiniew","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:14:24Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Marta\" --imie_meskie \"Bartosz\" --data \"18.09.2026\" --klient \"Marta Jankowska\","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:14:35Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Adrianna\" --imie_meskie \"Adam\" --data \"18.07.2026\" --klient \"Adrianna Bujnows","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:15:37Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\_debug_tmp.py","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:15:43Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/_debug_tmp.py 2>&1\",\"description\":\"Debug text layers\"},\"tool_response\":{\"stdout\":\"naglowek: just=2 (type=Justificat","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:16:15Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\tools\\\\generowanie\\\\buteleczki_slub_wzor4.py","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:16:40Z","tool":"Bash","cmd":"rm \"C:/visual studio code/projekty/orderPRO/tools/generowanie/_debug_tmp.py\" && cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"W","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:16:55Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && python tools/generowanie/buteleczki_slub_wzor4.py --imie_zenskie \"Adrianna\" --imie_meskie \"Adam\" --data \"18.07.2026\" --klient \"Adrianna Bujnows","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-12T08:17:37Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && \"C:/xampp/php/php.exe\" -r \"\\\\$p=new PDO('mysql:host=host700513.hostido.net.pl;dbname=host700513_orderpro;charset=utf8mb4','host700513_orderpro','","cwd":"/c/visual studio code/projekty/orderPRO"}

View File

@@ -46,8 +46,8 @@
},
"deploy_and_seed_orders.php": {
"type": "-",
"size": 34248,
"lmtime": 1772497088256,
"size": 34227,
"lmtime": 1775948066807,
"modified": false
},
"fill_order_item_images.php": {
@@ -76,8 +76,8 @@
},
"randomize_order_statuses.php": {
"type": "-",
"size": 3646,
"lmtime": 1772497235553,
"size": 3625,
"lmtime": 1775948065835,
"modified": false
},
"reissue_receipt.php": {
@@ -657,8 +657,8 @@
},
"20260314_000048_add_orders_performance_indexes.sql": {
"type": "-",
"size": 488,
"lmtime": 0,
"size": 453,
"lmtime": 1775948067454,
"modified": false
},
"20260314_000049_add_cron_last_run_at_setting.sql": {
@@ -834,6 +834,18 @@
"size": 83,
"lmtime": 1775815203659,
"modified": false
},
"20260412_000097_add_project_generation.sql": {
"type": "-",
"size": 822,
"lmtime": 1775946976581,
"modified": false
},
"20260412_000098_rename_external_status_id_to_status_code.sql": {
"type": "-",
"size": 244,
"lmtime": 1775948020015,
"modified": false
}
},
"seeders": {},
@@ -846,8 +858,8 @@
},
"20260302_orders_schema_v1.sql": {
"type": "-",
"size": 10866,
"lmtime": 1772494371620,
"size": 10852,
"lmtime": 1775948101062,
"modified": false
}
}
@@ -855,15 +867,15 @@
"DOCS": {
"ARCHITECTURE.md": {
"type": "-",
"size": 43763,
"lmtime": 1775559230614,
"size": 43749,
"lmtime": 1775948079266,
"modified": false
},
"DB_SCHEMA.md": {
"type": "-",
"size": 34569,
"lmtime": 1775316434590,
"modified": true
"size": 34555,
"lmtime": 1775948078122,
"modified": false
},
"ORDERS_SCHEMA_APILO_DRAFT.md": {
"type": "-",
@@ -885,8 +897,8 @@
},
"TECH_CHANGELOG.md": {
"type": "-",
"size": 82529,
"lmtime": 1775559241970,
"size": 82480,
"lmtime": 1775948079928,
"modified": false
}
},
@@ -2177,8 +2189,8 @@
"css": {
"app.css": {
"type": "-",
"size": 65359,
"lmtime": 1775819628149,
"size": 66847,
"lmtime": 1775950421440,
"modified": false
},
"app.css.map": {
@@ -2213,8 +2225,8 @@
"modules": {
"automation-form.js": {
"type": "-",
"size": 10533,
"lmtime": 1774909546633,
"size": 11257,
"lmtime": 1775944356011,
"modified": false
},
"global-search.js": {
@@ -2256,8 +2268,8 @@
"lang": {
"pl.php": {
"type": "-",
"size": 64489,
"lmtime": 1775817352765,
"size": 66282,
"lmtime": 1775947168859,
"modified": false
}
},
@@ -2304,8 +2316,8 @@
},
"app.scss": {
"type": "-",
"size": 47641,
"lmtime": 1775816862771,
"size": 47675,
"lmtime": 1775947092385,
"modified": false
},
"components": {
@@ -2377,6 +2389,12 @@
"lmtime": 1774474924746,
"modified": false
},
"_project-mappings.scss": {
"type": "-",
"size": 1499,
"lmtime": 1775950390953,
"modified": false
},
"_shipment-presets.scss": {
"type": "-",
"size": 2649,
@@ -2406,8 +2424,8 @@
"automation": {
"form.php": {
"type": "-",
"size": 17578,
"lmtime": 1775590767323,
"size": 18591,
"lmtime": 1775944371795,
"modified": false
},
"index.php": {
@@ -2442,8 +2460,8 @@
"layouts": {
"app.php": {
"type": "-",
"size": 12097,
"lmtime": 1775561821328,
"size": 12344,
"lmtime": 1775947105507,
"modified": false
},
"auth.php": {
@@ -2514,8 +2532,8 @@
},
"show.php": {
"type": "-",
"size": 54539,
"lmtime": 1775729335385,
"size": 54991,
"lmtime": 1775948492570,
"modified": false
}
},
@@ -2662,6 +2680,12 @@
"lmtime": 1772395769190,
"modified": true
},
"project-mappings.php": {
"type": "-",
"size": 8237,
"lmtime": 1775950413842,
"modified": false
},
"shoppro.php": {
"type": "-",
"size": 47160,
@@ -2704,8 +2728,8 @@
"routes": {
"web.php": {
"type": "-",
"size": 29359,
"lmtime": 1775816738226,
"size": 30318,
"lmtime": 1775947124874,
"modified": false
}
},
@@ -2942,8 +2966,8 @@
"Automation": {
"AutomationController.php": {
"type": "-",
"size": 23909,
"lmtime": 1775590757613,
"size": 25030,
"lmtime": 1775944243152,
"modified": false
},
"AutomationExecutionLogRepository.php": {
@@ -2960,14 +2984,14 @@
},
"AutomationService.php": {
"type": "-",
"size": 24938,
"lmtime": 1775245766985,
"size": 27091,
"lmtime": 1775948050415,
"modified": false
},
"OrderStatusAgedService.php": {
"type": "-",
"size": 5040,
"lmtime": 1774909434600,
"size": 5005,
"lmtime": 1775948049470,
"modified": false
}
},
@@ -3138,8 +3162,8 @@
"Orders": {
"OrderImportRepository.php": {
"type": "-",
"size": 19963,
"lmtime": 1775675692146,
"size": 19907,
"lmtime": 1775948047071,
"modified": false
},
"OrderImportService.php": {
@@ -3150,14 +3174,14 @@
},
"OrdersController.php": {
"type": "-",
"size": 44151,
"lmtime": 1775819210756,
"size": 45567,
"lmtime": 1775948470375,
"modified": false
},
"OrdersRepository.php": {
"type": "-",
"size": 41609,
"lmtime": 1775593939687,
"size": 41935,
"lmtime": 1775948577940,
"modified": false
},
"OrderStatusSyncService.php": {
@@ -3308,8 +3332,8 @@
},
"AllegroOrderImportService.php": {
"type": "-",
"size": 32746,
"lmtime": 1775684128009,
"size": 32739,
"lmtime": 1775948051353,
"modified": false
},
"AllegroOrdersSyncService.php": {
@@ -3350,9 +3374,9 @@
},
"AllegroStatusSyncService.php": {
"type": "-",
"size": 10850,
"lmtime": 1774474635936,
"modified": true
"size": 10822,
"lmtime": 1775948052282,
"modified": false
},
"AllegroTokenManager.php": {
"type": "-",
@@ -3492,6 +3516,18 @@
"lmtime": 1774474891200,
"modified": false
},
"ProjectMappingController.php": {
"type": "-",
"size": 5761,
"lmtime": 1775947286124,
"modified": false
},
"ProjectMappingRepository.php": {
"type": "-",
"size": 2452,
"lmtime": 1775947027939,
"modified": false
},
"ReceiptConfigController.php": {
"type": "-",
"size": 5259,
@@ -3542,8 +3578,8 @@
},
"ShopproOrderMapper.php": {
"type": "-",
"size": 40088,
"lmtime": 1775675670687,
"size": 40081,
"lmtime": 1775948055355,
"modified": false
},
"ShopproOrdersSyncService.php": {
@@ -3560,8 +3596,8 @@
},
"ShopproPaymentStatusSyncService.php": {
"type": "-",
"size": 14390,
"lmtime": 1774905506000,
"size": 14376,
"lmtime": 1775948054635,
"modified": false
},
"ShopproProductImageResolver.php": {
@@ -3584,8 +3620,8 @@
},
"ShopproStatusSyncService.php": {
"type": "-",
"size": 9585,
"lmtime": 1774611928171,
"size": 9557,
"lmtime": 1775948053805,
"modified": false
}
},
@@ -5597,9 +5633,9 @@
"tools": {
"apaczka_probe_order.php": {
"type": "-",
"size": 16169,
"size": 16643,
"lmtime": 1773006858881,
"modified": false
"modified": true
},
"debug_inspect_shoppro_payload.php": {
"type": "-",
@@ -5643,6 +5679,60 @@
"lmtime": 1772995312041,
"modified": false
},
"komunia_blanki_CMYK.tiff": {
"type": "-",
"size": 4117074,
"lmtime": 0,
"modified": false
},
"krita_komunia_template.py": {
"type": "-",
"size": 7065,
"lmtime": 0,
"modified": false
},
"ps3A5F.tmp": {
"type": "-",
"size": 12738987,
"lmtime": 0,
"modified": false
},
"ps41B1.tmp": {
"type": "-",
"size": 12415665,
"lmtime": 0,
"modified": false
},
"ps46F3.tmp": {
"type": "-",
"size": 0,
"lmtime": 0,
"modified": false
},
"ps6925.tmp": {
"type": "-",
"size": 12415621,
"lmtime": 0,
"modified": false
},
"ps7EB2.tmp": {
"type": "-",
"size": 0,
"lmtime": 0,
"modified": false
},
"ps84AA.tmp": {
"type": "-",
"size": 12415613,
"lmtime": 0,
"modified": false
},
"ps91CA.tmp": {
"type": "-",
"size": 0,
"lmtime": 0,
"modified": false
},
"psd_personalize.py": {
"type": "-",
"size": 42084,
@@ -5756,6 +5846,32 @@
"size": 2590,
"lmtime": 1773006737809,
"modified": false
},
"generowanie": {
"buteleczki_wzor1.py": {
"type": "-",
"size": 4723,
"lmtime": 1775946288094,
"modified": false
},
"buteleczki_wzor6.py": {
"type": "-",
"size": 4841,
"lmtime": 1775950147593,
"modified": false
},
"buteleczki_wzor8.py": {
"type": "-",
"size": 5265,
"lmtime": 1775949133934,
"modified": false
},
"tmp_mapping.sql": {
"type": "-",
"size": 225,
"lmtime": 1775950247575,
"modified": false
}
}
},
"vendor": {

View File

@@ -84,7 +84,7 @@ final class ProjectMappingController
return Response::redirect('/settings/project-mappings');
}
$id = (int) $request->param('id', '0');
$id = (int) $request->input('id', '0');
$pattern = trim((string) $request->input('product_name_pattern', ''));
$scriptName = trim((string) $request->input('script_name', ''));
$outputDir = trim((string) $request->input('output_dir', ''));
@@ -111,7 +111,7 @@ final class ProjectMappingController
return Response::redirect('/settings/project-mappings');
}
$id = (int) $request->param('id', '0');
$id = (int) $request->input('id', '0');
if ($id > 0) {
$this->repository->delete($id);
Flash::set('settings_success', $this->translator->get('settings.project_mapping.flash.deleted'));
@@ -127,7 +127,7 @@ final class ProjectMappingController
return Response::redirect('/settings/project-mappings');
}
$id = (int) $request->param('id', '0');
$id = (int) $request->input('id', '0');
if ($id > 0) {
$this->repository->toggleActive($id);
Flash::set('settings_success', $this->translator->get('settings.project_mapping.flash.toggled'));

View File

@@ -0,0 +1,159 @@
"""
Generator PSD - Podziekowanie dla gosci weselnych (buteleczka, Wzor 4).
Otwiera szablon PSD, podmienia teksty w Smart Object (linkowane 8 kopii)
z zachowaniem pozycji warstw, zapisuje jako nowy PSD w folderze _gotowe.
Wymaga: uruchomiony Adobe Photoshop, pakiet photoshop-python-api.
Uzycie:
python buteleczki_slub_wzor4.py --imie_zenskie "Kasia" --imie_meskie "Mateusz" \
--data "04.07.2026" --klient "Kasia Nowak"
python buteleczki_slub_wzor4.py --imie_zenskie "Kasia" --imie_meskie "Mateusz" \
--data "04.07.2026" --naglowek "Dziekujemy!" --klient "Kasia Nowak"
"""
import argparse
import os
import photoshop.api as ps
# --- Sciezki ---
PROJEKT_DIR = os.path.join(
r"d:\pomysloweprezenty.pl\projekty\ślub - buteleczki",
"Podziękowanie dla gości weselnych buteleczka z nadrukiem UV - Wzór 4",
)
SZABLON_PATH = os.path.join(PROJEKT_DIR, "szablon 370x300.psd")
GOTOWE_DIR = os.path.join(PROJEKT_DIR, "_gotowe")
# Szablon ma 8 linkowanych kopii Smart Object (Warstwa 2 + Warstwa 2 kopia..kopia 7).
# Wystarczy edytowac jeden - zmiany propaguja sie na wszystkie.
SMART_OBJECT_LAYER = "Warstwa 2 kopia"
def open_smart_object(app):
"""Otwiera zawartosc aktywnej warstwy Smart Object do edycji."""
desc = ps.ActionDescriptor()
ref = ps.ActionReference()
ref.putEnumerated(
app.stringIDToTypeID("layer"),
app.stringIDToTypeID("ordinal"),
app.stringIDToTypeID("targetEnum"),
)
desc.putReference(app.stringIDToTypeID("null"), ref)
app.executeAction(app.stringIDToTypeID("placedLayerEditContents"), desc)
def change_text_preserve_position(layer, new_text):
"""Zmienia tekst warstwy z zachowaniem jej oryginalnej pozycji.
Uwzglednia justowanie:
- center: zachowuje srodek poziomy
- right: zachowuje prawa krawedz
- left (lub inne): zachowuje lewa krawedz
W pionie zawsze zachowuje gora (pierwsza linia bazowa).
"""
bounds_before = [float(b) for b in layer.bounds]
try:
just_int = int(layer.textItem.justification)
except Exception:
just_int = 1 # Left
layer.textItem.contents = new_text
bounds_after = [float(b) for b in layer.bounds]
# Photoshop Justification enum: 1=Left, 2=Center, 3=Right
if just_int == 2:
cx_before = (bounds_before[0] + bounds_before[2]) / 2
cx_after = (bounds_after[0] + bounds_after[2]) / 2
dx = cx_before - cx_after
elif just_int == 3:
dx = bounds_before[2] - bounds_after[2]
else:
dx = bounds_before[0] - bounds_after[0]
dy = bounds_before[1] - bounds_after[1]
if dx != 0 or dy != 0:
layer.translate(dx, dy)
def generate(imie_zenskie, imie_meskie, data, klient, naglowek=None):
"""Generuje PSD z podmienionymi danymi."""
os.makedirs(GOTOWE_DIR, exist_ok=True)
output_path = os.path.join(GOTOWE_DIR, f"{klient}.psd")
app = ps.Application()
doc = app.open(SZABLON_PATH)
print(f"Otwarto szablon: {doc.name}")
# Znajdz Smart Object (dowolna kopia - sa linkowane)
for layer in doc.layers:
if layer.name == SMART_OBJECT_LAYER:
app.activeDocument.activeLayer = layer
break
else:
doc.close(ps.SaveOptions.DoNotSaveChanges)
raise RuntimeError(f"Nie znaleziono warstwy '{SMART_OBJECT_LAYER}'")
open_smart_object(app)
so_doc = app.activeDocument
# Nawiguj do grupy Tekst (zawiera wszystkie warstwy tekstowe)
tekst_group = so_doc.layerSets["Tekst"]
# Podmiana tekstow
replacements = {
"imie_zenskie": imie_zenskie,
"imie_meskie": imie_meskie,
"data": data,
}
if naglowek is not None:
replacements["naglowek"] = naglowek
for layer_name, new_text in replacements.items():
layer = tekst_group.artLayers[layer_name]
old_text = layer.textItem.contents
change_text_preserve_position(layer, new_text)
print(f' {layer_name}: "{old_text}" -> "{new_text}"')
# Zapisz Smart Object (propaguje sie na wszystkie 8 kopii)
so_doc.save()
so_doc.close()
print("Smart Object zapisany")
# Zapisz jako nowy PSD
psd_opts = ps.PhotoshopSaveOptions()
app.activeDocument.saveAs(output_path, psd_opts, True)
print(f"Zapisano: {output_path}")
# Zamknij oryginal bez zapisu
app.activeDocument.close(ps.SaveOptions.DoNotSaveChanges)
print("Gotowe!")
return output_path
def main():
parser = argparse.ArgumentParser(
description="Generator PSD - buteleczki weselne Wzor 4"
)
parser.add_argument("--imie_zenskie", required=True, help="Imie zenskie (np. Kasia)")
parser.add_argument("--imie_meskie", required=True, help="Imie meskie (np. Mateusz)")
parser.add_argument("--data", required=True, help="Data uroczystosci (np. 04.07.2026)")
parser.add_argument("--klient", required=True, help="Imie i nazwisko klienta (nazwa pliku wyjsciowego)")
parser.add_argument("--naglowek", default=None, help="Tekst naglowka (domyslnie: oryginalny z szablonu)")
args = parser.parse_args()
generate(
imie_zenskie=args.imie_zenskie,
imie_meskie=args.imie_meskie,
data=args.data,
klient=args.klient,
naglowek=args.naglowek,
)
if __name__ == "__main__":
main()