From 3aa2eadc52a1d7c5eff30d2de6bbb8af88a3d246 Mon Sep 17 00:00:00 2001 From: Poker Design Developer Date: Sun, 31 May 2026 16:01:00 +0800 Subject: [PATCH] Fix Django migration issues and add missing URLs - Create missing templates app urls.py - Fix REST_FRAMEWORK pagination settings - Add DEFAULT_AUTO_FIELD configuration - Create migration files for all apps - Fix auto-generated model warnings - Verify database setup with test project --- .../apps/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 159 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 167 bytes .../exports/__pycache__/urls.cpython-314.pyc | Bin 0 -> 488 bytes .../exports/__pycache__/utils.cpython-314.pyc | Bin 0 -> 8991 bytes .../exports/__pycache__/views.cpython-314.pyc | Bin 0 -> 5216 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 168 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 4475 bytes .../__pycache__/serializers.cpython-314.pyc | Bin 0 -> 2919 bytes .../projects/__pycache__/urls.cpython-314.pyc | Bin 0 -> 623 bytes .../__pycache__/views.cpython-314.pyc | Bin 0 -> 6937 bytes .../apps/projects/migrations/0001_initial.py | 69 ++++++++++++++++++ backend/apps/projects/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 3743 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 179 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 169 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 2778 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 473 bytes .../__pycache__/views.cpython-314.pyc | Bin 0 -> 2910 bytes .../apps/templates/migrations/0001_initial.py | 44 +++++++++++ backend/apps/templates/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 2524 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 180 bytes backend/apps/templates/urls.py | 9 +++ backend/db.sqlite3 | Bin 0 -> 61440 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 164 bytes .../__pycache__/settings.cpython-314.pyc | Bin 0 -> 2057 bytes .../__pycache__/urls.cpython-314.pyc | Bin 0 -> 803 bytes .../__pycache__/wsgi.cpython-314.pyc | Bin 0 -> 470 bytes backend/poker_api/settings.py | 4 +- 29 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 backend/apps/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/apps/exports/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/apps/exports/__pycache__/urls.cpython-314.pyc create mode 100644 backend/apps/exports/__pycache__/utils.cpython-314.pyc create mode 100644 backend/apps/exports/__pycache__/views.cpython-314.pyc create mode 100644 backend/apps/projects/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/apps/projects/__pycache__/models.cpython-314.pyc create mode 100644 backend/apps/projects/__pycache__/serializers.cpython-314.pyc create mode 100644 backend/apps/projects/__pycache__/urls.cpython-314.pyc create mode 100644 backend/apps/projects/__pycache__/views.cpython-314.pyc create mode 100644 backend/apps/projects/migrations/0001_initial.py create mode 100644 backend/apps/projects/migrations/__init__.py create mode 100644 backend/apps/projects/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 backend/apps/projects/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/apps/templates/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/apps/templates/__pycache__/models.cpython-314.pyc create mode 100644 backend/apps/templates/__pycache__/urls.cpython-314.pyc create mode 100644 backend/apps/templates/__pycache__/views.cpython-314.pyc create mode 100644 backend/apps/templates/migrations/0001_initial.py create mode 100644 backend/apps/templates/migrations/__init__.py create mode 100644 backend/apps/templates/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 backend/apps/templates/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/apps/templates/urls.py create mode 100644 backend/db.sqlite3 create mode 100644 backend/poker_api/__pycache__/__init__.cpython-314.pyc create mode 100644 backend/poker_api/__pycache__/settings.cpython-314.pyc create mode 100644 backend/poker_api/__pycache__/urls.cpython-314.pyc create mode 100644 backend/poker_api/__pycache__/wsgi.cpython-314.pyc diff --git a/backend/apps/__pycache__/__init__.cpython-314.pyc b/backend/apps/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc2ab0eea51bd758fb26a665a57084c246e61007 GIT binary patch literal 159 zcmdPq3V-N=h7@>^MY(Pc>LlA>9gC?WjN`@jPApbK+@|KN@RZMYe zPFi|mZfXpO&`nM(N-5SY$j?qK(oIP%&P>mXNlHx4PR&b+Nh~NRj){-Y%*!l^kJl@x hyv1RYo1apelWJGQ3N#F4T``F9iJ6g+v4|PS0sxn#CMf^_ literal 0 HcmV?d00001 diff --git a/backend/apps/exports/__pycache__/__init__.cpython-314.pyc b/backend/apps/exports/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e76b423cd1128fb1c7b29f6b5ad84a755be53492 GIT binary patch literal 167 zcmdPq87L>XQt=HBqb(ir{<-^Bo-7D$D~#injd*en!_1p`Z}zdr#ljZg@wM0;mLLEhqWO(%TCCc>pN*r zC4_8mgl7#SN)PIrgSwcswM?SAL)-U)%9M;L5zZ3jet;h+LA)l408~EXE*K_0eFZBH zf#l+{W>Gx8_4p$!k=BA#4}%dVx{K++^R2$^jIi%ob{JA?URbx`8a?0;>YLLb9A#nxj26sSFhrBe~z4`B5zC2Dp5J> E2a}?XC;$Ke literal 0 HcmV?d00001 diff --git a/backend/apps/exports/__pycache__/utils.cpython-314.pyc b/backend/apps/exports/__pycache__/utils.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec8983ccf5af62ea2ce872653328667ce4b167a1 GIT binary patch literal 8991 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 S6j6N?LAw5(0u{KpqyGSdj82jO literal 0 HcmV?d00001 diff --git a/backend/apps/projects/__pycache__/__init__.cpython-314.pyc b/backend/apps/projects/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d1d9b016e3b3af876777c936c7a161a32161c8e GIT binary patch literal 168 zcmdPq^MY(Pc>LlA>9gC?WjN`@jPApbK+@|LTMRZMYe zPFi|mZfXpO&`nM(N-5SY$j?qK(oIP%&P>mXNlHx4PR&b+Nh~NRjwvY0&q_@$DUOMc q&&7&-6@Yj7|4)$;B}#HkQKAIPvZPd2>eMNe*rJt4b`)XlxGf-gvEr`ewO1rN zJ8Z0+hyqPxG==R`3Ir+WUP4_087Sc7(4y$6M}k;@>J+`Sa137xqY|3j+V^%zijpZi zKvAFz==sgg+nM)f-h6N9u~5**!Sl`E`ftp7IqvV+XgtokvimDgirh6$;ODuwc*-YG zx6RwAEyg7|!QR6Ojun2%)%bA#-)Xz0Q-^8k1WVToES;vM8!SC9uyhHwA#T+B1g99~ znQJ2_E1JHT*`J={8b0lA^BgBZ6e}F%1&-RTIjOyy%Rx-kvEp0`w0>mi5SeYoz0~n+ zk6;%ZXBv@t;p?tvZIawIS#X|#S@EI%Bdw+cm*75QtJ?*@uFuk2CHUeIyv@- ztioV5&^n5xV_bs2IacI3R)MBf6s+1u*(C&9{O<(26GzOs?|)1P^>DP?-03jvbjNff z{vIJh<5xM_D@0*$JDGcl<3{{Op&HfA{%U<@=9*{fjGeqju)c z6Lmu(o8nDnleuMOO)6-Vc@$Zt(yFFx@yxd&-4Zn=yH2k&cSe(RUCoTz2&O)9gHZng z^KbE%-seD_1*8JaiP_wHq9n_ZUYln-x!d7ri@hUK$bY z9y3jwr=^?P1%3j~ieRHo!47daSfDY*+X|K5_m3CyvP2bGl;{?>xaDFVQN%F88J{SE ziv#iY|(z9~>ib z6fqFYfs+$l^KSUlfnnSS+)h{W?&}|UEVChaWq!3d+DBf(#&Hx06aye|&E#ALhQ=e! zyzjm{pPo|{O=gZlL6w;kYcqV5wnkAJ~BU5Hu4$-Ekb8tK1-E##p-81+&u9; zRfd%FoBDM{UB6CQFb(!s)D6X&!&1{#|49zH-CW?@A!Iqb>#JJ;cm}^N8_@+Qb ze+c56pF_U<*>P;g8?JeKtKQy{yq$iy@L=IjF~j>#@%)ZIQuFs${rx4~@Q)SKJJEP8 zI#`VkmRG+RHKOU_#hpk`Et0B6Qsv7=L74QOju3~Yk^TNHyXC>iy`_1t2xZ-u3xJ#zou zGFI?NE4jrA3kGKWp$AHVQ*br?>iAYxSTItD27;zJmb*Dtr{Dp^cbSOy0^)s5#K#0b z?FPj62m!!IkU7uky3z{x$G6C44Y4Yn?l_2j6XYSV?NUzk#6P{=CyRF zI>e+aZtsY7lJFd|pcz;Lz{BuLNBjVQqun1*-kYpM2206O`m@FRi zfuyY`4R@HxC)yC%XU%BxH~>7>a*}KU+2S8Ts2>8TMT<0aVAs^0ZhTd5eYLJ^Q$f0SHgQHXVAB+)7W2 zRa^l4(OwgTJ^-P=3Bo=hK>GoN$AlmNCIq(&xH4RlHWgBc!I5%^&~;+k_1+rFOWKI$#l< zEVMtZc{3E?Bj$czRI{>j>qQv63dS?&C9Wr8@Oa5v={(s6gfBfGgyaGYVBM$YPqKX)!KWmLLpQj+|@ z9ChLHJBwDY1222b2e^ePsH*6PE`{wexrn}?z=YQS2%?V3!JQ*9c^He~SS_5Wh7;u} zBRo-j>luvV&8`)zIB>EWN|sYbXcDm7z+^dQ1SbKLjfu;4BXkP-oAybw4L3u$ZCWFy zjL2kh0YN&AARR-Hj#(hZphn%yE8mc^>$wSe)vQ!x1YR@e+xTAw);^hq!d!+!zc4)C zw|=|K5acnIV;wX3sh#KfzjDX^!uj`HQGV#dwL98vZI1(W?_`)yeK>dL((Oxo9H@J# TPJZmJ>*K(^z`r<9O~?KNCC8#$ literal 0 HcmV?d00001 diff --git a/backend/apps/projects/__pycache__/serializers.cpython-314.pyc b/backend/apps/projects/__pycache__/serializers.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2453fe6fcc404f8d79bb91d9f801516b777ac06 GIT binary patch literal 2919 zcmbVO&2JM&6rcU@+K%m*ki-u8h9DOgIU*quOB%R`p%U$>J#r+ca_ApHPmK$b!>EV@r{1WNmLB`wuI<>4qtI@Y=lS@}o0<3Vdvmrs z(na7~el@gyNhahKcIuz6*4X9HD3e=66&6TZV8R%-#RV}fF$vm&DlN!qAM>RZrlkGM zKSuh=NutVeqWYGF%(1${{ofhMYqOw>Q~>Ee0@>vv1Aq)3feg9GE9+N?Nge109Fs9Czvd(*?$6M|x|w6#ciDkq9{fb7#x;G@q`CcD5dtQ3 zzukA?r%aX!6I8;)TMCohLkVywaYpn&Ojaf4Q)M`UkN4Cz_^fe+7R7?MgzS#CD)uvJ zSq3EnQ&f@pRSA^IJa$0Y{ir<*;vU&K7QgS?=^6Z1p)nYs11NC!#Vv(Kv4bHly_@hRG7iG;65MW$L`uv{WTCwG1kX zOJYOIq^m{DU@WzL*+6}ulkdWZoG(nK#rjSYeHsqdGq87!V-r z(~~gifU!v;F-|e?c^LFSri1L)!D0+*{j<#=_kFvj{Gw6B)UC)<7xcn_OYA4 z$40BMGnLqx?f&GWiJwwisYhemy>r{)x#!VdFXh}^PKG+hBVL2|?`H%M#O;D{1(}Hl z>NoN-J_%4aV0n+G5seWYm+7!3pFW7j%#1Q(*fSavXc{`m&4A04bl z&;1rX_cS_PPQQ_XBK}04coR^3eXj`!@A$Z~Gh?)siQyy5L~o<+?BBRWbuG*f6pE3K z95B#9-CObi=FHphz%<~{01X~EaexOrzM+Gtv5k<=;TVcxYz(1rDISMf?p;s%T@_}U zD(@-0H#|lJ_!BSGE3a=^IWXpTNf=01l^Yd0p!!%)RUj4pJYFlR^H6~-d*A$@Lz>EW z^!z3dQd2jyLf+nNIoe?^Npy6{@FCl@yM=b6G1|=KGVgmZk-*6lDB3Dwva4ejp@+Bv z8DTQVwKrF6eBC&Q*GjBj6vZj{cTR)2N1jK9AD(`E`dQ>c`O5Ri_(S8d@htK|`HGtx zO*IskEhZzpn*z6Ks}!CDUl!;Fm0+BQjCDP~R+t2iTlIKMao-z``}m-40mA6x(d+mO z+4qE3zVRyV72LzMS%?Qd^jTO zn&rx=pJgCgceYfgA_nd$jm$0=Y&RV5b)q$_m9|8iX)2qiN)jUPMCq6W6uo<`D$&zB zB>40`8T?D55SP4>8w@7xGv;%qmKN(jhx8X`So%y?#!x1&QYBd>S0E@0_zkS21o5ZO zyEdo(_knzftxT)$GLN^y$(S-Zhz|#W{mt!`j=M6rGwavKGk=cv Xli>aA@b-L;kCvwXCU;q4Rf&57Evd3_ literal 0 HcmV?d00001 diff --git a/backend/apps/projects/__pycache__/views.cpython-314.pyc b/backend/apps/projects/__pycache__/views.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f08beddff2ea68e68b298d1a450086b5e695d4d1 GIT binary patch literal 6937 zcmcgxYit|G5#HnT_>f47q9i{gQO}sREZMSTS$;&dBU)rEOALLM?Upgih-aCWM6!D) zD-ICX$)8X`TUh}bNljZTK#Dp=(YmOEIBkIRM^d!^NRugrtBe>(>?FS`#r_evK-!%< z9(iKvx&hiQz`fa>*~jh8d^5A$R$gXAr1X5e>D&<;LLWmzE}9&1?*Sn$q0`7ud69?W zsd}JQUX@49t3_Jv)p)eLR-`pvok!2>MOy2nJqF$&(mJovW8zIBt@oOF^J&UYd&@lK ze7VQMTS!0UH+Zcc8*lSe@D(0AZ?8vBQw_*(^qbmMU6iyNzquN92&kZNpTa zU#{RgN{qKC_*FT6nPPscf?w^|Hz8NW=dhlO66jDo5laQTfa= zU3kjhuIXVr)QCHLN!(#!6;x_2zqTiL0&&%d%4aF8B2)5?AIo)wcf-6ymgs+Rk!9=A zquwDP{%2eU$*U6{Rw0@?lf{aWlW~!0<3Qy%sqIS|#&4l~e58l2r`|9Vfzw_y9 zzq*r{|LpavcN4GPNxXLF_rJUQ>NTk!!(lK)Up14V=ml&gEog*8dd?dlh7X59E3gBYbc73@CyE*tG+gLBi*?Xx^)QSt*tuh8@Cm>B zAmi>AbS%a(%n6kur)$TK;Gu*4LBIQ{J{rPdZhJg7&f@K1mWzx<1J8s;$JuB&5Q@jSfIM9Q43=w; zUl7c>uHZz3<8dRI8D5F|8L2LzRUM)&FI{}$;({ZiuUoNiobQ|K%i3F0_SUq0OM+f; zv@Sh+Eu3-eOBh!y)eFWemPJe2vL#7xxoxn{*3Hx{?9Lb(h}hMEUk|=Hm~r$bjLRlR z)>M}=)n!f2ndk3Xhrv#=K-fl`&i<(db?NisH2<0+P)sZD6y!!ak3wK|;P5?>-tEJBu z-;j`sz>+FHE@(yUcp!U5XEeq;&%~ypVG*uGI1|*q;|vDG#Q=jtE}IBl7_>o9kFmU9 z?vJtDP>gp!3sx`Umk3oAIY8bnSiF^>873!+gmM{H>s714f7py9odSOR7K0xieyDgx}q(iU!~Wfm80$IiL|5pp~%#oF*pIh zrr!?yCXjI)`cIH4ZEs7O+a8KYGU)Be7@C%8%WU~fd4{eb;y*s0t?y0M_hu}6ll0y- zEiyKLdA}B!?O9WO%2aL93IE-N~BW@1D>0olNze%ves{q))A?f&G93ba~O) zUya_c?sS{gADAdoufsgBEfMp+AjkSY$GihM8w96WRDAZL4$_qEk|1Ip#Td0;r@${EX>94;|V2d=C;Qm&bDm)oF|Lz9G+-(I3nQB0cf#{4y_7nAp(VLOq z%4mJ}#`r*i7${C-S<9eK%4nJPRR(5bibvSt!x$ZC#!B!(_7 zWcOP6JmY0dnQu?A1VYn93-I3pdu2|^Xoc8babZ-9j?pt_#>kX27Jo&LUXqAg74~M$ zul`6|Q~0vSi`OD?kHS;?ZU29t=|uG;$MxIrSG8zxKIcd6Q=nVQxc}4ZOLu>AIUoIh za^vMs-d!TjRqDr}?ie%^yPyKQlrjPgftr{O2%0mI3HCYbP|OL0lX$4}kuVz;j3LNU zgZza!E9j@9P zkx>%J3)<;OnDpq*vXQZ~yvtc|;Fv@{2!ml1{5IYWO@K>5C$7(7z$Oggs+5>$4|@mQ z$3#ahy_71(2^w)#&AC`4DyT^uAgCf?Ov5b3qwaq1!JvP5m=Wm7&^Q~8kaR@@Tf?AL zlJ5uX6g06o8zt!uBk9Olsfh`oFqj1H6(@xBDl8qFIx;zi_W^4^u(Z+%fU|_SVqKAfjNFG4Gaeri zgVnjOh)*aTU~CivjIQDUW7$?SUpH5mwKb(|O=(+8Lbu{*UK+X9oN@F#H0ap`d46H!LrZf)v+USB zAD9bd9W5zG%hJR(Z`$!ViB~E&%@58EW-FUhmCZ}vy5>q(?oSx*>rid|m4U^9D}#%J zS2tcicBA^ejqhyyZSW80(wm=3(i>Lnj`^Osp85TA``@6m&Rr?zu4MP&w0(dibhL5S z^s?!)XNmuiZX@YmO~d8!CEHTh&wF3*UD}qcY)=?gDy!xP<_2KpWJ71V@^RATXwEuZ zHyy64uC!xs!nmr_7#>@xsGi^Y%GL!YUD23$VtI4@70;q)=4irw--v8g^JQ~oS!;93 z+DzVJxw>Jws(!i333WyFvVFs<1=(8eA=+k4Xzy2|s+OhWX~#Cjv0m3@cMPO<3}h^x zB<)!{LXlkX%lo#k7gGIwbw6czY$;8UvzqU&>#0TdpppddOE#r>OXIz zpzhFmcdJKp{*TBh^2;y&JNc!0MC~h)Ym|x=MpTNtR6}Bg5?STCytEK+Y4Z554M0#Y z7UDY}6>F7RLCQ<7iBX`YRGgL1F?li8%11^eW1&zAo4ZJRN={#Tr=;Bb%B4s zUOwtk%&3!3C%8_J&?amC>0T{%Sp+N z>$;p2K)R?XymblgE|nr@&F>(WvljMYEt-@x3x2*RXQihA;U!<2PgU=H|A(L4_(idE zeNMWYEtRY0GSsSK2PZlR(aV8TDdp-4-c57~xDVvM0o6gM;1F;>smN^`IABiDVRkY` zF6AIh#2us}&KSHCeiEc;$#KgLY8V(!V3dmvTJ%BSFFEjkt&(Sv+=*Elnafy52s=W4 zoGIr}G}@Cz8Ef95EL*GR%je3o*2a{zap`Q*+L*R>B(%keY;!UAt-oS}Z1c9sI@>qf zm*`s|*neX2#FfBe;FnvnTMwkR9=I{}-gn>mZn}0jF|=Z_%}&ou&t9ClxDd@+w%@dD zU$Iuq8(uLiv}dfY+jQBidB*&`@_$WPZDPu5L1mR$vomFOzR{9x>`FCuB~9Isy^>dy zve#Y7nyz<8vIj;|2SzfM6F2D-kiDKH*()H(i~IX`qW5J7KXS@ z)CE_KumO|1&)^wMqK)Yo9&Zn`qvVeR^5+4E0f2?-B0gz~|2l|TB9yP^N_Vgu!skNK zu~<8qh;4@t%C+bIjS%A*!IbAm&qyJV+UFg_5aEc5MecxO=~e{n zO43R|EAj3ELwtcjC*DLDvM)(x=>256sR{OR{B6=l6a{fVA{99*in@i`Z=tqZsNojs zzJ;8(kmIk&@DXbK2r((dtm%--nCQOTn&?PV8`o53YM8pGMygG#BDq#a*f))hX{u>W qRY~mwR`V)QYwha??xei(Kp@x7QWAel(zq#2ZO)Ib{Q^ddd;cdnX$C0( literal 0 HcmV?d00001 diff --git a/backend/apps/projects/migrations/0001_initial.py b/backend/apps/projects/migrations/0001_initial.py new file mode 100644 index 0000000..e1a10b8 --- /dev/null +++ b/backend/apps/projects/migrations/0001_initial.py @@ -0,0 +1,69 @@ +# Generated by Django 5.1.4 on 2026-05-31 07:59 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ('template_id', models.CharField(default='classic', max_length=50)), + ('card_width', models.IntegerField(default=750)), + ('card_height', models.IntegerField(default=1050)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('export_resolution', models.CharField(default='standard', max_length=20)), + ('export_include_back', models.BooleanField(default=True)), + ], + options={ + 'ordering': ['-updated_at'], + }, + ), + migrations.CreateModel( + name='CardLayer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('card_type', models.CharField(max_length=20)), + ('card_key', models.CharField(max_length=30)), + ('layer_name', models.CharField(max_length=50)), + ('layer_type', models.CharField(max_length=20)), + ('visible', models.BooleanField(default=True)), + ('locked', models.BooleanField(default=False)), + ('opacity', models.FloatField(default=1.0)), + ('z_index', models.IntegerField(default=0)), + ('properties', models.JSONField(default=dict)), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='layers', to='projects.project')), + ], + options={ + 'ordering': ['card_key', 'z_index'], + }, + ), + migrations.CreateModel( + name='Asset', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('asset_type', models.CharField(max_length=20)), + ('asset_key', models.CharField(max_length=50)), + ('file_path', models.CharField(max_length=255)), + ('file_name', models.CharField(max_length=100)), + ('width', models.IntegerField(null=True)), + ('height', models.IntegerField(null=True)), + ('uploaded_at', models.DateTimeField(auto_now_add=True)), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assets', to='projects.project')), + ], + options={ + 'ordering': ['-uploaded_at'], + }, + ), + ] diff --git a/backend/apps/projects/migrations/__init__.py b/backend/apps/projects/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/apps/projects/migrations/__pycache__/0001_initial.cpython-314.pyc b/backend/apps/projects/migrations/__pycache__/0001_initial.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8b3b6b77fc49a88417ab2cfd173a2fdfdb6b1d8 GIT binary patch literal 3743 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 RMsG*&#Fyj$B2djs{0|>uXMg|z literal 0 HcmV?d00001 diff --git a/backend/apps/templates/__pycache__/urls.cpython-314.pyc b/backend/apps/templates/__pycache__/urls.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0a394bad9023317d7799f3f1b479778662ff527 GIT binary patch literal 473 zcmYLGK}!Nb6n?WitE*xjf-XrCog`EuC@3+AAiZ>$^Qvs_WahdqGgFZeNT-hdgpT!Z zJa}m!3Oac+ymn|NbA5-$_rCeQ?>(69m2?tR{Y=)c00DgIVNvmaFe3^Kp#cQdpo#>_ zK?4z^W>igKR?Kz;M2sZ1AfKFQQ65Pgy5cf# z$h4rn(02uG`W-H0CK^2|+>S333xW@l5iAWNTS41&Uf}lVV09@ebHNV6ZlyGcG7Iy} zvwU2pyel_o_lwue=S&|it(y+L^iO1~I{mao9AHHFGl-PLAjP_2)xH`4WjPa0SY32I`1C579 literal 0 HcmV?d00001 diff --git a/backend/apps/templates/__pycache__/views.cpython-314.pyc b/backend/apps/templates/__pycache__/views.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9784652360d065309791cd70115ce79e569bdb2 GIT binary patch literal 2910 zcmbVOO>7%Q6rSC+*K2$2xUm!4ah$j`khmr>X$nRZRTWK3qLN@1Q=m0i8+)6YIPo&O zZVRUfgp>%0rWcw@paMduoZtpG4!}LzBJFCRCqz^($Y~+=`MtRr=4cw8pXM?V)dfxYnjyTV%X&=%R6H%?QcjsyE3&Q-?)fvhVq;f(!)}mp8^`9CfG(oE4N{S1 zchnsv>)cUyl;*irW(2A1c_x6)euj|B<=8BEt+h$ac`hroq6mBjxb5%#Hi-jV+>gq_s8{**OwR9KUrSC^ZELxKm4(D z^TFqL2wN@@$AUbs5N}D*iny%m<>~_QsaTMv&uB#i`7aMYs9Ika!Dc1%ZiM3 z;wV;XGsIOY%k$NR67kH)#kpBrtu2(29hiobxT-U6DMei)oLs38URG6Qp@eDVu$KxN zE9|2qxf-qzuf0uSdy__Idn?bj#oo}jtv9y~YN~{O#0r(NrsGFoaq0%`2M~*Bi${mzW?;Yw448o-BQSI?aCC9f^78hqv9u+|zJJ<0@e=&jPQ0}Gni(H6 z;$vn!b2pw@d-b9vhO9t%HDX4Gjp*<`wR=@CBPk=2vI6#Mqeg7h3iPgCHv2M0U#9Nm z!~VKg?DG7LM7MW?LtTAay+{nLjDL7?%@N&%E1=@uD(?co=7KK(T|}|}!3O6UiODqh zMP(%?ut1wCm3YA0RH5Voylwpf-lqQcS9|+0?dlV%-7R?}FU)9Hr6S;Ms#Nj;-b=l< zze#?;`}SkBCv^axIEbg6QUEM8ms*;12=IXx5W3msMfaGRycBduvnvlVwxLGu$IqJr*%gCK~%q+F6~ z6}=#9ngS#!YPGUn(B7G!sa7;1Xjf(ns;ploPMg7!VVg5C&0NCGDmoFztBN*V)z4g` zY(l9DQiCivQIR3=(!t{%|!r2#JnI3OK{J>#f~h-rEtt9&Jhmj%J;?1_x_o_ZdCn62E5c3R4WA`+ ztz0w1DI=V+gz&f5%*+)0)-qF+-qJ=iZAQoLM#t7(e$^5JmKa=l&Fo4VUCDhaFsKe&Fpu@$!NM!t^gFD$=c1$tJWyM6A~IZCvhwUuU7HgNJ%MHv8=WXWX!b_` E0e@6bKL7v# literal 0 HcmV?d00001 diff --git a/backend/apps/templates/migrations/0001_initial.py b/backend/apps/templates/migrations/0001_initial.py new file mode 100644 index 0000000..212daa6 --- /dev/null +++ b/backend/apps/templates/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 5.1.4 on 2026-05-31 07:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='CardTemplate', + fields=[ + ('id', models.CharField(max_length=50, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ('description', models.TextField()), + ('preview_image', models.ImageField(null=True, upload_to='templates/previews/')), + ('color_spade', models.CharField(default='#000000', max_length=20)), + ('color_heart', models.CharField(default='#FF0000', max_length=20)), + ('color_club', models.CharField(default='#000000', max_length=20)), + ('color_diamond', models.CharField(default='#FF0000', max_length=20)), + ('color_background', models.CharField(default='#FFFFFF', max_length=20)), + ('default_assets', models.JSONField(default=dict)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'ordering': ['name'], + }, + ), + migrations.CreateModel( + name='SuitSymbol', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('suit_name', models.CharField(max_length=20)), + ('svg_path', models.TextField()), + ('color', models.CharField(max_length=20)), + ('template', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='suit_symbols', to='templates.cardtemplate')), + ], + ), + ] diff --git a/backend/apps/templates/migrations/__init__.py b/backend/apps/templates/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/apps/templates/migrations/__pycache__/0001_initial.cpython-314.pyc b/backend/apps/templates/migrations/__pycache__/0001_initial.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cdf83608a5101844c0b0a82394d25b1d98f178f GIT binary patch literal 2524 zcma)8O-vg{6y9AM|KqHQ!7)EJ|B0zE6emTF+Oz~pAZ=2zCL~3`cI_RUP3&EFc1;3O zB@R{3J#ysQTaNCj=`F{_v1Ds5jnq?nvIOe6Z-1Ov1gl-iyYJ0>^Ua&@y_xYx!EPS~ zkNWq()2D8V`qOY)PnT_+u7Gh!?NA)ON@+BFnN?=Rp*dEZnln!IQX>@Sh)|q!+p%V{ zwFs>5b%*uUx;T1_N_72Yxc3tb@fD>!7BoqbRpKftA}Xjk3u?W4Z0GbbFdS0bFgHhO z%#K@gaJ1%3Qd-xxYc1G5#IhkChI4Ft)>;g0kP&KUj-xpz*EMg)m0~zoN36)X=V@y= z;5>i}w~^WA2zA}I0OJKr-$fXh)yMhg8LJPFfljk>-8*3}*oM5+5y_rIhB_k8bM|yZ zp69&W5g9%=doLibT(tJ>ZmzFQ#|YpCFT#OFSKi~2elE(nlJpGC^|!LsG2;Vf#$z2= zjf@X+L-Wpe>c={*3f9z~^ElxCE9b-ilWPQU!xu%k9aB|$_7?y*_(0iat%yF$63*)v(F zCrH2=pq7^n81Y%Hxk5Qhx-DCjgrXvggtgqPkb9QLN?8`oQOodBA@YKjph-X|YYHzb&v`)A`JCdI~qiT%dVz#hU`MMb=!BuES6EYqXz<@u5T;&++B6HiM*5-?G!Nv|IC zwc6EW4$|22AcI~-=HYxrkkbH0Ms7umo6(d6V}_0gAc$Y!V2%(EZ+7xL@$ozy%;f?C zJHYebmxY269e9^`epkY(R*+;QE70JUWJ!Z!AOR7TkSroOCm|IZhb-|gniAeK&UkEW zLE>F}BH(31E8<;8FEq>atr{g_H{Z>CbKf$ZqLkA}_Y#D?E*0(mz-=kN0J*S7E-M&G zdHE}-N|*Rlkn;**#4Pcct2WBey||EBTv+;&_>>ZAT|2!zuWE1wIyLnjkmhqZ4lvSro$}@zgq0C{_A$rJC{;_ha2W6>TR&+@J`c7hh2wXH$9a1a@`ZFdSZ=G{B5ZB=e>I5 zYBh58<=m_5dggI0@~zHpHbRl3zIrrKjV4}ZYSFaL-fV(+9(%;{{VL*vlVUOhfjjn7oPud}uI1D)k;(z)vB zTqUhP$kayHb@pK+Gdm)Tms zrI(3GR)><6zTcw1M(gR-lk{pm&7GvVdV2FDy{Svjn-ui}{g64MsMrPrPUsQS^t-~r zvo0@$n27bbe!Po6Z{;-MB2lXZlVUb${jo{5>JX=mvhu#`H#dm6C#<3{O3$MD!T@?c uwf5gFya=xGPehHwtLdO=`qV|yBY#lW&Ri3;>t|n`9Y0~m|DnJ!3H}AQL~0BG literal 0 HcmV?d00001 diff --git a/backend/apps/templates/migrations/__pycache__/__init__.cpython-314.pyc b/backend/apps/templates/migrations/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c125e458a9de2d93a82a02fa82418789c6c7e6cd GIT binary patch literal 180 zcmdPq_I|p@<2{{|u7673g9WQ=FQU zmY$fK8UrG9lM{XzRauQ2Yi(_&# z(~A;IGV}9_W8&j8^D;}~/', template_detail, name='template-detail'), +] \ No newline at end of file diff --git a/backend/db.sqlite3 b/backend/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..153fd5dee160233de47e466c410d509536e29d55 GIT binary patch literal 61440 zcmeI*&u`n-0S9nW){i=l&9rOAErwxQnE(ro6HydpE5NX6iMD8Q(&S4+U1V8!!y}6ZS}v6iHJ~+hB*fU%`o~ z_lxg+-VahFmF(|s>kbhfm{wnP1c|xCuq^X+L0}kWf&Ss>pWt5@D)5TT zj(7EeMjkt)KQvT_*or;U9s5bYYZ^)rsOXwP9%z;NX1yDPMH6zj_FBz@meB6pZhcoM zrX@)&t0?Sr(vug3^{^Pa_hR|!E?3}XnSHC}s9l4k?IJB~$*D zS}BKl-4rKB%20KVi-JRSqcJ_xFs+&Sf>yY#4$GD!Wea<)Z?^VYom;K_XoGsHr3HCi zJr_;5?Izvx+TQN858BP`?L$AXb-Vo5+G2rkG}xbfKVcdzD=5=eqM;XOxkeND)ktqe zM3-vCDaA^py);%McF)p>j&2T4a}F(XqLbGZy{{fcx?@rX?MIs56Ibk^sznkc`fHNr zn5dRBbx%#xGe+HKB++!WZw?|Im|9R*?L9oQ%+VPMHS$0m8IGdbHgW7k+9d%-{~mdX>PY~uT!g7j`Chs|E;^& zRMZBk%bQ#A6btcXCLWoVeX_p9)479kx~F1!ytYu_4@Gv|ir2{<$cFlaSkZ!s*sE)z zG_6;d>cWh=g$dG%Nz^Y)o2=uTwF?ElTxNfK)tjjC2F2ga$0ueyGMJE`XsPptp5i9mNhSags*&<)}*hv9lD%drL1OLF!)@Vc(K3u;*X$?QHR`q42Ryoun^ z&@kzQpE0m$og$+^@K$iCI;~J_l?@gB4d3yZ>+8mRffq&gr@45yh5a0s8-~0vqx-@H zpQ;Pp+-LWomm=1IQhW)XOoe#&B>H%gdKZPRX&T`oL;J!odk+a+FO%Ws zQ0?gs9anUbie>nL;!W2`ultAXNyiR}<>=&NEts?ug4C16G7=D5DE;2@4$S|T@$x2H zDDWE_?2qL5c=31a|FVOXBsXKM`00X?a=NOYi|TH9}V5Z((HLm9uG~+Q7mGc#%OYm5Uw%tLF}j02lNoG5yd_JCWc)3YcJ&a{f$}2 zyJQzAVlt#KzLPKTro@ha=nYWqHFa=gDm{~)T@D;?5-RF&s2FOO7)syN=->3LT9Y)X ztBeNvqm&F;zoYMW+Pn9|v+R_FXO}!V+N5N2M@m?yA{FpF7*}{nVxRWC@kn## zxxDwOW8BUayqHE1lWb(lZu0T*nvxE$}yPuus*fPG3K=RCjpVe#@r;nOM2S zQ}LhHWqLTSCJwgog*+KcNe$gyj!&NtF4F$baxXF5pSU-;J9Gmt2tWV=5P$##AOHaf zKmY;|fWYTMpq9-stEFaeq0FvSDk8l&sXMxAR4di`Mn&F`M4_^IQ*PXp>(|A4t+rW{ z=5owRsTo{8dS)iMAxYIcnH*F4R@1+j+b-h|^ z$Xks~mX=gXmNcv0e#UA|loz>onGE+1!@a|O^ttF>G!g<3fB*y_009U<00Izz00bcL z*%G+S&fQ>7JzL;Dp?`Tk`7j2bnUjLF(Pvlk7ijW4_lV&>;Qq+{hWi`$HhqH^1Rwwb z2tWV=5P$##AOHafKmY>IC-9~0>KYq9TrmA|cK%9swKR=zzho1n%6&1rvdRXJ7Pv9q zSF^G&Wmotx*!#}j+{@XO@Af}m8<86V5P$## zAOHafKmY;|fB*y_0D-u`8|;O9rR7Yf*<6|5+U(Y(il~aBq}AxZO{8||zniq#kZQe( zrqPfOfB*A;{_Yq5`qdvk`sHtX2K~gZ_cH&izYF^B^Lj8MjBHXx&cA&5blL6gyMB|{MtkpCGZdCSqoDyBF! zCoMfOH#G)C=q4u?r4;KH87L>XQt=HBqb(ir{<-^fCb|d3o>Kk<1_OzOXB18 i3My}L*yQG?l;)(`6|n+M1ld^(Vtis|WMnL22C@J~aVO0H literal 0 HcmV?d00001 diff --git a/backend/poker_api/__pycache__/settings.cpython-314.pyc b/backend/poker_api/__pycache__/settings.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b36311f11397543dece670dce1e3a978be94594 GIT binary patch literal 2057 zcma)7%~RV(6qkiR~^aYw*vaSu%}okQp>bu7k$>xCWU; z3+N_9as!Za=o7Sva!<1bmdqn|nORwOZ^gtTy;Zkz4kpBG)t%gdW#`(~F}5|mZRXmx zb%bk#kF5k~u&R^8viqIkYvj$AgKHfd=Y4eEz>ZmO6P!;4TnZHgyJKqEV_lEL!RJfyP*@z@9VW= z+%g<~Bp9Zkj>HZPiZW6tCseDNPem$KRj!m3nyFbWf?p5~qN!oWv24e^^Gt3H{u@Vp{$OZ6dY48C|-#Vb<@3hWu<8uxZ&^{W?kqIYtzIH!;Lru z+}8?jq|n3$DAJI>y3>b*wATxT%R^cJdhOnwOZMdf`D{8XN}Iw?N!6+X#4dPs)ruuS zQC!}J#I*xkZ{icnKIYqc-E8?8^Hsf$%bn&vwt*TkX%s9-nj$}zRwC~FD0r{S4!C`P+*&a@>T!$1mEJ zO`MgGn;!+yG!3JHPjnmeev6yrlvli72V(nD=B|7QuUXBe)#8i(G6wx@EGmA?d=Y{j zgMG}RV;}HEn7%jh$r$vTk2r@8J3fND0r!~yVbeQ^O55wWF&8TfG@@ySRns&YX~TVP znEN&hPa0({hjNL*-~a0)f9-HW2)WV*)pRW1_#uC(pQ_AH0b#y^1gW8ee`B zUwsu{eG^}M6<_Oe=gD$6cFrZbq4TMQm&d*IYB%{d$Yt1W>TNchV!N?Hnn~xni2=t% zGrenKpG%#weJ*nb)Kou_>!;WI>HCAw#Bypd5z58}(O4)vm`EhqZgjA~WN-JF^dQWH zQhhGn%kZ8$_wxSh^yi?G24KhsrkJU@ZnB@4??(Ia$u8HACcEMD>AO89bDo@m2ouvF zNlw3vyiP7cOki-KADjmpvuuya4r0vQCp~7y<1hAd)qZgDECa#}`%}u!Lv8*AaYKa< literal 0 HcmV?d00001 diff --git a/backend/poker_api/__pycache__/urls.cpython-314.pyc b/backend/poker_api/__pycache__/urls.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea2d9471146357c77ad2017752820e9c20b463ab GIT binary patch literal 803 zcmaJ<&ubGw6rSCk{gI@xO;QX-p%xJvn`}H31&IMA#RPvOEbT2Zth>`RX|lV_Oh9uA zURu26=GCJoul^a9RjLccgC}n(`3Ic+(NHY-VBdW2d*6F}GwkM-WE`;2K40&DZKo$1n|MZl9d#Z4W;i%k(&6RNP#e63!%nbl;fVSM0m?zjwU(|${v8$I^E%qRC zTR49UCZe(yzXkj+pZMbs<#`V}I^Fl=o@ES1CdzZ3LJ*}rt4kP`2-RuN7(?CZl{_#` z>yATI2itvQP@<0TfQ&N%N72w3=oCd{Dj?At$HtM4ZA+TAF&ZL^cCc;Jm-&R3F#EdI zwSz@iV1_VcX+aydwTDHY$woq-3Dj!n3`>EY8DZC;2wTJxtJ_a@pL($u+tvEx&aU>{ zi-%BaGcL*EQa76AR;ya8G>xOW zdVE+OEdIGDA)?gvoiHC~al^2&Wf)ArAzQFJrte_I!UQRiF^Mi^apYgRgj-8oXrs2- z_b5yL+xY;-(IeQ7x}}H6YddBS=}{?ICb7f9&*p-SLf7&23)AW%-`4-m(W6aDaLp3i zJ#6