From ff2c2300bb1932208214eff4d819ddacaa6c67ae Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Wed, 13 Aug 2025 17:19:26 -0500 Subject: [PATCH] immplmented Celery for future task management --- __pycache__/celery_worker.cpython-312.pyc | Bin 0 -> 1777 bytes __pycache__/celery_worker.cpython-313.pyc | Bin 0 -> 1817 bytes __pycache__/webserver.cpython-312.pyc | Bin 9329 -> 8087 bytes __pycache__/webserver.cpython-313.pyc | Bin 7291 -> 8040 bytes celery_worker.py | 30 +++++++++ celerybeat-schedule | Bin 0 -> 12288 bytes celerybeat-schedule-shm | Bin 0 -> 32768 bytes celerybeat-schedule-wal | Bin 0 -> 304912 bytes logs/database.log | 71 +++++++++++++++++++++- run-server.bat | 9 +++ webserver.py | 66 +++++++++++--------- 11 files changed, 145 insertions(+), 31 deletions(-) create mode 100644 __pycache__/celery_worker.cpython-312.pyc create mode 100644 __pycache__/celery_worker.cpython-313.pyc create mode 100644 celery_worker.py create mode 100644 celerybeat-schedule create mode 100644 celerybeat-schedule-shm create mode 100644 celerybeat-schedule-wal create mode 100644 run-server.bat diff --git a/__pycache__/celery_worker.cpython-312.pyc b/__pycache__/celery_worker.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..993f222d19d2910d4c66291d8f91e44ed579559f GIT binary patch literal 1777 zcmah}%}*Og6rY)0uh%wiFd;aEl5Bz+vTZRqRiQyqq$+Bv3YAN8iG{RX?+#%6+1Yi$ z$d!zQM02U2RmCNha_E7IsMp^55A+h0M7XO)iqu|mgE%x1r@puT2(*3e~KLhPpYlj*tM(VLMyRnNqv5OC5m-Y#bChPHY>+a^##?rms2l273zMc5kO9|vJQTZIn zp@SXvO;1AlDKHV7hAJV6f|=)r;e`z&U$o0PnL#eK>fhKGU>T^dp#wv!Fr$&MhDS&F|5Zbv3rD4(_Of^%HN`yWe>cl;2Ql zH}=9L5LugAnc9{6cI3YG%5HpkCqDd0zVsK90?GB+&Fn_@1p#(XB`43;Zmdq#BeB}2 zA`Xs^-3LqtXX6ZzqtAj(Utie@(b@F!&?oM&qZNw9!g&pg)A$m%$}YFHbVX~vISF`v z0ws|txIYp`$M&T(-8;`PFG5bhfJQw}`{k3N>id^2zpv;;J=nO;8O z8;_vzhznttwSTlAhCAl_8MYT(2YJ3&7M_yN6d+4nqq(O#);z}snbsp-XpyHKF23MG zAPQm-2_Aue7GfAV%+%{{22He$9WjKue$++N@cJ5UjW~}A1llkDP`%ph$7|wUkYVFF zGeGtvO6e1#Jt6(i}k|YZAZKrwC z5-6AC5?+k9q5aZ?k+Z#2L_A;Iza~)$@kGs^l%k+XT40H2L6w^$h|zn|pRI~#xVezh z^_-~`;s(>yG#pbmDivIbcg&(mchl{3*dAboVX@Hs38zo6w2#lM8<5~od1+__f7}vp zkxh~iE*Wu|@V}}v|KQ$>rWZ!f@x*a9dGvT6xod8 zVwF6CBv7IOef zjh4X(Sx$y=M3W&0@9^W0B??(bNmZwbZCRG9?&5pP$#gkmCM$;J(A^n_BCW}ik+&{tS`6viWs2mhm0efTb>yn3>#p*D z6sn!AT^QBAh0}{F)FUIuk;z(Q@+dN09~ynU^Kj>||H;tY_k*>exlINI_*Ok zcR<%|$8hp#-EbV5Pi;A-t?LS*5tbTq3{}dGq#HWd0yKac)&_PMrx#ztDaQq34Zx|1 z3ZSDnDI#U0x}kijQl^fVpex{4$-3fJC4)!T71=7Ea|PB{3h%{4rPq5NhRu$}r?T8m z;T*5@I$9XMoxlm{`z_p8mmB%d))mC<5QU? literal 0 HcmV?d00001 diff --git a/__pycache__/webserver.cpython-312.pyc b/__pycache__/webserver.cpython-312.pyc index eed72736a406c9edfcc5ae2d9e6820a94263cc5c..6a51b017bd3e6219d43a03770e40e8dbb453d864 100644 GIT binary patch literal 8087 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 delta 2468 zcmaJ?OKcm*8Q$falqiXMaP<~tN46-_r1+HR)JpZRELOA??@ILpblBB$NUlZhu4c$c zVjGA?3Rp!7M8W0|pvbjwdn&3!eQfVNkgWkRdvZ|}XwXXxUyAn9nI$RNL7`pn-}(RV zn}24$`Dgggh5yb^zi~Pp6n<#-^ZcJ(6!mxFw4aVv*Zs2&ed$U&g()~v_SH@ ze8W_zqG8bAh;ln|%w9pW(qXJoFZR;|veCD~OA{g}>j%ozXUqcY2?U zI21eQoz3Sa=6^!a?m2EAS9m;b^iVmI_r}R1!!T{La(jF(2cSA_8$awuCB7sI0Ywx_ zWe8BEvlYmS1?=_mic$~-OpztOkj?p(1I@YhVRB<}CB3?lT)D++ovVrDEw1g^`En@_ zq>{L!P3Q9SFnRD`IhM~R=I%#}D-S}kjUTPvUfVBj%}RGF;9=n~yfhoRtyOt;?O<_d zWd&@7LMRqb3oOY^z%Bl*r+c`+1Tn%fV8(8J{XYJPF|(RMkQ4NJVp zCl5B0Vmz^&5SN5lW`9G8g2YB7dn*xF_+;qr-ui>$?!#raSh-udznI-C3Mi2e?QRyl z_p*ywl#c<8(#%MZ6;SENMiMg~1++n)E;Mc2fKa1<9BPGl=1042T%G=rFdejL;~(E-AV z(t1{}5&CdYN8l`O{f6?opqcPYJKz9m7D1M>Vov?7>kr%HCeh3QLKz|pZhQ1c3*EYr z666d>DZEsI2iHrG7j{w^@bSBWJ+O`E@-cv<9y&zn2@pzYGCjD4bIsu&im6}rt{WSp z%E>=^%?3K5{;U5Qy{a+;{>dc4$yMutx3Se6LY|j$fWsoddpNM6W(O7wZ>W=B4}5B% zgX+xS@OlKtA*pZ}BZdqC=ZUdl<27scCrFmk8NS5BB@$jHW(6C~1m!)1hz$A?;cfNv z!Ey5=?Em=W_k%a-i6Eh}#OSlJqw+QqptucS3I{W4*Dzxxuto>eyZvr;X}C7pl#gs1 z`j)H&k~;+6A!b_jkKEMP2-Da{1o5<1YRbz+05dp}SARLO(^av~`t?^laZ{AqGwP;4 zP_K^ebm+_7Ch6kp*Q5WQvtR%`^I$`UbR_>% z>Y;{TF#~ckAT(zfdE9Mq+>3WmlZ{n za_NGInjymzq}fDCB%Y$Va9x$aehF8(Op0D^mVsu5a=Epokm!x|T*Q;_D#$reN<*+) z79q&!a%e_amf-hx!uErroGBN;0{jK;O=Lz#1~oArKOB8+p{$)pYtKt{OQdT2#^yW{ zK66yf-#A>ymp}7Wt&N_^s+DppU7{6B4gGV3KsgcH* zx8*I=so__Y`B~S~u7Z%7p7o_>VRnNt_|a z2dB(TotgRFz7G8G9N25+avy#VsWCIB%tD=6sI5QNp^wfx{p^$p)S1AGbsboH2Z+|0 zXl;qpkBg+&iG&4(1F#znLBEoW3`Fci%;t2J5@u28nHaIbOKD8b_{A%-gf7SXI%CDcV{{h55f@J^z diff --git a/celery_worker.py b/celery_worker.py new file mode 100644 index 0000000..fd83e29 --- /dev/null +++ b/celery_worker.py @@ -0,0 +1,30 @@ +from webserver import create_app # This imports your initialized Flask app +from celery import Celery + +def make_celery(flask_app): + celery = Celery( + flask_app.import_name, + broker='redis://192.168.1.67:6379', # Use your actual Redis config + backend='redis://192.168.1.67:6379' + ) + celery.conf.update(flask_app.config) + class ContextTask(celery.Task): + def __call__(self, *args, **kwargs): + with flask_app.app_context(): + return self.run(*args, **kwargs) + celery.Task = ContextTask + return celery + +celery = make_celery(create_app()) + +@celery.task +def print_noon_message(): + print("It's noon! Task executed by Celery.") + +from celery.schedules import crontab +celery.conf.beat_schedule = { + 'print-noon-task': { + 'task': 'celery_worker.print_noon_message', + 'schedule': crontab(minute='*/1'), + }, +} \ No newline at end of file diff --git a/celerybeat-schedule b/celerybeat-schedule new file mode 100644 index 0000000000000000000000000000000000000000..237da4902f5dc02a07c1ae61a77b16261416e6b5 GIT binary patch literal 12288 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 literal 0 HcmV?d00001 diff --git a/logs/database.log b/logs/database.log index 456f65e..e3a529a 100644 --- a/logs/database.log +++ b/logs/database.log @@ -236,4 +236,73 @@ sql='WITH arguments AS ( SELECT %s AS year, %s AS month),sum_cte AS ( SELECT mi.item_uuid, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id ),cte_recipe_items AS ( SELECT rp_item.qty, COALESCE(sum_cte.total_sum, 0) as quantity_on_hand FROM main_recipe_items rp_item LEFT JOIN sum_cte ON sum_cte.item_uuid = rp_item.item_uuid )SELECT events.*, COALESCE(row_to_json(recipes.*), '{}') as recipe, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_recipe_items g WHERE g.rp_id = recipes.id) AS rp_itemsFROM main_plan_events eventsLEFT JOIN main_recipes recipes ON recipes.recipe_uuid = events.recipe_uuidWHERE event_date_end >= make_date((SELECT year FROM arguments), (SELECT month FROM arguments), 1) AND event_date_start < (make_date((SELECT year FROM arguments), (SELECT month FROM arguments), 1) + INTERVAL '1 month');') 2025-08-12 11:13:30.870202 --- ERROR --- DatabaseError(message='missing FROM-clause entry for table "recipe_missing_items"LINE 25: COALESCE(recipe_missing_items.has_missing_ingredients,... ^', payload=(2025, 8), - sql='WITH arguments AS ( SELECT %s AS year, %s AS month),sum_cte AS ( SELECT mi.item_uuid, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id ),cte_recipe_items AS ( SELECT rp_item.rp_id, rp_item.qty, COALESCE(sum_cte.total_sum, 0) as quantity_on_hand FROM main_recipe_items rp_item LEFT JOIN sum_cte ON sum_cte.item_uuid = rp_item.item_uuid ), recipe_missing_items AS ( SELECT rp_id, bool_or(qty > quantity_on_hand) AS has_missing_ingredients FROM cte_recipe_items GROUP BY rp_id)SELECT events.*, COALESCE(row_to_json(recipes.*), '{}') as recipe, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_recipe_items g WHERE g.rp_id = recipes.id) AS rp_items, COALESCE(recipe_missing_items.has_missing_ingredients, FALSE) AS has_missing_ingredientsFROM main_plan_events eventsLEFT JOIN main_recipes recipes ON recipes.recipe_uuid = events.recipe_uuidWHERE event_date_end >= make_date((SELECT year FROM arguments), (SELECT month FROM arguments), 1) AND event_date_start < (make_date((SELECT year FROM arguments), (SELECT month FROM arguments), 1) + INTERVAL '1 month');') \ No newline at end of file + sql='WITH arguments AS ( SELECT %s AS year, %s AS month),sum_cte AS ( SELECT mi.item_uuid, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id ),cte_recipe_items AS ( SELECT rp_item.rp_id, rp_item.qty, COALESCE(sum_cte.total_sum, 0) as quantity_on_hand FROM main_recipe_items rp_item LEFT JOIN sum_cte ON sum_cte.item_uuid = rp_item.item_uuid ), recipe_missing_items AS ( SELECT rp_id, bool_or(qty > quantity_on_hand) AS has_missing_ingredients FROM cte_recipe_items GROUP BY rp_id)SELECT events.*, COALESCE(row_to_json(recipes.*), '{}') as recipe, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_recipe_items g WHERE g.rp_id = recipes.id) AS rp_items, COALESCE(recipe_missing_items.has_missing_ingredients, FALSE) AS has_missing_ingredientsFROM main_plan_events eventsLEFT JOIN main_recipes recipes ON recipes.recipe_uuid = events.recipe_uuidWHERE event_date_end >= make_date((SELECT year FROM arguments), (SELECT month FROM arguments), 1) AND event_date_start < (make_date((SELECT year FROM arguments), (SELECT month FROM arguments), 1) + INTERVAL '1 month');') +2025-08-13 05:57:51.664542 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (489, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:57:52.543637 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (490, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:57:59.264995 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (491, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:05.574433 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (492, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:05.759833 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (493, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:13.545144 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (494, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:17.277887 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (495, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:18.060764 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (496, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:18.238774 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (497, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:18.417773 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (498, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:21.253662 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (499, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:21.412016 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (500, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:49.785521 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (501, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:54.323920 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (502, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:54.795245 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (503, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:54.964411 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (504, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:55.098509 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (505, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:56.160562 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (506, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:58:56.248810 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (507, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:59:00.781015 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (508, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:59:01.156483 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (509, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 05:59:01.352075 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (510, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-08-13 14:48:16.893199 --- ERROR --- DatabaseError(message='null value in column "barcode" of relation "main_logistics_info" violates not-null constraintDETAIL: Failing row contains (511, null, 1, 1, 1, 1).', + payload=(None, 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') \ No newline at end of file diff --git a/run-server.bat b/run-server.bat new file mode 100644 index 0000000..672750e --- /dev/null +++ b/run-server.bat @@ -0,0 +1,9 @@ +@echo off +REM Start Flask web server +start "Flask Server" cmd /k python webserver.py + +REM Start Celery worker (use --pool=solo for Windows) +start "Celery Worker" cmd /k python -m celery -A celery_worker.celery worker --pool=solo --loglevel=info + +REM Start Celery beat scheduler +start "Celery Beat" cmd /k python -m celery -A celery_worker.celery beat --loglevel=info \ No newline at end of file diff --git a/webserver.py b/webserver.py index dd7d6b1..cda83e0 100644 --- a/webserver.py +++ b/webserver.py @@ -16,40 +16,45 @@ from application.meal_planner import meal_planner_api from flasgger import Swagger from outh import oauth -app = Flask(__name__, instance_relative_config=True) -oauth.init_app(app) -swagger = Swagger(app) -app.config.from_pyfile('application.cfg.py') +def create_app(): + app = Flask(__name__, instance_relative_config=True) + oauth.init_app(app) + swagger = Swagger(app) + app.config.from_pyfile('application.cfg.py') -oauth.register( - name=app.config['OAUTH_NAME'], - client_id=app.config['OAUTH_CLIENT_ID'], - client_secret=app.config['OAUTH_CLIENT_SECRET'], - access_token_url=app.config['OAUTH_ACCESS_TOKEN_URL'], - authorize_url=app.config['OAUTH_AUTHORIZE_URL'], - userinfo_endpoint=app.config['OAUTH_USERINFO_ENDPOINT'], - api_base_url=app.config['OAUTH_API_BASE_URL'], - jwks_uri=app.config['OAUTH_JWKS_URI'], - client_kwargs=app.config['OAUTH_CLIENT_KWARGS'], -) + oauth.register( + name=app.config['OAUTH_NAME'], + client_id=app.config['OAUTH_CLIENT_ID'], + client_secret=app.config['OAUTH_CLIENT_SECRET'], + access_token_url=app.config['OAUTH_ACCESS_TOKEN_URL'], + authorize_url=app.config['OAUTH_AUTHORIZE_URL'], + userinfo_endpoint=app.config['OAUTH_USERINFO_ENDPOINT'], + api_base_url=app.config['OAUTH_API_BASE_URL'], + jwks_uri=app.config['OAUTH_JWKS_URI'], + client_kwargs=app.config['OAUTH_CLIENT_KWARGS'], + ) -assets = Environment(app) -app.secret_key = app.config['APP_SECRET'] -app.register_blueprint(access_api.access_api, url_prefix="/access") -app.register_blueprint(administration_api.admin_api, url_prefix='/administration') -app.register_blueprint(items_API.items_api, url_prefix='/items') -app.register_blueprint(poe_api.point_of_ease, url_prefix='/poe') -app.register_blueprint(site_management_api.site_management_api, url_prefix="/site-management") -app.register_blueprint(receipts_api.receipt_api, url_prefix='/receipts') -app.register_blueprint(shoplist_api.shopping_list_api, url_prefix="/shopping-lists") -app.register_blueprint(recipes_api.recipes_api, url_prefix='/recipes') -app.register_blueprint(meal_planner_api.meal_planner_api, url_prefix='/planner') + assets = Environment(app) + app.secret_key = app.config['APP_SECRET'] + app.register_blueprint(access_api.access_api, url_prefix="/access") + app.register_blueprint(administration_api.admin_api, url_prefix='/administration') + app.register_blueprint(items_API.items_api, url_prefix='/items') + app.register_blueprint(poe_api.point_of_ease, url_prefix='/poe') + app.register_blueprint(site_management_api.site_management_api, url_prefix="/site-management") + app.register_blueprint(receipts_api.receipt_api, url_prefix='/receipts') + app.register_blueprint(shoplist_api.shopping_list_api, url_prefix="/shopping-lists") + app.register_blueprint(recipes_api.recipes_api, url_prefix='/recipes') + app.register_blueprint(meal_planner_api.meal_planner_api, url_prefix='/planner') -js = Bundle('js/uikit.min.js', 'js/uikit-icons.min.js', output='gen/main.js') -assets.register('js_all', js) + js = Bundle('js/uikit.min.js', 'js/uikit-icons.min.js', output='gen/main.js') + assets.register('js_all', js) + + assets.init_app(app) + return app + +app = create_app() -assets.init_app(app) @app.context_processor def inject_user(): @@ -108,4 +113,5 @@ def home(): session['selected_site'] = sites[0] return redirect("/items") -app.run(host="0.0.0.0", port=5810, debug=True) \ No newline at end of file +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5810, debug=True) \ No newline at end of file