From 0de280b2e7ccf3cc695f4f21aad8ca072e361684 Mon Sep 17 00:00:00 2001 From: vidhya Date: Sat, 26 Sep 2026 00:55:02 +0530 Subject: [PATCH] Demo data - Quick demo creating - pending few works on this --- .../__pycache__/__init__.cpython-312.pyc | Bin 181 -> 181 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 312 -> 312 bytes .../__pycache__/attendance.cpython-312.pyc | Bin 1876 -> 1876 bytes .../attendance_line.cpython-312.pyc | Bin 1601 -> 1601 bytes .../attendance_session.cpython-312.pyc | Bin 9077 -> 9077 bytes .../student_inherit.cpython-312.pyc | Bin 3224 -> 3224 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 175 -> 175 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 399 -> 399 bytes .../academic_level.cpython-312.pyc | Bin 2171 -> 2171 bytes .../__pycache__/academic_term.cpython-312.pyc | Bin 3535 -> 3535 bytes .../__pycache__/academic_year.cpython-312.pyc | Bin 4339 -> 4339 bytes .../models/__pycache__/campus.cpython-312.pyc | Bin 3334 -> 3334 bytes .../__pycache__/department.cpython-312.pyc | Bin 2755 -> 2755 bytes .../education_config.cpython-312.pyc | Bin 4493 -> 4493 bytes .../__pycache__/program.cpython-312.pyc | Bin 3406 -> 3406 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 301 bytes .../test_academic_year.cpython-312.pyc | Bin 0 -> 2151 bytes .../__pycache__/test_campus.cpython-312.pyc | Bin 0 -> 1441 bytes .../__pycache__/test_program.cpython-312.pyc | Bin 0 -> 2113 bytes .../__pycache__/test_security.cpython-312.pyc | Bin 0 -> 1011 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 215 -> 215 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 190 bytes .../__pycache__/main.cpython-312.pyc | Bin 9275 -> 9275 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 190 bytes .../__pycache__/dashboard.cpython-312.pyc | Bin 540 -> 540 bytes .../static/src/js/education_dashboard.js | 9 + .../src/xml/education_dashboard_templates.xml | 2 +- addons/education_demo_data/__init__.py | 14 ++ addons/education_demo_data/__manifest__.py | 24 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 801 bytes .../demo_data_generator.cpython-312.pyc | Bin 0 -> 7438 bytes .../controllers/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 196 bytes .../__pycache__/demo_login.cpython-312.pyc | Bin 0 -> 3250 bytes .../controllers/demo_login.py | 79 ++++++ .../education_demo_data/data/demo_users.xml | 27 +++ .../demo_data_generator.py | 224 ++++++++++++++++++ addons/education_demo_data/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 195 bytes .../test_demo_login.cpython-312.pyc | Bin 0 -> 2514 bytes .../tests/test_demo_login.py | 32 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 210 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 192 bytes .../__pycache__/portal_exam.cpython-312.pyc | Bin 6041 -> 6041 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 409 -> 409 bytes .../education_exam.cpython-312.pyc | Bin 13061 -> 13061 bytes .../education_exam_result.cpython-312.pyc | Bin 7257 -> 7257 bytes .../education_exam_type.cpython-312.pyc | Bin 965 -> 965 bytes .../education_grading.cpython-312.pyc | Bin 4720 -> 4720 bytes .../education_student_inherit.cpython-312.pyc | Bin 1573 -> 1573 bytes .../education_subject.cpython-312.pyc | Bin 1536 -> 1536 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 178 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 535 -> 535 bytes .../fee_assignment.cpython-312.pyc | Bin 4312 -> 4312 bytes .../__pycache__/fee_category.cpython-312.pyc | Bin 2995 -> 2995 bytes .../__pycache__/fee_structure.cpython-312.pyc | Bin 4199 -> 4199 bytes .../__pycache__/fee_type.cpython-312.pyc | Bin 2448 -> 2448 bytes .../student_discount.cpython-312.pyc | Bin 5304 -> 5304 bytes .../student_inherit.cpython-312.pyc | Bin 4789 -> 4789 bytes .../student_ledger.cpython-312.pyc | Bin 5189 -> 5189 bytes .../student_payment.cpython-312.pyc | Bin 5965 -> 5965 bytes .../student_refund.cpython-312.pyc | Bin 4415 -> 4415 bytes .../student_scholarship.cpython-312.pyc | Bin 5139 -> 5139 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 212 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 189 -> 189 bytes .../__pycache__/portal.cpython-312.pyc | Bin 10052 -> 10052 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 438 -> 438 bytes .../models/__pycache__/hostel.cpython-312.pyc | Bin 6472 -> 6472 bytes .../__pycache__/hostel_bed.cpython-312.pyc | Bin 3893 -> 3893 bytes .../hostel_complaint.cpython-312.pyc | Bin 5451 -> 5451 bytes .../__pycache__/hostel_fee.cpython-312.pyc | Bin 8475 -> 8475 bytes .../__pycache__/hostel_floor.cpython-312.pyc | Bin 2631 -> 2631 bytes .../__pycache__/hostel_member.cpython-312.pyc | Bin 12889 -> 12889 bytes .../__pycache__/hostel_room.cpython-312.pyc | Bin 5199 -> 5199 bytes .../hostel_visitor.cpython-312.pyc | Bin 5329 -> 5329 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 213 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 188 -> 188 bytes .../__pycache__/main.cpython-312.pyc | Bin 8325 -> 8325 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 580 -> 580 bytes .../education_library.cpython-312.pyc | Bin 1479 -> 1479 bytes .../education_library_book.cpython-312.pyc | Bin 3500 -> 3500 bytes ...ducation_library_book_copy.cpython-312.pyc | Bin 2750 -> 2750 bytes ...education_library_category.cpython-312.pyc | Bin 2444 -> 2444 bytes .../education_library_fine.cpython-312.pyc | Bin 3965 -> 3965 bytes .../education_library_issue.cpython-312.pyc | Bin 8189 -> 8189 bytes .../education_library_member.cpython-312.pyc | Bin 4325 -> 4325 bytes ...cation_library_reservation.cpython-312.pyc | Bin 5580 -> 5580 bytes .../res_config_settings.cpython-312.pyc | Bin 1645 -> 1645 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 209 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 184 bytes .../__pycache__/main.cpython-312.pyc | Bin 18636 -> 18636 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 336 -> 336 bytes .../education_lms_assignment.cpython-312.pyc | Bin 7923 -> 7923 bytes .../education_lms_content.cpython-312.pyc | Bin 7863 -> 7863 bytes .../education_lms_course.cpython-312.pyc | Bin 5907 -> 5907 bytes .../education_lms_submission.cpython-312.pyc | Bin 13385 -> 13385 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 212 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 218 -> 218 bytes .../__pycache__/main.cpython-312.pyc | Bin 16026 -> 16026 bytes .../__pycache__/payment.cpython-312.pyc | Bin 6932 -> 6932 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 361 -> 361 bytes .../__pycache__/announcement.cpython-312.pyc | Bin 1657 -> 1657 bytes .../fee_assignment_inherit.cpython-312.pyc | Bin 1748 -> 1748 bytes .../payment_transaction.cpython-312.pyc | Bin 6829 -> 6829 bytes .../res_config_settings.cpython-312.pyc | Bin 4545 -> 4545 bytes .../student_inherit.cpython-312.pyc | Bin 9089 -> 9089 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 281 -> 281 bytes .../payment_service.cpython-312.pyc | Bin 10213 -> 10213 bytes .../razorpay_service.cpython-312.pyc | Bin 8976 -> 8976 bytes .../reconciliation_service.cpython-312.pyc | Bin 10004 -> 10004 bytes .../views/login_templates.xml | 48 +++- .../__pycache__/__init__.cpython-312.pyc | Bin 179 -> 179 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 193 -> 193 bytes .../__pycache__/report_wizard.cpython-312.pyc | Bin 8987 -> 8987 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 178 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 225 -> 225 bytes .../academic_config.cpython-312.pyc | Bin 6759 -> 6759 bytes .../__pycache__/student.cpython-312.pyc | Bin 18802 -> 18802 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 215 -> 215 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 190 bytes .../__pycache__/main.cpython-312.pyc | Bin 4410 -> 4410 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 243 -> 243 bytes .../education_room.cpython-312.pyc | Bin 1177 -> 1177 bytes .../education_timetable_slot.cpython-312.pyc | Bin 4848 -> 4848 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 220 -> 220 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 197 -> 197 bytes .../__pycache__/portal.cpython-312.pyc | Bin 5810 -> 5810 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 442 -> 442 bytes .../__pycache__/assignment.cpython-312.pyc | Bin 5648 -> 5648 bytes .../__pycache__/attendance.cpython-312.pyc | Bin 3081 -> 3081 bytes .../models/__pycache__/driver.cpython-312.pyc | Bin 2113 -> 2113 bytes .../__pycache__/incident.cpython-312.pyc | Bin 3778 -> 3778 bytes .../models/__pycache__/route.cpython-312.pyc | Bin 1972 -> 1972 bytes .../__pycache__/route_stop.cpython-312.pyc | Bin 2584 -> 2584 bytes .../models/__pycache__/stop.cpython-312.pyc | Bin 1657 -> 1657 bytes .../models/__pycache__/trip.cpython-312.pyc | Bin 4819 -> 4819 bytes .../__pycache__/vehicle.cpython-312.pyc | Bin 4685 -> 4685 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 151 -> 151 bytes docker-compose.yml | 2 +- 139 files changed, 453 insertions(+), 11 deletions(-) create mode 100644 addons/education_base/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 addons/education_base/tests/__pycache__/test_academic_year.cpython-312.pyc create mode 100644 addons/education_base/tests/__pycache__/test_campus.cpython-312.pyc create mode 100644 addons/education_base/tests/__pycache__/test_program.cpython-312.pyc create mode 100644 addons/education_base/tests/__pycache__/test_security.cpython-312.pyc create mode 100644 addons/education_demo_data/__init__.py create mode 100644 addons/education_demo_data/__manifest__.py create mode 100644 addons/education_demo_data/__pycache__/__init__.cpython-312.pyc create mode 100644 addons/education_demo_data/__pycache__/demo_data_generator.cpython-312.pyc create mode 100644 addons/education_demo_data/controllers/__init__.py create mode 100644 addons/education_demo_data/controllers/__pycache__/__init__.cpython-312.pyc create mode 100644 addons/education_demo_data/controllers/__pycache__/demo_login.cpython-312.pyc create mode 100644 addons/education_demo_data/controllers/demo_login.py create mode 100644 addons/education_demo_data/data/demo_users.xml create mode 100644 addons/education_demo_data/demo_data_generator.py create mode 100644 addons/education_demo_data/tests/__init__.py create mode 100644 addons/education_demo_data/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 addons/education_demo_data/tests/__pycache__/test_demo_login.cpython-312.pyc create mode 100644 addons/education_demo_data/tests/test_demo_login.py diff --git a/addons/education_attendance/__pycache__/__init__.cpython-312.pyc b/addons/education_attendance/__pycache__/__init__.cpython-312.pyc index 2c19ce7d86964fbf76081c9480db9ce120cd6d25..9c7e84d508c96968953e9dfd7a2ae397779d537d 100644 GIT binary patch delta 21 bcmdnWxRsIjG%qg~0}$*#yE#jABJTj&K)JDE^WdLaf2yp-a delta 23 dcmezB_SKE=G%qg~0}vdZxGgJNdLv)DG5}+D2e$wK diff --git a/addons/education_attendance/models/__pycache__/student_inherit.cpython-312.pyc b/addons/education_attendance/models/__pycache__/student_inherit.cpython-312.pyc index ba92e3d76a3a126d6a62b9e5e26dadd0cba0a4cf..d3a7fdf7e26d81e18a51f7c1032c2623ddb18c5e 100644 GIT binary patch delta 22 ccmbOsIYW~7G%qg~0}$*#yE#jGBX2hk07ixecmMzZ delta 22 ccmbOsIYW~7G%qg~0}vdZxGl?OBX2hk07ZlbWB>pF diff --git a/addons/education_base/__pycache__/__init__.cpython-312.pyc b/addons/education_base/__pycache__/__init__.cpython-312.pyc index 787f33f2660b42afaeec8fb70d95bc11ade46177..f1692ed69b2c7e41c61462adc39008c0adf4e5b8 100644 GIT binary patch delta 21 bcmZ3_xSo;sG%qg~0}$*#yE#jABJUyqKeYy1 delta 21 bcmZ3_xSo;sG%qg~0}vdZxGhU;BJUyqK1T*8 diff --git a/addons/education_base/models/__pycache__/__init__.cpython-312.pyc b/addons/education_base/models/__pycache__/__init__.cpython-312.pyc index a24f4864098c28b134821ade4ce044b127c60080..40a92a5fcf096e754ebf29293e9fd150bce49f4e 100644 GIT binary patch delta 22 ccmeBY?q}vb&CAQh00jHbZqC}Vk++Ev07Q@m!vFvP delta 22 ccmeBY?q}vb&CAQh00f68Zp+%gk++Ev07DE0l>h($ diff --git a/addons/education_base/models/__pycache__/academic_level.cpython-312.pyc b/addons/education_base/models/__pycache__/academic_level.cpython-312.pyc index 8ceab359d2a19bdf712b5f2fb378f1c79c0eeadd..89d5b9aeba132158617d6bbae59d88bbf9853d27 100644 GIT binary patch delta 22 ccmew@@LPcQG%qg~0}$*#yE$v`M&3LQ09Z%|tpET3 delta 22 ccmew@@LPcQG%qg~0}vdZxGn3!M&3LQ09Q~4n*aa+ diff --git a/addons/education_base/models/__pycache__/academic_term.cpython-312.pyc b/addons/education_base/models/__pycache__/academic_term.cpython-312.pyc index 5397b7a2bf8ae481c53dc2463d24b6bd35a77ed0..b96b948dd55cc0e72e6c1a3b76a28635812427ab 100644 GIT binary patch delta 22 ccmX>veO{XPG%qg~0}$*#yE)5lBkv(z08sh|MF0Q* delta 22 ccmX>veO{XPG%qg~0}vdZxGk%GBkv(z08p3*Q2+n{ diff --git a/addons/education_base/models/__pycache__/academic_year.cpython-312.pyc b/addons/education_base/models/__pycache__/academic_year.cpython-312.pyc index 46840fdd3ea0cbbe69f15765cf59af5ef8b7661e..18f6c57e117edcea31e1e7d95fe26d2fc9c46229 100644 GIT binary patch delta 22 ccmeyY_*s$nG%qg~0}$*#yE#i?BkwZ-09S_xq5uE@ delta 22 ccmeyY_*s$nG%qg~0}vdZxGgJfBkwZ-09QT-vj6}9 diff --git a/addons/education_base/models/__pycache__/campus.cpython-312.pyc b/addons/education_base/models/__pycache__/campus.cpython-312.pyc index aa2817fe00e7561327ba8a165fffe7a2b44ba432..5664ba7806d0f78d1a0ff4776445613f4fe4ac53 100644 GIT binary patch delta 22 ccmZpZYLntU&CAQh00jHbZqAC@$orEA07cOU0{{R3 delta 22 ccmZpZYLntU&CAQh00f68Zp-T5$orEA07Wwg0{{R3 diff --git a/addons/education_base/models/__pycache__/department.cpython-312.pyc b/addons/education_base/models/__pycache__/department.cpython-312.pyc index 4d05bcf7889a3b661dd111990bf9dd2b20f2185e..c1aa6d845f749c2db0d1884c1f4ab530583b3a17 100644 GIT binary patch delta 22 ccmX>sdRUbAG%qg~0}$*#yE$vaM&4~)08lXpga7~l delta 22 ccmX>sdRUbAG%qg~0}vdZxGn3^M&4~)08fMmfdBvi diff --git a/addons/education_base/models/__pycache__/education_config.cpython-312.pyc b/addons/education_base/models/__pycache__/education_config.cpython-312.pyc index c1cdac4fa3777094344d480391a5128462b45d12..3195d94d9b77cc55ea4f276bc53b366421e45029 100644 GIT binary patch delta 22 ccmeBG?p5YJ&CAQh00jHbZq8EJ$lD+Y07g&-bpQYW delta 22 ccmeBG?p5YJ&CAQh00f68Zp(_^$lD+Y07cLSdjJ3c diff --git a/addons/education_base/models/__pycache__/program.cpython-312.pyc b/addons/education_base/models/__pycache__/program.cpython-312.pyc index 093ed9d4e1106c895129aa25c18406c7f5b5d6e8..251fc9bcb7854f42bf72dcbf556578fc3c4a6dbb 100644 GIT binary patch delta 22 ccmX>nbxw-+G%qg~0}$*#yE$vlMqWo=08xAg9smFU delta 22 ccmX>nbxw-+G%qg~0}vdZxGn4cMqWo=08u0dEC2ui diff --git a/addons/education_base/tests/__pycache__/__init__.cpython-312.pyc b/addons/education_base/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21b002e8c7422cf7d5d4fddc0e5ff42e703c7b33 GIT binary patch literal 301 zcmXwzF;2uV5JksvvRYVDKnFCmDZmnz$wq_K=`t&G-5G@TG+*;x*M~s!_VN0Nw7-)1pW+X8Hw4dMz_1N?)-sm3ATHV>GbiRP z&s-9hZOLG&n#DJx(}rzNq76|ht&H_f%gHLFbd^)B{4fTxN7)Y8uTgpOb@svP5nY__ zn`#TlsSnE}RgwkC3+zZ?e=U3$g?);sE|oET7lbvVR?+pHd{DuP)E9)5u5(e!t6|zN iZ+&mZjlIJaRitObG06{SjLmQ{!|4oXpKy)`l>P#AEKbP) literal 0 HcmV?d00001 diff --git a/addons/education_base/tests/__pycache__/test_academic_year.cpython-312.pyc b/addons/education_base/tests/__pycache__/test_academic_year.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1efc04f4c5419bf7cc5573c372c1c65c5c7407e4 GIT binary patch literal 2151 zcmb7F%}*Og6rb^W*NgGu;F911bts@FhF~WYP+Os@q^g<|hn7~wm(g}-QyJM_IZ!L-Xo-C4d+W6W?nly*{r0^#^Jd=1 zZ{GZ97;ysQyPv*Y>{1E&6@}&iIT%M1@YyDua9Sc|TA&p9NGVcQ3JN6=@;>3p2H{bg z?kf$GLUcvVYQLe7rG9c=m=$SSZqcc{Yf2kcADg8jH&OGR5RR}Kb`2T{g`-hmzJQ}` zQlOj^BAetU<#aQbVEDW2F6^M5Z98u-+k}cq4yB{t2 zie0(o$1JD3WL8$P5kD&J(oMgEF{@-s$(Y252iNN}`Ete0+f`SX<0j`$Mdoe3Yz1jz zpF-yHF2pAT%FHlKwgPeHmR3XuY_fWxJp;MGg&54qSAaZSC%@>%R&2}oGU@g9Z&$yr z9`s(S^vm(!GegevE3-<%FC~YYaUjpOuHA~oFCpuAx6!`-x62MAK=b-39?GTp! zY|(=g*sa!0T7CU*#ecpL9w`@qtP{`ZJ}@#hBeQ$wXCr?|VjW2@aqixYts9Td=W2=k zL1Ma=nD)}cUV6~WjCuo?z0A;FX{WU3>^O&=+8bTRL^F~n3K*WCb+AQU;t}7xIh$4< zrq$V3V`l({;RgVlfmj28fuencplRK*XY;2(^MbdPYdp5AJ%bIv4ME;E+!oxLD?>=P ztwZrYywiCHS9$!!dr7-@&}d&2)SYvp8@yRX08b)-r$PWvt|EXZ8=w{EVaUQYEQDQggT5kCsDBAb4-l}!#E1bTSXO~OMf4*H(3}D8G-^iz0Lo(J zvy#nDZ_J=QvhZ%KPW>}(pJRrR$ooJ5xq9NBzNJ6v9&^m*2^I1A~V~Y%+cf`0RX=B3-F7kk|hYyYxew?wg!n0klYi5Y)9mYv~Q0fCe7{)7OC+ob2dX zOv6|)-NIkEa7j|WD!fp7e%y@0MNe`xeeMNK=Aq?7AtK>taT!;Mq_lTNiEq`_92$f{ zL)(DsgpqZtp)+kA8pZ~6NyGdUTsLYCxXkIG7imGwRH4;;H+FU5Xhz#=d9zW(9kaxTJ=~}CR0xRw7^<> zMU1KF-sEA?we;4avdXs@%fe0i8UvMwxVjLG*lO?tq9xmcf zyr$$*;Iz6#*h)x5v??ahv4SI$4-4&t%^Mv~@y6b%e+49}-*P0txbHfww3{Si{e0_TR?AF=s`d0mM(U>pogE2P#$cBmIyUz5$nZEb+A5Q%- zm}BLkJ$dJH|MLBlGXr~e*RBuj`fzG?I8_}^pV|(#g6(K4Qb#OIs3V;6Q(c8T#ke&1 zKw@FP*zaDl^qe zop*iS#xGjdm-N&hAv*!va$voe<@>& DUJ5tL literal 0 HcmV?d00001 diff --git a/addons/education_base/tests/__pycache__/test_program.cpython-312.pyc b/addons/education_base/tests/__pycache__/test_program.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37ca834975b309709df6bdc091158fac582c7045 GIT binary patch literal 2113 zcmbVNO-vg{6rS~AnR!>#Mv8VP@^;}iL>cOj3bLy$LP-qiz>YMc%41z;Dhqv#|%=g}# znfJZ@MV7+|#!tU~zw|^z=nrl*hU6&+qo8aff(Xu{98P1*bzjz(6Vd`kJ~WMpu#SjG z@vczEq{S6U@&CyU1v}CEOfyVPw=#KSQZp%^`b5iSh{k887|S!gj;l+bXB@l%$`c4p zQ5qAJ_HCefOz?UzEfC*2N{bt48Kks>%P_o->!WBCQ9<#gQS%?~=y>flG1{R(d* z>v(Y!ucBvg%3W^;qgAv7w{UhWaUW;KDpI|(q6<(2cL8Q8bOs0}@eu(co#S=MeT~xy zBJK#g-iaXUG3xwWiF9F9KM4RPa@sq$&W##86*bU6T@W>NVbm~b`QK*^HlnT|B{EyO zOi599YbL2{xkAw_MP~ENTI`>6Ek~N2oS3->#UL75jyj^AC)5e+`CLIWR@4kB#ZDX$ zTF{u4qlV?QOc@IqgHo0;793$}c3Ke_e>KJ*!wJ?CT z8PpyrY8G{TbJI%5k<4O&GWbwyuHXpNc;p1UWE{WFsJk;mK(D7CZpuk={VG03G--C; z38|`{)l5@WO-_#fwWC|9oMENtvcMnw()A)xE&j`W1Xi1edvPP z0rU*eFitU_KcCC|zd+gMEN$)!d^-%Q(QHtIV{fC2`hdsiV=mM^aOpAnxL!|I&g0g9 zV4+AP;@|N%a&tQ`bl+VsYm8RVAi9A}{Md)lL&%)ZEDI0OW2^*bORdK>k@RYybfu}< z`)|_)Mu90%^tT!J=}0S7W2WM7VnEQXMIeA9pHwI}gQUn@I>LgdsYN4WDFG(}#Y&m= zk(M#3$#_p?uW`}F1@9HCor_Ko3TEB#G5O>4vmTI68?W6))v68OrGe(MJ$H-iXdYaw zAzN;($%(3**!lc7Ikk_1p{O0X{KcKkJ9}+I)reAyT(3s1+nvL9XTt93uiP!)t<02X z?14AG?fa&$HgK~#aMSMTwFidw<-q8rLllssF9q=OlDl&K9htnDem!w%Vnq0PM4Gr2 zQ2b6%ReASORVS>fxjZRmxgJr~&x%^MzT%RQUF9d0J!0!Ln^je~ia5-=S26Bh1>^1B z75r~(${=2?qeHP(YWe4CNQ$!F#`>%xIjwn;&nNlKm`Ug~xxB$R0i38iPnUIC;D222 xLAdMhP~8K+_M_nY^?W~INig|)m>nQq2pHq%XyiG1>(HOT(JxbfBlx($e*x;8&`1CP literal 0 HcmV?d00001 diff --git a/addons/education_base/tests/__pycache__/test_security.cpython-312.pyc b/addons/education_base/tests/__pycache__/test_security.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c21d386e9a47e9890e980848053664326e2f391b GIT binary patch literal 1011 zcmZuv&1(}u6rb6TG)Y_6Y9q9^rG_F|+9nkQFQS5ow_dCVBXt~irXgWJ>ddYrp@N4V z?5W<`g9m#m(xW#K`~yTt5os9k@9^H6_kQnl-k0IwERgj1>xbG$ z2*6ME=#kk~I#;E#1qdL}1s*Iz2sCgX5N#b0ox(jm!Iia!VVj5QVMAdpG3;~fgw?>m zi#c@?P{L)Um^v4v*a8%kApvELz;#g88=9?)p(V=02h@pJHEcLNyb4nNs*0UYl5K%C zP?Pe1B5+KaYTeHIy+k8AF^EZ0XGhk0Q}+dtfxT`AwN#(Et5)EOUV$Y2*65*LLYX^r z8o3602nZU$&MY=FjPhc{DdWv^_ekVmwXW%h(jZ1CiI8%kP_6|&o-*B`b?mLW zwCDuhq3Vrkk~IqwnB+pwfx#@GD$#{aN86* z^3A3T9t?_=CZeNiAB`bgu$u1B8+$v)xq@i@r{z_hb3AM8J@?41U@gF zY@np(;xR|^KH{G)t~Nw2o>%pqjE^0Ma^B4MUqtatj9LJHEZHm2wk~egH|pDi`_{~X zHM?)kwnt~$xk5X4y?uFN8^4>`E$kF_=XT~=rAOcL<%9h4etx-ibPQNNQDnbwhlVRfH{?5lzUNL|42ZBAfAz{pY;NtsZ&nE$CdUk<#GCEQv4R1 dkPdaHT$MV~A%s7`{O?o-PQAJP2S^b|{RP(t{Hy=~ literal 0 HcmV?d00001 diff --git a/addons/education_dashboard/__pycache__/__init__.cpython-312.pyc b/addons/education_dashboard/__pycache__/__init__.cpython-312.pyc index 8befeb20bfa2da6b7bc0cc09e22e7389095f8b6d..3c54756409d86c4a7dfa29090b7de9238a4ce2b9 100644 GIT binary patch delta 21 bcmcc4c%6~=G%qg~0}$*#yE#jLBJU{xMui6L delta 21 bcmcc4c%6~=G%qg~0}vdZxGl?YBJU{xMH>dX diff --git a/addons/education_dashboard/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_dashboard/controllers/__pycache__/__init__.cpython-312.pyc index 753f194a72d72f8727943cc3bf99f67fa5ce8cc7..5d90c9ba71ed171d4d0a302d2e720234a8c7cb4a 100644 GIT binary patch delta 21 bcmdnTxQ~(dG%qg~0}$*#yE#jEBJV~3LKFsu delta 21 bcmdnTxQ~(dG%qg~0}vdZxGhU$BJV~3K&A## diff --git a/addons/education_dashboard/controllers/__pycache__/main.cpython-312.pyc b/addons/education_dashboard/controllers/__pycache__/main.cpython-312.pyc index f493f8b3e70ebbb1fa57464c4e9686c07e50ab5b..8eea5c91930c4589814043c587e260f2c5875d5b 100644 GIT binary patch delta 23 dcmdn(vD<_1G%qg~0}w23-Ii6YwvkU)1prt}2K@j4 delta 23 dcmdn(vD<_1G%qg~0}vdZxGl>Programs -
+
diff --git a/addons/education_demo_data/__init__.py b/addons/education_demo_data/__init__.py new file mode 100644 index 0000000..169d529 --- /dev/null +++ b/addons/education_demo_data/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from . import controllers + +def post_init_hook(env): + """ + Hook to run after module installation. + Creates basic demo data if it doesn't exist. + """ + from .demo_data_generator import generate_demo_data + try: + generate_demo_data(env) + except Exception as e: + import logging + logging.getLogger(__name__).error(f"Failed to generate demo data: {e}") diff --git a/addons/education_demo_data/__manifest__.py b/addons/education_demo_data/__manifest__.py new file mode 100644 index 0000000..6c4831f --- /dev/null +++ b/addons/education_demo_data/__manifest__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Education Demo Data', + 'version': '19.0.1.0.0', + 'summary': 'Demo Data & Secure Demo Login for Education ERP', + 'author': 'Metatroncube', + 'category': 'Education', + 'depends': [ + 'education_base', + 'education_student', + 'education_lms', + 'education_portal', + 'education_exam', + 'education_timetable' + ], + 'data': [ + 'data/demo_users.xml', + ], + 'demo': [], + 'installable': True, + 'application': False, + 'auto_install': False, + 'post_init_hook': 'post_init_hook', +} diff --git a/addons/education_demo_data/__pycache__/__init__.cpython-312.pyc b/addons/education_demo_data/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e86a8837fd55204ce2b55e264ae4a67247eb2e GIT binary patch literal 801 zcmYLHO=uHA6n?WmcCsan+ER!I9f+XoPeV~bM1&%Wh@`!?mu1aNAl3Z{nf1U=So;oJq3g!Myq2oA-VD_RW0EW*ty=@!k9CE&}+W zgVc;E7%nUD3@A_(LJe&p1k`v8TSnV-tpmjZ7bWv$9!bH&kcqggbE(-1m}(7QE2mTt zHMB}ssbs)_4(h<$X+46rRRC$F)RQ1Cbq#7#D>S=i$E;@3li4oE{p&bYsb*)VDWZ1A z*o9X{T7zH{sMR$d8f|N`H&GK><|Z_eduYdZh_YLp-zSn2(TIq@Etw!SP8%U3K@>|r z41F2!Xk}b_T`*s=nB4W_piC&MaYB9RlVF#s3s;h*;@(>`AC^s+>LO&rtv>dd7 I#G*?51A!&SNB{r; literal 0 HcmV?d00001 diff --git a/addons/education_demo_data/__pycache__/demo_data_generator.cpython-312.pyc b/addons/education_demo_data/__pycache__/demo_data_generator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4df642994c45cf8f5be908a1ca8b902cef543172 GIT binary patch literal 7438 zcmcIoNpKt2nQoBSh=tfUiliDML=hwb5+Frtp=ncGAlafeQlw~0f}7|j1riJ04Janu zoMNgn6}oDwET3%Fs7mt5PT5tXS8hSMs9R}hgvM{bO&#M zKl(M>+o*Ks565e)OYpcsuE~eGn$?yO(1H#5ov7p2!nY{=Dm&EpbXLu6kCtPQN9N32>KSPdMp zvNf<8JYr?%O>BOZ*mCez_89M2bG^-xx2jd7)&m-XZ*91<_3!L-urc1W=6M^lHUVqC zx1Z55-Z4dd;Y>BH5~-#;pom*e+QU0nn!arMH=`ETww!6rA%13dkhif>-u%Bu0>3u3 z7*;^Pk6>5;!wwjh{}YD&AH?`~=(%{qejcKS0pI_2##FsG*LA3icX8|c{?(@QG(GZ< z`{#9PsOqPN`pna#^qGf-S{=7s4Y1WZOwjK)^zwl^lZNNWJ$3+$Y#Sf&Uwdf3>%}xw>xh@jmYP{tmTj&(k;Q1$vRbbx@TpALQw` z|KvP<4*r)K#_=I2ifUF?>ea)~`<1u1iZ7K2)&0;P!Ia-V$nTaP_}pn&H@{kic%SNO z> z@4PWjVG@(d`V0KKA*_*gnRGT?U~%0_=Beq~tC7ix*=slF!p$u1Z&{nl(~NAw=u~bq znWjtb0|=Vgpx8o|$rY;RtQPjX@l1ksvB0q8Tq@1vQVfZKS^N%MGEB}zFicph_-Bo< z$hKglmI`4E;Xi<&QWT^vor-3d`%LBtjPquWX4qAhqKi1!3I_Zx1B{yq1*7CR@UsCg zJ1mt22MVIX(|Tckdh%kV%Ba+NAv({b?vZb?@4>FaEPh{qfj7#!O@?B*u>K$f*{JXX z^0M_HEBMw(7oioP%RP}~m{dp{DX3lkuhV3~{$#z!LXHOk_b zCs{wW6d#F?rn68^sHT>tHo36w5HAx~fD$F4^BCF4M0+icB#r}8z~UDZ7LRtR1$SzZV<36W(0cjRbWUlR zl8J^0qZFM@=OA)Cag}w8vc5v4ikZTu$`h_oq@n#v-ernoqN{AaxRGSojbxU}QL79) z137WRpm0nwy^_r33(1vyF-Mmihs?Q6uE1nVwnIyp;SrmSJX@eLa*G1M;TApAT2&6R z2@eAdJ`P!F6D`h{Y?!NXl=W1qkiO4^4YFw^&2oh#o=dqULsc(X62b;Al}^Q8%s3D2 zcvTN&EEGA}l;)CEy!peEn8|X{RKCb^%#jW^P0qyzW0hezbtzY1^B@n3=76p=>hmxL zY}qI-gLK_v=u-QHB0em0kI8WmKt;V5$}hbMMApbeJ|Hn`wqivFQzrT=E=r zJZ8-?3ZYW#BEzhcv2)}Fic6=UKPvjuQo#X_vXNsxDPlP(d5^lt0tTC=G9};KW+p=| z7df(@UACKq_9)@Ku|WD9#NC15=sHmMrxtbS%5hvHkF*9)QWQ z`Ah}_;0eap3=Qc~oWOW11AsHG>^+>C^fF7ao6+TbejOhJX>PePZEviK&|jLna3vCp z50#?xkcbJkK;~Btn&Mie4PhWxNkstRz)Ir+hD(;Ie2&V{8li;WG{XdpV}-duU8H>;E!E9XNdr!SQqr1nMFvM;hvGME!{t?uI2bjMt<*hPpMujH znzu<2akwg^VO&9BVNF-agVM?^c!_2*1xjvanH8AujSbLPS<4maysY~Po5qJArqz^U z!C^iNXKgqjH#52W?2JOUa_E6uW}^U#hz~j0P?Z4oea!DNw$oxQm9yctKC%~Dsm@lR@rweWEF*hGF4_)Zmr?5 zOe)Vp+&Is&zLIzjD?WZ3QvJLc8_4Dg1I(xJ9uuKx8s2CI_G_EOs*g)V4eVbfS1T`7 zc{aMSDLbooFhMm_b`9|GI}5i5zs$CYmlne2{9^s{_3gy(t#;(-609N7+9z21P~;No ze;?hLL)N~sb$)wh&+L#KZsa*7IC@0KfZ!OA+(G=eE%>N+xA&Dn8#BEov`+Jm9=uv? z$aYdNcZ=qTV2+@Hn<%<~?k15rQZ|3QJ+)`HNj4{Pg#}x$Xp0H9nB?x0+#OYCQsDTb zz;57Gi*5*f>g?tn?MpiW1ns?orBAfP1xp+aFQTDa=wk|5;$_S7_Vk|FF4@931Uk@KX`+AX$5gjOIpi=tQ1!Xj#olv{6YC-%%v$>~Af zu;AZ zZN~xeu~8)B0vUhWjL3MI925LwwXB=(f+Hw8dY~0h?+gkje)kD-^pqXfx8Ijs-Upuvt}fBlE4X@b3-x_~ z=H`*Bx9qyPefjS^eyJw{?T-w*21K6u-OaBJW&a$~dSKI6qhF4qW6@`)AB>h=m%xw1 z{gv-a9}4t7Ek5v-9n%VOz11HK4#^kTvFw@Kzs`uAF`+Yt;*(;0Mu^Wm?}Q@zzHS!- z{X(GsyW9Vf{6+G4;2l_#EZ#4!etxxV=@2blf~D*6N6*IoCw}cI^nEV&v-F$S4i9y6O@pk(9kl9r_g!^Ib&sK zcE_-1^Geg*LePYa!=#m+NA=NYN<4OGGxEn&eD{%-848}*Jqx4ipjg&dZGKEcs1 zI)((t5ITJg4PQq~A0o$4+40eiUbcB8j~@jF1ka%885KOEl7B+-hk(kX{BFKRArO*| zzXS7g7H|z-+s@2OH{okTZ85_+GXWM)L8H zVCYuVu}`q|i?$)b2Kk*s!}I9&9b_9S+wSgY_iQeh3gjCQT!W%(RB%ClFG_7alK+%M z1|f8uQJveiGxf^;|KQ$1qTqR axA<2+hkr)AY}RNrul1ibY20iE?*9gGYx~Cl literal 0 HcmV?d00001 diff --git a/addons/education_demo_data/controllers/__init__.py b/addons/education_demo_data/controllers/__init__.py new file mode 100644 index 0000000..7a0f431 --- /dev/null +++ b/addons/education_demo_data/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import demo_login diff --git a/addons/education_demo_data/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_demo_data/controllers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25d86ef5b7c2024bdb10bbcb4609e85714c6645c GIT binary patch literal 196 zcmX@j%ge<81p1q|Wf=nL#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%r6;%!kUb? zxKdJc^W$^!(=+q@G?{KO6fpzES2BDC>HcM_pPN^rpIT8;l&G7Sl9HcSte=`vnw(gY znV%OA)|ir5lBl1YpI1_ppOceXRIDE#pP83g5+AQuQ2C3)CO1E&G$+-rhy!RE$iiX} R;{!7zBjYm$i6S;22LMu=G8X^< literal 0 HcmV?d00001 diff --git a/addons/education_demo_data/controllers/__pycache__/demo_login.cpython-312.pyc b/addons/education_demo_data/controllers/__pycache__/demo_login.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b5cf7a6d1708d15844c8037c3d3a360a3777ca6 GIT binary patch literal 3250 zcmcImO>7&-6`tiT|4E6WNK=w&Yil`@R+Y)bvTP-_o!GJz#YikSQd*dBz^*tec^Pt- znO#a2L#AnApo(k25?Vku5WwoGD%68dMFIqfS~Q4(UPMp;nS~B6k{;5N6uB_q_RyLA zF^NcZPTd7&-kW)UGxO$q^EbcW1Mv6H&;OK`ya0Sf80)i}#O_5*ECUE2l>u2QL1k?T z8%20qhR!kxh5|P5DuDD202zTw>lQ5|M!!ZIeZnzs=N#VpW=!83qn>NmL(O*nT&u6-Z;bq@r*npN{Ga-Idb`_jF{4x z%i|N1lcStnW7PSapfP-2y{0*{f_hDcisqaXrW8@d<0%DAUrN~;LL-sjeFnQKLsn9x zl(0%!^XW!Oa}ZK%=KL?sRYChlG;}~GWOT{}-FRJO%=-~tqKj0Ko~6+DS@qSe7O_q{ z_Eus@OvaZscg*5RU$PhN${E#djqQ8R=48pC`YpMl!}10F@ALwI97P9g(mmRxuxe!) zNH0jD9=5gHEVEZc*uoMb-NT zjeWcnoonXlm0U#^YAL$XB*gE0u+>_R)ZSokzX&?Mql(#*TiS$8FqCO3d5WI&;k^=R zcAv4Xy<hfLS1)xxK z7=^C@3jeo;uG3e*9MuKXervCe0%XT19WJ@AfLmj8z>whD3b#D0`ArC^JQ7#}eC+E4 z=hzVm=44S)V^3wyr3gAJtSn{b*&d9ILJ!-^!>lOvv(tPkpHb)gSw+o5K~lN8+M5Ct zk&wcQs>~|Y}70tx}gOMBWe;MU-Y(Vw%nIh{rf8pjg2};5VjwDm0N0UpYs- z9)JG$$pRC{7|YR`T}NllmE#pmP076Q6~Q6pa6gfVXhZq82_%h2Z| z@$7tDuxdjb^2)U-nMaU#)q~QUrg6<_S@FLn&GH!$>T8L8Lx39*R48~zyk;pO;DK6j z!_nv|jY!ed=)4FojTTPUrC$~hlF=CwJkUhB8(vd zbX)`x6xV#@+!W=4Ac+D*BoQ?moHFW|6HX;FqM~YaMv!zZjTWR?&6YxVEm#W|L(NBu z8a`7I7e_&(X9N|IE2}Xwlx1A(WSGwg3fb@(Yzob5t~V{pfwM}Hkw)`5QS**Svm%nE zEViZjlL|j8BrPBA5v%lbevMIt%(TXkG|+7C%xQjdfJt-FxT=~IA~!*!;gq6zQh3=U zL_VXrNw`T-nwIr2(GRc`Iz*Z%ZWL0DtgP4jCojjdk{TDTtB60wLx^7=_0vx3t|71T zalF6ggFw;W14%vOV!3%u&rgFb9QhxQh?s6jS0Qy%`43Ks55P_n2!ytR(Q1$@2f2;D z;Y#qrhVR0*4|H_bqW!h#ksT*44-*Tvzc;sh9XznyztsPm*uwBub8vCs*Vpg7 zaI;hkx7}%3`pJ^*>&W41q^BI|S@l&SgByXtZ6@e$d)UsdM9S@4E!wqmu^f%p+DMQc zO$!$vc|ag?`@Ij}yZ!#n_qU>5_r~vzSEEDa=+LK;&klZaa6Mg#{&>;-W$e_VxSUsP*%;j>GqQ@Ag(ZV&#t5D!PB-<6x!Z^y2Uq+w=S8-!)g+(`EMb#}n&) z750tA*S10jt0Ar&;#RvhL$Mn7!{5HTJiau(8S4J>_>b;z_m15?wrbz(i2XJ4MdzP8 ztLG-m=O!12AA5j9Nwle^+X}){Fk=#FOG5G^Op1Bu|xD1-7d^L zIAkB|c0M@bBsAw8J4HV@N#T~GE^!Xcl}t()7L!TMlS~>n57WM6^4&b2F=mXLZAWq* zgXaMD@&~YsTY!#}#%VQ#P@c!l4e-$3{K4d}62C|+`d3Epx2=z^4{f}4W#ebUrhWQb z+X!VJ+@*nIhT73-^rB_r66Z8-7pbZS*tiKM#K>#jKpIc|8Ev>8BBHtl63!FXX=4#* p(P_*Qm{dA(gZGG{9yu{{r>s<6Qs% literal 0 HcmV?d00001 diff --git a/addons/education_demo_data/controllers/demo_login.py b/addons/education_demo_data/controllers/demo_login.py new file mode 100644 index 0000000..49c08c3 --- /dev/null +++ b/addons/education_demo_data/controllers/demo_login.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# pyrefly: ignore [missing-import] +from odoo import http, exceptions +# pyrefly: ignore [missing-import] +from odoo.http import request + +class EducationDemoController(http.Controller): + + @http.route('/demo/login', type='http', auth='public', methods=['POST'], website=True, csrf=False) + def demo_login(self, role=None, **kw): + """ + Secure Demo Login Endpoint. + Accepts only 'role' (admin, faculty, student). + Redirects to safe destinations. + """ + if not role: + raise exceptions.AccessDenied("Missing role parameter.") + + # Map allowed roles to specific, pre-configured demo user logins + # Do not allow arbitrary user login + demo_accounts = { + 'admin': { + 'login': 'demo.admin', + 'password': 'Demo@Admin2026', + 'redirect': '/web' + }, + 'faculty': { + 'login': 'demo.faculty', + 'password': 'Demo@Faculty2026', + 'redirect': '/web' + }, + 'student': { + 'login': 'demo.student', + 'password': 'Demo@Student2026', + 'redirect': '/my/education/dashboard' + } + } + + if role not in demo_accounts: + raise exceptions.AccessDenied("Invalid role.") + + account = demo_accounts[role] + db = request.db + + if not db: + # If no DB is set, force it to the single DB (we can get it if there's only one) + dbs = http.db_list() + if len(dbs) == 1: + db = dbs[0] + else: + return request.redirect('/web/login') + + try: + credential = { + 'login': account['login'], + 'password': account['password'], + 'type': 'password' + } + if request.env.cr: + auth_info = request.session.authenticate(request.env, credential) + uid = auth_info.get('uid') if auth_info else request.session.uid + else: + import odoo + with odoo.modules.registry.Registry(db).cursor() as cr: + env = odoo.api.Environment(cr, None, {}) + auth_info = request.session.authenticate(env, credential) + request._save_session(env) + request.session.db = db + uid = auth_info.get('uid') if auth_info else request.session.uid + except Exception: + uid = False + + if not uid: + # Maybe the demo user doesn't exist yet, or password was changed. + # Redirect to login with error. + return request.redirect('/web/login?error=Demo account not properly configured.') + + # Protect against open redirects: Only use our pre-defined safe redirects + return request.redirect(account['redirect']) diff --git a/addons/education_demo_data/data/demo_users.xml b/addons/education_demo_data/data/demo_users.xml new file mode 100644 index 0000000..84af348 --- /dev/null +++ b/addons/education_demo_data/data/demo_users.xml @@ -0,0 +1,27 @@ + + + + + Demo Admin + demo.admin + Demo@Admin2026 + demo.admin@example.com + + + + + Demo Faculty + demo.faculty + Demo@Faculty2026 + demo.faculty@example.com + + + + + + Demo Student + demo.student + Demo@Student2026 + demo.student@example.com + + diff --git a/addons/education_demo_data/demo_data_generator.py b/addons/education_demo_data/demo_data_generator.py new file mode 100644 index 0000000..4363a9b --- /dev/null +++ b/addons/education_demo_data/demo_data_generator.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- + +def generate_demo_data(env): + """ + Generate realistic demo data for the Education ERP. + We do this via ORM to avoid complex XML constraint failures. + """ + # 1. Company / Campus / Department + demo_company = env['res.company'].search([('name', '=', 'Metatron Demo Company')], limit=1) + if not demo_company: + demo_company = env['res.company'].create({ + 'name': 'Metatron Demo Company', + 'email': 'demo@metatroncubesolutions.com' + }) + # Explicitly ensure the main admin (ID 2) does not have access to this company + main_admin = env['res.users'].browse(2) + if main_admin.exists(): + main_admin.sudo().write({'company_ids': [(3, demo_company.id)]}) + + company = demo_company + + campus = env['education.campus'].search([('name', '=', 'Demo Campus')], limit=1) + if not campus: + campus = env['education.campus'].create({ + 'name': 'Demo Campus', + 'code': 'DEMO-CAMPUS', + 'company_id': company.id + }) + + dept = env['education.department'].search([('name', '=', 'Computer Science Demo')], limit=1) + if not dept: + dept = env['education.department'].create({ + 'name': 'Computer Science Demo', + 'code': 'CS-DEMO', + 'company_id': company.id, + 'campus_id': campus.id + }) + + # 2. Academic Level & Program + level = env['education.academic.level'].search([('name', '=', 'Undergraduate Demo')], limit=1) + if not level: + level = env['education.academic.level'].create({ + 'name': 'Undergraduate Demo', + 'code': 'UG-DEMO', + 'company_id': company.id + }) + + program = env['education.program'].search([('code', '=', 'BTECH-CS-DEMO')], limit=1) + if not program: + program = env['education.program'].create({ + 'name': 'B.Tech Computer Science (Demo)', + 'code': 'BTECH-CS-DEMO', + 'level_id': level.id, + 'department_id': dept.id, + 'duration': 4, + 'duration_unit': 'years' + }) + + # 3. Academic Year & Term + import datetime + today = datetime.date.today() + + year = env['education.academic.year'].search([('name', '=', 'Demo Year 2026-2027')], limit=1) + if not year: + year = env['education.academic.year'].create({ + 'name': 'Demo Year 2026-2027', + 'code': 'DY2627', + 'start_date': today, + 'end_date': today + datetime.timedelta(days=365), + 'company_id': company.id + }) + + term = env['education.academic.term'].search([('code', '=', 'DT-FALL-26')], limit=1) + if not term: + term = env['education.academic.term'].create({ + 'name': 'Demo Fall 2026', + 'code': 'DT-FALL-26', + 'academic_year_id': year.id, + 'start_date': today, + 'end_date': today + datetime.timedelta(days=120) + }) + + # 4. Users & Roles + admin_user = env['res.users'].search([('login', '=', 'demo.admin')], limit=1) + faculty_user = env['res.users'].search([('login', '=', 'demo.faculty')], limit=1) + student_user = env['res.users'].search([('login', '=', 'demo.student')], limit=1) + + # Assign groups dynamically + erp_manager_group = env.ref('base.group_erp_manager', raise_if_not_found=False) + system_group = env.ref('base.group_system', raise_if_not_found=False) + user_group = env.ref('base.group_user', raise_if_not_found=False) + portal_group = env.ref('base.group_portal', raise_if_not_found=False) + + if admin_user: + admin_groups = [] + if erp_manager_group: admin_groups.append(erp_manager_group.id) + if system_group: admin_groups.append(system_group.id) + if admin_groups: + admin_user.sudo().write({ + 'groups_id': [(4, g) for g in admin_groups], + 'company_id': company.id, + 'company_ids': [(6, 0, [company.id])] + }) + + if faculty_user and user_group: + faculty_groups = [user_group.id] + + # Give basic student read access + student_user_grp = env.ref('education_student.group_education_student_user', raise_if_not_found=False) + if student_user_grp: faculty_groups.append(student_user_grp.id) + + # Give LMS Faculty access + lms_faculty_grp = env.ref('education_lms.group_education_lms_faculty', raise_if_not_found=False) + if lms_faculty_grp: faculty_groups.append(lms_faculty_grp.id) + + faculty_user.sudo().write({ + 'groups_id': [(4, g) for g in faculty_groups], + 'company_id': company.id, + 'company_ids': [(6, 0, [company.id])] + }) + + if student_user and portal_group: + student_user.sudo().write({ + 'groups_id': [(4, portal_group.id)], + 'company_id': company.id, + 'company_ids': [(6, 0, [company.id])] + }) + + # 5. Create Student Record + if student_user: + student = env['education.student'].search([('partner_id', '=', student_user.partner_id.id)], limit=1) + if not student: + student = env['education.student'].create({ + 'first_name': 'Demo', + 'last_name': 'Student', + 'partner_id': student_user.partner_id.id, + 'program_id': program.id, + 'campus_id': campus.id, + 'academic_year_id': year.id, + 'status': 'active' + }) + + # Map student ID to portal user if required by ERP architecture + student_user.partner_id.write({'is_student': True}) + + # 6. Create LMS Course with Faculty + if faculty_user: + course = env['education.lms.course'].search([('code', '=', 'CS101-DEMO')], limit=1) + if not course: + course = env['education.lms.course'].create({ + 'name': 'Introduction to Computer Science (Demo)', + 'code': 'CS101-DEMO', + 'faculty_id': faculty_user.id, + 'program_id': program.id, + 'state': 'published', + 'description': 'A comprehensive demo course.' + }) + + # Create a section and material + section = env['education.lms.section'].create({ + 'name': 'Week 1: Basics', + 'course_id': course.id, + 'sequence': 1 + }) + + env['education.lms.material'].create({ + 'name': 'Syllabus & Introduction', + 'section_id': section.id, + 'material_type': 'document', + 'content': 'Welcome to the course!' + }) + + # Create an assignment + env['education.lms.assignment'].create({ + 'name': 'First Demo Assignment', + 'course_id': course.id, + 'due_date': today + datetime.timedelta(days=7), + 'max_marks': 100, + 'state': 'published' + }) + + # Enroll the demo student + if student_user: + student_record = env['education.student'].search([('partner_id', '=', student_user.partner_id.id)], limit=1) + if student_record: + env['education.lms.enrollment'].create({ + 'course_id': course.id, + 'student_id': student_record.id, + 'state': 'enrolled' + }) + + # 7. Library Demo Data (Optional, if library module exists) + if 'education.library.book' in env: + book = env['education.library.book'].search([('isbn', '=', 'DEMO-ISBN-123')], limit=1) + if not book: + book = env['education.library.book'].create({ + 'name': 'The Art of Computer Programming (Demo Edition)', + 'author': 'Donald Knuth', + 'isbn': 'DEMO-ISBN-123', + 'total_copies': 5 + }) + + # If student is a library member, create a checkout + if student_user: + student_record = env['education.student'].search([('partner_id', '=', student_user.partner_id.id)], limit=1) + if student_record: + member = env['education.library.member'].search([('student_id', '=', student_record.id)], limit=1) + if not member: + member = env['education.library.member'].create({ + 'student_id': student_record.id, + 'member_type': 'student', + 'state': 'active' + }) + + env['education.library.checkout'].create({ + 'member_id': member.id, + 'book_id': book.id, + 'checkout_date': today, + 'due_date': today + datetime.timedelta(days=14), + 'state': 'issued' + }) + + env.cr.commit() + diff --git a/addons/education_demo_data/tests/__init__.py b/addons/education_demo_data/tests/__init__.py new file mode 100644 index 0000000..f097086 --- /dev/null +++ b/addons/education_demo_data/tests/__init__.py @@ -0,0 +1 @@ +from . import test_demo_login diff --git a/addons/education_demo_data/tests/__pycache__/__init__.cpython-312.pyc b/addons/education_demo_data/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49b621736ce1594ba3b04cf17af0e6f07ecc6f68 GIT binary patch literal 195 zcmX@j%ge<81gp1f%aQ}qk3k$5V1hC}3ji6@8B!Qh7;_kM8KW2(87i4HnO`yjg*6#( z@t33)m&B)}=H|!e_{_Y_lK6PNg34bUHo5sJr8%i~MI1nLK=u`b7$2A! N85!>}$QH2yIRJp;G8g~= literal 0 HcmV?d00001 diff --git a/addons/education_demo_data/tests/__pycache__/test_demo_login.cpython-312.pyc b/addons/education_demo_data/tests/__pycache__/test_demo_login.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22b42ca99bddb93236c689dcfa6a2bac6099f3df GIT binary patch literal 2514 zcmd5;&2Jk;6rb4-d+Q`X(@Jq7N*7TI1|_DUk&qyj5QPR&5(x?iUslV`#96Z+W@cSA zR*{Mn364P=!m&4q(gUZ8KLLqLqN)lSRH+iD+)9mvloRjmuE`ecRB(z9zkT!G%$qmA z_vVd%9viC=_YDlyKS_ z?Jqs}ww^qY`w}ylxussxxJ+sY?4tW{dG_HeXVqsm%HlJ;A!oN9AW)<2SpGfoav$l3=7Zi#AZ!qxo}!^Kx<(p0(*O;o1DebLEHM+X zyjrT2)z}p-lZ!lzFUL(k^7@X@AJ9cG;NA+r2DwgJMJwp=$0*a7?$cXF|G=M9n3*3m zo0H*n+A@mcOlBr4^=YAGwOq5hXKakgc3J30HiOXY0AsVS`mW6*){gxsvG+&nXsV|s zWr#T7%1oDRQe`kVarb_L9rmC3a3$^p%od#af_sS_3vlN$+qK(nlP_-S%Ib)~iQ7C< zBd(NOByWG#aRW61q$eHecroLfnldC0mX#&AY{!x064Ptj`xokAl+^jPM7Yx~V_>Rt z*74lLk0S>obTF2B0wve);wU~5q3}O^`hgCT@3%rHm2?V@*i{dF1PXgpg5fdP*sf@ANBD1-N?u&!C z9W-+cJoWy~uD?CEfb70|2)kku)*dBxWzu0Bu1?`f71_*(T}dWfe&p1`iiuhJb?z%g7(2dbx@HN*=ci;Ue}biy>FmH?oZ?`=M!$f z>3LjA`y!8g&W080>8w!C7pctmcX0pi^q^`TIvtCDKtl+&=ibATy*#93-@j`u9+CzI zUWdN{KDnj+&;GA7qtO4&TB)0-AoQj5qh^`{%z*r73eq<499GX6fXA>qS7bMLeF(cl zr$3GC)&Xvi2PJZ{nm61JklNQCN9|(GQkLUHZpa-+RU9XbStmew)N%09$t(9C#o7{-ynXIzbSB0s?zoe5*_Q(>Ua#IaPR#BDY?%VK#M4A~Y~g8SAR+379_ z?4S78LB0;~K&O=cN{-(nXYY~I_o?~i)E85`bbN=7ug~9{xkJzWp-s^xy1vjO`0eRL LoBcgirOy8X_PbOC literal 0 HcmV?d00001 diff --git a/addons/education_demo_data/tests/test_demo_login.py b/addons/education_demo_data/tests/test_demo_login.py new file mode 100644 index 0000000..1b8cc5b --- /dev/null +++ b/addons/education_demo_data/tests/test_demo_login.py @@ -0,0 +1,32 @@ +import odoo.tests +from odoo.tests.common import HttpCase +from unittest.mock import patch + +@odoo.tests.tagged('-at_install', 'post_install') +class TestDemoLogin(HttpCase): + + def test_01_demo_login_admin(self): + """ Test admin demo login via endpoint """ + response = self.url_open('/demo/login', data={'role': 'admin'}) + self.assertEqual(response.status_code, 200, "Should redirect or load a page") + + def test_02_demo_login_faculty(self): + """ Test faculty demo login """ + response = self.url_open('/demo/login', data={'role': 'faculty'}) + self.assertEqual(response.status_code, 200, "Should redirect or load a page") + + def test_03_demo_login_student(self): + """ Test student demo login """ + response = self.url_open('/demo/login', data={'role': 'student'}) + self.assertEqual(response.status_code, 200, "Should redirect or load a page") + + def test_04_demo_login_invalid_role(self): + """ Test invalid roles get rejected """ + response = self.url_open('/demo/login', data={'role': 'superadmin'}) + self.assertEqual(response.status_code, 403, "Should be Access Denied") + + def test_05_demo_login_missing_role(self): + """ Test missing role gets rejected """ + # using GET instead of POST causes a 405 Method Not Allowed, or missing role in POST causes 403 + response = self.url_open('/demo/login', data={}) + self.assertEqual(response.status_code, 403, "Should be Access Denied") diff --git a/addons/education_exam/__pycache__/__init__.cpython-312.pyc b/addons/education_exam/__pycache__/__init__.cpython-312.pyc index 46d488b76a63bd78edbfebd01c90e5c4811460a4..a121821fb98555162136be376c591348b82f18e9 100644 GIT binary patch delta 21 bcmcb_c!`nsG%qg~0}$*#yE#jLBJWWEMYsmu delta 21 bcmcb_c!`nsG%qg~0}vdZxGl?YBJWWEL{0{) diff --git a/addons/education_exam/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_exam/controllers/__pycache__/__init__.cpython-312.pyc index 0841217bae28b86a78804c0a55a0e19e33ef81cb..b31b02781fd773d22f2a5aac0840815d483d6e33 100644 GIT binary patch delta 21 bcmX@Wcz}`jG%qg~0}$*#yE#j0BJXAZLV^a9 delta 21 bcmX@Wcz}`jG%qg~0}vdZxGhV1BJXAZK@z|2Co1B diff --git a/addons/education_exam/models/__pycache__/__init__.cpython-312.pyc b/addons/education_exam/models/__pycache__/__init__.cpython-312.pyc index a0607ea5c8d51408340db0319f247374a86b76e8..9ead79c8b0b5fc2a6d7cbe0d86c93bc4abde199a 100644 GIT binary patch delta 22 ccmbQqJd>ICG%qg~0}$*#yE*IhM&2Gq07j<<^Z)<= delta 22 ccmbQqJd>ICG%qg~0}vdZxGn4AM&2Gq07V`K#Q*>R diff --git a/addons/education_exam/models/__pycache__/education_exam.cpython-312.pyc b/addons/education_exam/models/__pycache__/education_exam.cpython-312.pyc index 50b170e6c999e958506d73bae7949b4eaa31d34c..7966f5c8f1f2ffabcd9da3844c7aa685bbe21fa9 100644 GIT binary patch delta 22 ccmZooYfa-l&CAQh00jHbZq5?l$os(^b delta 22 ccmaE^@LYlSG%qg~0}vdZxGk%5BX5)d093UHFaQ7m diff --git a/addons/education_finance/models/__pycache__/fee_type.cpython-312.pyc b/addons/education_finance/models/__pycache__/fee_type.cpython-312.pyc index db904a2942ec3910f427e3d1ee1c2b08f931d3cf..dfbc7b6f3503d92dcfe6b844591acba572ac8611 100644 GIT binary patch delta 22 ccmbOrJVBWEG%qg~0}$*#yE&_9BX2V&07d2or~m)} delta 22 ccmbOrJVBWEG%qg~0}vdZxGihOM&4#l07U%;nE(I) diff --git a/addons/education_finance/models/__pycache__/student_discount.cpython-312.pyc b/addons/education_finance/models/__pycache__/student_discount.cpython-312.pyc index 13c53d2986567d3ac2cb7454d8a89eff8e695bef..9d57a8eda37f240c0c6632b9e1580651d849aa58 100644 GIT binary patch delta 22 ccmdm?xkHopG%qg~0}$*#yE$voM&8vT08udqhX4Qo delta 22 ccmdm?xkHopG%qg~0}vdZxGn4ZM&8vT08ujsrvLx| diff --git a/addons/education_finance/models/__pycache__/student_inherit.cpython-312.pyc b/addons/education_finance/models/__pycache__/student_inherit.cpython-312.pyc index 05ed766258bcfd0857804670e47baa0a727e8922..8502dd6e20a9e0ae73cc6aa52017891af1be2f13 100644 GIT binary patch delta 22 ccmdn0x>c3;G%qg~0}$*#yE&_ABku|!08eWNQ~&?~ delta 22 ccmdn0x>c3;G%qg~0}vdZxGih*M&1=d08Y6FPyhe` diff --git a/addons/education_finance/models/__pycache__/student_ledger.cpython-312.pyc b/addons/education_finance/models/__pycache__/student_ledger.cpython-312.pyc index 8dd416f22901919e6879d680dc1b0c27b24a20ca..89e93a10f396e1944187bd9b4cb24c2f2f5a001c 100644 GIT binary patch delta 22 ccmX@Aaa4o%G%qg~0}$*#yE#jLBd>)B08j=7xc~qF delta 22 ccmX@Aaa4o%G%qg~0}vdZxGk%GBd>)B08j4*)Bpeg diff --git a/addons/education_finance/models/__pycache__/student_payment.cpython-312.pyc b/addons/education_finance/models/__pycache__/student_payment.cpython-312.pyc index 0f289189533c26105553f08076b3aa0b2180ed0f..9bcad71ab4262accdebe000cb3a920ea9a690cfe 100644 GIT binary patch delta 22 ccmX@BcUF)0G%qg~0}$*#yE$vxMqUST090HDM*si- delta 22 ccmX@BcUF)0G%qg~0}vdZxGn4ZMqUST092X>a{vGU diff --git a/addons/education_finance/models/__pycache__/student_refund.cpython-312.pyc b/addons/education_finance/models/__pycache__/student_refund.cpython-312.pyc index 9fd6a37a7f1ace4478b957be2dbe69897b0817f1..82601bd9db689e81e4b58afa19ecdf3392281b2b 100644 GIT binary patch delta 22 ccmdn5v|ow$G%qg~0}$*#yE$v+MqVR908niQ5&!@I delta 22 ccmdn5v|ow$G%qg~0}vdZxGn4bMqVR908k_cBLDyZ diff --git a/addons/education_finance/models/__pycache__/student_scholarship.cpython-312.pyc b/addons/education_finance/models/__pycache__/student_scholarship.cpython-312.pyc index 78f4f115a8cbdc7177f50c87965c1309b6eaeaa3..a209e9bf2b544b7d4e1b0dd00a3f515ce367ecc9 100644 GIT binary patch delta 23 dcmbQNFBkxK^07ab!jsO4v delta 22 ccmdnSyp5UnG%qg~0}vdZxGn3>M&6Z-07_8@CjbBd diff --git a/addons/education_hostel/models/__pycache__/hostel.cpython-312.pyc b/addons/education_hostel/models/__pycache__/hostel.cpython-312.pyc index c49a0b1877b991d806a956b8e527861bf91e6762..a23e14ae3b811b3f09b2bd5a54c4f4aa706c2ee1 100644 GIT binary patch delta 23 dcmX?Mbi#=5G%qg~0}wo9-G%qg~0}z<7Zp)g>zmd;Y6aY=L1^xg4 delta 23 dcmX@Dby|z>G%qg~0}vdZxGhUqU?ZQcC;(Lc29N*% diff --git a/addons/education_hostel/models/__pycache__/hostel_fee.cpython-312.pyc b/addons/education_hostel/models/__pycache__/hostel_fee.cpython-312.pyc index ef143884b82a22c6ead9b39c6424a9a1f6f2c221..a1a9364036ad8587a431bfebf611ff9438d75aea 100644 GIT binary patch delta 23 dcmbR3G~0>qG%qg~0}v##Zp%uO+{nkP2mndB1*!l5 delta 23 dcmbR3G~0>qG%qg~0}vdZxGhUXY9k-7A^=eG23G(8 diff --git a/addons/education_hostel/models/__pycache__/hostel_floor.cpython-312.pyc b/addons/education_hostel/models/__pycache__/hostel_floor.cpython-312.pyc index 25daf3ad8f6489695522b5deabb32e46f0cf6e85..558c653229a31420dd0612cf81f665ed12ce4a48 100644 GIT binary patch delta 22 ccmX>ua$JP>G%qg~0}$M0*_O3_Bd-+~07{PrWdHyG delta 22 ccmX>ua$JP>G%qg~0}vdZxGn3^MqVo}08b1D3jhEB diff --git a/addons/education_hostel/models/__pycache__/hostel_member.cpython-312.pyc b/addons/education_hostel/models/__pycache__/hostel_member.cpython-312.pyc index 8307786b584716139da66efd7d35923e14b65038..1ea655859440c54c0ae26858b0eaba682f65c540 100644 GIT binary patch delta 23 dcmcbaax;bRG%qg~0}v>(Zp%_s-^k}}1OQg520{P; delta 23 dcmcbaax;bRG%qg~0}vdZxGhUkVG%qg~0}#At*_Nfdk=IEC08KFlKL7v# delta 22 ccmX@FabAP>G%qg~0}vdZxGk%1Bd?PP08#P>0RR91 diff --git a/addons/education_hostel/models/__pycache__/hostel_visitor.cpython-312.pyc b/addons/education_hostel/models/__pycache__/hostel_visitor.cpython-312.pyc index f2cf6fd781755e36b2f7a9d3ce34f69587c74d2d..47b31bc3000191d76a9ec39869c388a811d6fe0f 100644 GIT binary patch delta 22 ccmcbpc~O)1G%qg~0}!~fZp%{H$a_Qt07#Ms6#xJL delta 22 ccmcbpc~O)1G%qg~0}vdZxGk%5BkvIr08?29ga7~l diff --git a/addons/education_library/__pycache__/__init__.cpython-312.pyc b/addons/education_library/__pycache__/__init__.cpython-312.pyc index 93b6d63c7c9359ee7a1b6d306bef45eda47989de..31c049db862d5e8627f4e264aeaa1d82a9e3a927 100644 GIT binary patch delta 21 bcmcc0c$Ja&G%qg~0}$*#yE#jLBJT+RMl%NI delta 21 bcmcc0c$Ja&G%qg~0}vdZxGl?YBJT+RM9BuU diff --git a/addons/education_library/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_library/controllers/__pycache__/__init__.cpython-312.pyc index 0715051606a71e189bf17596a79bb1b137064e35..9ba5a6815ea0d86eb686d8d32010bd2e6bc6a17f 100644 GIT binary patch delta 21 bcmdnPxQCJVG%qg~0}$*#yE#jEBJX+tLBa-r delta 21 bcmdnPxQCJVG%qg~0}vdZxGhU$BJX+tKvV`y diff --git a/addons/education_library/controllers/__pycache__/main.cpython-312.pyc b/addons/education_library/controllers/__pycache__/main.cpython-312.pyc index 28138f19c173afc9a15df83577b9e713d5fbb1fb..5c59771ebb78ae1a3ac8d4b8c145a7049e7d83c3 100644 GIT binary patch delta 23 dcmZp5Y<1*2&CAQh00jHbZqAx3v5~J_0RU2a2R;A* delta 23 dcmZp5Y<1*2&CAQh00f68Zp*Tk+{jn1002%{2B-i4 diff --git a/addons/education_library/models/__pycache__/__init__.cpython-312.pyc b/addons/education_library/models/__pycache__/__init__.cpython-312.pyc index ccb8470d29180613a601b0fa2c0bc5dca2f2bdc7..2fdf77a0b454762871834e1ab4272fed82c2aa6b 100644 GIT binary patch delta 22 ccmX@Ya)gEVG%qg~0}$*#yE!XjBd<9V07~@+g#Z8m delta 22 ccmX@Ya)gEVG%qg~0}vdZxGgJjBd<9V07-iWSpWb4 diff --git a/addons/education_library/models/__pycache__/education_library.cpython-312.pyc b/addons/education_library/models/__pycache__/education_library.cpython-312.pyc index 40b99b12aea9b8c4b01f85c55a93a68734b1ecf8..4b99d2e4d8666dc5213ff9adc579dcae01ce1fd2 100644 GIT binary patch delta 23 dcmX@keVm)`G%qg~0}$*#yE*F@(?-6XtN>Ra2gCpX delta 23 dcmX@keVm)`G%qg~0}vdZxGjr^c_ZIWRsc`62BH7} diff --git a/addons/education_library/models/__pycache__/education_library_book.cpython-312.pyc b/addons/education_library/models/__pycache__/education_library_book.cpython-312.pyc index 99542977b52ef8f43e951cb74698b6740923e73c..5cfd56d32d8681e94e3fe0a853b88b79d9f83edb 100644 GIT binary patch delta 22 ccmZ1@y+)e%G%qg~0}$*#yE)5XBkz1(07|e1&Hw-a delta 22 ccmZ1@y+)e%G%qg~0}vdZxGgJqBkz1(07_g9YZG%qg~0}$*#yE*GW`$oQeegI=L2p|9e delta 23 dcmew>_g9YZG%qg~0}vdZxGl?qVWw delta 23 dcmX@3eMXz_G%qg~0}vdZxGl?zk@3t#M!wU$yj%=G5PW@eR+#NZzI`45Yx)RT delta 25 gcmX>zk@3t#M!wU$yj%=GaAe}PtaEl7`Sy7L0C3w000000 diff --git a/addons/education_lms/models/__pycache__/__init__.cpython-312.pyc b/addons/education_lms/models/__pycache__/__init__.cpython-312.pyc index ceb59c7cf1984d1774d6e4f88bd8d83affe6a3f7..b8a05542ef300cf4df5bdb90f39e31afc940502e 100644 GIT binary patch delta 22 ccmcb>bb*QYG%qg~0}$*#yE$v>MqXz|08Qlv;Q#;t delta 22 ccmcb>bb*QYG%qg~0}vdUxGihuMqXz|08Cp3u>b%7 diff --git a/addons/education_lms/models/__pycache__/education_lms_assignment.cpython-312.pyc b/addons/education_lms/models/__pycache__/education_lms_assignment.cpython-312.pyc index 9088b0ad9c20d3b3cf4dba20ea41660602a27390..679171c7f1e813de718222e4f34bd20932849413 100644 GIT binary patch delta 23 dcmext``MQ7G%qg~0}$*#yE$u%@J7C;asXxq2#^2( delta 23 dcmext``MQ7G%qg~0}vdUxGhUYWFy~GIRId(2gLvY diff --git a/addons/education_lms/models/__pycache__/education_lms_content.cpython-312.pyc b/addons/education_lms/models/__pycache__/education_lms_content.cpython-312.pyc index 97f22978abfbed3063e9bc1e5b317e58cc8594af..ba70222543865921897864006ceba146d65b6b30 100644 GIT binary patch delta 23 dcmdmPyWN)WG%qg~0}$*#yE*Hu&_=$MasXS;2lM~{ delta 23 dcmdmPyWN)WG%qg~0}vdUxGl>{cq89RIRI9W2QB~r diff --git a/addons/education_lms/models/__pycache__/education_lms_course.cpython-312.pyc b/addons/education_lms/models/__pycache__/education_lms_course.cpython-312.pyc index 504824b980ed1073124e532dc33decbe51b97cfc..ea60a730cd03a780a56cd82aee30adf815515489 100644 GIT binary patch delta 22 ccmbQNH(8JOG%qg~0}$*#yE#i@BQKjc07vcy8vpj&d=0-ki698yA2!j9s delta 23 dcmX?^aWaGNG%qg~0}vdUxGn3T) diff --git a/addons/education_portal/__pycache__/__init__.cpython-312.pyc b/addons/education_portal/__pycache__/__init__.cpython-312.pyc index ae25c90b6898584956851dceaf7c98cf523e759b..21d9ab67780ee58f8f3d0a07961c1eb6a7b75e76 100644 GIT binary patch delta 21 bcmcb@c!iPoG%qg~0}$*#yE#jLBJXhkMhXVx delta 21 bcmcb@c!iPoG%qg~0}vdUxGl?YBJXhkM5qR` diff --git a/addons/education_portal/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_portal/controllers/__pycache__/__init__.cpython-312.pyc index 4252d5d3d884509b4a7c57a70e47ab1c6252d493..200494e7a7ad9906946943c1a9635322f05e73f8 100644 GIT binary patch delta 21 bcmcb`c#DzuG%qg~0}$*#yE#j9BJWuMM(76c delta 21 bcmcb`c#DzuG%qg~0}vdUxGhV2BJWuMMTQ2x diff --git a/addons/education_portal/controllers/__pycache__/main.cpython-312.pyc b/addons/education_portal/controllers/__pycache__/main.cpython-312.pyc index e0c705164033a08a2bfad89b153d12eef61a1896..35eef4fe38ae053a9704a06006f91c90994a0432 100644 GIT binary patch delta 23 dcmbPLJFAxOG%qg~0}$*#yE$vS!A8CwI{;xz2t@z@ delta 23 dcmbPLJFAxOG%qg~0}vdUxGn3F;YPk5I{;uH2rU2r diff --git a/addons/education_portal/controllers/__pycache__/payment.cpython-312.pyc b/addons/education_portal/controllers/__pycache__/payment.cpython-312.pyc index 0c31549ce0e1b051795a93ef56d387690423b44b..680336fc5474f51fbc7cf2ce9894991737234a10 100644 GIT binary patch delta 23 dcmbPYHpPtZG%qg~0}$*#yE*H>&_+HsX#iA+2P^;p delta 23 dcmbPYHpPtZG%qg~0}vdUxGk$fcq1R1GyqSL266xZ diff --git a/addons/education_portal/models/__pycache__/__init__.cpython-312.pyc b/addons/education_portal/models/__pycache__/__init__.cpython-312.pyc index fd3aad1daca8b42ad2e794fda00dffea82a73aca..f8966893d111751b5533430abdcab32ef882ee56 100644 GIT binary patch delta 22 ccmaFK^pc79G%qg~0}$*#yE$voM&1}k08(-XIRF3v delta 22 ccmaFK^pc79G%qg~0}vdUxGih>M&1}k08s4*3IG5A diff --git a/addons/education_portal/models/__pycache__/announcement.cpython-312.pyc b/addons/education_portal/models/__pycache__/announcement.cpython-312.pyc index 25f1cb72e70aef84a12c8d70ff30c49776445501..5654ea7bdefafba8a8468c1d3736880e8cc38890 100644 GIT binary patch delta 22 ccmey#^OJ}7G%qg~0}$*#yE$w9M&2AY09ObHj{pDw delta 22 ccmey#^OJ}7G%qg~0}vdUxGn4CM&2AY09EVR delta 22 ccmZp4Z*=E9&CAQh00c)SZp-?-k+(z{08DcSN&o-= diff --git a/addons/education_portal/services/__pycache__/__init__.cpython-312.pyc b/addons/education_portal/services/__pycache__/__init__.cpython-312.pyc index 9abd365fd9b8d8db2f130fe1c1d2ffca814dbb90..494afc4c4e4b43d9ece6074562769d613e8db24c 100644 GIT binary patch delta 22 ccmbQqG?R(<{9 delta 22 ccmbQqG?R(Hucv2&Vu5 delta 23 dcmaFr|J0xFG%qg~0}vdUxGih8%0|BH>HuVH2v-0A diff --git a/addons/education_portal/services/__pycache__/razorpay_service.cpython-312.pyc b/addons/education_portal/services/__pycache__/razorpay_service.cpython-312.pyc index 7ac0c7ab43ec481dd99865939c079bb7290d1228..a986414ce53b703f7abab3f88acbc6b442007e44 100644 GIT binary patch delta 23 dcmbQ>Ho=YWG%qg~0}$*#yE&^+W+NYyG5}Ln2E+gW delta 23 dcmbQ>Ho=YWG%qg~0}vdUxGhUeb|W8?G5}9!1~vcy diff --git a/addons/education_portal/services/__pycache__/reconciliation_service.cpython-312.pyc b/addons/education_portal/services/__pycache__/reconciliation_service.cpython-312.pyc index 29917b0b31e03ba39791787c2730794b1aa50a73..c6d7ecd3cea72beb1022f87ac61ac28ec99780bb 100644 GIT binary patch delta 23 dcmbQ@H^q@aU&m_Isj5@27mwn diff --git a/addons/education_portal/views/login_templates.xml b/addons/education_portal/views/login_templates.xml index e9df3cd..32e1ca2 100644 --- a/addons/education_portal/views/login_templates.xml +++ b/addons/education_portal/views/login_templates.xml @@ -319,10 +319,10 @@
-
- © 2026 Metatron EduPortal. All rights reserved. - Powered by Metatroncube -
+
+
Powered by Metatroncube
+
© 2026 Metatron EduPortal. All rights reserved.
+
@@ -424,13 +424,43 @@ - - +

