diff --git a/LAB3/LAB3/__init__.py b/LAB3/LAB3/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LAB3/LAB3/__pycache__/__init__.cpython-310.pyc b/LAB3/LAB3/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..7ab28145 Binary files /dev/null and b/LAB3/LAB3/__pycache__/__init__.cpython-310.pyc differ diff --git a/LAB3/LAB3/__pycache__/settings.cpython-310.pyc b/LAB3/LAB3/__pycache__/settings.cpython-310.pyc new file mode 100644 index 00000000..e6abb605 Binary files /dev/null and b/LAB3/LAB3/__pycache__/settings.cpython-310.pyc differ diff --git a/LAB3/LAB3/__pycache__/urls.cpython-310.pyc b/LAB3/LAB3/__pycache__/urls.cpython-310.pyc new file mode 100644 index 00000000..382548b4 Binary files /dev/null and b/LAB3/LAB3/__pycache__/urls.cpython-310.pyc differ diff --git a/LAB3/LAB3/__pycache__/wsgi.cpython-310.pyc b/LAB3/LAB3/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 00000000..d76e4c2a Binary files /dev/null and b/LAB3/LAB3/__pycache__/wsgi.cpython-310.pyc differ diff --git a/LAB3/LAB3/asgi.py b/LAB3/LAB3/asgi.py new file mode 100644 index 00000000..f312d343 --- /dev/null +++ b/LAB3/LAB3/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for LAB3 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', 'LAB3.settings') + +application = get_asgi_application() diff --git a/LAB3/LAB3/settings.py b/LAB3/LAB3/settings.py new file mode 100644 index 00000000..20e8ca72 --- /dev/null +++ b/LAB3/LAB3/settings.py @@ -0,0 +1,125 @@ +""" +Django settings for LAB3 project. + +Generated by 'django-admin startproject' using Django 4.0.4. + +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-qv#0onlb3zx_k=0v$(ovlg+sn$ep(b^mpnsdx5o_mxlor@+iu_' + +# 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', + 'Students' +] + +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 = 'LAB3.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 = 'LAB3.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/LAB3/LAB3/urls.py b/LAB3/LAB3/urls.py new file mode 100644 index 00000000..588745d0 --- /dev/null +++ b/LAB3/LAB3/urls.py @@ -0,0 +1,22 @@ +"""LAB3 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('students/', include("Students.urls")) +] diff --git a/LAB3/LAB3/wsgi.py b/LAB3/LAB3/wsgi.py new file mode 100644 index 00000000..d736aaa3 --- /dev/null +++ b/LAB3/LAB3/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for LAB3 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', 'LAB3.settings') + +application = get_wsgi_application() diff --git a/LAB3/Students/__init__.py b/LAB3/Students/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LAB3/Students/__pycache__/__init__.cpython-310.pyc b/LAB3/Students/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..9bce31fe Binary files /dev/null and b/LAB3/Students/__pycache__/__init__.cpython-310.pyc differ diff --git a/LAB3/Students/__pycache__/admin.cpython-310.pyc b/LAB3/Students/__pycache__/admin.cpython-310.pyc new file mode 100644 index 00000000..68d1e030 Binary files /dev/null and b/LAB3/Students/__pycache__/admin.cpython-310.pyc differ diff --git a/LAB3/Students/__pycache__/apps.cpython-310.pyc b/LAB3/Students/__pycache__/apps.cpython-310.pyc new file mode 100644 index 00000000..91c204cf Binary files /dev/null and b/LAB3/Students/__pycache__/apps.cpython-310.pyc differ diff --git a/LAB3/Students/__pycache__/models.cpython-310.pyc b/LAB3/Students/__pycache__/models.cpython-310.pyc new file mode 100644 index 00000000..ae19ee52 Binary files /dev/null and b/LAB3/Students/__pycache__/models.cpython-310.pyc differ diff --git a/LAB3/Students/__pycache__/urls.cpython-310.pyc b/LAB3/Students/__pycache__/urls.cpython-310.pyc new file mode 100644 index 00000000..368dc3ae Binary files /dev/null and b/LAB3/Students/__pycache__/urls.cpython-310.pyc differ diff --git a/LAB3/Students/__pycache__/views.cpython-310.pyc b/LAB3/Students/__pycache__/views.cpython-310.pyc new file mode 100644 index 00000000..22711176 Binary files /dev/null and b/LAB3/Students/__pycache__/views.cpython-310.pyc differ diff --git a/LAB3/Students/admin.py b/LAB3/Students/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/LAB3/Students/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/LAB3/Students/apps.py b/LAB3/Students/apps.py new file mode 100644 index 00000000..fceba1c4 --- /dev/null +++ b/LAB3/Students/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class StudentsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'Students' diff --git a/LAB3/Students/migrations/0001_initial.py b/LAB3/Students/migrations/0001_initial.py new file mode 100644 index 00000000..346320f5 --- /dev/null +++ b/LAB3/Students/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 4.0.4 on 2022-07-27 17:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Students', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=20)), + ('last_name', models.CharField(max_length=20)), + ('birth_date', models.DateField(max_length=20)), + ('GPA', models.FloatField()), + ], + ), + ] diff --git a/LAB3/Students/migrations/__init__.py b/LAB3/Students/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LAB3/Students/migrations/__pycache__/0001_initial.cpython-310.pyc b/LAB3/Students/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 00000000..3f7d05d7 Binary files /dev/null and b/LAB3/Students/migrations/__pycache__/0001_initial.cpython-310.pyc differ diff --git a/LAB3/Students/migrations/__pycache__/__init__.cpython-310.pyc b/LAB3/Students/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..de5f3d2e Binary files /dev/null and b/LAB3/Students/migrations/__pycache__/__init__.cpython-310.pyc differ diff --git a/LAB3/Students/models.py b/LAB3/Students/models.py new file mode 100644 index 00000000..ad860063 --- /dev/null +++ b/LAB3/Students/models.py @@ -0,0 +1,12 @@ +from django.db import models + +# Create your models here. + +class Students(models.Model): + + first_name = models.CharField(max_length=20) + last_name = models.CharField(max_length=20) + birth_date = models.DateField(max_length=20) + GPA = models.FloatField() + + diff --git a/LAB3/Students/tests.py b/LAB3/Students/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/LAB3/Students/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/LAB3/Students/urls.py b/LAB3/Students/urls.py new file mode 100644 index 00000000..7713c37a --- /dev/null +++ b/LAB3/Students/urls.py @@ -0,0 +1,12 @@ +from django.urls import path +from . import views + +app_name = "Students" + + +urlpatterns = [ + path("add/", views.add_student, name="student_adding"), + path("list/", views.list_students, name="student_listing"), + path("update//", views.update_student, name="student_updating"), + path("delete//", views.delete_student, name="student_deleting") +] \ No newline at end of file diff --git a/LAB3/Students/views.py b/LAB3/Students/views.py new file mode 100644 index 00000000..503efaed --- /dev/null +++ b/LAB3/Students/views.py @@ -0,0 +1,102 @@ +from unicodedata import name +from rest_framework.decorators import api_view +from rest_framework.request import Request +from rest_framework.response import Response +from .models import Students +from rest_framework import status + +# Create your views here. +@api_view(["POST"]) +def add_student(request : Request): + + fname = request.data['fname'] + lname = request.data['lname'] + bdate = request.data['bdate'] + gpa = request.data['gpa'] + + students = Students(first_name=fname, last_name=lname, birth_date=bdate, GPA=gpa) + students.save() + + res_data = { + + "msg" : "student added successfully!" + } + + + return Response(res_data, status=status.HTTP_200_OK) + + +@api_view(["GET"]) +def list_students(request : Request): + + skip = int(request.query_params.get('skip',0)) + get = int(request.query_params.get('get', 2)) + + all_students_with_high_GPA = Students.objects.all().count() + #print(all_students_with_high_GPA) + + if 'search' in request.query_params: + search_phrase = request.query_params['search'] + all_students = Students.objects.filter(first_name__contains=search_phrase)[skip:get] + else: + all_students = Students.objects.all().order_by('GPA')[skip:get] + + list_all = [{"id": student.id, "full name" : student.first_name + " " + student.last_name , "GPA" : student.GPA } for student in all_students] + # This step to convert model data to json data and get it at rest_api + + res_data = { + 'msg' : 'list all students', + 'students' : list_all + } + + return Response(res_data) + + +@api_view(["PUT"]) +def update_student(request : Request, student_id): + + + # store json data in request.data + + fname = request.data['fname'] + lname = request.data['lname'] + bdate = request.data['bdate'] + gpa = request.data['gpa'] + + # get id of student who will change her info + + student = Students.objects.get(id=student_id) + + # here to assign json data updated to data model of student + student.first_name = fname + student.last_name = lname + student.birth_date = bdate + student.GPA = gpa + + # save changes + student.save() + + res_data = { + 'msg' : f'student with id ({student_id}) updated successfully!' + } + + return Response(res_data) + + +@api_view(["DELETE"]) +def delete_student(request : Request, student_id): + + + + try: + # get student with id to delete it + student = Students.objects.get(id=student_id) + # get info of student will be delete it + student_deleted = {'id': student.id, 'name': student.first_name + ' ' + student.last_name, 'birthDate' : student.birth_date} + # then delete this student + student.delete() + except Exception as ex: + return Response({'msg' : 'The student Not Found!'}) + + return Response({'msg' : 'student with id ({student_id}) deleted successfully!', + 'student deleted' : student_deleted}) diff --git a/LAB3/db.sqlite3 b/LAB3/db.sqlite3 new file mode 100644 index 00000000..17c7583e Binary files /dev/null and b/LAB3/db.sqlite3 differ diff --git a/LAB3/manage.py b/LAB3/manage.py new file mode 100644 index 00000000..cdefed1b --- /dev/null +++ b/LAB3/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'LAB3.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main()