From cc5187c3a1001508bea64d6c5f46a72de9a46507 Mon Sep 17 00:00:00 2001 From: "afanasyev.aa" Date: Sat, 5 Apr 2025 20:50:54 +0900 Subject: [PATCH] added api/history --- api/__pycache__/models.cpython-313.pyc | Bin 1944 -> 1783 bytes api/__pycache__/serializers.cpython-313.pyc | Bin 4306 -> 5097 bytes api/__pycache__/urls.cpython-313.pyc | Bin 730 -> 1105 bytes api/__pycache__/views.cpython-313.pyc | Bin 5150 -> 7854 bytes ...userprediction_unique_together_and_more.py | 30 ++++++++++ ...n_unique_together_and_more.cpython-313.pyc | Bin 0 -> 1427 bytes api/models.py | 14 ++--- api/serializers.py | 13 +++++ .../__pycache__/tawhiri.cpython-313.pyc | Bin 3553 -> 3444 bytes api/services/tawhiri.py | 2 +- api/urls.py | 8 ++- api/views.py | 52 ++++++++++++++++-- db.sqlite3 | Bin 176128 -> 372736 bytes testapi/__pycache__/settings.cpython-313.pyc | Bin 2874 -> 2937 bytes testapi/settings.py | 7 +-- 15 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 api/migrations/0003_alter_userprediction_unique_together_and_more.py create mode 100644 api/migrations/__pycache__/0003_alter_userprediction_unique_together_and_more.cpython-313.pyc diff --git a/api/__pycache__/models.cpython-313.pyc b/api/__pycache__/models.cpython-313.pyc index 14683360226b692ada24ff31de15efba325f4f64..23cd3586c3131b5ec406b45f86c9fa0095c83e05 100644 GIT binary patch delta 765 zcmZ`%&ubGw6rP!#Y_hxAZMRL@Skf8;ZMuj-1x2C6mR6AsN^#NCVr-LTjnu46l7pud z1kc7rRPZ34y@;3g)U!969$HrN2jr&s>)^$Cld1?hhi||4&D)vxy*JNBzU#(kT~`rb zKQf>EZ=`EvPQT*O6XYNVml1<6DPx;3k^?T4C7UvuLm8Au4xK_y%q8J_n(E$CbXkZp z7vq1#xDXRuRDO$vgpVzC0QX+Ca3tRiYTibZGsE{VBi_-Di}a5yh96 zoaLpJixGteM(RE0bq+6KM|lFv0sPDG9BcqUEzJuY9-;%y+}E-_E&KfD-t>vBiJh74 znO*Jj=E{LNxo_rsX8z^E*4drXc4^nNH*KNL_RQHmv+%$kHggVjxHU!eJW^_R)*60L ztgVY_MB|5XHE6V0eZ9EWZrvXGh+To#z{J4CC`5UG&nQYP@CVY~@Jj3?FBe1IiyS^m j7~>B}>!WNR6~AB-R^!J~V-lW!bmOVpb-yA`MRh*`D-Ee9 delta 949 zcmZuvO-~a+7@nEk+0tFwvH}%LgMj zYaX?tI~ZlmqM`QG&$;u(&wDzhM(~?$+AJwRbuStCY?nuXuLaY})m{VG znAITa@s}7v93g?AAT%JD2;=n)*>NjQ$1aZc%Q49&GbvKz%1ry zK?83M4%7?Gi6Z5?qfR7)9^O>36|-*^#36#(L@=8Q#b!da6~R5#s_?M!wDay! zw=}!c2u2nQ)iMMQ^@YEoW#wa*c2?8EM7fZER(5AfzUP)6yF#4Nt58M%;tKf37?mQ< z;|1AD^}J3Tb@T=Z$6*p@g^{xf^#{Ii^Il=ZeJ*g^VPtT?9vm3DFRr1zoXB-#7ZKVK zq~rfms>u0W!e<0*Y;hO>GBV6fBfVjyS0~?3eVksKUNby z_qKI&crh#0&JDBkQ{TFIdog>cQr=r507oUEYbzpGDU9Zx%oaSqJNF0+sgRJ5;`+)W zj?$LdoZhgoE(1$mo_FtwKJbOJE%pQKDU{M*#Mmb3no8+7eR=Cm=2Zql1FvbE_Aez@ Z($#d00IkI}+PgHh;#8dj0u*zjqc25Bk>|h<+V17e*pe2k`>z6p3vkalqm_wQTeZ&Z<4OFo8tS}&y8o-{T#Un8WR+4d$MxZ zIBJllV4o?cuH}~>r`24s&_^8}`Vdd$<%w_D#cF3|``yRN*4NE3V-TdT=wHm!#t4{G zdY^Dko&_@uxC)pCTm#GiLi%k%mSbT4uj6qDj90b<5f88ez@evcRB|LqW<^^rYODEq ztx!}lL{oFxMuybm`X?MIxq8JX;+djaPf#5{PliB$7$5>zd*oEx>^gcjlLs^a8w>vo z_VV$;k`dP2k?}2pE+F2~fbj)je1X=-APoJvoSpjTXu(>pt3!o#DEH22^>`n?X9GYX ziQavsX_zJZAo<8oN=DiWUB|J6&>2K1kpj`PfA@ha;kWB=Ee}f(@ZO-PT9T=STX*K8 z=~Q$vno^?VCWP(*k`Om_nj>uF?5IHN$Q7vehn}vktmQIclBH2h-@+@3eI8?6L!&k1 zt|8X}$78OcuUi)`G|?q2HlJV~2VQUP$-x~t*hF;E9OQBMjkM){s2__ B-lYHl delta 518 zcmaE`85SLn=o22GHOoFXVL(YGnkSX zMJNAevaT=Y0cvPtxFI0b!Fo&3wwtX;7AR084JQ$bg#uor#In?h6BufG7m1xg}6sl9;!7EAt5^C0!sty;@|Q`@^ah zdrhVyZIBt7Kmx|r-8`R7jaAwJq>n2nu{19^BR(;wq?iRLpa29#a+@D;Utp94yB*?e zISgk{KFjOQW(qReaIzGi1)DX9X)rm0PgULm#IytvMj*l%M3{gGGZ0}uc@Cevyc39t z&BtmW3AN3)_(T|azzzTj_-Tqv?h}fO16yJX6u8A75ajRX>Ejw7RjEZqU?Wij_7;atZhlH>PO4o|7*IJQ5Eo}m4iQe{`pRI)C;|>x E0HRB0&;S4c diff --git a/api/__pycache__/urls.cpython-313.pyc b/api/__pycache__/urls.cpython-313.pyc index 516fdbd026e4180fa69bdcfc3238b34cf1c0e5eb..7ace33c7fc0261579f3e55a3963d521e812d5786 100644 GIT binary patch delta 505 zcmcb`dXYopGcPX}0}y=V{FtuA%)sy%#DM{BDC2V+<3tT56)(0THZS%fb}x=14h4o_ zhF}(NPA{$^E(L}dMkR(|))?j>v59@M6YKdHfwVS=kd@~OX18Pp%X7zYnKD641oL@f z*g)!Kgiu6zW7x5X^2Km~MO9#G_1TMf()l$7UV;qNWW2>vkXVxOk`csVo6N!J;C)Ln zpeQvZGr1%)KhGnxxFo-*(g#R|Wu}(jlE#p7Ni9jt%)uc!*^aTxrivp2Vv2s15R7G0 zTAG<+Rgi6`UnPktmXey2T9T^or^!3{G@}Mj5eLw5MVuglYw`z16-MsKqD&qtl0X5F zvy0aQi4V+-jEr{~WWF;oGb(*&01{t07#M9QS2G2B-DKhDkh&nMcU{!%lBn5bQH#qg zmO!x!oU#|>t**;EU6OaYEbnre#T6{5azV}Ux|-)DHP6dx-j`W?KJat!Gc|G-i34o` E0Mm_x761SM delta 220 zcmcb}af?;sGcPX}0}vRkdY}HDk%8echyw#0P{!vI3==h!Bor8e8G>27*}T|`*cBLJ z7?l`;S!0-k1ST6W%1rFyXM`}eK^aEDT*2&?%wT2QG3=&H5X1CYia67GG~vN2Nwv!5o{}0TqB06=ws956p~= ijCUDi?lS~lWC*;=U^96Ob1=^bPF8-VM(!dJpb7ws;VfnV diff --git a/api/__pycache__/views.cpython-313.pyc b/api/__pycache__/views.cpython-313.pyc index edba6dd3e0bca25eeabf6dd1c374c4130359a44a..a7c45b310316906a13ea751a89bfa45a484f145e 100644 GIT binary patch literal 7854 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 PGOZ0yKPB+MUgUoO=kYXW delta 1923 zcmaJ>O>7%Q6rNdo*X#e^*p3sYc8HXiv?fVY+(1hcT2t6XX|a={V!#-C8@9N1I=e}# zUd*Wy2M+B}DH0N#xm1Fj3gUpE;tDskVD(CGrA@eS;k~upgbFdT-@JK$^WOK~?46UJ zPX!+P{T>4A%k;ywS>Me-vhxR=Zj&-8QOQf+c_#%YHSf46|Y211Z8%Nit5#!4xTn-j!}1Uv<&$z2DC9dkHqh?x=V;kE=;pyYakwDDC-Sh@9$54!We_WV zPd+4gmU+VcB8~I1dp>&vbPOxYjW9p*Si2?bMs>5+)Ei9XcijaV;eWbg9c-Z$Drr|Y zG{Y=jt843~-fmgqI@4RGzT_8UcV#VW*AH7TC#iNdUM<^Wb9Tkhm`I>K)F7fYt zBZbr8%5X+l2Fb*LV9iDl$PMyqYJ5BOvopTujEU1d+X_%hS-BnyEFaHPdn$wN1^&$MT(NYX*cWUW2M~&I1^|hpzT4IDtb% z?Cx0-ABsLh7x_Z;R^|U{*3kdIYJLY5NKV23NzE>Cv0pQ)a${T>O?9jUgV#{K#A;Wx ztv35G565+AQa}0FQ`$}FiovjfmalQS)>>=lH%z^0^d?`r(gqBS9z^(d`!fU4ba;-} zHD>h21)r*wg4q1gXi~yYA4~F3dc1?9Y9$Uv&NsAro7K!V_=eChj3yxnxvAGRBX8EW zKG2!YBB;afb#M6Xw%a)Tdmb$L1SGl9)Lvp&!5I2VjJJS1bWlp~UnJ9Aa=1&Tx+Hs_ z%>P2>?-Qj32eJ_KC05~#4f>ocT}c}bi1%e IaJT2|A4H{vlmGw# diff --git a/api/migrations/0003_alter_userprediction_unique_together_and_more.py b/api/migrations/0003_alter_userprediction_unique_together_and_more.py new file mode 100644 index 0000000..332ea40 --- /dev/null +++ b/api/migrations/0003_alter_userprediction_unique_together_and_more.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.7 on 2025-04-05 10:40 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0002_prediction_user_userprediction_delete_todo'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='userprediction', + unique_together=set(), + ), + migrations.AlterField( + model_name='userprediction', + name='created_at', + field=models.DateTimeField(), + ), + migrations.AlterField( + model_name='userprediction', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/api/migrations/__pycache__/0003_alter_userprediction_unique_together_and_more.cpython-313.pyc b/api/migrations/__pycache__/0003_alter_userprediction_unique_together_and_more.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e13512f6bd67581dfcb4be3e2408abdb9f86038c GIT binary patch literal 1427 zcmaJ>&u`O66dv1&GjUTw-4+U>qAgXMNXV@~9J*RnL~Q}JK&3dnSsFRrWcNGlGUxTOl*d1KdY7or{6DTvb!o%7tkD9LT2VVGP72;dMPD3 z|K0-|Vz69ODy!eb@@ZM(IG|zZdd;9LbFJ+*nH{>m7jU)hJG2!v1TGyDr;AZt5?)!c zM@%*)rkJvosmAf7;N-i6EOo3mz#zt&%rI!`$?oC|(I}R-gzlXR&CG_dapfW=SqmgY zU8r6kcXp<)ZYckwp9B3HVk;b#9DoX^d?7ciH%in0P}r!N)a)O`CZ()6~in zJpUxE$Tti`P$R|exO{DWef3~HH5j!+>JU3DE6@<435bBQ0@&x-LzlK3o)L6Fk_Xd?87_zZ2WY5S zj!BFsglmL=ez!$oT_EJBYqtaw?23dOx-1A=u17te5S9_-Gry#(GlWY6K3!>rlpVye)Y4EC=xnaVCl7?zOk65Hxeejf z+%}D6TzlX%>NdSSddyYlx$QN5E<1IOm%2IMJZ zZoM1Q0K%973nO?DuWkKdG1~DhI0&I+mUz#vmjwm9OKjowuVwqCBEUkOSYe}9Br*0%a86!1)=P|&jabDbd4hROnLx4(453WHJnBF? zm=DO}pB&Gg&nPhYJi9uh;NpG_6PsLA`4ndwmpP}aI@?he zHdpn{R$R@Dj8>EPaa%H)PyWHJ!05PHl82vB$`NR3kr;>&1`@Y8Y;yBcN^?@}iu@)! H@fraDJe@h` diff --git a/api/services/tawhiri.py b/api/services/tawhiri.py index dbaf7e8..44d1fb0 100644 --- a/api/services/tawhiri.py +++ b/api/services/tawhiri.py @@ -36,7 +36,7 @@ class TawhiriClient: query["burst_altitude"] = params.get("burst_altitude") query["descent_rate"] = params.get("descent_rate") query["interpolate"] = str(params.get("interpolate", False)).lower() - query["dataset"] = cls._convert_value(params.get("dataset")) + #query["dataset"] = cls._convert_value(params.get("dataset")) query["format"] = params.get("format", "json") query["pred_type"] = "single" # <-- в конце diff --git a/api/urls.py b/api/urls.py index c256ed2..eaff5cb 100644 --- a/api/urls.py +++ b/api/urls.py @@ -1,5 +1,8 @@ from django.urls import path -from .views import PredictionCreateView, PredictionListView, PredictionDeleteView +from .views import (PredictionCreateView, PredictionListView, PredictionDeleteView, + PredictionHistoryListView, + PredictionHistoryDetailView, + PredictionHistoryDeleteView,) from rest_framework.authtoken.views import obtain_auth_token urlpatterns = [ @@ -7,4 +10,7 @@ urlpatterns = [ path('predictions', PredictionListView.as_view(), name='get_predictions'), path('predictions/', PredictionDeleteView.as_view(), name='delete_prediction'), path('token/', obtain_auth_token), + path("history/", PredictionHistoryListView.as_view()), + path("history//", PredictionHistoryDetailView.as_view()), + path("history//delete/", PredictionHistoryDeleteView.as_view()), ] diff --git a/api/views.py b/api/views.py index 5255069..a4420fc 100644 --- a/api/views.py +++ b/api/views.py @@ -1,15 +1,18 @@ -from rest_framework import status, generics +from rest_framework import status, generics, permissions from rest_framework.response import Response from rest_framework.views import APIView from django.utils import timezone from .models import Prediction, User, UserPrediction -from .serializers import PredictionSerializer, PredictionRequestSerializer +from .serializers import PredictionSerializer, PredictionRequestSerializer, PredictionListSerializer, PredictionDetailSerializer from rest_framework.permissions import IsAuthenticated import requests from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from rest_framework.permissions import AllowAny from .services.tawhiri import TawhiriClient +from django.contrib.auth import get_user_model + +User = get_user_model() def get_prediction_from_tawhiri(params): @@ -22,9 +25,12 @@ def get_prediction_from_tawhiri(params): raise Exception(f"Tawhiri error: {response.status_code} {response.text}") class PredictionCreateView(APIView): - permission_classes = [AllowAny] - + permission_classes = [IsAuthenticated] + def post(self, request): + print("DEBUG: request.user =", request.user) + print("DEBUG: request.user.id =", request.user.id) + serializer = PredictionRequestSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @@ -70,5 +76,43 @@ class PredictionDeleteView(APIView): except Prediction.DoesNotExist: return Response({"error": "Not found"}, status=404) + + +class PredictionHistoryListView(generics.ListAPIView): + permission_classes = [permissions.IsAuthenticated] + serializer_class = PredictionListSerializer + + def get_queryset(self): + return Prediction.objects.filter( + id__in=UserPrediction.objects.filter(user=self.request.user).values_list('prediction_id', flat=True), + deleted_at__isnull=True + ) + + +class PredictionHistoryDetailView(generics.RetrieveAPIView): + permission_classes = [permissions.IsAuthenticated] + serializer_class = PredictionDetailSerializer + + def get_queryset(self): + return Prediction.objects.filter( + id__in=UserPrediction.objects.filter(user=self.request.user).values_list('prediction_id', flat=True), + deleted_at__isnull=True + ) + + +class PredictionHistoryDeleteView(generics.DestroyAPIView): + permission_classes = [permissions.IsAuthenticated] + + def get_queryset(self): + return Prediction.objects.filter( + id__in=UserPrediction.objects.filter(user=self.request.user).values_list('prediction_id', flat=True), + deleted_at__isnull=True + ) + + def perform_destroy(self, instance): + instance.deleted_at = timezone.now() + instance.save() + + #class PredictionCreateView(APIView): #permission_classes = [IsAuthenticated] \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 6e40345d6fc75e7199cab29743a6eacb12498479..41a74d0e402f6ebfef4234d9dbe4a32d20f1ecef 100644 GIT binary patch literal 372736 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

J`N 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 delta 780 zcma)3Ur1A76#tHQZEkLT8%w9@a4s{RDZcYf&*O#$957i@UfWPh1k#1_ZkP}o5;)piq&wfZeZXZEU1 zj)!`6tInl8@(gKl9^p@T6TilJyo4X%f@;acu#)#Qw-^mfqh6fNjYns*$r(yut=zw5 zk~5QXHY=xX4C4dkt~Y`NIcXR@s04gxeJA%93L6zn;2OL_6-QKuh27@;IGR4;jZ)IC1oSsSqXRt zQPZiG;%BVxTr<64ENFXGcN)Gm>gZ@Tw2p`&1`e}kfXP*CRJh<2+C%GLRl3YKwVj<> z+i)9clA(cwlW>__iNlwQ+79w623^E0K_z)4!ckHuLI6T!ScG$Mg4`EDGF%@G>TL5~ zSj1$V^1CxL$%Guw$?2)6oQV2ULMra_`=hf{^0b(d_oX_3*p+EhHF+w6^;lWMa>qgO zpMLUQga-R>pws1W{)Kh6F2(}ny9g|_+)F_X35al5IcxNi8xq_issv8*u^Uc8>*|Xn zgd;{|rotf9K)s&owvE*vx550R1nkOkmHBa1(NT7_s`Rz-?y`n%ZVllzy1D0gq!%<} zU3w|O@tjwn|Ko&U$R{O|Qqa%)LxB`8#8U||735h?@_RX! zEzYngwYVfcttc@!wLHHlTQ9M+BqKGiBr`d&Br`uxFC;%ZHO~=6tV#<_OF?Q;Zf0>Y zPe9xIFV0+=^w*HjZXsl48hX+jKMN`%taFEvYK+6br@f< zF)B~?;*jQW%*n|wcg(BYT*7gckx^x{7ndNT^amzpb+!*Y44ir&SecdCKJs%5F*WiP I=>p9L0OE=o$p8QV diff --git a/testapi/settings.py b/testapi/settings.py index 5014536..9409c61 100644 --- a/testapi/settings.py +++ b/testapi/settings.py @@ -142,11 +142,10 @@ REST_FRAMEWORK = { # ВАШИ НАСТРОЙКИ 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', 'DEFAULT_AUTHENTICATION_CLASSES': [ - # 'rest_framework.authentication.TokenAuthentication', - # 'rest_framework.permissions.AllowAny', + 'rest_framework.authentication.TokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ - #'rest_framework.permissions.IsAuthenticated', - 'rest_framework.permissions.AllowAny', + 'rest_framework.permissions.IsAuthenticated', + #'rest_framework.permissions.AllowAny', ] }