From caa33dc34b610ef3321ce98d7128bba902dab6a8 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:35:32 +0000 Subject: [PATCH] Refactor group selection logic to store all search results - Replaced `selected_indices` with `selected` attribute on candidate objects. - Updated frontend `createGroup` to include all candidates. - Updated backend `solver.py` to filter by `selected` attribute. - Updated tests to match new data structure. --- __pycache__/jwFetcher.cpython-312.pyc | Bin 13050 -> 0 bytes __pycache__/main.cpython-312.pyc | Bin 4413 -> 0 bytes .../cookie_manager.cpython-312.pyc | Bin 1841 -> 0 bytes backend/__pycache__/ranker.cpython-312.pyc | Bin 3397 -> 0 bytes .../session_manager.cpython-312.pyc | Bin 2843 -> 0 bytes backend/__pycache__/solver.cpython-312.pyc | Bin 3915 -> 0 bytes backend/solver.py | 6 ++-- static/app.js | 33 +++++++++++++----- static/index.html | 3 +- tests/test_api_flow.py | 3 +- 10 files changed, 29 insertions(+), 16 deletions(-) delete mode 100644 __pycache__/jwFetcher.cpython-312.pyc delete mode 100644 __pycache__/main.cpython-312.pyc delete mode 100644 backend/__pycache__/cookie_manager.cpython-312.pyc delete mode 100644 backend/__pycache__/ranker.cpython-312.pyc delete mode 100644 backend/__pycache__/session_manager.cpython-312.pyc delete mode 100644 backend/__pycache__/solver.cpython-312.pyc diff --git a/__pycache__/jwFetcher.cpython-312.pyc b/__pycache__/jwFetcher.cpython-312.pyc deleted file mode 100644 index a220b83a59d330ba988052a4583630fbd1af8966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13050 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 diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc deleted file mode 100644 index ff205a361c998cb6592fa04a81c14e039e97f6cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4413 zcmbVPU2Gf25#HndkVhUVN~9!8w&L@@=-QI)I7aLSMr1oyBiJe$#c{&KWzM{_bQFJ- zy`yEZ$3O|(gl>XHdXkJJFxw}&c446pMf%dleG1SQGIT2DtN;O8H_e-B1!$1IboP!% zQI3oPU68wTyR$ztJM+!#U;KVAf)f7rRrPHFp}&z2r?~6HDy9&cLo$-76pGm`6{D5@M|(O9Hq>b z;i0o9vN^0NCsL}C(V;6aqG+0$&76@k(x`&1p2V0U=Tgc@Hg#!z&vQ~{T)~OvUF!m& z)g90~2O^LQh0CO_Ah=2w)Qn6+&B_ea+!Pz-OnP8KO*j+DV&vXv_^&<<)g00rW6sSP zDBkGP>pB1}0yilzN@iPS3Pq{mD1%9d$t5f?F+)CDG+WYmx*;l~DXEJZSy}u}=$9rY z`qPq{>6@4`J@L4jQT2E{FTi2@oG%}+YMoF`qvejB)sEdo=3U?NmVMPN{YB<8&*oJa zLW#N=5*qRFw?q?Rn`Y5u%AnpyAG+2qiw8lH&2y~<5K1-#u6ICVP)WzF);hs)oYfvN zPXCW_MrIv@e8dXenw#D7+$4&HQg9ir5wsoY9{U@i9SFA<=(UTKd4partwFy@$=(9} zIz35EqRaG4Xp)Nh@{fDPdYO>0l-7=lvYODvpJk-9vR6!GWl~G&iJVqwaOMLq!zG;; zM-&Ms#*T_6L%2=6sOZ zI0ORWcBt~<<~_t`FwWwm;&7BT*$J#>bWHHioJ&(T+wj94-v`mK<)XEaZXR6cVi5adD)vJ!0=Ep8hk1> z(yS3HwytMx(g@$=W5!s_{`DeX# z91urwHa7u4a9Y)LF?-Se7PA+UNg%h zhd8aTug~-*q>QY}lCEf&z%M4E=ea?$t@t&G4mpCr;@>~|rI;gPi1&XxfB%Dp`+xfR zS66<2|E=GB^_w?LRw0Oxr$s}|3-*4evbl^b=7ZuTDW%Gy=Ij}DnQj|!G?Ud5S*(07 z7?NF931rMcOpqyJnxGWdFx~;w4G3{2b=i(v7HpWFr&3b-f-D`&_Y&+FwIx;JjXnFG zN@WvLN;?LG&G|H}q!GNHMy0K#!C&ve#44VL!_ni)6oDuR{+eR)jWwcPOne>_Wtc4> zO=3Kr$Yw640H8IKgYcPivzlrJ7XIWC?N~u$zOXA4`*s#o=VwN?Yo!Y*Lz~MlAqGacsuBY!C4z+Jz3LmV54=x_AhL0Bc&wb(Ark>*Idy%cP z%nUVipmyx!$3OXl`ib!Av9t5s{A<_v(%wp>f03$0V9uwJqvi97vaFOZj#lK+a$>Cf zvO2^5f0Kfnmx9|X!R@77X>{T2;uDLz%STR^cbxewIK1LUUE5YXsD1PN+3T@uu?3;p z^F%pxxGWq78M<~aMUGS=M?TtBjSLk1%O3xX@WDu_r`pqB-n_rO|LJmI;I8L5aJGrn z)~!XZ)*32u_gWt-4%EWkOW|lG99`JD@NzYLr1(rtXnXI>)iWh&ac8Cb$l2(Q8WN%gazjECDR52vjKQtv ze+gbY1@3i7k?poAE#ihvAth;gyq?15Tk6S(bV-p#Ju5z+Z(Hkel9N-AYBNbKn=#o` zR+2SLvR6~kV3ML$gEk`D%C%SWc*O zDYUy1+PxGyR0$ng{OQLpd~&uL8Y!NHd}QXwrIV$@<+eR{g&zQ;ld5!CsmiX>Yo&xe zwj7FBiAtB9sJuDQJ`h27BK*J+`p(wCz#;n1Ar|Q2sGH>a1U}+%(;JVcv*hUmv=EQK zmXlKU2qsuzC1;qR113V^U8EwQX$wxU6qAbFx%Ei6f*!bB?EVLyHa7gAcMH37^*F_| zUG^NpNwy|04tQp?YC43bM8BGmmCJo&dODR00tYj&IUH?L) zUKw&BMkwY#rMo`&`rp|(eF8wTH8kg*bEBj7x8&be@o%enx@$svt);CNXq$ih8=eht)2AS}X4|F* V-#+uknR(`~OwY7%g5T3U`P8xd?8kaUfs9l;gVilZF1a%I`Qp6!Df*k0nzATG(-P-kf&3hXh zTc*k(Lim832nn|mQaMtEJ4l>*<^-f7+V+Czg$t_UL#3RU+4VMdFr1jRzny*a-uIs8 zn_2&)X%m3<4FV5t3W=wvpfr*rMx7;8rae{*zz7SkmcnD zGn7BcT`v&E){jGP0Y|#v0I}pHJ7KeJmY0bouh=r8YAc9|hH8uj+B=?itK__IRjnHi zFT^B7O1_NW-ZVlNTC4>odXY82VCx18#*3wjQ?vY=h7>5msT6qvCkR@r>qqC8ty*pQ zBdc)BsoKkha4XY|_FAenf^pL7V<{dF$xb2J797mzpDSNzJ=%ZhoHQpq z=V$29IR$GlpV2(B7L*5nRWyi6wdL=WJz9tM7JMqTq_P@44PuM!^_dt-L{}^Xg9e*} z%OF@?VsIT8UJbS>Uxzv~)aJ!&)+dh8{hN*+{cc_Oyi~oR`<`y;l(nVxfYp!G4ZoOK zxsRE2ss+!+8HOAvUd^e7nGDoAFZqrk^D#VDFwxH;as{j?==i#>^KptL1@34@6PmNb z`5XvQHpLqVTk!kT>_KY!v37cAzMI+2e3SmR{!q*QaQPsmb=KNzJMZqNE8$*{x(Z{3=PAa~=OX-t4_)vPBO8_ck%@*fah$L?`Jtq=duS->h`Ile zl(kqn8Lv6M@AciXc03k)ajYPn6#E+dhu916d6qp&>>~Hvum)nmIj3FuBm#DyIl0 zJGa}n@7VX;yYBwfYX|9bBZ?q>rh8@g%9ktM+-~mI^jusBzfd8hkn4ebesxiPu&A!S zIa~`=mGtd>h4BB^0@sh5yG)gT!bVp|TuIcV_y(1lGaopvccMijl?;`iLry+JFiSwy z79@DMz+j;kf~vpYd8tChv3M-QOT(=<7$aJ-h=4jIwNAF3?d00IJM;H4cQgCRS0AS) zJ6GFRckHga>po1)Kb0Y6aQYL$S8X#HwYFIDH+`%fe0NqY*D=jt!Zcma-l&kDGR==S ztV$H&)G_=F!OH{}5bi@r7?uxLXq157eBvy^HuNN>zH*pQRsC>MRp)z?vU(|6LK6)o z%uS$_g;xy}zvMa*%Nz!enS=4Sqa)?`0tP5og3|d^W{f?8Q;#5tpJ&R8?9w41ge(6B D{kwS4 diff --git a/backend/__pycache__/ranker.cpython-312.pyc b/backend/__pycache__/ranker.cpython-312.pyc deleted file mode 100644 index 05c5acdc98d1507ab8f9df9f1de867dd24fd4f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3397 zcmbVP+i%;}89$^h*436|U2IvAXt{;0q_LwWPS!N3lc2dQcHJaiy2fj&Q6gh2mMDj$ zl31g*p~!=}37C`?4TB7U@}?{=2Kuu9VJ~4_pbXoG0PDlNCuc4&U@zNuC`y*ncms9- zk%#Aem*4OEzH`xE+-?VgmfZej_5&|Mf5ji|W;Qz86m;$(1~EhqEg}+~MGScdF{USE zOJb2&BNFCK{4t+t4Yi)eJlc-H_dUd-MS?+#Bx_=bJLriaxoBP^6DF;HA+yXf#TlRwBZ+t=u8vne#gOH`9b}A^>1!hfBxiIa;0xO?+aw!9u1p}r6V-muvv=v) z+6X}_3bGE#&R8V}W5W3b-z4X4VzJyt=@Qf zz?v23M$e1W;Na@w;4?V%|4$ABZIq1XCgQ&Y4(?t3e%kG~H&0zU-nK>H&4Gpk;%sE7 zWQQ#IFy3;%1i3Y`>=*G0(3{lX)@BA7e;8c{jh7qKiEMd*36wp6*$Y2k7lw`mV0az8 z4NCpepzhtOd-qFz-Ya={hvWkk??SCvB(LPtE5OSHb(_9wRPsP=jDk$7Hhk4_h^t%j z>T>StDpddPVT51?a3+|L&c_bbg~OW0$PFDihb8FJ}O_4tKDIq>vQAF@#u6NzKo_j&4Ec4--R=U8!Epago&7}*iqvC=VjVaLbO&ftEEzFEjJDVFAQ zYpHyJ=d#=qHIXh9a*3lJbK3m9_+ zkebMHBG|mZa&%5yqq5hicc>3L;!CZ3UOBK~JT#VxC?Vw82*}--LXj z%`kr8CA$gLj0|hfXEb+9!=S%;5=+eQNT3s%vx|6w)XbQ(W&(nn_^itQI|dpU)BKsA z@o-)vt-qI;MkEb){u2qSW`ZDT7M|voSg^u!nkk*-G)w7PHkZ>ZnL-hwFr?Yq)HG*T z9cdQ5ax~|)VlHQp)~ukz3#>+F(i(9~>sxIFP&4OgVMTKoRe<{hqqz*CDSgt+6&O}? zhy{_(rIv62Z4AAJ4GUTyz)C@yHRm!dK!@f|9DX59~}AO;~Jq3`ac)sw>LuL8-wGjKh_{Vn{T9>-bbwB-}m|a3kwRqwq-$~ z*j7Jsh5j(}>CDrS17ACnYA{qe3zp=hoc`h?uoH?mlJ#HL%<5oBPTqY>UIrx5Sk3X> za8$nWaHw`t^+y}Yrnhh{%sE(`UmiYs0@4X#?)lfwc-%p%#ruL>AuNGy6SDeR z-IfZL##?Ki7MEM9Z)5$AIn8#g1>+t5I85LTU4ZK{+ARSH+ Dq1j=@ diff --git a/backend/__pycache__/session_manager.cpython-312.pyc b/backend/__pycache__/session_manager.cpython-312.pyc deleted file mode 100644 index b4a955b4d587309e124afc99ca9339878b0498f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2843 zcmbVOT}%{L6ux(Uc9(URMNt7k7+ZfBTbH7-u7)%r{js7&3{R3Y)9Kz>n05a;ceV>; zF{I%E8WXfWfN2v=(+3Pb^iiK$``Q;*pi4%YnA8{FEHpLcsprnmx`6$Ocj3&vbM84a z_dDM?XMPTcg9ye?tDorCMTCB13vUSSWUUJ(Gl(F9Q)s}s;sI>0xd9HYT#8Tg13X3? zI*kZFfrv2AIo1Qh2$sdCY|$%YD?n6JGxf9$3;F|PTE!=4lCAZ#0^VqpbC6hhR9?5_=dvX1DYm7$VcN_Q0q7|afk*Gp+!{V~k z5^}0JWcjpVoto4Nq}59rsHn_Y0@YFpgFTM2^GMQqTZfvol$Sz>pYf=!a}7+@NVggmBl2=+=d8aJYMcDf zL%BFroPDp{a-`I9WNvsN5_=Gc8FgUU8?UA+3zH4%pD+PX(aS(BRzMvSst8)`2dvqc zcP=lbzNag4MSd7l4kH~3!Z-YwXfn|3Q4|PA_&dV9n+C_xn9tniX_M^un?_MA`iMw; zcl`72`(Ol#4nHqc7!`$n^g8N96c^yB7ZHXZyEn{VLOhIUFi2e~F?6B5zmCavs~ zd8>w1FlwsloaJ-;THC6eTDY(-=FP;B*lnnI@SH5sGlL&IW$6hC8`3fq{3|Mr>$>IB zGX!3=SN0pbL2oeVEIyMhST#D$CbC9aH7y~V(=tFwpsOX2d^!ia87GZhOf)gEhuPT_ zwJU`Hg;uq2f-;J@=s1K8Q2a=AGkHNP~R~b zc+#}*X3LG1uUpGaou#JEg{EW6yIYo<4?b*ubMCd@{X$)EQurf?YIj_1pM7`k&{Fv5 z_v%WhZu-pBnX6>Bd+z~W-FGV)yXX6uv@<$iEaca*;$6}w~p4TZ!9 zN}Kb)z~p~$o_mGz!Bxr-9>G=o=C<&g{||oio~JlRprAp4bDIuETUkAVT~3Rm`_5%m z0(7kqIALVdulQk{#iuf9LrBMKzG29Ol+p_{B^=Kq}6Qa*U1bnwJtb8I2fS89%3RquBH&~vZn$HG$A`LFPU=2$7x_aM;s*TYC3Wo_@< z-Q7sICxC#DwOacmm8TmFA34Cj9#|Jt6f3AG=`6{o*gT{tpXJq*qcI||)v0HP*^GVH z8J!?*BfE>)L^I%n6WM}=l`<+%pf!#c-&hUu;>opOSZrKv^@-A29VcGEjv=#=MW;_Y zyw2x!VpmPa9|PdUGpsyjF;FnRP?j#wc#QEQRPzXJgTG(V-si%8d;zZ_CT;V- E0o2%B>i_@% diff --git a/backend/__pycache__/solver.cpython-312.pyc b/backend/__pycache__/solver.cpython-312.pyc deleted file mode 100644 index b6879d88488014267dff42d371546278e2dc8bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3915 zcmb7GO>7&-6`t8${z;TcN~C@$$y&*_Y(}bODRG?Itz%h^3|Oh#M2U+EcIf5qiduQ!U<$Q*0PeCM{0QnbAhm&1r+F>^5t<|~xufYpz0P?D1uw=0PoWkg88b+) zh4Fqzh7+#qc(QiKb{Oik&WyY7jnU#~3|jmX?8l?#A_;>617=Tl-abBo5`yO-Ccuh*E8B(uJ&o7%?`4h zEU=b*k`*sYDj1Z;T^p~Rd+p6%u^g{Sm*7ayl>`nBmt=d-V3i-Uk~YEq(1w%S{<(*| zDQYu{tR7`whvV7YIIGR%Gos2KFmIHUWI?=~?C-TMXb%SxtRm(WQ59uPlGCmmM9y=P zQuPkskqj_uT<=vQtcn?t*F=FBlXy{mYdGOG=!_^E9)*+Bq7e|~nXIV5T@`{2Mwrjd zD5|I?oo6?^Ts|+#LSmQUwI1FGIBTkbWdlnFo-};c6*xyo8MGu^HZX7ah(Br)RxBZ9 z1i4IR+djo}2F0gTfGXs~f%X5N#y&W^FU9dw;6R^hLc+oPoDl+$;HO*@>iq7fVdLPA zb#gN`2Cwrjs??)c(?Vb~7+UiFc4PrRiZm`wf7rY*xEYJD^sh|cI9%-fFu8=wakdz_ zky!G%!oR$z_wed3Z=Ww6K6AHctE{` zS@MVW+p%XU_%PnNbn@ZueJj*v$B#BTj+Z))-&XDn-0K)F z_Z(Vz{Xtu2#fLh&pZHPRfd|d)l{(bg^(2grMP~*M| zjq2l-Lnz#`=5PLfYaeP=@%InoirNg%^Hm@;)Kv3T3q$(;&`^8LpD_bHZ(}2!V}(n|OJ zNaw;}IUHN!uK8CELlV7G3h%jz*F%X1O|2CVs_&|JQ8=~*X8{+G-fn*QH>2wmd?l0L zDILL=9E2}PS1~>C_747Ku6lOxF9Y1o=um@H@ukP+UvGh|dR2xnHb$dR0Zh6TgX0Xu zjMs@a;Ibix)EmC-Se$g(v}y(ioa!o12};xdxp#wY~u9GjQ;DMBbY zS$viQ$CX@`6*+#w;-&4-x9N=K*o@6*PH+RInH!ujE2&jlc2Xs_Eh!|674l>WpF(O2 zg({`cO_Jz>HNE7f+ci$>r?foKjxBJB17+2~(abtL8s2I63^mYH* z&yuB)i{G5O_&&GRePUs_6yqK=w3M4#-Vc<6tsB9vQn0J|^1a{-l>n-5t~8ofAGPk? zXzeYv_TJ2`w;o>@*$lOBga%5Xfz@O8La&y?9UI~9Qn$~9>Hyaw4ezV@N|K_pv zhL_9HmTyD5*ZjMIQQBUu1W~vH281vgQ&=U4bR%@K&Hp(A-BSfR`G{r${{e($w4Jh5 zMYmfvJ7Ek7a~u+;x|GLOVgB4*HekT6PS{0hgxbwE=@Nl611Su}rwRX%;wEI+yCLaV zi~#;AC{a%U1<(m*{_r;PbF3^YDsub6sXPt=@yOo3#bM$Sl33gI#nClr9 { - const selected = searchResults.value.filter(c => c.checked); - if (selected.length === 0) return showToast("未选择任何课程"); + const selectedInSearch = searchResults.value.filter(c => c.checked); + if (selectedInSearch.length === 0) return showToast("未选择任何课程"); + + // Copy all search results, map checked to selected + const candidates = searchResults.value.map(c => ({ + ...c, + selected: c.checked + })); groups.value.push({ id: Date.now(), open: false, - candidates: selected, // Store full objects - selected_indices: selected.map((_, i) => i) // Default all active + candidates: candidates }); searchResults.value = []; currentView.value = 'planning'; @@ -68,16 +73,26 @@ createApp({ }; const getGroupName = (group) => { - if (group.candidates.length > 0) return group.candidates[0].name; + // Find first selected one to name the group, or just the first one + const first = group.candidates.find(c => c.selected) || group.candidates[0]; + if (first) return first.name; return "未知课程"; }; - const getActiveCount = (group) => group.selected_indices.length; + const getActiveCount = (group) => group.candidates.filter(c => c.selected).length; const toggleCandidate = (group, idx) => { - const i = group.selected_indices.indexOf(idx); - if (i > -1) group.selected_indices.splice(i, 1); - else group.selected_indices.push(idx); + // No-op here if using v-model, but let's keep it or remove it. + // Since we switch to v-model in the template, this function might become obsolete + // OR we can keep it if we want to programmatically toggle. + // But the previous implementation used indices. + // The template currently calls it. I will update the template to use v-model. + // So I can remove this function or just leave a placeholder. + // Actually, let's just make it toggle the boolean for the candidate at that index if needed, + // but v-model is cleaner. I'll remove it from the return object if I don't use it. + // But to be safe, I'll update it to toggle boolean. + const c = group.candidates[idx]; + if (c) c.selected = !c.selected; }; const removeGroup = (idx) => groups.value.splice(idx, 1); diff --git a/static/index.html b/static/index.html index 8f4bc8e..a4cfa88 100644 --- a/static/index.html +++ b/static/index.html @@ -109,8 +109,7 @@

我的课程组 ({{ groups.length }})