From d416431102ef4965aca6d25cfc310ca44fabe339 Mon Sep 17 00:00:00 2001 From: Iza Madeira <imadeira@tic.gov.tl> Date: Tue, 17 Sep 2024 16:24:45 +0900 Subject: [PATCH] update slide --- .../__pycache__/serializers.cpython-312.pyc | Bin 10114 -> 12267 bytes apivisitor/__pycache__/urls.cpython-312.pyc | Bin 1673 -> 1761 bytes apivisitor/__pycache__/views.cpython-312.pyc | Bin 9988 -> 10372 bytes apivisitor/serializers.py | 46 +++++- apivisitor/urls.py | 4 +- apivisitor/views.py | 14 +- .../__pycache__/settings.cpython-312.pyc | Bin 5748 -> 5748 bytes mci/__pycache__/forms.cpython-312.pyc | Bin 12677 -> 13634 bytes mci/__pycache__/urls.cpython-312.pyc | Bin 3047 -> 3311 bytes mci/__pycache__/views.cpython-312.pyc | Bin 18776 -> 20480 bytes mci/forms.py | 39 ++++- mci/templates/layout/base.html | 8 ++ mci/templates/slide/editslide.html | 35 +++++ mci/templates/slide/slide.html | 136 ++++++++++++++++++ mci/urls.py | 5 +- mci/views.py | 47 +++++- 16 files changed, 319 insertions(+), 15 deletions(-) create mode 100644 mci/templates/slide/editslide.html create mode 100644 mci/templates/slide/slide.html diff --git a/apivisitor/__pycache__/serializers.cpython-312.pyc b/apivisitor/__pycache__/serializers.cpython-312.pyc index 9dbc8320b6619b1a6cfac3bc280abe3aceb873ae..f4a5666b5670dd84047ce5a539f9c0e5483cb3f9 100644 GIT binary patch delta 4616 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 F{4Z`Zz0Cjs delta 2790 zcma)8ZD?Cn7``{jO`7jE{Yu)Vz3tMbck9}H6xoNHVOv+{wsuZ8rPyV+$z7NArfJVj z+*Su2T5(fR%K;fG4E!O82!$XB$`F6ZKz}$8w_Ok?3jPqLY}27Q@I2>kNg6uvLLT1t zIbZL2zfOKjzBn5A+VA%W?7LKd{a8z6F%TA87UQ{uD5QmSjoy%L9BbsVTW`uXk2N#d zleX#MtbNSRd9QBEM#dtdU=xOgv~NL3`!(srAYBq$gRPtkFfLf)+BjFsxVjP-<y?qy z^(C&Ia}A7ZEO8y2Yhqk;iIX`OW?ZDib#ktSajo~cPInvAqD<Qj%cR)pcBO;9Z#yBn zsNcS~IB6dj=bM=uYT55LU_rQ68#yOk3pHJEz14BvNn}QnE(RkXI!FtYRzTYWnsh*t z0iA%x2M}b!Z6AXL;jYalb>0#fSQ9ZP#eV#wpU3>g1Ck<c2{WBU0KE)M-;|oyCUYdC zCNt>~#aVs27c--PcKSm!EDq3boRP2$g4?V3Dp$~Z&Ov1z2DybeflsTpKaPPo9divk zWlLO&CFrlNRJ>%~3bx>$6}If&#PoJ>s{k^9+eBgzt6cU7H~_y)H#C`3bSW002c$)M z+TG?-81*#iqhfRu{mvb(@YYr~V*0X$>5P$?$rM)hmLEG-cxxMd%oCZH!LHyf&=O!h zfZuKdq>X^>0B$r+UeSwNFaW^bWDp<&K$Rjd2=r2H19f{-z3{E+IF`}16`YGqsx*BE z{n#7rmcc&UsR;}x=<nW$6~{y|;Oi2_)pWhTNgSq+``a19mlyrfXeqR2?X*hN>7<sO zA=;cuG6k}gUiWWnsmlBScCYZ}Ub-jHW*yW;rvewnQR)rK4EutQIeA?iqO-v>qFlTg zEQ&i0VmZ(B5hf`%v!-BZWLnK?1cd2;N)BKaaz*i&_L<y_X`j^c1XW5l(4XtN*JFZd zH?+J`L!N;gcwW^rX;wDrBtw-fKZlId&7nTaoTGFq^phyl0Xb4UR{xi6o*%|d+J^&p zWcNdYL1Yy0Bmi3~L2?9g67WCPjAPz&02MF+;O8L~6bZI>3glVPX@Ca6A_F-n<0GBL zf174Sp0G-&vam6?oT@xm%Bjjd<k^!|C$-%fO;7WSnC_j&RbuJfLp(_jVWXpf;|xrH zGMUm<!$@hmo=hqt8Dp$bCo)V}oo)zohv>cVoE7*Xl&kHsNIQFCbksLk>~B3HHnG>C zhV@|gM>aN{ePhk1J&Kop(bmwzdl1Un^cjVTQn%y2H>H`JkuO*Ue{i1Hhm_Cc^#U6q zno%&li118dLeEU8ghvYTF`XG)Hfws)nlVK(hFX~B?UYQjQ7f!DNb4{;Sa~k%8@#m5 z8h&(T8)+=}d^Z-CGk<=T>2vI71Q_7;Xg(+1vN=MYWp9TPet5|64wG`oU>M=O{Ujvb zdw9p;9qbgiatDtmp!2Jh8xoof;g{rrt?IT}i~_LA_>z9R>a)7L4yWX~B`~nsRF;ME zT`%tnJZ(ql;qLb89#D&o%APoShUqV3PnZl(G@O&nx}D4Xuwws*`v_nGt1Um`$=oI4 z&D<qgHqG(Zprhy0nqf9gv5{f=W6$^XyzU*y1p^s|N}-qI>%>L+cYL!$W)!{I(?s|6 zzUekyM4K&WMxNg2?H@8-soZp4JC)~^W(HEnwbWE{hNb+;97$Uxh3hDGtG7t3w-hw1 zEbaUx95t#uA-+xDQTDK2@{97x@Od^uUcxeoyat)qJ}-M-+7lSMzoT>Nq)H}@sx7f- zg5Fr&<$RBc#x{CUX`x+f;^Q(?N0vY8m@5HJ0A2;u0bl@uH_0o2Hvl-f`sF<f4)8kt zV9jBl{6HO1y6L{PU(vSys8~z4^sk-g+qPr8o`D(MpG#}{QyTkoqG#q<ujVNk$2iYJ zo`MOeLjaz0h_LCYSaTLb%d_*Jnn$y_bV1j)6Wku%#<;?O{?Q+CC9ev}D?*ai4!jTw giJlAItKp4T!W-`hOu5rXmj*gKe+ms^1J9TL0Jms63IG5A diff --git a/apivisitor/__pycache__/urls.cpython-312.pyc b/apivisitor/__pycache__/urls.cpython-312.pyc index 17363d1c405ba69cebc573c0f75b31723634d211..0893e60440945b96e8a19d68a82aeb23bb296561 100644 GIT binary patch delta 379 zcmeC=eaOpunwOW00SHp`UZ&+w<dtNcGf_QQB3Cd<kdc9jA(dq{ND>I5gi?jF)F<|- zGJ~jX5b7S7n#{%sq4l727?iGq(#sfCtU$UUCLxn4e5rydd~4WNGeblf8B+M8M1b}( zrU(E@CZH~@$#)pl*#&_-zAT-|c}&vcLTiL!>cJ{O>e--jqG)nrKskPhoUk}TE}bPx zyi!6_a`GG|T}GbCr<nHe@&xB(rlf{trj`e%mP~GCPGDm#28m35!d%WMF*$~%h^a_u z@@bYDeO;hi8G*Ri2}pimW@Kc%&!Bpj!QeX+17k4rcc3JU{0w4GE@PcP`82B#(+94} L;%s>=+CZ%UZJSWl delta 307 zcmaFJ+sVs&nwOW00SNZIew?O0kynzjV4`}k2qOa%Ln_N^kOUA!38o5WsZN}v$_%1* zL8wPyYBCoigf@cGQBb-GO0Qy65lZ2U5(b*bn8FVvnSf?#Oy*!xXBPnS__DMn&tj4m z7hEH>ni*mnSS3h38&pmNO->Xj#}APc7DLFTvqXtiifc+tKEb5R$UXTR)1Ju(nBym_ zv6L~2PoB$CG+BhTQePWr2O|&{8vw}<%#4hT_Zd|0G8lYkVqkP*{tlFcksm?q$$MDm QGkxHgoX?iWq6yRn06x+}`Tzg` diff --git a/apivisitor/__pycache__/views.cpython-312.pyc b/apivisitor/__pycache__/views.cpython-312.pyc index 4bcd2a15fdfacc7f6c7d4d227f423b0ec624ee51..d2fdc9f943cf88101f434f04b60be6ca947510fe 100644 GIT binary patch delta 2962 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 VJw#gEd^y&0G1l{&zz3L;e*o^?c<lfH delta 2766 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 diff --git a/apivisitor/serializers.py b/apivisitor/serializers.py index 785cc19..307dcc5 100644 --- a/apivisitor/serializers.py +++ b/apivisitor/serializers.py @@ -4,7 +4,7 @@ from rest_framework import serializers from django.forms.widgets import ClearableFileInput from django.contrib.auth import authenticate from django.contrib.auth.hashers import make_password -from mci.models import Produtu, Kategoria, Subkategoria, Munisipiu, Postu, Utilizador,Dokumentu +from mci.models import Produtu, Kategoria, Subkategoria, Munisipiu, Postu, Utilizador,Dokumentu,Slide, Imagem from django.contrib.auth.models import User from django.contrib.auth.password_validation import validate_password from .fields import MultipleFileField @@ -107,6 +107,12 @@ class UtilizadorSerializer(serializers.ModelSerializer): instance.dokumentu.set(dokumentu_ids) return instance +class ImagemSerializer(serializers.ModelSerializer): + + class Meta: + model = Imagem + fields = ['id', 'image'] + class ProdutuSerializer(serializers.ModelSerializer): kategoria_id = serializers.PrimaryKeyRelatedField(queryset=Kategoria.objects.all(), source='kategoria') @@ -118,6 +124,7 @@ class ProdutuSerializer(serializers.ModelSerializer): subkategoria = SubkategoriaSerializer(read_only=True) munisipiu = MunisipiuSerializer(read_only=True) postu = PostuSerializer(read_only=True) + imagem = ImagemSerializer(many=True) class Meta: model = Produtu @@ -127,6 +134,33 @@ class ProdutuSerializer(serializers.ModelSerializer): 'kategoria_id', 'subkategoria_id', 'munisipiu_id', 'postu_id' ] + def create(self, validated_data): + # Extract imagem data + imagem_data = validated_data.pop('imagem') + produtu = Produtu.objects.create(**validated_data) + + # Create and associate image instances + for img in imagem_data: + imagem_instance = Imagem.objects.create(**img) + produtu.imagem.add(imagem_instance) + return produtu + + def update(self, instance, validated_data): + imagem_data = self.context['request'].FILES.getlist('imagem') + + # Update Produtu instance + instance.titlu = validated_data.get('titlu', instance.titlu) + instance.save() + + # Update images + if imagem_data: + instance.imagem.clear() # Clear existing images + for img in imagem_data: + image_instance = Imagem.objects.create(image=img) + instance.imagem.add(image_instance) # Add new images + + return instance + class UserSerializer(serializers.ModelSerializer): @@ -157,4 +191,12 @@ class PasswordChangeSerializer(serializers.Serializer): user = self.context['request'].user user.set_password(self.validated_data['new_password1']) user.save() - return user \ No newline at end of file + return user + +class SlideSerializer(serializers.ModelSerializer): + + class Meta: + model = Slide + fields = [ + 'id', 'titlu', 'imajen' + ] \ No newline at end of file diff --git a/apivisitor/urls.py b/apivisitor/urls.py index 94bd7b7..6c50d4e 100644 --- a/apivisitor/urls.py +++ b/apivisitor/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from .views import CustomAuthToken, ProdutuViewSet,KategoriaViewSet, SubkategoriaViewSet,MunisipiuViewSet,PostuViewset,UtilizadorViewSet,DokumentuViewSet, ListUsers,PasswordChangeView,PerfilAPIView +from .views import CustomAuthToken, ProdutuViewSet,KategoriaViewSet, SubkategoriaViewSet,MunisipiuViewSet,PostuViewset,UtilizadorViewSet,DokumentuViewSet, ListUsers,PasswordChangeView,PerfilAPIView,SlideViewSet # Initialize the router and register viewsets @@ -13,6 +13,8 @@ router.register(r'postu', PostuViewset, basename='postu') router.register(r'utilizador', UtilizadorViewSet, basename='utilizador') router.register(r'perfil', PerfilAPIView, basename='perfil') router.register(r'dokumentu', DokumentuViewSet, basename='dokumentu') +router.register(r'slide', SlideViewSet, basename='slide') + diff --git a/apivisitor/views.py b/apivisitor/views.py index 8ec5d19..97429cb 100644 --- a/apivisitor/views.py +++ b/apivisitor/views.py @@ -1,6 +1,6 @@ from rest_framework import viewsets, generics -from mci.models import Produtu, Kategoria, Subkategoria, Munisipiu,Postu,Utilizador,Dokumentu -from .serializers import ProdutuSerializer,KategoriaSerializer, SubkategoriaSerializer, MunisipiuSerializer,PostuSerializer,UtilizadorSerializer,DokumentuSerializer,PasswordChangeSerializer +from mci.models import Produtu, Kategoria, Subkategoria, Munisipiu,Postu,Utilizador,Dokumentu,Slide +from .serializers import ProdutuSerializer,KategoriaSerializer, SubkategoriaSerializer, MunisipiuSerializer,PostuSerializer,UtilizadorSerializer,DokumentuSerializer,PasswordChangeSerializer,SlideSerializer from rest_framework.response import Response from rest_framework import status from .pagination import CustomPagination @@ -184,4 +184,12 @@ class PasswordChangeView(APIView): user = serializer.save() update_session_auth_hash(request, user) return Response({'detail': 'Your password has been updated successfully.'}, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class SlideViewSet(viewsets.ModelViewSet): + queryset = Slide.objects.all() + pagination_class = CustomPagination + + serializer_class = SlideSerializer + permission_classes = [ReadOnly] \ No newline at end of file diff --git a/e_comerce/__pycache__/settings.cpython-312.pyc b/e_comerce/__pycache__/settings.cpython-312.pyc index 6ec65c047ec5e58446a2367a435beb4d98f94028..0abdd23e96be221cc20d7d2464b21d06cedd8d40 100644 GIT binary patch delta 20 acmeyO^F@dIG%qg~0}!m%d%2N2Qw#t{0|qz% delta 20 acmeyO^F@dIG%qg~0}#}nc(IW?Qw#t}SO%j2 diff --git a/mci/__pycache__/forms.cpython-312.pyc b/mci/__pycache__/forms.cpython-312.pyc index aeb09ba9ba926f117265a4d9a469e62c8abaa4d9..d7ae30b21ca246ad7ce13433f438fa331e11d4c0 100644 GIT binary patch delta 1016 zcmZvbOH30{6o%&xOzFe6JnV}W+EOYVS_<lhhe5yuf`M*ig^8uH1&ch)6qLpoqM-o- zNb#13C?O#sn#hKXE;Md*;l>RMjf9xEaiI$m301U-#&f2in@-X%=id9zf6knH8oT_u zSMye_Rx<E>F8SKMRz9aOlEh}&RaVI|Ellvl7!xd`UBt?rin@4STwr^2Bqjbaa9QN0 zm~E~jBue*;t#r~dZN336LJc5701bi@*HH<ys)z?=Lyn2YZ8dbGXkL9A4xZs*1Rxfh z?Szbi)p`2DI_u47HHvD)Qw(k)N~Nts-w$M5ykduvVp2)FC5g->#qgyVedypp2_=c2 z92W^U1G~S(v(7G7br%Kg2p?_q6j<+JND&D{6Jj254iFfpyQ?9vl51&L46O}>Tw z&4?);J}E(`H4fzziV;6(tGga#M~&EV2WW%m_%SI1n)`$Wx~eyFs}L87BOVvA{5#|2 zLOB|(Al!&M^kqc{vC}+nw>4wSBq_o|7rZ=KIZ7;3T<8l2L-dQ=(-b5@wukNHqFH=) zN+azz4+{O>_Rvs3z*g+Y!u^5X(14GZ306#NL)h_zOWT;8R?8z;^KkKzJP5{^?Ofdi zw_Q-URK1l~O1JbTl>+v)@Y|OY+F)L$D+(2jE7a^0mc|WcBBL9I+HyX}C$xb`N_=<+ zxO|Mb4&YVkCamKfoAUpc>-UET!b5(41=cW3*DTdkV^igS%+<$7w%pC{a$ELuWNJ+^ zpW1BtOFCV#aw2<HHK}?pFHDb7#s;oqUW5y64G{bsV-8rBbM7&K1G$M)eq#V>4^;a2 z)8ZTNDCvBF@0KCz5FLnX2<bl|O|vwL(sW2SC1rD<L>g=-L@D{1{=wjIU#MPq4oj$l ziR{zms#mp5q=a;kxO1^`t}@ABoNOZs(nyxLRqcIklEFA>EGEi0x2T=derF(*jQ;|I C0Qh16 delta 511 zcmX?<)tbzAnwOW00SFvUyhw{vpU5Y{n6*(on~9}TO;dgI0j6|O#;VO460FQXN>AFF zk+EX(IVI1@n`L?!%O(p*iLg}w^%hl3j*`^`N-b0fntV-mDr3Xu964P^#yYUt$MO>( zY9;GHYC*&n5Tgb}sDOol8b2_$ZJwkEw4ep3=`Pgp7LaVq<YUU3K;eZ7lAAeIq8V9x zfTDjlXR0PJ8TWz|_<{&O5YY!B`a#455HS%%Oac*;L4*^Cn6mkg`dUWDE}$)jlW%Lf zGchu5R?$*qWSl&iQA(Ms3#0}_{F+>>Z3k2a@)C<qq5{|^Z03WE_A8n?*+*4^bsmtd zw0V(^2BQqvZjhWNN0AngDw+c#v_VAU<Y&4ejB1mu_0k~z<O0iq2*t?<^fcK)EI&=7 z&3Q)kjEu7;zcZE)1qU-Y{J>!XcIKSP3MR5#8-a=$fw=hbWOtK;T3(Dwj3JB@RHy4t d)c?W&Vt?^t<YaVYoWVMue<uG|1`rz@>;NGsgn0k} diff --git a/mci/__pycache__/urls.cpython-312.pyc b/mci/__pycache__/urls.cpython-312.pyc index 308dc3ebd8b9d854e0d85ff9bd67788be37f2657..52d63ea373af80ee90ec47aa87df10d2db5b093f 100644 GIT binary patch delta 467 zcmaDZ{$5h!G%qg~0}$}4yi7CWWMFs<;=q6+l<`@Eb)!ZAOFa`qDszfiDr1%#Oa+2Y zF<ZmFni;|et1}0x^FYYMSSc20>MVikykN2jI>id1E?qWCEtNHk(Qk4Ci>SLA(0Fzr zHvpj+#sZ24!Pp3TjrD3K2(OBlfgwt*(x%cz({}S6mU`y+Tdc)7nJKAN!l@~lC19q$ zO=ez+Rc4Bv{w+?pV3lY}YEEiND!K}8Bw<a)Tf8ax$)&lec_r~h`S~S&np%_dIWF@Q zsQ_&+QUwuelkGV(xQu~JMj$Ru*}ReSFQdapHU?JC4)F=9)3qmRFL1xYqH~jl;{vDL z0@mgH3;8!>Utw_q3n(m5y{=?@QOS6R?iCh~53!6!{7enpA2KHI;MQg_1R4kcXjx|1 delta 205 zcmaDa`CMG%G%qg~0}vc`xs_JO!NBks#DM`hDC6@6mW>(#EGp?zQOc>TSspNX1YM+* zs?5ZY%AU$P`2vfG4p5N~LK4PWW44+J!mi?FV2Dz#G_N$*wAdWNTF)$^$#{!5B|o_| zH#M&$z9>Jx#7|RwvJvOy$s$~-Tn0d0j6hthx4D_?FC*87U`9iJrUvd0X_F7|XtU@6 Fr2y(dDBb`7 diff --git a/mci/__pycache__/views.cpython-312.pyc b/mci/__pycache__/views.cpython-312.pyc index d48ed3a9840a2403c9190f59027d9fadfac7f5dd..0dfb00288d4512d87aaad241cecfebb4db27ce34 100644 GIT binary patch delta 5304 zcma)AYiyI(8TRK(;$S;=uH<3|CvifYhJ;JQZQ&9wp(~=L1<D9l2Rq=BINAB^(!pAr zmab*A1$xxAEUf^wTUP<vSSD6=qa6}cHFcfBQWf;Uq)J1ZI;k6!{uw`}z0dnO_Gd59 zS@M(fp7Wk_p7Y+$ajw3iq)sZuAG=&rO!PV5_(lKqCC7@Zl=H`?f0R6HR!m`2*ga4` z*wEWB*x1`R80ZafpJ$+Hu(`KcF-4lgB?nEXF`GWU(@8Eh$SvWrgQnhKxSX(>#wrYB ztt3|(<oigTYLJs{)KO*Vm_c&2L2f6x#vpf)Tx*bLlI%6evq<(C<k=+G8RR)6Ps_^5 z-utP;pY7=FB)Q%o&n3CRAkQPY(IC$!Ibe_%klbXD7n0m;kiSLp^o*P|^>$H5OQyrr zyNKkVL0(L9t3h5u@_hz*DamaHxtrt}26-9D?FM=I_sqeLFW||bqK#fPPgksprnJiE ztj{a8(q-#W8s&Q1hQ<cc(Ci|zE2_pLLbQ-LmA<NtAZ7a8Y8L_dN82WUE6KtO@Dr#C zfnQ*<;E`6jvY@^oK=MvSmb8?QrV6?g#|(_O0~+N=g*^|pp;->V9-;!kYZg*Vvqoe6 zL!y?NL93|8SZ2OvO{fu}TB*}dAJHH;+JCGBM!&L0ETvdgvqc6&(E)w44jFZ>Qo7_h z=gP`i7%bipj}Aolg~CIkXGjc+HmSH)IObrBQovlf)>YfeOn7@2Z?8ELnQ5wKC2oUh zM)Flxw44v$h3SCV^i?CWwD^MMuN5`&YVj<KsgexsPACECY^ff7!yQwUHt8s-uYmqO zS3EQr@<(@v{E=`pE*8n|lD6bxEcXC_dE16XG!_?2(ZROsMr#?M2asiK(+&0*^=idx zWFWFL9;V~+(yO7mj)0vC`{|z3+!zjJ4=I$*^2?H+5#hzlf3IwiTgrT;;2JCx9;~6W zlZVS{=3?idCA%rxK($bBW_3@PXv8Ci<#)(yWoyZ6ZRKCW6g8FG9N-o#=F`eO)|w{4 zPT{j=kLkeX2obRz;FV`9YaV4s73d83gqW$>`lFG7un0r1pFk}jAWHP%Xw}?_;czG( z**+Xn)xAR^EOwK^0cd_8tEUb)KdZn0nCqzR=o8m`jq=T@KD((daLZz9=#-bHHcbTh zfsXP~OO;hAV77hIRlUkSlhz<Z&5>KGYrC_41Wf@FX=`atMDq4wG1MO&i0E!Hnoaa! zLf`0n)wf}zGqrvtCO@h5@8N)Otx3e9YIHc7(Bl}olf{G+159EGTE?7WTgA}JA(2ff zba8)7KIHuY2SK&`r+0Yg1{%@q-9-6`P&mP!e%B^^&_`Hk1!_DLPpH|DeAf^dTETFl zZy>rSH#S_M^lIB-4Y5~V^v%ugxQKTwdNg9(QmEK4L6Eytv6xWP*V->Xs57kfZJqtv zNGu$QQH4W1-)$+^a9T@W>1k5E1obBYfzj`Gd{^;eInKp9Q#f(`6ip$q5xp_FzJ5+} zh?+r{$a)}?&SDd^h9?%7)Nvdx2*-&Mh>X_V0>>FDAo`)m@G&)RKSPj`1r5*W37llA zTcHBCQf%gN+J+%RT0zO+Ii8hkYqy@#gA+k04$>TrzPFbXq)azF)mJ?Amp%1YJWZG7 zCykxN1hvl__?uFQr0x;(WKr|NBnaKH%!r2Rn1`sX6`{Hg52^8l$eehehdVkL+jqwY z2ZAMf*zrL)A&S;w&Rvs%<2m<;!eug9C^_VZ&6TB`7)5#!IZQmrhktLbo5_?M{ZXOD zx9g-hSBgl3OG&1jFnMuEc256{>YB4<L~*j!5f3=)Xt2S7#l#N*FUik?-Xtdukw};H zm(j}0;XKC7jHwnHDlV^!pb)PBB!FpRcABPM^NLXC^>e&tlKWfFq*Lws!b^{5gCxT< zXorm^$~{_>M2Y~ZoN&SX+;DN|;iB(+Tn@FZn<$`oAzW{JOsP%>1x?k8_E25kH6)^; zpjnK_)$JWgz2>c+=)bF*`5r6=)4ZCOz82X^-@*6@fUSfF4qHio#qa>2R-t3OM2(b5 z{;T~(ax3z_B9r$bMPquxk4W>ZImtIjri9OKpO^4&LLcYM_cF7FTg3@1k$&@V_%j=@ z&P#YGvi59ZDUk5uf07+@DcSS*Oya^E?_pN1_tMFp@rpP_D&5%kIqVxC*l8x<&*;Br zuQxlNr#2rIvA?NvSv#NOMfAdcbi}vN#t}6SGG0yeW!E2(f9P!1(}T&g_dV+pecv1a zY_y+X?Yz`+qmP5)2wF!0@Q-GTg+wT(-;C)3!1Gr#<zvvxrWIIgrFuQcp?tTpz{h+` zo|*ffbXo8l%K{ev5rEa+M(d}te?hB$cBahn@(xD20m}gV<jXrBbFQUP@_0Rz*b=<% z|5X}1C=C-wlJ12z<+Q9=cs5%g47W&zEft8YT{+q(i7o+ZIU$Dmxgl1n7l?`dk^AB- zY3-vZQ^B8da9Y=c#;Wmb*GzNfDtUkL!+MQytQAAy#62#8m9&^B18^{`K<np#RRGS! z611|<CA;Bi$)#fr#vcZ(1^g1Q&O~XT+NsH<gg~z*=P(F3h?D$9zP)6t<r@7gC|Wv$ ze-<oQ`pCTs%Q;!HY({dF=2Kx|Ud%eLu>1;}+`F)x#}dZE!o(&iEKn4Hiy)k$MoL~- zmePyML)l9L^C{HwI8EaI9M5A`*7Nd_6+4VB#YK?BIjCw7YBqHs8jjE<@IEAd8F0@& z5C7?4)ZYUR{dZE)I?TA|^`O~U=WZ9odfG~`o3ZJnHv|s=uE9iysX@Pw?d~JRhl*cs z{<GbG-Cgzi)Dzz0-jjRZdFs?t<L*xB>S$S6IPUh3+5KM^m^{^o_rGAh?kYX9_0ZNU zuDZ*vx^b63wc+LzQ(4v3%9>j?i)Tt|<JVJ6uCk-^#=PynC>(drAG6I*zdiL-WQV6f zk{_KQw69z@4CgW|p&Q4n@x{+$;y0v6!E^x=Ckv+EV&LAvH2*`aVT>j=$t2MPMFIGV zqe(v5=9Bde6{R@_`kn1lcaQ8YtqQIhFAI!012^1NCp$lN2Vbz>aFiUKK2|&HQuWxz z&6nqF8Fy?Qvu>sTM9}Y2LqWp!6pVRi`levStZXonprzj_x}h#ok3#pF3M<i*)>(37 z&7n0{oW9FW-^tQ3r+m4s$u;iqj#<5Y2L@M+{(42N(r^qbdBTr}V!MXg)!joPzB3V5 z`GV2wi%)uc0?9g36ODit0RQu(3$4w79e~|{K0pkx7qB1jG~fW>Ab=liuc37uFakIM zI0fKpeHtxPR4zu8;0vkw9%ObM`w0gY%>b%pCazz1>|KLYPX{84#h<88p|AR?{6|lx z<+`bSbk-`L`GK2et1|6oxykIgWiC?|+_q5bCR#V!xX-C<Q_`Ji-t=;>Rq=7>Et>7) G{r(Hym2rds delta 4720 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 diff --git a/mci/forms.py b/mci/forms.py index e7306bb..37d2e87 100644 --- a/mci/forms.py +++ b/mci/forms.py @@ -241,10 +241,6 @@ class SubKategoriaForm(forms.ModelForm): ) - - - - # Form Produtu class ProdutuForm(forms.ModelForm): @@ -285,7 +281,6 @@ class ProdutuForm(forms.ModelForm): - class UpdateProdutuForm(forms.ModelForm): class Meta: model = Produtu @@ -296,4 +291,36 @@ class UpdateProdutuForm(forms.ModelForm): # Customize queryset for ForeignKey fields if needed self.fields['kategoria'].queryset = Kategoria.objects.all() # Replace YourKategoryModel with your actual model self.fields['imagem'].queryset = Kategoria.objects.all() # Replace YourImagemModel with your actual model - \ No newline at end of file + + +class SlideForm(forms.ModelForm): + class Meta: + model = Slide + fields = [ 'titlu','imajen'] + + def __init__(self, *args, **kwargs): + super(SlideForm, self).__init__(*args, **kwargs) + self.helper = FormHelper(self) + self.helper.form_method = 'post' + self.helper.layout = Layout( + Row( + + Column('titlu', css_class='form-group col-md-12 mb-0'), + Column('imajen', css_class='form-group col-md-12 mb-0'), + + + ), + + + Row( + HTML(""" + + <div class="form-group col-md-12" style="text-align: right;"> + <hr> + + <button type='submit' class="btn btn-secondary"> <i class="fas fa-save"></i> Save</button> + + </div> + """), +), + ) \ No newline at end of file diff --git a/mci/templates/layout/base.html b/mci/templates/layout/base.html index 4498977..0b61414 100644 --- a/mci/templates/layout/base.html +++ b/mci/templates/layout/base.html @@ -144,6 +144,14 @@ </p> </a> </li> +<li class="nav-item"> + <a href="{% url 'slide' %}" class="nav-link"> + <i class="nav-icon fa fa-tachometer-alt"></i> + <p> + <font color="white">Slide</font> + </p> + </a> +</li> {% endif %} {% if request.user.groups.all.0.name == 'adminkompanha' %} diff --git a/mci/templates/slide/editslide.html b/mci/templates/slide/editslide.html new file mode 100644 index 0000000..3f134ec --- /dev/null +++ b/mci/templates/slide/editslide.html @@ -0,0 +1,35 @@ +{% extends 'layout/base.html' %} +{% block content %} + {% load crispy_forms_tags %} + + + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <div class="content-header"> + <div class="container-fluid"> + <div class="row mb-2"> + <div class="col-sm-6"> + <h1 class="m-0" style="color: rgb(31,108,163);"><span class="fa fa-book"></span> Update Slide</h1> + </div> + <div class="col-sm-6"> + <ol class="breadcrumb float-sm-right"> + <li class="breadcrumb-item"><a href="#">Home</a></li> + <li class="breadcrumb-item active">Slide</li> + </ol> + </div> + </div> + </div> + </div> + <section class="content"> + <div class="container-fluid"> + {% crispy formslide %} + <!-- General Form Elements --> + + </div> + </div> + </div> + </section> + </div> + </section> + + {% endblock %} \ No newline at end of file diff --git a/mci/templates/slide/slide.html b/mci/templates/slide/slide.html new file mode 100644 index 0000000..503f446 --- /dev/null +++ b/mci/templates/slide/slide.html @@ -0,0 +1,136 @@ +{% extends 'layout/base.html' %} +{% block content %} +{% load crispy_forms_tags %} + +<div class="content-wrapper"> + <!-- Content Header (Page header) --> + <div class="content-header"> + <div class="container-fluid"> + <div class="row mb-2"> + <div class="col-sm-6"> + <h1 class="m-0" style="color: rgb(31,108,163);"><span class="fa fa-book"></span> Slide</h1> + </div> + <div class="col-sm-6"> + <ol class="breadcrumb float-sm-right"> + <li class="breadcrumb-item"><a href="#">Home</a></li> + <li class="breadcrumb-item active">Slide</li> + </ol> + </div> + </div> + </div> + </div> + + <!-- Main content --> + <section class="content"> + <div class="container-fluid"> + <div class="card card-info"> + <div class="card-body"> + <div class="row"> + <!-- Form to add Munisipiu --> + <div class="col-md-3"> + <div class="card-header"> + <span class="fa fa-book"> Rejistu Slide</span> + </div> + <form method="post" enctype="multipart/form-data"> + {% csrf_token %} + <div class="form-group"> + {% crispy formslide %} + + </div> + </form> + </div> + + <!-- Table to list Munisipiu --> + <div class="col-md-9 table-responsive" style="border-left: 1px solid #ddd;"> + <table id="example1" class="table table-bordered table-hover"> + <thead> + <tr> + <th>Id</th> + <th> + <b>Titlu</b> + </th> + <th> + <b>Imajen</b> + </th> + + + <th class="text-right">Asaun</th> + + </tr> + </thead> + <tbody> + {% for slide in slide %} + <tr> + <td>{{ forloop.counter}}</td> + <td>{{ slide.titlu }}</td> + <td> + + {% if slide.imajen %} + <img src="{{ slide.imajen.url }}" width="40px"> + {% else %} + No image available + {% endif %} + </td> + + + + <td class="text-right"> + <a class="btn btn-info" href="{% url 'editslide' slide.id %}"><i class="fa fa-edit"></i> edit</a> + <a class="btn btn-warning delete-btn" href="#" data-toggle="modal" data-target="#deleteModal" data-id="{{ kategoria.id }}"><i class="fa fa-trash-alt"></i> delete</a> + + </td> + </tr> + {% endfor %} + + + + + </tbody> + </table> + </div> + </div> + </div> + +</div> +<!-- /.card-body --> +</div> +</div> +<!-- /.container-fluid --> +</section> +<!-- /.content --> +</div> +<!-- /.content-wrapper --> +</div> + +<div id="deleteModal" class="modal animated rubberBand delete-modal" role="dialog"> + <div class="modal-dialog modal-dialog-centered"> + <div class="modal-content"> + <div class="modal-body text-center"> + <h6>Ita boot hakarak atu hamos dadus ida ne'e?</h6> + <div class="m-t-20"> + <a href="#" class="btn btn-white" data-dismiss="modal">Lae</a> + <form id="deleteForm" method="post" style="display:inline;"> + {% csrf_token %} + <button type="submit" class="btn bg1">Sim</button> + </form> + </div> + </div> + </div> + </div> +</div> +</div> + + +<script> + document.addEventListener("DOMContentLoaded", function() { + const deleteModal = document.getElementById('deleteModal'); + deleteModal.addEventListener('show.bs.modal', function(event) { + const button = event.relatedTarget; + const id = button.getAttribute('data-id'); + const form = document.getElementById('deleteForm'); + form.action = `{% url 'deleteslide' id=0 %}`.replace('0', id); + }); + }); +</script> + + {% endblock %} \ No newline at end of file diff --git a/mci/urls.py b/mci/urls.py index 2feb612..9515466 100644 --- a/mci/urls.py +++ b/mci/urls.py @@ -48,9 +48,10 @@ path('painel', views.painel, name='painel'), path('deleteprodutu/<int:id>/', views.deleteprodutu, name='deleteprodutu'), + path('slide', views.slide, name='slide'), + path('editslide/<int:id>/', views.editslide, name='editslide'), + path('deleteslide/<int:id>/', views.deleteslide, name='deleteslide'), - - ] diff --git a/mci/views.py b/mci/views.py index e17849f..b21315c 100644 --- a/mci/views.py +++ b/mci/views.py @@ -11,7 +11,7 @@ from django.contrib.auth import authenticate, login from django.contrib.auth.models import User, auth from django.contrib.auth.models import User, Group from django.contrib.auth.hashers import make_password # Import make_password -from .forms import MunisipiuForm,PostuForm,KategoriaForm,SubKategoriaForm,ProdutuForm,UpdateProdutuForm,UtilizadorForm,CustomPasswordChangeForm +from .forms import * from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required @@ -471,3 +471,48 @@ def deleteprodutu(request, id): + +@login_required +def slide(request): + if request.method == "POST": + form = SlideForm(request.POST, request.FILES) + if form.is_valid(): + instance = form.save(commit=False) + instance.save() + return redirect('slide') + # prenxe dados + else: + form = SlideForm() + slide = Slide.objects.all() + + + + context = { + "slide" : slide, + 'formslide': form + } + + return render(request, "slide/slide.html", context) + + +@login_required +def editslide(request, id): + slide = Slide.objects.get(id=id) + if request.method == "POST": + print(" edit data") + + form = SlideForm(request.POST, request.FILES ,instance =slide) + if form.is_valid(): + form.save() + return redirect('slide') + else : + form = SlideForm(instance =slide) + + return render(request, 'slide/editslide.html', {'editslide': editslide,'formslide':form}) + +@login_required +def deleteslide(request, id): + slide = Slide.objects.get(id=id) + slide.delete() + messages.success(request,"Dadus Apaga Susessu..!") + return redirect('slide') \ No newline at end of file -- GitLab