From 5fe40e03045ccbfbdf1fdfc6452bf5b69364aee9 Mon Sep 17 00:00:00 2001 From: Peter Kotyczka Date: Mon, 8 Apr 2024 20:55:26 +0200 Subject: [PATCH] api added --- .vscode/settings.json | 7 +++ pyapp/db.sqlite3 | Bin 143360 -> 147456 bytes .../__pycache__/settings.cpython-311.pyc | Bin 2609 -> 2777 bytes pyapp/pyapp/__pycache__/urls.cpython-311.pyc | Bin 1470 -> 1493 bytes .../api/__pycache__/config.cpython-311.pyc | Bin 206 -> 0 bytes pyapp/pyapp/settings.py | 7 +++ pyapp/pyapp/templates/pyapp.html | 2 +- pyapp/pyapp/urls.py | 9 ++- pyapp/pyapp/views.py | 2 +- pyapp/pyapp_api/__init__.py | 0 pyapp/pyapp_api/admin.py | 3 + .../__pycache__ => pyapp_api}/api-client.py | 0 pyapp/pyapp_api/apps.py | 6 ++ pyapp/pyapp_api/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes pyapp/pyapp_api/models.py | 3 + pyapp/pyapp_api/serializers.py | 13 +++++ pyapp/pyapp_api/tests.py | 3 + pyapp/pyapp_api/urls.py | 13 +++++ pyapp/pyapp_api/views.py | 54 ++++++++++++++++++ pyapp/sql-scripts | 13 +++++ 21 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 .vscode/settings.json delete mode 100755 pyapp/pyapp/api/__pycache__/config.cpython-311.pyc create mode 100755 pyapp/pyapp_api/__init__.py create mode 100755 pyapp/pyapp_api/admin.py rename pyapp/{pyapp/api/__pycache__ => pyapp_api}/api-client.py (100%) create mode 100755 pyapp/pyapp_api/apps.py create mode 100755 pyapp/pyapp_api/migrations/__init__.py create mode 100644 pyapp/pyapp_api/migrations/__pycache__/__init__.cpython-311.pyc create mode 100755 pyapp/pyapp_api/models.py create mode 100644 pyapp/pyapp_api/serializers.py create mode 100755 pyapp/pyapp_api/tests.py create mode 100644 pyapp/pyapp_api/urls.py create mode 100755 pyapp/pyapp_api/views.py create mode 100644 pyapp/sql-scripts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..00a609e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "pyapp" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/pyapp/db.sqlite3 b/pyapp/db.sqlite3 index fdad6d05014f7eff6ec6b220559307f9d792068e..1ae40fbe8f80fc537080b5def9c77ced8efd28ee 100755 GIT binary patch delta 1853 zcmai#O>7%g5Xbjez8UB$RHvo7jo7 zUfb)h3dsrF=mq3M#R(2YLU1Yg5TQ1z5aL1w6sZTGNT6~-mEZ^nRfuQDXe|=`xRbb9)m`GvM_-f`})xu7eiKm4_bA7P5=Cy)#X6G?L|@$#n!DTJl^THqZLDbqG}F0bvER4 z7l`Uua6s4F^s~sfBHukiRNo6aYWm<~E$%ejs_HKDW@F6wlCjrF8vZo=Z1~D>t7fI* zhRP`|aDb=uI?rf<3y`9el2qwfN&itYo)F}%C&|7JEwF)B!48WS3<09?_^rLOcWVI$ zh-S?e!tL6QP_uFi+U@Pq0yiM){b)^FYrC&p*O0i$fWd^RW-_1$`P*pNx8p`^{{l~( zHlC~Ak-ICI;LP%}8WT2#Wi~V~rFRooWpBV9O|34nlk=+VEu~763x$FrOzv>3G99J2 z#+MjhL`v~ffvfQnpT5A-tjA5G%SSQZ(P3_s^$z-JugBw4cG9AFNfZY~@tH+5JIHb# z+(R?9nj8is4j*Fh5&Q!_taT{&pEHo1g9rEdF6g$=(y&M|pXzlM#7?R=CZIU zR%VBVT+TO}rL*qLxX6`-WoA8ATrYYu{>_Y9Tvdwv%1k&?SYwM5v&H%ClqVe7nc9t( z%H{adPJ$75d1E^yOm6c#VR?D>@`{`1g~-C3ZE9`-tsQ-s1x(x?_bT({%!}c|-qizX%!`d3Qw_&Zd zz>jzKz^UtPSAb1x3L0-53|s++q(*aiaF++4Xe#^m5uJr$z!fQs_ta{=mE?j$KHDN-}@(E;Sevyz}n;<}(x^Gl(6MizD@DjHa+;|e9FW$BnG z*<}1lkjV?OnpDg6LZqwY)mi%c!TwN-%;vZ{QqT-+|01r5p4Np*rzFbO)Ir75vMR~y zu`V>wno>yD!RIm<3!@oLWAIn_9sB~`hVQ^PpbA&vIHb{xJ_B85Qj1x78d93K>m*Rd z(a5w8hlACx!G}~ks2{odar+jYKZo{wXmZv{RbDU{^iR!D$Ts0>6Yc z_%?hM#^E%Q!NN+nPKQ~~>GjxgJ=&*AITd{%5|(xyuv+wbeftq(-7Lo|n^LN$4T0wo zXgdKRK^BELK)c%?S#Ac00R~%yj`B N(NJ+h#*6N?E(gp8IpR}cKXcKevaTJcWl+yOvE;Q(* zi{=JK9ZZb6s5dkw5_NEqK?Vjj28|<$t|mqk4?^6GU-CWjJ%;c1`?cG>?JwHfX9gJz z!$yuBshPVoN+ag!!W9!D)ar7+Us zaDc%9{7?ql`=A_boF3@G1~5#&ukP&WH#X0s?!ff`D`qqGb*WLXQj?<1k}r!ETdpKn zXmh=q&eY7pnBZ$9#Oak;No3=kz%RQC#kmAC7cGgwBu(=i8;SU{37?DhnVr$Rr&_cW z>9ugH60e8SLY5KN(zWJ9ea7m_vhy)X$or^fs9f1_1)D8tZZRrOlwI_qoA+3Al`_vY z5)-tr9-rn?<5YMxxf~8OeMuqe@KP(zs4(jfxocr>%iGL^=vY1-_HxNwd_`QdN%3qm zRt(zBm0Tj2vKtHhOr$W+1X{k;P{!kHHLMMnv=s2COEn`sn$m7cPwuf!_Zi_UuU)Ns!=_HM@rt{njha z&oA3(V5@rpjdb-t$FR=m0@~K$#C~UoMLW2`HmuonTQmlT1Kl{K!d?(cg2eMOZyN4C zsMJ7r-MK+j0Q!Y`9k%58BB`a~WEMp}jBj@Dl zOw*Jt(l;OOq@=NRJY?-%dv;}{%#ixVi~8XxQ# z<+^zWOD7|nAW%b<$K*mbjm`dSl8lTJlQY??`T2regG1uof*gHa!~KK2CqHIi!st1< zgTsiapmOpq4h1ec7NKjDZq=MrN2zyKo}_&!K*@Bsy2L<83cF$Tpz#v6jd WA6S_|N`VAW71!is&QmPfKw|)~Yjp?! delta 243 zcmca9x>1C0IWI340}xmR@}_+p}ZV@?!L3P(Ca3QGznkmOp#n8}#JJ%=To zF^V^ZCyFnHH-#^iErq{|n}H!kU=C9zV-$aiV2Th>m0*f6m=pn%qM3~8EKvd}Vo`!A z;!#2=EK$NhERrG-C7L1`C6*!;%%CZ~S&p%Zk&%7!LZ<1PgPF4#H%qa0Ff#INUd-mk z$S6Mf6?^sMQjW!p?vo`sjVAkYDsZU--OC8X#jcafIb)SLgqS`sz=#IE4OV diff --git a/pyapp/pyapp/__pycache__/urls.cpython-311.pyc b/pyapp/pyapp/__pycache__/urls.cpython-311.pyc index 047a373c7560aa619397ee9ace6d1247db1b7611..e58169b6edd930fe1c504a133aebae628605dfe2 100644 GIT binary patch delta 446 zcmdnTeU)2%IWI340}z}x5lMT@%)sy%#DM`$DC6^siRw=ET)Es)Jd6xX45@4>?5Rvy zyf9@c9BVk20rjp1Vh8}M;Ywx6;)97~al=^4n1CvQ7y`g5xq+s^>|#ja!D8c->F zD$g=TpmrdJ093=$S)%wib1@!ZvSTSN$|=6ZaEmoFFD11?lkpZyUSe))6V= Nseu~=i^PCd0RV2(Wsd*= delta 423 zcmcc0y^mXcIWI340}%KZ@})gwW?*;>;=lk0l=1n=M0KZnj$E!NE=C3>hE%o`_EeTE zZkVzx9vEvG69dC)Acg?2N{&>fEMAyM3g;TGWk6e212K{sZlD@Ym`Dl_RyDjzKt*7u zf)u9kqAN;giQ?PL$9RCro+Gg!Gd?3fH?@i_F(o%MPyZIfE!NDul++4M##=0Ti6DuB z%EW>K{af6@8TkbTnR)4s1qHX5f%^P3`6u(R1dA1cync(NII|@67E5VSPH_>)>d9>^ zX^Md_cx@h7^V<5N1qa3}(<|y2V_aTj2+!IZBID zi}Dh4Q*Ut;Bo-H!=NF}{WcUoy`paHF6ew4$pPgS)nOv2fs9%&?kYAixl3$dWiX@s? zP*AL&l9ia3p05vN>nG>urDdk;6;%G>u*uC&Da}c>E8+l}2XarbFp&7b%*e=igIl11 O157k
-

PyApp Inventory

+

PyApp Item List Inventory

{% for item in all_items %}
diff --git a/pyapp/pyapp/urls.py b/pyapp/pyapp/urls.py index 4b81f8d..d0b1e27 100755 --- a/pyapp/pyapp/urls.py +++ b/pyapp/pyapp/urls.py @@ -18,12 +18,11 @@ from pyapp import views from django.contrib import admin from django.urls import path,include from pyapp.views import pyapp_home -from pyapp.views import api_home - +from pyapp_api import urls as pyapp_urls urlpatterns = [ -path('admin/', admin.site.urls), path("", views.index, name= "index"), -path("pyapp/", views.pyapp_home, name= "ShoppingApp"), -path("api", views.api_home, name= "api"), +path('admin/', admin.site.urls), +path("pyapp/", views.pyapp_home, name= "Item List App"), +path('api/', include(pyapp_urls)), ] \ No newline at end of file diff --git a/pyapp/pyapp/views.py b/pyapp/pyapp/views.py index e679801..deae9ce 100755 --- a/pyapp/pyapp/views.py +++ b/pyapp/pyapp/views.py @@ -9,7 +9,7 @@ class ShoppingItemViewSet(viewsets.ModelViewSet): serializer_class = ShoppingItemSerializer def index(response): - return HttpResponse("Welcome to the pyapp Shopping") + return HttpResponse("Welcome to the Pyapp Item List") def pyapp_home(request): if request.method == 'POST': diff --git a/pyapp/pyapp_api/__init__.py b/pyapp/pyapp_api/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pyapp/pyapp_api/admin.py b/pyapp/pyapp_api/admin.py new file mode 100755 index 0000000..8c38f3f --- /dev/null +++ b/pyapp/pyapp_api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/pyapp/pyapp/api/__pycache__/api-client.py b/pyapp/pyapp_api/api-client.py similarity index 100% rename from pyapp/pyapp/api/__pycache__/api-client.py rename to pyapp/pyapp_api/api-client.py diff --git a/pyapp/pyapp_api/apps.py b/pyapp/pyapp_api/apps.py new file mode 100755 index 0000000..533edf7 --- /dev/null +++ b/pyapp/pyapp_api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PyappApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'pyapp_api' diff --git a/pyapp/pyapp_api/migrations/__init__.py b/pyapp/pyapp_api/migrations/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pyapp/pyapp_api/migrations/__pycache__/__init__.cpython-311.pyc b/pyapp/pyapp_api/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f04cf2eac4f11287a033ecda45e615d60b2ee0d GIT binary patch literal 197 zcmZ3^%ge<81THcnX(0MBh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09tD?&fCIJKx) zKRdsqGPx={QNJj)Aip@XB)=##6-hL)prBYkB`Yy6Jzu||63By)@rebQ`nj3uMTsSu z`FX|q@$s2?nI-Y@dIgogIBatBQ%ZAE?TT1|7J-~n%nu|!Ff%eTeqewRMa)1k06A$h AfB*mh literal 0 HcmV?d00001 diff --git a/pyapp/pyapp_api/models.py b/pyapp/pyapp_api/models.py new file mode 100755 index 0000000..71a8362 --- /dev/null +++ b/pyapp/pyapp_api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/pyapp/pyapp_api/serializers.py b/pyapp/pyapp_api/serializers.py new file mode 100644 index 0000000..88c0cbd --- /dev/null +++ b/pyapp/pyapp_api/serializers.py @@ -0,0 +1,13 @@ +from rest_framework import serializers +from pyapp.models import ShoppingItem +from pyapp.models import Product + +class ShoppingItemSerializer(serializers.ModelSerializer): + class Meta: + model = ShoppingItem + fields = '__all__' + +class ProductSerializer(serializers.ModelSerializer): + class Meta: + model = Product + fields = '__all__' \ No newline at end of file diff --git a/pyapp/pyapp_api/tests.py b/pyapp/pyapp_api/tests.py new file mode 100755 index 0000000..7ce503c --- /dev/null +++ b/pyapp/pyapp_api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/pyapp/pyapp_api/urls.py b/pyapp/pyapp_api/urls.py new file mode 100644 index 0000000..2e27289 --- /dev/null +++ b/pyapp/pyapp_api/urls.py @@ -0,0 +1,13 @@ +from django.urls import path,include +from rest_framework import routers + +from . import views + +router = routers.DefaultRouter() +router.register(r'item', views.ShoppingItemList) +router.register(r'product', views.ProductList) + +urlpatterns = [ + path('', include(router.urls)), + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) +] \ No newline at end of file diff --git a/pyapp/pyapp_api/views.py b/pyapp/pyapp_api/views.py new file mode 100755 index 0000000..e0302fe --- /dev/null +++ b/pyapp/pyapp_api/views.py @@ -0,0 +1,54 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status, permissions, viewsets +from rest_framework import permissions +from pyapp.models import ShoppingItem, Product +from .serializers import ShoppingItemSerializer, ProductSerializer + +class ShoppingItemList(viewsets.ModelViewSet): + """ + API endpoint that allows users to be viewed or edited. + """ + queryset = ShoppingItem.objects.all().order_by('name') + serializer_class = ShoppingItemSerializer + permission_classes = [permissions.AllowAny] + + +class ProductList(viewsets.ModelViewSet): + """ + API endpoint that allows groups to be viewed or edited. + """ + queryset = Product.objects.all().order_by('title') + serializer_class = ProductSerializer + permission_classes = [permissions.IsAuthenticated] + +class ShoppingListApi(APIView): + # add permission to check if user is authenticated + permission_classes = [permissions.IsAuthenticated] + + # 1. List all + def get(self, request, *args, **kwargs): + ''' + List all the todo items for given requested user + ''' + ShoppingItemList = ShoppingItem.objects.filter(user = request.user.id) + serializer = ShoppingItemSerializer(ShoppingItemList, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + # 2. Create + def post(self, request, *args, **kwargs): + ''' + Create the ShoppingItem with given todo data + ''' + data = { + 'name': request.data.get('name'), + 'price': request.data.get('price'), + 'quantity': request.data.get('quantity'), + 'done': False + } + serializer = ShoppingItemSerializer(data=data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file diff --git a/pyapp/sql-scripts b/pyapp/sql-scripts new file mode 100644 index 0000000..23cb643 --- /dev/null +++ b/pyapp/sql-scripts @@ -0,0 +1,13 @@ +-- database: /Users/kotyczka/repositories/kotyczka/apps/django/pyapp/db.sqlite3 + +-- Drücken Sie die ▷-Schaltfläche oben rechts im Fenster, um die gesamte Datei auszuführen. + +insert into pyapp_shoppingitem +SELECT * FROM migration_shoppingitem; +commit; + +create table pyapp_shoppingitem as select * from migration_shoppingitem where 1 = 0; +commit; + +drop table pyapp_product +commit; \ No newline at end of file