- or continue with + Quick Demo Access +
+ +
+ Demo accounts contain fictional data.
-
+
+
+ + + + +
+ + + + +
+ + + +
+ + +
--> diff --git a/addons/education_reports/__pycache__/__init__.cpython-312.pyc b/addons/education_reports/__pycache__/__init__.cpython-312.pyc index fc0f20dbf9edf978d693c950edbdf0253abf8efa..74a28f8d670720352e3cfc3b367e91ea8029a733 100644 GIT binary patch delta 21 bcmdnYxS5gnG%qg~0}$*#yE#j2BJVN)KwSoC delta 21 bcmdnYxS5gnG%qg~0}vdUxGhV3BJVN)KKBMS diff --git a/addons/education_reports/wizards/__pycache__/__init__.cpython-312.pyc b/addons/education_reports/wizards/__pycache__/__init__.cpython-312.pyc index db5db8412ac587d7d155d465da5b736fc6c6d0e8..3a95771b5b36441d84a90962d6f67e92380fda03 100644 GIT binary patch delta 21 bcmX@ec#x6zG%qg~0}$*#yE#i{BJUOeLbC># delta 21 bcmX@ec#x6zG%qg~0}vdUxGhU|BJUOeK}`l_ diff --git a/addons/education_reports/wizards/__pycache__/report_wizard.cpython-312.pyc b/addons/education_reports/wizards/__pycache__/report_wizard.cpython-312.pyc index 6db4d2eca5982b788be81d6016f9fb1aef9d9077..5f7cdb824d2ac0cceda8ee2845d73848cde75ba3 100644 GIT binary patch delta 22 ccmbR3HrtK&G%qg~0}$*#yE#jKBQKva08Kpxb^rhX delta 22 ccmbR3HrtK&G%qg~0}vdUxGn3{MqWN;08aJ>?EnA( diff --git a/addons/education_student/__pycache__/__init__.cpython-312.pyc b/addons/education_student/__pycache__/__init__.cpython-312.pyc index e5d4a8da1ae587ac0e7370bfe958f1915a86854e..fac8a4457b646f228455c0cbd24b8d160f193bba 100644 GIT binary patch delta 21 bcmdnQxQUVXG%qg~0}$*#yE#jABJWZFKrjYm delta 21 bcmdnQxQUVXG%qg~0}vdUxGhU;BJWZFKFS6$ diff --git a/addons/education_student/models/__pycache__/__init__.cpython-312.pyc b/addons/education_student/models/__pycache__/__init__.cpython-312.pyc index 45d3e262b761cb843ed58aec88c2ba61c369fa27..b723c91c5cad70b1e8f0ae39b480fa53c802eabb 100644 GIT binary patch delta 21 bcmaFJ_>htJG%qg~0}$*#yE)5bBJULdNHYfz delta 21 bcmaFJ_>htJG%qg~0}vdUxGl?UBJULdM$rb| diff --git a/addons/education_student/models/__pycache__/academic_config.cpython-312.pyc b/addons/education_student/models/__pycache__/academic_config.cpython-312.pyc index 6b8719e95c3b2af7a35f522437d732d2728db31a..d3f504188ed068d309f5c8c6612e22ebdbd38e4b 100644 GIT binary patch delta 22 ccmaEE^4x^?G%qg~0}$*#yE)5aBX5)x09Zi>RsaA1 delta 22 ccmaEE^4x^?G%qg~0}vdUxGn3#M&2kX09i{1ssI20 diff --git a/addons/education_student/models/__pycache__/student.cpython-312.pyc b/addons/education_student/models/__pycache__/student.cpython-312.pyc index 53b4559cfe6b4ada0f13bafeba35aedb102bc682..75a2158bfcd497d169a8d7551667f1d23b12473e 100644 GIT binary patch delta 25 fcmew~iSg4UM!wU$yj%=Gu>b7ltT~1o`BFRqceDuV delta 25 fcmew~iSg4UM!wU$yj%=GaAe}PthGiP`BFRqc1;M# diff --git a/addons/education_timetable/__pycache__/__init__.cpython-312.pyc b/addons/education_timetable/__pycache__/__init__.cpython-312.pyc index 0fc45fcc3f7c33b2fae2f905982231c6c968e843..1ab03a616c1d386f9b3d9c2e03590d9b0f197e98 100644 GIT binary patch delta 21 bcmcc4c%6~=G%qg~0}$*#yE#jLBJU{xMui6L delta 21 bcmcc4c%6~=G%qg~0}vdUxGl?YBJU{xMI#2g diff --git a/addons/education_timetable/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_timetable/controllers/__pycache__/__init__.cpython-312.pyc index eaf7878efc27bc892126e69e60bb81448ca97026..585a9a40e31b309f702d69b2546dddc0a1e41cca 100644 GIT binary patch delta 21 bcmdnTxQ~(dG%qg~0}$*#yE#jEBJV~3LKFsu delta 21 bcmdnTxQ~(dG%qg~0}vdUxGhU$BJV~3K&}Q; diff --git a/addons/education_timetable/controllers/__pycache__/main.cpython-312.pyc b/addons/education_timetable/controllers/__pycache__/main.cpython-312.pyc index b398eae6c10d8b2a2fde024afecd70f026f7855e..16a910a28cebda5604540d65a208a23d932dc8c3 100644 GIT binary patch delta 23 dcmdm`v`dNaG%qg~0}$*#yE$vM&_+HTK>$_~2N(bV delta 23 dcmdm`v`dNaG%qg~0}vdUxGhUYcq5;VAOKM7237z7 diff --git a/addons/education_timetable/models/__pycache__/__init__.cpython-312.pyc b/addons/education_timetable/models/__pycache__/__init__.cpython-312.pyc index fd1b90de7b2d076f094a24e23f8698d4d79884f7..1b3642b115c5b1f9b81da4ba5f0ff116a5fa2998 100644 GIT binary patch delta 21 bcmey&_?eOSG%qg~0}$*#yE)5cBJVQ*OH~I} delta 21 bcmey&_?eOSG%qg~0}vdUxGl?VBJVQ*N%IFJ diff --git a/addons/education_timetable/models/__pycache__/education_room.cpython-312.pyc b/addons/education_timetable/models/__pycache__/education_room.cpython-312.pyc index 34621d90383094d6db5713771156f817725ef4d7..5a8da6379664852d9cc4d4bf488cb3ae7d215e72 100644 GIT binary patch delta 22 ccmbQqIg^w3G%qg~0}$*#yE)5$BX18207WhahX4Qo delta 22 ccmbQqIg^w3G%qg~0}vdUxGgJTBX18207K;lWB>pF diff --git a/addons/education_timetable/models/__pycache__/education_timetable_slot.cpython-312.pyc b/addons/education_timetable/models/__pycache__/education_timetable_slot.cpython-312.pyc index 159099e6223018898ca04db8becc953c61c2c7f1..3c8fd350a845858f0b2e4054fe783c3d632e1b02 100644 GIT binary patch delta 22 ccmeyM`azZVG%qg~0}$*#yE#jKBkyA&09T*~q5uE@ delta 22 ccmeyM`azZVG%qg~0}vdUxGk%2BkyA&09Tv`zyJUM diff --git a/addons/education_transportation/__pycache__/__init__.cpython-312.pyc b/addons/education_transportation/__pycache__/__init__.cpython-312.pyc index 93b2e4ba155f35b2034dc18eba12362ad398d990..ba9fbb5e7a2a155d77d582be1a6509857f1ac811 100644 GIT binary patch delta 21 bcmcb^c!!bqG%qg~0}$*L-Ik?4k@q|RLQDol delta 21 bcmcb^c!!bqG%qg~0}vdUxGl?YBJX(sMeqj7 diff --git a/addons/education_transportation/controllers/__pycache__/__init__.cpython-312.pyc b/addons/education_transportation/controllers/__pycache__/__init__.cpython-312.pyc index 10ee48321bc26454e60264767a3a2d733d741af4..f8dd52ddd042c6c33f0978dbb02d96d2997b40fb 100644 GIT binary patch delta 21 bcmX@gc$AU%G%qg~0}z}M-IgUfk#`3GKCK1y delta 21 bcmX@gc$AU%G%qg~0}vdUxGhU;BJU0WLDdFo diff --git a/addons/education_transportation/controllers/__pycache__/portal.cpython-312.pyc b/addons/education_transportation/controllers/__pycache__/portal.cpython-312.pyc index 18ae84688ec3fec985ce3efdfeff93d76350fa70..1a4d9a5d4a8b20dc9ed76309efd8a5d13da7c5a7 100644 GIT binary patch delta 23 dcmdm_yGfVtG%qg~0}z}M+m^LLU?blWF#u772JZj> delta 23 dcmdm_yGfVtG%qg~0}vdUxGhUUa3kLmF#u952Gall diff --git a/addons/education_transportation/models/__pycache__/__init__.cpython-312.pyc b/addons/education_transportation/models/__pycache__/__init__.cpython-312.pyc index d9de16d3545781b9b24c143f97e4bf27424900ca..30155fc76402997b75e0fd14939a275f4b74db25 100644 GIT binary patch delta 22 ccmdnRyo;IlG%qg~0}vb$-IjHHBkx*907k(EqW}N^ delta 22 ccmdnRyo;IlG%qg~0}vdUxGn3#M&7lI07}jWC;$Ke diff --git a/addons/education_transportation/models/__pycache__/assignment.cpython-312.pyc b/addons/education_transportation/models/__pycache__/assignment.cpython-312.pyc index dd126193240259f3f08880fa91f4339c0e7bf9ba..11116a6332e082f4479789b16abec762ed41e90c 100644 GIT binary patch delta 22 ccmbQBGeL*oa8Q8vG%qg~0}wnC-IkTHk=KL+07y3m7ytkO delta 22 ccmX>oa8Q8vG%qg~0}vdUxGk%FBd-Yu0869>l>h($ diff --git a/addons/education_transportation/models/__pycache__/incident.cpython-312.pyc b/addons/education_transportation/models/__pycache__/incident.cpython-312.pyc index 291988b88e112407a4b17b98bf1e172a7e289c2a..bc9a276a1cb82b5921e990f86697c5882765a960 100644 GIT binary patch delta 22 ccmX>kdq|e|G%qg~0}yD4ZOh`^$h(yf07Dc7qW}N^ delta 22 ccmX>kdq|e|G%qg~0}vdUxGl?SBkxu|08L#6>i_@% diff --git a/addons/education_transportation/models/__pycache__/route.cpython-312.pyc b/addons/education_transportation/models/__pycache__/route.cpython-312.pyc index bf750de4bcb22a464c1432082660ffaa13ea9bf5..ea157ad23af82a33dd6c106e458b20432777ab14 100644 GIT binary patch delta 22 ccmdnOzlERoG%qg~0}y-`-IjG|Bkyu{07)$d*#H0l delta 22 ccmdnOzlERoG%qg~0}vdUxGn46M&9M@088=*LI3~& diff --git a/addons/education_transportation/models/__pycache__/route_stop.cpython-312.pyc b/addons/education_transportation/models/__pycache__/route_stop.cpython-312.pyc index 845ca539db38abeef97edd626ccc39aceba5e28b..3d056b84ed8fe854d0c8073376f491519438349b 100644 GIT binary patch delta 22 ccmbOsGDC#-G%qg~0}$}3Z_Dc3$ji+I06UHa1^@s6 delta 22 ccmbOsGDC#-G%qg~0}vdUxGihhMqX|%07caXLjV8( diff --git a/addons/education_transportation/models/__pycache__/stop.cpython-312.pyc b/addons/education_transportation/models/__pycache__/stop.cpython-312.pyc index 660e7cde079c4a46acaff3d935e4ed759d361877..c9a7f632ca045c45d13e5b04c60a243312f1d3fb 100644 GIT binary patch delta 22 ccmey#^OJ}7G%qg~0}#9t-Imp{kvE4808$+W-T(jq delta 22 ccmey#^OJ}7G%qg~0}vdUxGih$M&2AY096nNNdN!< diff --git a/addons/education_transportation/models/__pycache__/trip.cpython-312.pyc b/addons/education_transportation/models/__pycache__/trip.cpython-312.pyc index 03d908a1779384486e43672f9fcf8e2345559c4e..7c1402054a0bd4ae5a237f05694e46af977eb4df 100644 GIT binary patch delta 23 dcmcbtdRdk4G%qg~0}zOaZOeMdy^-&z5CBjs2D$(M delta 23 dcmcbtdRdk4G%qg~0}vdUxGhVSXCvQHAplnU2Pyyn diff --git a/addons/education_transportation/models/__pycache__/vehicle.cpython-312.pyc b/addons/education_transportation/models/__pycache__/vehicle.cpython-312.pyc index 1da6f0d6fbf59f1daee5f4986a41d7a258d745c4..f492e56de81c069bbe3596003c38574b996b14eb 100644 GIT binary patch delta 22 ccmX@Ba#n@+G%qg~0}!yNZ_8S~k=H>807q^G;Q#;t delta 22 ccmX@Ba#n@+G%qg~0}vdUxGn4LMqURY08-osQ2+n{ diff --git a/addons/theme_student_erp_custom/__pycache__/__init__.cpython-312.pyc b/addons/theme_student_erp_custom/__pycache__/__init__.cpython-312.pyc index 93a30c1f35b8485a431ebb44f0698da4292402c5..2079040daa4195943cc108e025a1e0aedfe65e2e 100644 GIT binary patch delta 21 bcmbQvIGvIAG%qg~0}#|*+>#|Rk+%x~Is*mT delta 21 bcmbQvIGvIAG%qg~0}vdUxGhU^B5xM}I)eq{ diff --git a/docker-compose.yml b/docker-compose.yml index dcbf0a1..f91c3eb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: USER: odoo PASSWORD: odoo LIST_DB: "True" - command: odoo --proxy-mode -i education_base,education_student,education_attendance,education_finance,education_dashboard,education_exam,education_lms,education_portal,education_reports,education_timetable,education_hostel,education_transportation + command: odoo --proxy-mode -i education_base,education_student,education_attendance,education_finance,education_dashboard,education_exam,education_lms,education_portal,education_reports,education_timetable,education_hostel,education_transportation,education_demo_data volumes: - client1_odoo_data:/var/lib/odoo - ./addons:/mnt/extra-addons