From 066f2e507b5997c3ab6461e42b9549c70feff0f9 Mon Sep 17 00:00:00 2001 From: emile Date: Fri, 12 Apr 2024 22:23:53 +0300 Subject: [PATCH] ll --- .DS_Store | Bin 8196 -> 8196 bytes osinaweb/.DS_Store | Bin 10244 -> 10244 bytes osinaweb/billing/.DS_Store | Bin 0 -> 6148 bytes .../__pycache__/models.cpython-310.pyc | Bin 5177 -> 5183 bytes .../billing/__pycache__/urls.cpython-310.pyc | Bin 1073 -> 602 bytes .../billing/__pycache__/views.cpython-310.pyc | Bin 3027 -> 1818 bytes .../add/__pycache__/urls.cpython-310.pyc | Bin 0 -> 442 bytes .../add/__pycache__/views.cpython-310.pyc | Bin 0 -> 1923 bytes osinaweb/billing/add/urls.py | 9 +++ osinaweb/billing/add/views.py | 63 +++++++++++++++ osinaweb/billing/delete/urls.py | 0 osinaweb/billing/delete/views.py | 0 osinaweb/billing/edit/urls.py | 0 osinaweb/billing/edit/views.py | 0 ...e_type_item_item_type_remove_order_paid.py | 22 ++++++ osinaweb/billing/migrations/0027_item_type.py | 18 +++++ ...tem_type_remove_order_paid.cpython-310.pyc | Bin 0 -> 697 bytes .../0027_item_type.cpython-310.pyc | Bin 0 -> 709 bytes osinaweb/billing/models.py | 4 +- osinaweb/billing/templates/.DS_Store | Bin 0 -> 6148 bytes .../templates/add_templates/add-product.html | 33 +++----- .../invoice-details.html | 2 +- .../templates/listing_pages/items.html | 16 ++-- osinaweb/billing/urls.py | 24 +----- osinaweb/billing/views.py | 74 ++---------------- osinaweb/db.sqlite3 | Bin 1003520 -> 1007616 bytes .../__pycache__/models.cpython-310.pyc | Bin 11720 -> 12714 bytes .../__pycache__/views.cpython-310.pyc | Bin 12892 -> 12769 bytes .../add/__pycache__/urls.cpython-310.pyc | Bin 1700 -> 1774 bytes .../add/__pycache__/views.cpython-310.pyc | Bin 11451 -> 11908 bytes osinaweb/osinacore/add/urls.py | 1 + osinaweb/osinacore/add/views.py | 16 +++- osinaweb/osinacore/models.py | 24 +++++- osinaweb/osinacore/views.py | 5 +- 34 files changed, 183 insertions(+), 128 deletions(-) create mode 100644 osinaweb/billing/.DS_Store create mode 100644 osinaweb/billing/add/__pycache__/urls.cpython-310.pyc create mode 100644 osinaweb/billing/add/__pycache__/views.cpython-310.pyc create mode 100644 osinaweb/billing/add/urls.py create mode 100644 osinaweb/billing/add/views.py create mode 100644 osinaweb/billing/delete/urls.py create mode 100644 osinaweb/billing/delete/views.py create mode 100644 osinaweb/billing/edit/urls.py create mode 100644 osinaweb/billing/edit/views.py create mode 100644 osinaweb/billing/migrations/0026_rename_type_item_item_type_remove_order_paid.py create mode 100644 osinaweb/billing/migrations/0027_item_type.py create mode 100644 osinaweb/billing/migrations/__pycache__/0026_rename_type_item_item_type_remove_order_paid.cpython-310.pyc create mode 100644 osinaweb/billing/migrations/__pycache__/0027_item_type.cpython-310.pyc create mode 100644 osinaweb/billing/templates/.DS_Store rename osinaweb/billing/templates/{ => details_templates}/invoice-details.html (90%) diff --git a/.DS_Store b/.DS_Store index f1fcd39383d1368a1d2dca395ee0ec39ac585243..b10de2d52a764a74a4f95c7e20b3d1b0308b8e8c 100644 GIT binary patch delta 21 ccmZp1XmQx!A;@89Xs)ARWM;5AKyV8m07PU3?EnA( delta 21 ccmZp1XmQx!A;@85VX32FWMsHGKyV8m07S(F^Z)<= diff --git a/osinaweb/.DS_Store b/osinaweb/.DS_Store index 2e84bc6a5caf7ca8dd613b9058c90f2bfc0bcbdf..2dc331eaa7815d64c74f63c18a67fbefa6f6936f 100644 GIT binary patch delta 86 zcmZn(XbG6$XEU^hRb=42j$^vSLQ{F4O)8#oLN&2AN)a3Ym1K#wXjvRJ>8h!!)cg1i z`~}YZ5&jD&c%SV`Nt%k&5Fme*{T%1LnvtU5fBO(Wdv9*h;Cipy;jcAx2 z77KNah;o|Xw@>K?+jdw7tOI|W1N`oG)jJzeLdEy@>QyXH{8;*6FzW@%{!bNXtyL*q z(Fu7dXB6^vDypv)RTJERf-*}ytgsx#x8<{<`h?Z=-NN>D@h&N$y2SI8}lu2toPqE=mG9AIVt~WJ){MC!CJc zne-kk7K6dzo_p}Dzua>dgFYWTeR8l|cAR^U9zTCQIgc+A$pc3SEJG@88(hO@G-}Ma z98Z&2Cj8J@$@an`)U}U8O^%{jZJObM$MtNUBH~VAia2zMi4oF#3m?;?#9!xrV`$8B zx;J(QdtvKLrhfWHqe3ggh=N~8L8pi)}^U<=(U(B?l2tZ@wv4X!le3_@rrP)mi` zVhAlqziW6ygDZ_%PQq+Hgt@aYI~1Yrj_bRMPGYFh*46>*K-qz&KJ4-O|8o2Ozbvvx z)&c9lf8~H^9gmMk7?N3AHwMRRt&8#rg@bu3jY@*bEXS(BOYwaa6*%W|12{Ce(uf{} P{Ue}ku$6V-k2>%R5}gJg literal 0 HcmV?d00001 diff --git a/osinaweb/billing/__pycache__/models.cpython-310.pyc b/osinaweb/billing/__pycache__/models.cpython-310.pyc index 9e7b55446a92b158c481bcbab804109cfb2aa8a1..c7c0d5511efbe6dea3698fe8db2a1697a871ad01 100644 GIT binary patch delta 1435 zcmYLJO>Epm6!xsWUVGQx^?El+^V4idLy4874TMx6QAE?KO@VF**+|qNS?D45buo(vE)zhee>SK%UI?{Ywa#iVLz5!efJO^wOa_V5av`i~tH>gGJL&YyOX>~*KYGP7d z@H?KGmHXlQLB!(ibSEoycLu#KOEN9qi=tz~n;_OBS@BL3#_xJ69|oVF0m#fj98eaq zlpU*l6zTuhAa7WFuD&%f4)mV|0G)hb-Aq~kLJ%Y=4}!KgBsA@5Bh%9TUB+8tPP?s} zJ%|XzXIjU?&l-wG9L*x)H*JpWh+6UWgDTc?sC-KN+I?k<$chZ#xvyx7Ux%WqS#gb1 z#y!m|WaiaDe;4&pz6jd^qhAku5xCFhu6Z?#yDUQHxt!73gP8FpaG(TPQv+;CK<&+^ z&>2FQ0Qj8(Km%ouo)rIZOwY)ohpQUEUu40nWX1qB1wG0y0+*ErckZ%onq>M`FG?Bb zo|rK{B&*^p7@gD{JL-{I2$nVzI!x|i@*&@r!t zDZAcd5%mqa#{vp&X6*6-bUNMVmoaM<1MMK_Mq!d*6M}#niXv{ArMcHIz(hd3EqD_b zK%R&05QkW#K+2?9_vLTMFxHc4dkOSp6BlJtOT1?-P250#9RZblMxK2WiC4uB*0Li-Lj_Ni zuZoJjIV1apMdbbR(Q**v&TX`Ai$i||eyq;7@Rax#!l@>lA1*bu#ZYaIFma_e0(hb| zMZb2LEQ`20?c`fQC|pA=4*TLKbxfD3Q{wO1qA7RYfpszIj*)G#?lb^V;73kE#>I(q zp(1all=mjcYl@fa3&a;uovz5{poYx4#=5x? zS~J3R&y${b(H#fOrJI7gE4lptI`ONEov1hFC#7DFsWCziz%T8F`+XLtye-~tER5a* z4&Ma-oQ7h-uo*CP{GRx_F}wHci&0zNa~% delta 1310 zcmZux&u<$=6yCAN>)o|?z1~gY#HkZC{gqYXG!UXnfD|>9q##mK)l}{FU~N2;#AUNK zV;i+Xhy#&=kOGG}!o7-+kfNvuBqaC)IP`#o*aI9m@fRR*Y2O>CFd{!>rx0ZA*jSgV)Em|2Ve4$&jwRp7Xa@hGh>)sB`)-&nU|QH-MYmf`|euF#V8* zMU}Hv40)D^oC8q_xB+Wi;ALhq3%JJ$thld*KC|y=fg=~P^|y~mYVAdjnlVpy`n!#Q zq`9p)N+M_Dlr8BsyNu_GcX@@e)SsY-`d$%qW-rHq)8 zcjPy@(tjn@E4Y9H{7dRVAvHRJanWou zQJ3e9QF29IGd>~f^2E3Rz4*9M%3qPZ634G zU<2M{5Q=#i328TKv()H{PM3@RWAP>mtjiU%R(}_%iBJcaf~PkEfX#Mwm$;-z9Fidx z8OcF;2j-LMS7EqubZQB=5A5OJ(Bp*MuvY8WFrEWQbD}dy7);4y>J0?rKTz*oKKar5 zj*OwHln#1ahz3qj5>xWi;?lV_j5iV10Rm&FbrTcs$X|-ft}>xymEyWA+aFw1O+!<| zrrk&8A}HkzWcTEk_Iz*)=`sS!i}w-EYCLPuru@^MCY$oPz2m%wldw?@ur@A_OEda8 zOx5JK&JvlH&z$*b+#$gc&Pr)vs7l$8lcl){25|^a4==Ex6^Ta-Xt`jrS-Pzc-y(nZ zYA@A)F9o2Ubr%ateFx<%`P{FJiEZFpD5alDfy_1(Ta#b730$pz+=YU=a_TtWmW$=< z6f2R(&V>A`d~;Rx3NvZ(25+_ZqF5a!wT}Y(6`FXYns}IomhhEASqhNN$Z_v7*_A8a zBw({tlaIXB|1t5Ghb^l3^Ha*iN4RzmVHY6GccaI9Jn4%K8Tobilzr`20H64?NsHcly9|CbfFQ;g_2kGW<0~w$IKVXXb~#_ diff --git a/osinaweb/billing/__pycache__/urls.cpython-310.pyc b/osinaweb/billing/__pycache__/urls.cpython-310.pyc index dfe42e93ccedf87a0073a48b28d02329cd0a9dc5..50de502829b3f841a663a0d29b685b2c6c848608 100644 GIT binary patch delta 365 zcmYk1J5Izf5QaUr^M0_RK%%BfvlR3QaR3^+tPlzr6THd;l5CK+q1c)#9XFsv;tE{C zEfqZnU@UFHSpGHN{4;)h_(r~TNfI)O&*Avq<&1q>_#f82pgl|^$PjAQKn@MhIaubk zXk;#dDL|n(${p-D<&KhT2OV@@1(8SOqPHiX$U~p##+m`4kKx{ohysi)Rc;<)a?P^z zhc0IsH}bIhtsQPwzXMJMZ Xlle_N9UW4-fEZ$#iWF#xRQSJt&F54& literal 1073 zcmaiyy>8nu5XU7;wq;pXoW%L+)OIO6*y@m}2!akBixz0mg+O5_I@)1MQU*yUh~J?P z(nskdR8xUY?IU#Rk*1pS-! z$O93QFtobGTOuNnh)L`?;%(6(9j9a76$we4Zu6cBTolN2XN@=2CsIVN%QqZPTE1*g@36nQ9tEgW0OMuBz)v&4zNfEr>ENH53Fw8A@z3$lz z_aBm=bZY%#PEB<+saD$5f~tutTbwazUTu9d2IoaHa)GmZr`_K+-S27w)Rc_tO}=-! zbh7W#y~~HKpZz~Cf0QySDzK?;k{<2szp(2Cd)$7TPHR>*f?+LW#P|Q*fvd598DGs!_2>Vl85-l&PHgXyp{a^3toIh&j0`b diff --git a/osinaweb/billing/__pycache__/views.cpython-310.pyc b/osinaweb/billing/__pycache__/views.cpython-310.pyc index 70bf2185b2f6af5bef77b30b42db229bb5d26e5d..9d21722b90f361bd8a74e404735650aed05266de 100644 GIT binary patch delta 803 zcmZ`%&ubGw6wd6-{z$srM2&6QrdT72q5eSWQF^HeUWynEzZ{MqXxGq-8}Uvfh#pG@>8LE{#~9#$=aC*3U$CpS_?s z%~{p%JxHToD62#>x!vVI=+!vVUU!rgJEbHRGVU~M-FlOY>#^i*acy0;ld7%RUHsE- zy4K>M6xwOT%ZcQmy%Zu2wY6=quo@J)z&CnaNX_cdMB$UCW`sPl+6~i=MmYJ-$i+nQaelF@PuiYS1y2Br*58z>#a3`W`+mLQB$Fa$K{g6h&lX*RTl`O?3d4=tUi0U3kO77 z*i1L>Y^HI@ca)o*e>8t=GTO-F+?cM#5uE>zjm{s5A};H3A}$?S`bU-(wPbJFa1IIe z$*zzEb!gvN(D{{~kZGF(o^vBkI24S9*)yCr(i_fH%XCRkgkzzpd j&EY|Mx7v6=6TVDPAxyr2Yx~3_1w?&);)7(=FH4_%{M2Xo2yy){ruhPwg@fj zcj}z}+2~xySNsOTEzS}vWgV8<9h*_#PMp;3xQ2HUFZDY?}UhiIF8jyKRQ@Oj=uyT}*#BHAUs#Fx=7^D}$} z?HPWSpF_LCSNTh5&+_y90@`!@;ytT%=?`dZwQTK6k#QmQ!j4ege5)^dXk_>5+gDpm z2P#g*L7oZlRpPlwRP+a0qhQ2%a9ydW^>(Eiw2+kZiM-EiAHxJGwaiQXDr#pytMA441W3jQT(&Q17 z6oW^uu1N92P!vkLk=!Y?|6tFwm0q4H@uPZV$t4Ir`M&*aA!N}OX`Bd=B=Npz-xS3I zl@HqYq9jh&zKjOcxl_cdm#6K#h_k4ji9N&cew6Lx<=~#!YH!8ZBHL*{jKyBDG1%9h z(XCF#7|U4b$TR4@&}NCeGB&Qx+L%j3r8H8`K}0r)kPRhS2B-Z}YLP})h@1tPIm*Mp z)V;5vqpUtVwoj~MhqDuQ=x}@F#O%;jE?n-6T;pPLw1%F#2`3_Dz&po}4EoDavwz$V)_w_OphWiB(KK4nUgBb=<#0 z*No0sXIu;kN}j1BFGZYBbFOHkw?2?LANG{d_Ql?;)55Xn8?>Ww=^D8Ibtv-eA$<2= z4jqfGPY-?N*+WmqQJ%wW%iWaZAzkea3zerxmV*obw%i0@5~cYYW6`f=zK#5s7wEu? zL@p7btMu<6U8bq$1W8xvICH>N5_y>jrC5*lnf!b(^xeQ$+yzmVVk5@cFZQ9W?7q`? zM>e;AK`NF#?r;}9S9v4n*ykSiPwXRxp8K@NE5F)@o~n$zBL;*BHXku<#~c6?OuTWw z#X8MNr`wH-Y?vgH!m2$Lt3&|1R?TJYNB(KA&~=CxgajdL*!VjQ=KmFV@*ND#xV?e_db^C#BGFlzI%_+Yh3aNeDmshP!6X`w>Be+Sq*0tq z_B6g~Etau54~^uzAi8>oKy?~5`4$Z}=!xn@67LjgBHtr%lh7X!N1@X05I0oUo+_iO zPj&Fj(b8Pr4O(KtUMa&~o0t!SD`Va$BR?e3_ldksWEKGRnKJs5)m$i;S9}A>f-Y^y ze1_2507hmrmj&iuWB#8(U490EnPiy2q)CP~%$`mLJODNx0Ng(F0F-a;IFRx>gr6*r zwOAi(QNoFH%DVG<*GbiWJf4SbgmmTpj)k*W2Y zF)AUH4%iDwN;lA;s-%jbQ{9uuOj;$Yq{A2*f=Pj7Jl3gGVbd*@(+-4nAjkF9vsr@j zDie}!4#X6;G}sUzA!@*f5J}-Oc^l)KtySGDito4X6nZApjVXF%JUlUFBgrG&HRFL!ZBInS{s7)q#u26> zGPO!s0j%KwNl%`6J`9+dB$gC%qyH(x%|$WQPjC%74HNMR)sqE1Q%$51S=|Ih>joA4 N=L`*lgC--Ut8y diff --git a/osinaweb/billing/add/__pycache__/urls.cpython-310.pyc b/osinaweb/billing/add/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0092be93f4384776bee160f32c75f52dfba80e4d GIT binary patch literal 442 zcmYk2u};G<5QgnKY0{?6&c@oMegT9Sm=J=YV)0VB^-)~xII`1Lotb$MUMVXRuTTkz zbDBz6^4>phKWp#7i3oapdXphHmPOvhB@79ID|Hak&MWXD$NEk^&GNQTTUl+~eCJK@18gLUl{Q9Kn>m(w)}5eQUb+<# zF7BfUomX3+0}j}LufiAcBYfC}ljJX09ynNS0MPmf{2s!4<7&Q;M%(L0Sx0ydx>-BR xUC@=}6&yNop6`5kfEDkj>6_k*IYR#NB)woocIfSfo{ztBw@#;R;x!Nb${JoyX^Hk7CgVrA07>T%lZo!w;vl8 z-@=d;2xc*oSveV#+#cJxGj<5t?2H~XvukE2^KyUe=fOBI?`an1opHzLZr07CaRj=@ z{NJr{j|D7*d5v{g7v^;qu^!BQwzh8#*8hfEt%0LG!3)NP-ZB-BZ4@YL9sr_R4SV zKG=g+4?qu9FeTHFg*C0++OLB;WSt9-SPDQnC;JwQY9}SDj_TGH>(!le2f$g|)wGCn zuIa12{R8c)RApRu8JCGjE0vao4pWG9q81fKYNt$labC^}r9%L0CPZ2sYyXuf*$m+G zG{v1Ff{;ZI#Ttq}iVYCj#nYtj+#D*Gk7CAd(3B%sZCA~4!xNQfgGhJbcudy;9IgE( zby7QVmg%4rkkiTGLVGz^CnXaIy>=i&!awa{IJ zs|6^8OXcSv`lLf5{MpU$Y@7V|^Iiu5wdp?*6`#W9JC%xv;4qbnc}lI71JwpJtsPS% z_U@Zf1aY3F32#zF8ceBp1P6!@QEZ~vLV?IM;uFvs|J$!0gFzY(NaP4y-SN!@!;NqF z@qHFC+tf5wz#Qh()c8wxm(DiSX_(BUDs#xk^8Nppn5mn_dsnaTv|FLjjv#g7UARoV zhvFd$Q!(!S=sv?&ZwfKQ>&yk)utj1c=o9Lg1PowtCrA$r7~~EN`3!^t=+DWDKqBm# zT$0)bdOHe2W%dQRbgrxw227d5C^Q6@xwXr@XIAY3q5a+EW5!jSX7U!N(&DUyWNo)^ z+N5buDx~jnJ+7)OO=9HxsA5Oh;!I^1(B^=1%a3BE;^ZXfh5Bj}0m7c~^;W)^!0sW8 zt>s%gNQFXeKTn}+LV3ek16N?|20nqcs>8VeKH*ma{wb`1XE4>lbu%?^j=RYFN#mS$ zU^6!8rWfC@rgen64G)j~5>A!aa{@wv6KlW+)Wj1o?G83{zv0+Wo|Hl*GbJ16uvM7m zFzy>BCZ*uRyktC+#NZ-&saDop4KkEDomQL|J literal 0 HcmV?d00001 diff --git a/osinaweb/billing/add/urls.py b/osinaweb/billing/add/urls.py new file mode 100644 index 00000000..c29906c6 --- /dev/null +++ b/osinaweb/billing/add/urls.py @@ -0,0 +1,9 @@ +from django.urls import path +from billing.add import views + + +urlpatterns = [ + path('product', views.add_product, name='addproduct'), + path('service', views.add_service, name='addservice'), + path('order', views.add_order, name='addorder'), +] diff --git a/osinaweb/billing/add/views.py b/osinaweb/billing/add/views.py new file mode 100644 index 00000000..48cff91f --- /dev/null +++ b/osinaweb/billing/add/views.py @@ -0,0 +1,63 @@ +from django.shortcuts import render, get_object_or_404, redirect +from osinacore.models import * +from billing.models import * +from django.http import JsonResponse, HttpResponse +from django.template.loader import get_template +from weasyprint import HTML + + +def add_product (request, *args, **kwargs): + item_types = ProjectType.objects.all().order_by('name') + if request.method == 'POST': + title = request.POST.get('title') + description = request.POST.get('description') + + item_type_id = request.POST.get('item_type') + item_type = get_object_or_404(ProjectType, id=item_type_id) + + amount = request.POST.get('amount') + recurring = request.POST.get('recurring') + + Item.objects.create( + type='Product', + title=title, + description = description, + item_type = item_type, + amount = amount, + recurring = recurring, + ) + return redirect('items') + context = { + 'item_types' : item_types, + + } + return render(request, 'add_templates/add-product.html', context) + + + +def add_service (request, *args, **kwargs): + context = { + + } + return render(request, 'add_templates/add-service.html', context) + + +def add_order (request, *args, **kwargs): + customers = CustomerProfile.objects.all().order_by('-id') + + context = { + 'customers': customers, + } + + return render(request, 'add_templates/add-order.html', context) + + +def add_invoice_pdf(request): + template = get_template('details_templates/invoice-details.html') + context = {} + html_string = template.render(context) + + pdf = HTML(string=html_string).write_pdf() + response = HttpResponse(pdf, content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"' + return response \ No newline at end of file diff --git a/osinaweb/billing/delete/urls.py b/osinaweb/billing/delete/urls.py new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/billing/delete/views.py b/osinaweb/billing/delete/views.py new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/billing/edit/urls.py b/osinaweb/billing/edit/urls.py new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/billing/edit/views.py b/osinaweb/billing/edit/views.py new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/billing/migrations/0026_rename_type_item_item_type_remove_order_paid.py b/osinaweb/billing/migrations/0026_rename_type_item_item_type_remove_order_paid.py new file mode 100644 index 00000000..a31aa7b2 --- /dev/null +++ b/osinaweb/billing/migrations/0026_rename_type_item_item_type_remove_order_paid.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.5 on 2024-04-12 17:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('billing', '0025_remove_item_project_item_customer'), + ] + + operations = [ + migrations.RenameField( + model_name='item', + old_name='type', + new_name='item_type', + ), + migrations.RemoveField( + model_name='order', + name='paid', + ), + ] diff --git a/osinaweb/billing/migrations/0027_item_type.py b/osinaweb/billing/migrations/0027_item_type.py new file mode 100644 index 00000000..b4e3697c --- /dev/null +++ b/osinaweb/billing/migrations/0027_item_type.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2024-04-12 17:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('billing', '0026_rename_type_item_item_type_remove_order_paid'), + ] + + operations = [ + migrations.AddField( + model_name='item', + name='type', + field=models.CharField(choices=[('Product', 'Product'), ('Service', 'Service')], max_length=200, null=True), + ), + ] diff --git a/osinaweb/billing/migrations/__pycache__/0026_rename_type_item_item_type_remove_order_paid.cpython-310.pyc b/osinaweb/billing/migrations/__pycache__/0026_rename_type_item_item_type_remove_order_paid.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0d88df0b250e05aead4d368d7b1b0d71c10fabc GIT binary patch literal 697 zcmYjPJ&)8d5Vaj=HwkwoCqacMkkVXMNKhek1%d_+i4#p4E1MZ2FG(Ei?47oT_DX&P zf5{S}pyDr_#K$<<e#yo^w8 z;!qeQ#Fv3BU;#@=E=42CC8YF=%%^XzYv;l**Sc+W-}pzX)#E41VrR}#=@C0MShK-; zoJqZPqv_Ck8P>cUcLVx#(gm1D)Up9=RbO@J6Vt*T^>{I(*jPYY%AwMb3!75&UIz7P zp7=yfBBgw$6cyUGNccdhPur>uqQC$L>;d~)qq8FHzw-{m;!BM!1QME`NoEGz8~Bac zyCj~{)z{*^L+c9cbc;ww-(m3r-N(@k#aY$r?!oJ72;{BPV{N*^INetToniv8srtsu zlNY!y_U;uo*Hw^@Pszur>0r(5-+!mBEuP#^!HnZ!XCrEGLE-LGN|=b`Ul|J?KKXk_ q@=tO#=}yV)bZ+Dr){_y_{LLw6bVQ|m@@#hVIXzG2!h1XrN6|l_7s&1a literal 0 HcmV?d00001 diff --git a/osinaweb/billing/migrations/__pycache__/0027_item_type.cpython-310.pyc b/osinaweb/billing/migrations/__pycache__/0027_item_type.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42efbe7fc0d9f2b780eced373c6a7adb2273465d GIT binary patch literal 709 zcmYjP&2G~`5Z)gru?>|_4~X74A>~pRgy4cu5eP0&kOCK9R*q+yY*>5EuG5k;T>Bur z3D2gvzW_l#Vo?=9?MK->%);%NdF24^Dq^#(qa~QxYP_r2YW`FyMwYyyT52 z1!r#<2$0_yNaQQ|O_map8JmtSDVI$}$Q!+IRj+O9!?>}4#@8`)Q&J+wr2a7hvXTQU z1@HwgB_^v;Y=Gm{1QHl61dL$<>4k*sLQ+NwIkmeLvUmUcP}9j=8>8Dr`S9rI(G%sc ztr}GQrbDHBY_>2^hmAc$WgVbXU8Nx;F(V`~8Y_Kp7S?s|;*62c(4FZTT}J%!C&9<5 z43m0k$?0j^>Z>x?F8XCi+O;th%!jR29D#fhN2eMMoJ_Njs==>R$d#hJwL!9PEA?ev znPF&RfE~7gZLQHeK`lf20^oJ5;bf%Q%Vp&T9&+2^^|^mAcaNe2{Bgx6kIom^XoE<{ z*paJKaed!n_qYXJ`swbl zhuy}-e={ca`vfTyGPz1df(yRSlfUWJ5I>nFA=_3zg!!=Du+tFS&A+t{s7^?qZSVA) NzAE#v#~pE3{sViw#_0e6 literal 0 HcmV?d00001 diff --git a/osinaweb/billing/models.py b/osinaweb/billing/models.py index 1ad96577..0df4aa70 100644 --- a/osinaweb/billing/models.py +++ b/osinaweb/billing/models.py @@ -17,10 +17,11 @@ class Item(models.Model): ('Product', 'Product'), ('Service', 'Service'), ) + type = models.CharField(max_length=200, choices=TYPE, null=True) title = models.CharField(max_length=200) description = models.TextField(blank=True) customer = models.ForeignKey(CustomerProfile, null=True, blank=True, on_delete=models.CASCADE) - type = models.ForeignKey(ProjectType, on_delete=models.CASCADE, null=True, blank=True) + item_type = models.ForeignKey(ProjectType, on_delete=models.CASCADE, null=True, blank=True) amount = models.FloatField(null=True) recurring = models.BooleanField(default=False) def __str__(self): @@ -38,7 +39,6 @@ class Order(models.Model): status = models.CharField(max_length=200, choices=STATUS, default='None') order_id = models.CharField(max_length=100, null=True, blank=True) due_date = models.DateField(null=True) - paid = models.BooleanField(null=True, default=False) @property def get_cart_total(self): orderitems = self.orderitem_set.all() diff --git a/osinaweb/billing/templates/.DS_Store b/osinaweb/billing/templates/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..efbd10e19f0f49a019e1475dba06811bb172d1d9 GIT binary patch literal 6148 zcmeHKK}y3=5S^(7D^jRCH$qMz6g)s$;=*+gplwrPAu)m0ebzmJ7xD~VzX4bF|l!2iNY-Me3 z`2wqJa@%-Zcbx%ez!~^q2GFxbdZ&tRodIXS8Q3x)?}rE~7#r4#;ne{XjsU1B?x8MMNO}ArNSA;|%;N1Mg=@ZHfQ@ literal 0 HcmV?d00001 diff --git a/osinaweb/billing/templates/add_templates/add-product.html b/osinaweb/billing/templates/add_templates/add-product.html index 23c71010..00551e91 100644 --- a/osinaweb/billing/templates/add_templates/add-product.html +++ b/osinaweb/billing/templates/add_templates/add-product.html @@ -8,55 +8,48 @@ Add Product -
+ {% csrf_token %}
-
-
- - -
- -
- - - - + + {% for type in item_types %} + + {% endfor %}
-
-
diff --git a/osinaweb/billing/templates/invoice-details.html b/osinaweb/billing/templates/details_templates/invoice-details.html similarity index 90% rename from osinaweb/billing/templates/invoice-details.html rename to osinaweb/billing/templates/details_templates/invoice-details.html index befbb82e..3d84361c 100644 --- a/osinaweb/billing/templates/invoice-details.html +++ b/osinaweb/billing/templates/details_templates/invoice-details.html @@ -21,7 +21,7 @@
-
+
diff --git a/osinaweb/billing/templates/listing_pages/items.html b/osinaweb/billing/templates/listing_pages/items.html index 981e953c..1c1cee9d 100644 --- a/osinaweb/billing/templates/listing_pages/items.html +++ b/osinaweb/billing/templates/listing_pages/items.html @@ -41,10 +41,6 @@ class="px-6 py-3 text-sm font-medium text-gray-500 uppercase border-r border-gray-300 whitespace-nowrap"> Title - - Customer - Type @@ -61,21 +57,18 @@ + {% for product in products %} -

Item 1

+

{{product.title}}

-

Nataly

+

{{product.item_type}}

-

Type

- - - -

222

+

${{product.amount}}

@@ -97,6 +90,7 @@ + {% endfor %} diff --git a/osinaweb/billing/urls.py b/osinaweb/billing/urls.py index 2565e7b6..36de696f 100644 --- a/osinaweb/billing/urls.py +++ b/osinaweb/billing/urls.py @@ -1,36 +1,20 @@ -from django.contrib import admin + from django.urls import path, include -from django.conf.urls import handler404 -from django.conf.urls.static import static -from django.conf import settings from billing import views urlpatterns = [ - - + path('add/', include('billing.add.urls')), # LISTING path('items', views.items, name='items'), path('orders', views.orders, name='orders'), path('invoices', views.invoices, name='invoices'), - - # ADD - path('add-product', views.add_product, name='addproduct'), - path('add-service', views.add_service, name='addservice'), - path('add-order', views.add_order, name='addorder'), - - - path('fetch-customer-items//', views.fetch_customer_items, name='fetch_customer_items'), - path('fetch-invoice-details//', views.fetch_invoice_details, name='fetchinvoicedetails'), - - + # DETAILS path('invoice-details//', views.invoice_details, name='invoicedetails'), - path('generate-pdf/', views.generate_pdf, name='generate-pdf'), - - + path('fetch-customer-items//', views.fetch_customer_items, name='fetch_customer_items'), ] diff --git a/osinaweb/billing/views.py b/osinaweb/billing/views.py index 7b5b3223..918ad6eb 100644 --- a/osinaweb/billing/views.py +++ b/osinaweb/billing/views.py @@ -9,7 +9,9 @@ from weasyprint import HTML # LISTING def items (request, *args, **kwargs): + products = Item.objects.filter(type='Product').order_by('-id') context = { + 'products': products, } return render(request, 'listing_pages/items.html', context) @@ -32,31 +34,17 @@ def invoices (request, *args, **kwargs): return render(request, 'listing_pages/invoices.html', context) +#DETAILS +def invoice_details (request, invoice_id): + invoice = get_object_or_404(Invoice, id=invoice_id) - -# ADD -def add_product (request, *args, **kwargs): - context = { - - } - return render(request, 'add_templates/add-product.html', context) - - -def add_service (request, *args, **kwargs): context = { - + 'invoice' : invoice, } - return render(request, 'add_templates/add-service.html', context) - -def add_order (request, *args, **kwargs): - customers = CustomerProfile.objects.all().order_by('-id') + return render(request, 'invoice-details.html', context) - context = { - 'customers': customers, - } - return render(request, 'add_templates/add-order.html', context) @@ -74,51 +62,3 @@ def fetch_customer_items(request, customer_id): } return JsonResponse(data) - - - - -def fetch_invoice_details(request, invoice_id): - invoice = get_object_or_404(Invoice, id=invoice_id) - order = invoice.order - order_items = OrderItem.objects.filter(order=order) - - order_total = order.get_cart_total - - data = { - 'invoice_number': invoice.invoice_number, - 'order_id': order.order_id, - 'order_total' : order_total, - 'date_created': invoice.date_created, - 'customer_first_name': order.customer.user.first_name, - 'customer_last_name': order.customer.user.last_name, - 'customer_email': order.customer.user.email, - 'order_items': list(order_items.values()), # Convert QuerySet to list of dictionaries - } - - return JsonResponse(data) - - - -def invoice_details (request, invoice_id): - invoice = get_object_or_404(Invoice, id=invoice_id) - - context = { - 'invoice' : invoice, - } - - return render(request, 'invoice-details.html', context) - - - - - -def generate_pdf(request): - template = get_template('invoice-details.html') - context = {} - html_string = template.render(context) - - pdf = HTML(string=html_string).write_pdf() - response = HttpResponse(pdf, content_type='application/pdf') - response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"' - return response \ No newline at end of file diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 84e97bda0287fa4d1eb07252091dc8e3915338c6..5cccc217142a0e730a52bd40e1fb4e57da4947e6 100644 GIT binary patch delta 11365 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 Hf9L)Wvc!UO delta 4162 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 delta 2007 zcmZuyZERCj815;z?cLgL-Q8V3x3$|?$L&5k1PzG@!!a-hHZn#Gor1N!!?M!O(_00M zI$=236u}o*L?Ba$ap+JO3YjJvH6VmdP4rJS!XJN_h$iw!K7RPV7dmIcn)B?v=e%F{ zd7smsh<)2#l(yRo4fr?JRMzw3!c#?}iMgRA=y9$!C_-*dS9BA%;W4)(w2zsgs@4yt zulA|7n01om5E(AMaHnD{)a zhbv-dX(OiO9)#_Vd~H}PRZXld=w&PnUld+5KR_;SIBjjN3!s@PM-UA*Hv1zpkvUiq z6OFQwhhSNw4E=$EiFvkB#vYxxXkX9RDyS*`n>_?h$6{k9KqNu4$qo_6de#kR908+Z z(djwh@s#yqiS<;=JX4GJ&SdqLSQ*<4LFp%!gxk_tUzA*B-IbcKF^(A8b74+BhE5z~uEIIyyJ z!5{@ZO^_hyCwP^hi$Eh-N3fe5_Caewbp8^#@qfYj{3pyjl2In)fDBn*tpvehjzx z9)eXeh^Ndj-L1 z7_P4{jiPx8{;5^4C%X0|@}?$-H%30DNJ(Ehk?30SfPYNkr{I*m z)HIH!8NR9O3>~3Oor1Y!=}Ol1J4%nF-<+UDGrfGAq~SY*8@F-Ij19GGCgt)o^llS_ z^L)&DmO|SICShD@WG?tw*<(II8y`SAB_=e}>dWROim^ z`G_oiG9)nmIYQ39JjThhUBjfeU*D*N#m4!36B=w zQAR`qf0*z1e43(-IZH=RPZEFW_;=(&Q}5z?;e2=@I|{eL^G#E@(+cyOOW72(HD6dnisrf^ z>H2cIk(@3WA0^QFBwjeZ8K-yP)C8Zxeq7K!Kd4wG0Y4Q|xg<(1$)x|cOBTtDOO)=D KoRXI;r}!@uxZDx| diff --git a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc index b31e93aadf75be5cdef859e998306406e3e6196d..d5ac056339d13b5bdcb7698cf91963a674ae1408 100644 GIT binary patch delta 5103 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 T5icwYc#t5E%i|ZnUUuYvYN%F_ delta 5152 zcma)AX>c6H6;{t4T4@j6vSh8~U0JfUx_!#BEXhJXkWb+Q@CLH1w@32Ydx)M9KB|mD za6$-IxjMlK5WvYzc+hoCLcTFZ)E$=bpB|zKD{)$lojzJ9!NE$gVCVk zWvQBUW3-XD#vQ4q{YAW-SDY@2E+f0jR45&ehDle&t4Y?(Yj`dFF6T>l9sRcGrM#Xm zJzaD=i?-@3cmoeA-bTEUH!0pud>Id&E}A8y2;GEvvr=>rU(Q<;?BRP&(|xy zmiPeQp!hoCgM6dn{ltg(u;S~9kMK>34-g;aS1G=M_!!@;_#p8ue5>LciEraqD?UVg zoNotTA04Kf9ek%!j1b?&cPqY$_#Qr?_$cvf_+G`Y;`{a$MfS^-_V%j4E%8*6$4xz^ zr{l>~gjr?R+LB~8vqgxkAdzoMH)E!ro=%aWyx#H0swLC~mgA^?!g9_Sx;R%P!gA1g zti6ilMu5P>Dw&6s;?mrjSWY5x5uefx`3L9U-60Z+I{AVtU$FK1x~@ z%*|?<#~}vKKksoc)+#TQ)Ui%^vE*2JFC5s(0t?9-O1B)S1yx}@Dvaffiz&l$A3cU& zu?6a_fNca;aUz>B_2Z`HnX7uij6@xo?U0|9wz4`I^rp9}#P5QG-GDuSf<;srX55@H zV(ILmWJ;$W9#2h?o#7;KYCeb9E8p_I$3`iCLHVk$WkV+^q8>Au)?@Lhtf-{hbDE{~ z^a*GR{g-Y`B@Hu?O-~P>l41V{yPh01b{~Xk6oB#KE0>QHH(v*Pr^BG3wF7pW)6!*~ePY*%4=5#o}@Hxel{8L>} zzFQ`CsLnVH%X#k(yY-Gjx&&q#Q4YE^ImSf&c7>sQv#^f)mJ7z| zOS>RYyW>`{1?C{2c#kdvJJq9AYt4>a{h&!O0{KZ@wanJ6cDK@v7?n@ebR4)ER82&M z58?K*;?6?4P*5oTL6<6S?OecF+SYY)r1m=6k7sK~k|7LNMeuH>2gQlK`gB$-T!@`8 zRV#Pq9cf>Obb@-@d^XAAlJCxSk!l} zqA~Ntv~IX4f%$#r5O);B8LS(>?h0}4Tr5r*ZS%>=*mTxNn)Ki_$|;h)SsYHM^S?f~ zxT_!%tKYi&3X$$!EK=amj6u%>ufEVjGj$I+ZeTxJTP_)Bq1{U`f zc)e+9$CbRESC>F{fpow8X+tBE@{NXx?J2m)caHN*e1B2rb7{>vpTJzt!ukO?t&v2j74Z&ZmpaMC zZSrhz<(^&`IYaBs^(B@7@aUdHT&o|4am*Rtp2U&6Qfk7FeAMXNY2r<=zQ znUItN3d(miWU6o6_5^z5Gu<;B96sE+~aCF8{fy2vG7Q61dbGG0G~S!ni> zI^j+wh6M7Smdxw+@w=jRjiDvSzqB3Wz0lGo?v63}YrI@%>(qth!W z_p}bKQa+x?@aqUHmzgwExdj za141f-p2&+72u-@lr!$DKEq3wo&5DA6)#5e>tUy_}; z-44K~0Ztk*jb5{ys?Gc5&)S+sehGaAz()}A+RgJj;!!W{3A|w|YYs^nXpAQ(Cv~A` z61sRp`rDh??`2HEQA0KDn{-!JHG)T{J@{z=E3vuiMT zK5f6HTgwyAWM~JQy5-mvKQ03jtJmRo?L)qdLxVC9*RaQ+Ofh2gCuYF6xk- zPjtCTbhI)RZ!buOA>OA!R%u>(R9-I1s;;5gci|Al5IRA$ESF2WRP@;Xdf5k*=xSNj zJsiA-%&0D^uP@t3>F$QIHE`x6E2o1#8$Oh0yYKM-#vY{78Iqkny?#*o^iF4wBheT8@U=UD8 z5Ur+#P0G`K6|;LGn*^wDx1(U{v*;Aqt$|RI z02ctS0A2&U4tNLfLD50N4?&Tayv9=LZ6=xJ*+>uWnUp@v=+1bUpql=sQBC;au_`V}EGaFH&rGq?w<#_uvP#X( z&&ssZzr~Z7k`fP7>Zd8SIi017QMw3dKf^8V(xRM##FCQKqP*gj3`HQ<6>&}e&RWiB OGC7~kn1zp#<2e9ZG%|kx delta 113 zcmaFIyM$LepO=@50SM0OiKZ=PV_QMlGO_F`~x-!DGR!y5{ibg)6TR_D%(+^a+F28 zLdv3=A85a!LPA2~LuSE}k6;7#6v6^8j<3(X=bj_^>)W$;_3_F|MC|#g?+kCeICkF=~A2C{~N?#m~^Q;n|v=)+t^Zx|P(sMSgg;)4@T;6qD>iqp- zHj_%rFOF$DSa$Hz0;|c6y~-t}6FpIbj9*Xv3%@EpWJ+hF-GTg*y^KfVc=3`wx2u8; zw<)$U7fs{7rfKPRi~-yP4+0D!h9-?cezQEoexE(Oy0v)^0{51^B3WN6UT@Wb7du;n L5Z5BWMjd_wX55I~ delta 114 zcmZpP-5tr7&&$ij00d|CMAMwyCi2NJMorXy#%MHIh%t*V#URD7g&|5MMK+j0(|GeN z#tcoB93}>aVgaBIE=C?kCT1o^w*MT=9L!vdMO%S_noNFvnyQ//', views.add_reaction, name='add_reaction'), diff --git a/osinaweb/osinacore/add/views.py b/osinaweb/osinacore/add/views.py index 9f95d034..56174ee7 100644 --- a/osinaweb/osinacore/add/views.py +++ b/osinaweb/osinacore/add/views.py @@ -616,7 +616,7 @@ def add_reference_modal(request, *args, **kwargs): - +@staff_login_required def add_tag_modal(request, *args, **kwargs): if request.method == 'POST': name = request.POST.get('name') @@ -633,6 +633,20 @@ def add_tag_modal(request, *args, **kwargs): +@staff_login_required +def add_reaction(request, status_id, emoji): + status = get_object_or_404(Status, pk=status_id) + user = request.user + existing_reaction = Reaction.objects.filter(status=status, user=user).first() + if existing_reaction: + # If the user has already reacted, update the reaction + existing_reaction.emoji = emoji + existing_reaction.save() + return JsonResponse({'message': 'Reaction updated successfully.'}) + else: + # If the user hasn't reacted yet, create a new reaction + new_reaction = Reaction.objects.create(status=status, emoji=emoji, user=user) + return JsonResponse({'message': 'Reaction added successfully.'}) diff --git a/osinaweb/osinacore/models.py b/osinaweb/osinacore/models.py index 414ff569..71012844 100644 --- a/osinaweb/osinacore/models.py +++ b/osinaweb/osinacore/models.py @@ -21,12 +21,17 @@ class Reference(models.Model): return f"{parts[2]}-{parts[1]}-{parts[0]}" + class Tag(models.Model): name = models.CharField(max_length=50) + def __str__(self): + return self.name class BusinessType(models.Model): name = models.CharField(max_length=50) + def __str__(self): + return self.name class Business(models.Model): @@ -39,7 +44,9 @@ class Business(models.Model): website = models.URLField(null=True) type = models.ForeignKey(BusinessType, on_delete=models.CASCADE, null=True, blank=True) logo = models.ImageField() - business_id = models.CharField(max_length=20, null=True, blank=True) # Allow null and blank for initial creation + business_id = models.CharField(max_length=20, null=True, blank=True) + def __str__(self): + return self.name class Meta: verbose_name_plural = u'Businesses' def __str__(self): @@ -102,7 +109,6 @@ class StaffProfile(models.Model): intern = models.BooleanField(default=False) active = models.BooleanField(default=True) staff_id = models.CharField(max_length=20, null=True, blank=True) # Allow null and blank for initial creation - def __str__(self): return self.user.username def save(self, *args, **kwargs): @@ -119,6 +125,8 @@ class StaffProfile(models.Model): class ProjectType(models.Model): name = models.CharField(max_length=50) + def __str__(self): + return self.name @@ -138,7 +146,9 @@ class Project(models.Model): status = models.CharField(max_length=200, choices=STATUS_CHOICES) start_date = models.CharField(max_length=200) end_date = models.CharField(max_length=200) - project_id = models.CharField(max_length=20, null=True, blank=True) # Allow null and blank for initial creation + project_id = models.CharField(max_length=20, null=True, blank=True) + def __str__(self): + return self.name def save(self, *args, **kwargs): if not self.project_id: # Get the last two digits of the current year @@ -156,6 +166,8 @@ class Milestone(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) start_date = models.DateField() end_date = models.DateField() + def __str__(self): + return self.title class Epic(models.Model): @@ -169,6 +181,8 @@ class Epic(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) start_date = models.CharField(max_length=200) end_date = models.CharField(max_length=200) + def __str__(self): + return self.title class ProjectRequirement(models.Model): @@ -176,6 +190,8 @@ class ProjectRequirement(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) date = models.DateField(null=True, auto_now=True) added_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + def __str__(self): + return self.content class ProjectFile(models.Model): @@ -302,6 +318,8 @@ class Status(models.Model): date = models.CharField(max_length=40) time = models.CharField(max_length=40) staff = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True,blank=True, related_name='staff') + def __str__(self): + return self.text class Reaction(models.Model): diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index a2cfb82a..1c6489f0 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -10,10 +10,9 @@ from django.http import JsonResponse from .models import Task, Epic from django.template.loader import render_to_string from .custom_context import calculate_time_ago -from django.core.validators import validate_email -from django.core.exceptions import ValidationError from django.template.loader import get_template from .decorators import * +from django.contrib import messages def login_with_email(request, email, key): @@ -27,7 +26,7 @@ def login_with_email(request, email, key): else: pass -from django.contrib import messages + # Pages views def signin(request): if request.user.is_authenticated: