From 795dd3384307a7654ae2bbc46837125ad08d0c84 Mon Sep 17 00:00:00 2001 From: Nuha Alansari <86974837+nuha101@users.noreply.github.com> Date: Mon, 1 Aug 2022 05:13:24 +0300 Subject: [PATCH] All tasks solved successfully --- LAB4/LAB4/__init__.py | 0 .../LAB4/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 156 bytes .../LAB4/__pycache__/settings.cpython-310.pyc | Bin 0 -> 2294 bytes LAB4/LAB4/__pycache__/urls.cpython-310.pyc | Bin 0 -> 980 bytes LAB4/LAB4/__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 553 bytes LAB4/LAB4/asgi.py | 16 ++ LAB4/LAB4/settings.py | 125 +++++++++++++ LAB4/LAB4/urls.py | 23 +++ LAB4/LAB4/wsgi.py | 16 ++ LAB4/db.sqlite3 | Bin 0 -> 143360 bytes LAB4/manage.py | 22 +++ LAB4/orm/__init__.py | 0 LAB4/orm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 155 bytes LAB4/orm/__pycache__/admin.cpython-310.pyc | Bin 0 -> 196 bytes LAB4/orm/__pycache__/apps.cpython-310.pyc | Bin 0 -> 428 bytes LAB4/orm/__pycache__/models.cpython-310.pyc | Bin 0 -> 893 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 0 -> 947 bytes LAB4/orm/__pycache__/urls.cpython-310.pyc | Bin 0 -> 842 bytes LAB4/orm/__pycache__/views.cpython-310.pyc | Bin 0 -> 4359 bytes LAB4/orm/admin.py | 3 + LAB4/orm/apps.py | 6 + LAB4/orm/migrations/0001_initial.py | 38 ++++ LAB4/orm/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1132 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes LAB4/orm/models.py | 20 +++ LAB4/orm/serializers.py | 19 ++ LAB4/orm/tests.py | 3 + LAB4/orm/urls.py | 17 ++ LAB4/orm/views.py | 168 ++++++++++++++++++ 30 files changed, 476 insertions(+) create mode 100644 LAB4/LAB4/__init__.py create mode 100644 LAB4/LAB4/__pycache__/__init__.cpython-310.pyc create mode 100644 LAB4/LAB4/__pycache__/settings.cpython-310.pyc create mode 100644 LAB4/LAB4/__pycache__/urls.cpython-310.pyc create mode 100644 LAB4/LAB4/__pycache__/wsgi.cpython-310.pyc create mode 100644 LAB4/LAB4/asgi.py create mode 100644 LAB4/LAB4/settings.py create mode 100644 LAB4/LAB4/urls.py create mode 100644 LAB4/LAB4/wsgi.py create mode 100644 LAB4/db.sqlite3 create mode 100644 LAB4/manage.py create mode 100644 LAB4/orm/__init__.py create mode 100644 LAB4/orm/__pycache__/__init__.cpython-310.pyc create mode 100644 LAB4/orm/__pycache__/admin.cpython-310.pyc create mode 100644 LAB4/orm/__pycache__/apps.cpython-310.pyc create mode 100644 LAB4/orm/__pycache__/models.cpython-310.pyc create mode 100644 LAB4/orm/__pycache__/serializers.cpython-310.pyc create mode 100644 LAB4/orm/__pycache__/urls.cpython-310.pyc create mode 100644 LAB4/orm/__pycache__/views.cpython-310.pyc create mode 100644 LAB4/orm/admin.py create mode 100644 LAB4/orm/apps.py create mode 100644 LAB4/orm/migrations/0001_initial.py create mode 100644 LAB4/orm/migrations/__init__.py create mode 100644 LAB4/orm/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 LAB4/orm/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 LAB4/orm/models.py create mode 100644 LAB4/orm/serializers.py create mode 100644 LAB4/orm/tests.py create mode 100644 LAB4/orm/urls.py create mode 100644 LAB4/orm/views.py diff --git a/LAB4/LAB4/__init__.py b/LAB4/LAB4/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LAB4/LAB4/__pycache__/__init__.cpython-310.pyc b/LAB4/LAB4/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5675447e1d115de7c995230cff3976bff2da2520 GIT binary patch literal 156 zcmd1j<>g`kg0G98C4uP2AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUThXRDad;?$zz zn7q=AM8g=D{N&Qy)Vz}77#A-`KX?E5AlKlKcppb6lNbaMAD@|*SrQ+wS5SG2!zMRB Rr8Fni4rFjK6OdqG002o&BX$4) literal 0 HcmV?d00001 diff --git a/LAB4/LAB4/__pycache__/settings.cpython-310.pyc b/LAB4/LAB4/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daba2104d4bcce373a2d726f966c32bc55d8a506 GIT binary patch literal 2294 zcmb7FOK;mo5GHBrVa0MBJFg~a!9$x=X-p+Z>c&BvgcfN>i6jal6}N;@g3_+!wfPEn z700~x+<%Zm8x#flmv}8upnsr;B4|3KWLuB})TPAbavtBzemk=a%HTcg=7${0 zz2&VEJoE58hYHpL0u2&Tsw=(a36IXb5r@20Mhn&=Dx*c5N9V6|Xz7hWc67d1sa~KJH3I1%CKs4gw+YlU=b{Pxl!)g@;eJYP*9A(fCyejsq09a)~ zNcyyTlx=kk&vvmi7`d+G63V1taIzZ5M-T{;NP6YCBTWBKtOyUL0{sa)%T@S9Y&&c> z-k7jJe2V*{2(L1F=gV8S4%Rb)8S(wvSGQz#lFurvL%Lu=O9%Atq z6WimmP3imqa!PZ2Z^rnT!Vfqc=_+DU*idTEwU%m$YQ1A5MWx-gvspoJn{~Zq#FsL* z4(O1`P8b5e+2$n$ga^*ZWyd9sdMD)3mo8!WUR(mDZzxK7##FUA%@6hAsEQj_?^8+i@v583XC z|Kqdzj~k>t$?*i>$yotfBM(QUe;Of&{nZh*=DKDrF2IowjZ%$2p1=Z=UVyMmYvx*yvp{3iL zlnkxb(M>cH)P|9insrreXxmChOBOo1 zZra^Wqo%hulX+8Xwi}A68OhSNu~kp)8}*u!mQgaVDyEW#HIl1J*L-TX6~oxpJF5Lc zY1BcfL-my#N^7gDY-x5)S2X~vH#OVRp=63(NVtCYK`Y6pGt+|1O+c=t(UWCW+f=#@ z(*|VS-mGg4^*1j11X#$1zaQ5g?xY1ocl^<=b9YA#`mhH+qdV#|h^X5g%`ok>&Ua3R zqmQ2)9wx=Ff%}n*AHk=bqt9RvxrK$LIk6zli9#_~JSUa}QQ!r>C Xo)`atc^PEl)cu#ZB7!;m^2OZ0-&qhX literal 0 HcmV?d00001 diff --git a/LAB4/LAB4/__pycache__/urls.cpython-310.pyc b/LAB4/LAB4/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1330797bb825c6cc650bee1c1433ee968470eb5a GIT binary patch literal 980 zcma)5U2oGc6m`<{gRBF7g5TOmC1J3q@*zsM!O%3MeY{kaGBj_xF7Si+%esd)`3kyZzZ+P55~OpSBxC6GR>A zW)62Ju4B)QtiipB$D5O;gP2D>=B`?+_MHpoCTr5xopa|d+)0PFFHz7T+(qbY^!5;6 zU!38w6!UaZC}L76eE(|6@J*qzoEXED&^I_swZTdjhG~02V7Shd>R>Jpa&ryQHqJcDbJ-cLyYH2a?EdIlIL}BC;wTUUr7c5I||_{ zh+X!3y+N&ODLETpK{$KWv*%vmk29k6lNku3JE;F-AT2mdfS6-idmR4l-Rs-BgWKr^@goL0tQpaSi&xvU@Hd2QuzW7nn~p*4IvPmdUMc|g6b-ZlX+3QvnkJhc3B7#Qi4h&Ou z`8;?~w&NH^Cypl%YqlWLsC1@aicz_@BSFFALCUjXPp5{Jo)uQ^?KJxEF#lhWTyTdC4U$GWOa5Jl%!O PL)}M@ovzn)I=}w_=G!cc literal 0 HcmV?d00001 diff --git a/LAB4/LAB4/__pycache__/wsgi.cpython-310.pyc b/LAB4/LAB4/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22ddaf8cc8a37fb2f78504a725982909020e20b6 GIT binary patch literal 553 zcmYjP!EO^V5cN7~Qx<|aAkMx?3ZvT@|KS8FGwz48V8 z0f-a-!^u~qO8o#XoUjuR8OhHYkNw{B*t*+|k&j>BZZ1AY2>lGnZnS;!(hqa!fukwn z5yvu`Mt*KdT(zdH2tl-Lf7#=0zV{XTtn~>^_c_i`Z~yv7{2?2TNTJnSlw__Oa(eRW zh}4ZX?4n>minp!Wz$PjiZs6Uy+Gq$Hr%8B+mrF|jAnz$WHcUT^xawi z{B&^L4OdSLSSwU%dL7rH)az5~ur}_&)AjQ;=%dZ{=7 literal 0 HcmV?d00001 diff --git a/LAB4/LAB4/asgi.py b/LAB4/LAB4/asgi.py new file mode 100644 index 00000000..10d559d8 --- /dev/null +++ b/LAB4/LAB4/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for LAB4 project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'LAB4.settings') + +application = get_asgi_application() diff --git a/LAB4/LAB4/settings.py b/LAB4/LAB4/settings.py new file mode 100644 index 00000000..9f5476ff --- /dev/null +++ b/LAB4/LAB4/settings.py @@ -0,0 +1,125 @@ +""" +Django settings for LAB4 project. + +Generated by 'django-admin startproject' using Django 4.0.6. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-ts05**w9$68e^qmf&tt-l&ys%jr6&nz=dvl_9or6pxfa9peo9k' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'orm' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'LAB4.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'LAB4.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.0/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/LAB4/LAB4/urls.py b/LAB4/LAB4/urls.py new file mode 100644 index 00000000..b9ef90e4 --- /dev/null +++ b/LAB4/LAB4/urls.py @@ -0,0 +1,23 @@ +"""LAB4 URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + + +urlpatterns = [ + path('admin/', admin.site.urls), + path('brand/', include('orm.urls')) +] diff --git a/LAB4/LAB4/wsgi.py b/LAB4/LAB4/wsgi.py new file mode 100644 index 00000000..68bbdb37 --- /dev/null +++ b/LAB4/LAB4/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for LAB4 project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'LAB4.settings') + +application = get_wsgi_application() diff --git a/LAB4/db.sqlite3 b/LAB4/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..f86ddcb30e3c430a3bfe492b62480462b9d9b266 GIT binary patch literal 143360 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 L(7a-h*#ZmzM*c3G literal 0 HcmV?d00001 diff --git a/LAB4/orm/__pycache__/apps.cpython-310.pyc b/LAB4/orm/__pycache__/apps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e199d2867d93e671d01a1a9bcb2645a0bac0a601 GIT binary patch literal 428 zcmYjN%}T>S5Z=wElKx$!SHWv80l`xdY1(Q*qy?*&5LmXIO|2x^m~9Zf>I3)?UVNp! z3WBfT$=S4E2j<)P`DSKkRJYqAC{G{Xi+6m#tg|mJIs;UFi~s~^N-`QzN+tvxU~dGN zq^~S;z?~Dn@q;YlQ_~EKVx;n9y;|DHzEE@qsJe$BNkoBQHH{cJkqZpFxTZNPvu*jy z5j==|r2<$4nF5*WV7Oj|)ka;eWeSF=GMoAh<8hvgOmc2ooFlPHt=-}Lu@dPna|kjK zRl4B<%Xw1QyEgYpN_&MGe*2?-e5Ylp14)lF6OuVIvk$H zHQ)zgQ4~5To=b*Z?8Wo}f=68H(KoyGC&s%7B7s+)&oj1XcD~O=yB!c5qi;WE=M6%>8)tXe=$zs#kI@JsXi72~ zQA*B;Xb9^I5f;#8qvbg6D;g@Ck-jk`N6bWU+rC4fX! zkf;IH(iT)S9%$r%_1OGMA{Ws^^mq0GVPOedJAKJ>v3-qco~RBoe$P_K=V~$OwzS7s z&NE<42aMrQtW&cN8M|BawBC`}JJJ4N!R0uCRA@&fDh2J|z`d#?EdgaLla)$}T>C?= zpo&L(P%1u4lX3xqaTVEdqBc)N?qkNv{5%=FnckKl%W1w|@K@7e5wA1IRXH8L>rKu+ zva8Yc4ZG;|kEfL>WHzn2I$CX{p{I$nG(veKq#k}9TE+k2@{e4XczBmfKo*xxK_421 z$E9b)LvE4F#{fBPA%=);#684)#17&C;vwQQVI$9ub}uFJ7b}$0FLH)@f`aW!EG8W^ zlkRir8pkunH>M&s7#9+fdHx>iezZI2T@QN0QRK{waMJXqZKH(@&8@caz1ypcnqxo7 z_#D_;raBm>1+OKEoRv&s(BXNmU=Fo%k%y}0sNP10{h~;L=e2%*QZgQ^hi?gaby#ggaq;z-Qu#+(o4O;=h}Xa1L3dnfgydrM7zqh&}A HofqyeNz(Kh#9BQsL26K9(#T~-}sxEx7!Vd>+$cOA1*j!KS)_$F)D|+-5CnaG`Fne zl9xgXPP(vB8Os>&k&bPxOk`4~GUe=q>6%WyGo6_DQ+5@}I$Bblp(VSuG<1E;28|oc z%m%{O&Zov|pM=8=xNkZG)51UI*kSTz%_#|9zpyXzIc|uMLqBOJ0<;Smvqmwu4-OKTrdObXPng=n5GG8NZ|I3Assj50=ToO{oVxDp6;dOK! zLyM5wBz8!U`3`+`+a(*lPjN44Br?_$!Lq^H-v&U2VMz1tZKwW&XrNIJ_g0#_~>6^N!iis_pGY$lK2+i++ zag{m;Z1J}_dWg@s>r^7hu7P|jPG-;U&^4K9!YJcvd8c(SyiVvhF7$$B zjS&O*VuBi7us8>qo5vY#hH1hpUs$s1rkbs~gt(&qL7N#RaOexCi}e{mQ+hvx(X6

GPy%QD7nv*L@*)Q9p1n676^pKX!p5EOge%H&{)@0}xj@R_ z{kQw!S56rZ^LiP-3{Q)BozcAF;pvCtv-h8(&+pE^L?4e&UWcvVl?bKlz4E&-4>CNH Xlpe}!!=Ix##Lzl z@86I9_3Y1Uit633STU(Vnwbd}>PbL*_pYaCw%JiG5Yz0UEqIr|NI zgX7l#&+dDZ-s1Q=;Msj|(;COG&#kjbzs2zl`p%(Jzw-wDUMH!M1WD+_pcKUJi5CXc z?R&`!04%Q`xF>=C62`d$|91mFP7pru<9^hO{WlOJrLLyN4)c06&F!;@4%!JI6^Q>P1s+jUg8Z`+R-4S zwO*9eJW6X`?HRt!Ycju zavyK+JUrrE#JWcq(D-iuG|j^+xP0XWSS!Xyw>3*GkX5y+u?@IPwNDzYnRpn0V&m~R zfPsj|g-QukFV$BNl?kFzog-?Zb@U74QaRHSbEIJ`&ecwCL`Ldg)pg}ePb``n>D2lH z?uX3GH^F6}2YrT#kZRBU zPN~UXEw1NNE$Ahw4e85HA+?#;joB@*U>2I?qGuhyoy4gIYfR(E<5f4f|JhBn=C`~9 zBc~`gR`>X|;$FY-_^kKng3sTecKb&50x6=QVlNyVtt;;WZr#pJPK)PRa2sBjnX zqB)KRJ<99jwaPZ(;d%ZK*QaGQ=tH6THCb7ktcq`VQ(o4@?0hMed34x!a6R;Vns5BR z?e~))>WNaCsiKE&^GORT>1lH>6T%g|c@;Zecc3>)x+rVxzPr7<+t|k<6G2Wb{z`5@ zQ-hCE;yWdQ$w!=zwJmTF?H|DEU*cveM7vCG5$jLtSLJa%sq7){ZtgW6H(HIE;3K_F zf=}UMSegy~NEP%ZlR!Uxcaj8#Oae)DZ%qQUGiC_TY_jjeULu-n(^wq`y$J_y@~93s zM69VF`pFfPhgFn`lPT=jU4%L5VWilPpmWOH`46`4i%`{dQC|1Z;68Q_utR3cRFuv9 zZgk=cFaI3oVx%ioD-(O-=c>+r3g8S?pv&CxgBtv@#HAZ5Ru(${67W+0BOp`w~kApA)5&AB|+@BMTk^XZ^;vwAr3+90s zpeH3qxuQ7dJu2;aTt5Zt7}c$y705ENwXzC4^#K4g-uxeg7_#`k5n_hn9A;8bsBm8# zCOBDS)OSPTZ_(c(ti}0lJDHBG~b z2C*%Cbg4Q8xf|+EPL4SZI+gLvThym4)km8B0TyMCu)|ZtjNgz2#|p!K3>Wno_P;iD z$*kW5{ojxq)UFT!Jo3)D<0tqCSNVj$wPgHlG}^)LD#kC1oyGIu`o+4=|N#us{}w4O#$d&;Ybqzu}n4 zfWfySLorB;wBz-jM|TG-jF|?Av(DfH(LII(w*N9>pWmf^J7QjfpHCPRXLW8~e(*7@ zYiI2nlj0+jzieuDBS?x^=puR}El$6NVsYj}hot4%W%$Py|CZrLZ+;5nM+L5MoVPj8 z@S@@Q#9ub!Ev}vXXm5Q04>1V+50PqP%yV0@;ShrV+*!o37Kl}bW<#q&D?(d_R)U7u J612iH`5Jgr*XjTO literal 0 HcmV?d00001 diff --git a/LAB4/orm/admin.py b/LAB4/orm/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/LAB4/orm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/LAB4/orm/apps.py b/LAB4/orm/apps.py new file mode 100644 index 00000000..54bea84e --- /dev/null +++ b/LAB4/orm/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class OrmConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'orm' diff --git a/LAB4/orm/migrations/0001_initial.py b/LAB4/orm/migrations/0001_initial.py new file mode 100644 index 00000000..c1a52708 --- /dev/null +++ b/LAB4/orm/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 4.0.6 on 2022-07-31 16:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Brand', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=50)), + ('description', models.TextField()), + ('established_at', models.DateField()), + ('city', models.CharField(max_length=50)), + ], + ), + migrations.CreateModel( + name='Product', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=40)), + ('description', models.TextField()), + ('image_url', models.URLField()), + ('price', models.FloatField()), + ('quantity', models.IntegerField()), + ('is_active', models.BooleanField()), + ('brand', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='orm.brand')), + ], + ), + ] diff --git a/LAB4/orm/migrations/__init__.py b/LAB4/orm/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LAB4/orm/migrations/__pycache__/0001_initial.cpython-310.pyc b/LAB4/orm/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d79b11f328a2e76600b79dc635a2e4a3480c6c27 GIT binary patch literal 1132 zcmZuwQE%He5Eg04mSn|A(===UK@Ai}QuJvUhB|grbZxSsNnZp5EUmjJ^km7S=%VTC z_L~2&Jr4Uvd>SyIKz_i0VFQXCWv2vk-#$*?2A=nab8Zix zoTv2F12W(NE4(>N*_@}GIiDA;)PL?l3;drv@R7}eA6sbv{KV@ASG33La~sc9uBA~` zS=;u!0xas|%>BDPHpzKPU;R57^il?1%7LY=+)I57W^Lfm!pB&WZ}@uu%eUFA-ue&U9pXzGzHLGq4Z2IH*PtCj zn+>{0`?v7UYI2&39qMUSqbTJZZD5os@ai$?*JmWUd@l+t zb8~LHfOV$T!nMHmur_j9sQMg1NMrp>nG5QY-;lJ=6c$k1&UdxW8*d(IhQ| zjfJ2)u`G~qA_P$uE)()Ps#JzbwF%$?OTaQySZnT*>5dw0j@)h1Ef+}+R6Zot4qX8@ z8l6kMhNt-6tl^mST*2_o>sKoj9~PBdFGyaL26J5ROb)85Kv`a|t2C;-d`V4c!%UWW zWjRc3*i`1E?Tm&eqv80OjjIK&Z~U*G-ly~$^Y_u{%gGz+Up*<8=W>5CuCnDEOH)tA z-wcnRe=A-;J2@4vh6hh3jUf#uH;-qsx3{-1)}jm+7uvnf4t=%jdFc6^rq9_9@3EL> zkMV!}Pkww8anYFFXZ$b!Q}}1Izu&ges+a*x8*Nu|KKL9Qte))Px=j7Z)#J{-sceN@ V8aDiD)y}UOd3Br277y8O>tBO7Nmu{? literal 0 HcmV?d00001 diff --git a/LAB4/orm/migrations/__pycache__/__init__.cpython-310.pyc b/LAB4/orm/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4adc9bda9ddb7f6c8b60786927f4727296525a8e GIT binary patch literal 166 zcmd1j<>g`kf{G>2l0fuh5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HgvsFxJacWU< zOkQb5qG60nesXDUYF/', views.update_brand, name='update_brand'), + path('delete//', views.remove_brand , name='remove_brand'), + path('search/', views.search_brand, name='search_brand'), + path('products/add/', views.add_product, name='add_product'), + path('products/list/', views.list_product, name='list_products'), + path('products/update//', views.update_product, name='update_product'), + path('products/delete//', views.delete_product, name='delete_product'), + path('products/specified_list/', views.list_products_of_brand, name='list products of brand') +] \ No newline at end of file diff --git a/LAB4/orm/views.py b/LAB4/orm/views.py new file mode 100644 index 00000000..1b2105a5 --- /dev/null +++ b/LAB4/orm/views.py @@ -0,0 +1,168 @@ +from turtle import title +from django.urls import is_valid_path +from rest_framework.decorators import api_view +from rest_framework.request import Request +from rest_framework.response import Response +from .models import Brand, Product +from .serializers import BrandSerializer, ProductSerializer +from rest_framework import status + +# Create your views here. + + # ------------------- CRUD Process For Brand ----------------------- # + +# ----------------------- Add Brand ---------------------------# + +@api_view(['POST']) +def add_brand(request : Request): + + brand_serializer = BrandSerializer(data=request.data) + + if brand_serializer.is_valid(): + brand_serializer.save() + else: + return Response({'msg' : 'could not add a brand', 'errors': brand_serializer.errors}, status=status.HTTP_403_FORBIDDEN) + + + return Response({'msg' : 'brand added successfully!'}, status=status.HTTP_201_CREATED) + +# ---------------------------- List All Brands ------------------- # + +@api_view(['GET']) +def list_brand(request: Request): + + skip = int(request.query_params.get('skip',0)) + get = int(request.query_params.get('get', 3)) + + brands = Brand.objects.all() + brands_list = BrandSerializer(instance=brands, many=True).data[skip:get] #.data to convert object of serializer to json obj. + + return Response({'msg' : 'List of all brands!', 'brands' : brands_list}) + +# ------------------------ Update a Brand ---------------------- # + +@api_view(['PUT']) +def update_brand(request: Request, brand_id): + + try: + brand = Brand.objects.get(id=brand_id) + except Exception as e: + return Response({'msg' : 'brand not found'}, status=status.HTTP_404_NOT_FOUND) + + brand_updated = BrandSerializer(instance=brand, data=request.data) + + if brand_updated.is_valid(): + brand_updated.save() + else: + return Response({'msg' : 'could not update a brand!', 'errors': BrandSerializer.errors}, status=status.HTTP_403_FORBIDDEN) + + return Response({'msg' : 'a brand updated successfully!'}, status=status.HTTP_202_ACCEPTED) + +# ---------------------------- Delete a Brand ------------------- # + +@api_view(['DELETE']) +def remove_brand(request: Request, brand_id): + + try: + brand = Brand.objects.get(id=brand_id) + brand.delete() + except Exception as e: + return Response({'msg' : 'could not find a brand!'}, status=status.HTTP_404_NOT_FOUND) + + + return Response({'msg' : 'brand deleted successfully!'}, status=status.HTTP_302_FOUND) + +@api_view(['GET']) +def search_brand(request: Request): + + if 'search' in request.query_params: + search_phrase = request.query_params['search'] + brand = Brand.objects.filter(title__contains=search_phrase).all() + + else: + return Response({'msg' : 'No brand found!'}) + + brand_found = BrandSerializer(instance=brand, many=True).data + + return Response({'msg': 'Brand found!', 'brand' : brand_found}) + + + + + #--------------------------- CRUD Process For Product ----------------- # + +# ---------------------------- Add Product --------------------------- # + +@api_view(['POST']) +def add_product(request: Request): + + product_serializer = ProductSerializer(data=request.data) + + if product_serializer.is_valid(): + product_serializer.save() + else: + return Response({'msg' : 'could not add a product', 'errors': ProductSerializer.errors}, status=status.HTTP_403_FORBIDDEN) + + return Response({'msg': 'product added successfully!'}, status=status.HTTP_201_CREATED) + +# ------------------------------ List All Products ------------------------ # + +@api_view(['GET']) +def list_product(request: Request): + + skip = int(request.query_params.get('skip',0)) + get = int(request.query_params.get('get', 3)) + + products = Product.objects.all() + product_list = ProductSerializer(instance=products, many=True).data[skip:get] #.data to convert list of Serializer obj to JSON obj + + return Response({'msg' : 'List of products', 'products': product_list}, status=status.HTTP_200_OK) + +# --------------------------- Update a Product -------------------------- # + +@api_view(['PUT']) +def update_product(request: Request, product_id): + + try: + product = Product.objects.get(id=product_id) + except Exception as e: + return Response({'msg' : 'could not find a product1'}, status=status.HTTP_404_NOT_FOUND) + + product_updated = ProductSerializer(instance=product, data=request.data) + + if product_updated.is_valid(): + product_updated.save() + else: + return Response({'msg' : 'could not update a product!', 'errors' : ProductSerializer.errors}, status=status.HTTP_403_FORBIDDEN) + + return Response({'msg' : 'product updated successfully!'}, status=status.HTTP_202_ACCEPTED) + + +# -------------------------- Delete a product ----------------------- # + +@api_view(['DELETE']) +def delete_product(request: Request, product_id): + + try: + product = Product.objects.get(id=product_id) + product.delete() + except Exception as e: + return Response({'msg' : 'could not find a product'}, status=status.HTTP_404_NOT_FOUND) + + return Response({'msg' : 'product deleted successfull!'}, status=status.HTTP_202_ACCEPTED) + +@api_view(['GET']) +def list_products_of_brand(request: Request): + + if 'search' in request.query_params: + search_id = int(request.query_params.get('search')) + all_products = Product.objects.filter(brand_id=search_id) + else: + return Response({'msg' : 'No products found for this brand!'})# This doesn't appear when there are no products in a given brand + + products = ProductSerializer(instance=all_products, many=True).data + + return Response({'msg': 'list products of specific brand', 'products': products}) + + +