diff --git a/README.md b/README.md index 89415d6..658658e 100644 --- a/README.md +++ b/README.md @@ -1 +1,18 @@ -# Donation-Back \ No newline at end of file +

Life Share

+ +Summary + +A website for blood donation + +

Team members

+ +1- yahia labib (team leader) + +2- Mohammad Alkhatib + +3- haia Lawansah + +4- Yaseen Saed + +5- Yousef Obeidat + \ No newline at end of file diff --git a/accounts/__init__.py b/accounts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/accounts/admin.py b/accounts/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/accounts/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/accounts/apps.py b/accounts/apps.py new file mode 100644 index 0000000..3e3c765 --- /dev/null +++ b/accounts/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'accounts' diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..2fbf34b --- /dev/null +++ b/accounts/migrations/0001_initial.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0 on 2021-12-30 12:59 + +import django.contrib.auth.models +from django.db import migrations, models +import django.db.models.deletion +import phone_field.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='Account', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='auth.user')), + ('age', models.IntegerField()), + ('blood_type', models.CharField(blank=True, max_length=10, null=True)), + ('chronic_diseases', models.BooleanField(blank=True, default=False, null=True)), + ('image', models.ImageField(upload_to='image')), + ('data', models.DateField(blank=True, null=True)), + ('isAuthenticated', models.BooleanField(default=True)), + ('phone_number', phone_field.models.PhoneField(blank=True, help_text='Contact phone number', max_length=31)), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + bases=('auth.user',), + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/accounts/migrations/0002_account_group.py b/accounts/migrations/0002_account_group.py new file mode 100644 index 0000000..e5868b9 --- /dev/null +++ b/accounts/migrations/0002_account_group.py @@ -0,0 +1,21 @@ +# Generated by Django 4.0 on 2021-12-30 13:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('accounts', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='account', + name='group', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='boes', to='auth.group'), + preserve_default=False, + ), + ] diff --git a/accounts/migrations/0003_account_donate_account_location_alter_account_age.py b/accounts/migrations/0003_account_donate_account_location_alter_account_age.py new file mode 100644 index 0000000..8c92a2d --- /dev/null +++ b/accounts/migrations/0003_account_donate_account_location_alter_account_age.py @@ -0,0 +1,28 @@ +# Generated by Django 4.0 on 2021-12-30 17:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0002_account_group'), + ] + + operations = [ + migrations.AddField( + model_name='account', + name='donate', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='account', + name='location', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AlterField( + model_name='account', + name='age', + field=models.IntegerField(null=True), + ), + ] diff --git a/accounts/migrations/__init__.py b/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/accounts/models.py b/accounts/models.py new file mode 100644 index 0000000..e8475ea --- /dev/null +++ b/accounts/models.py @@ -0,0 +1,16 @@ +from django.db import models +from django.contrib.auth.models import User,Group +from phone_field import PhoneField +# Create your models here. +class Account(User): + age = models.IntegerField(null=True) + blood_type = models.CharField(max_length=10 ,blank=True,null=True) + chronic_diseases = models.BooleanField(default=False,blank=True,null=True) + image = models.ImageField(upload_to = 'image') + data = models.DateField(blank=True,null=True) + isAuthenticated = models.BooleanField(default=True) + phone_number = PhoneField(blank=True, help_text='Contact phone number') + group = models.ForeignKey(Group, related_name="boes", on_delete=models.CASCADE) + location = models.CharField(max_length=50,blank=True,null=True) + donate = models.BooleanField(default=False) + diff --git a/accounts/serializer.py b/accounts/serializer.py new file mode 100644 index 0000000..8873d1b --- /dev/null +++ b/accounts/serializer.py @@ -0,0 +1,34 @@ +from django.db.models import fields +from rest_framework import serializers +from .models import Account +class AddSerializer(serializers.ModelSerializer): + password = serializers.CharField(write_only=True) + + def create(self, validated_data): + + user = Account.objects.create_user( + username=validated_data['username'], + password=validated_data['password'], + age=validated_data['age'], + group = validated_data['group'], + blood_type = validated_data['blood_type'], + chronic_diseases = validated_data['chronic_diseases'], + data = validated_data['data'], + phone_number = validated_data['phone_number'], + first_name = validated_data['first_name'], + last_name = validated_data['last_name'], + email = validated_data['email'], + location = validated_data['location'], + donate = validated_data['donate'], + image = validated_data['image'] + ) + + return user + + class Meta: + model = Account + fields = ('id','first_name','last_name','username', + 'email','password','age','blood_type','phone_number','location', + 'chronic_diseases','data','donate','group','image' + ) + \ No newline at end of file diff --git a/accounts/tests.py b/accounts/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/accounts/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/accounts/urls.py b/accounts/urls.py new file mode 100644 index 0000000..bc638f2 --- /dev/null +++ b/accounts/urls.py @@ -0,0 +1,9 @@ +from django.urls import path +from .views import AddListView,DetailAddView,ListView + +urlpatterns = [ + path('',AddListView.as_view(),name= 'add_data'), + path('',DetailAddView.as_view(),name = 'detail_data'), + # path('',DetailAddView.as_view(),name = 'detail_dataint'), + path('view',ListView.as_view(),name = 'list_data') +] \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py new file mode 100644 index 0000000..54a1845 --- /dev/null +++ b/accounts/views.py @@ -0,0 +1,25 @@ +from django.shortcuts import render +from rest_framework import generics, permissions +from .serializer import AddSerializer +from .models import Account +from rest_framework import permissions +from django.shortcuts import get_object_or_404 +from .models import User +# Create your views here. + +class AddListView(generics.CreateAPIView): + serializer_class = AddSerializer + queryset = Account.objects.all() + permission_classes = [permissions.AllowAny] + +class DetailAddView(generics.RetrieveUpdateDestroyAPIView): + serializer_class = AddSerializer + queryset = Account.objects.all() + + def get_object(self): + UserName= self.kwargs.get("username") + return get_object_or_404(Account, username=UserName) +class ListView(generics.ListAPIView): + serializer_class = AddSerializer + queryset = Account.objects.all() + # permission_classes = [permissions.AllowAny] \ No newline at end of file diff --git a/blood_donating/__init__.py b/blood_donating/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blood_donating/admin.py b/blood_donating/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/blood_donating/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/blood_donating/apps.py b/blood_donating/apps.py new file mode 100644 index 0000000..92dc25b --- /dev/null +++ b/blood_donating/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BloodDonatingConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'blood_donating' diff --git a/blood_donating/migrations/__init__.py b/blood_donating/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blood_donating/models.py b/blood_donating/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/blood_donating/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/blood_donating/tests.py b/blood_donating/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/blood_donating/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blood_donating/views.py b/blood_donating/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/blood_donating/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000..8f3da34 Binary files /dev/null and b/db.sqlite3 differ diff --git a/hospital/__init__.py b/hospital/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hospital/admin.py b/hospital/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/hospital/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/hospital/apps.py b/hospital/apps.py new file mode 100644 index 0000000..003288d --- /dev/null +++ b/hospital/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HospitalConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'hospital' diff --git a/hospital/default.png b/hospital/default.png new file mode 100644 index 0000000..c402c36 Binary files /dev/null and b/hospital/default.png differ diff --git a/hospital/forms.py b/hospital/forms.py new file mode 100644 index 0000000..70028c0 --- /dev/null +++ b/hospital/forms.py @@ -0,0 +1,43 @@ +from django import forms +from django.contrib.auth.models import User +from django.contrib.auth.forms import UserCreationForm +from django.core.exceptions import ValidationError + + +class HospitalCreateForm(UserCreationForm): + username = forms.CharField(label='username', min_length=5, max_length=150) + email = forms.EmailField(label='email') + password1 = forms.CharField(label='password', widget=forms.PasswordInput) + password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput) + website = forms.CharField(label='website', max_length=256) + image = forms.ImageField() + + def username_clean(self): + username = self.cleaned_data['username'].lower() + new = User.objects.filter(username = username) + if new.count(): + raise ValidationError("User Already Exist") + return username + + def email_clean(self): + email = self.cleaned_data['email'].lower() + new = User.objects.filter(email=email) + if new.count(): + raise ValidationError(" Email Already Exist") + return email + + def clean_password2(self): + password1 = self.cleaned_data['password1'] + password2 = self.cleaned_data['password2'] + + if password1 and password2 and password1 != password2: + raise ValidationError("Password don't match") + return password2 + + def save(self, commit = True): + user = User.objects.create_user( + self.cleaned_data['username'], + self.cleaned_data['email'], + self.cleaned_data['password1'] + ) + return user \ No newline at end of file diff --git a/hospital/migrations/0001_initial.py b/hospital/migrations/0001_initial.py new file mode 100644 index 0000000..f67d21c --- /dev/null +++ b/hospital/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# Generated by Django 4.0 on 2021-12-30 11:36 + +import django.contrib.auth.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='customUser', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='auth.user')), + ('website', models.CharField(max_length=256)), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + bases=('auth.user',), + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/hospital/migrations/0002_customuser_image.py b/hospital/migrations/0002_customuser_image.py new file mode 100644 index 0000000..4aa1acd --- /dev/null +++ b/hospital/migrations/0002_customuser_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2021-12-30 11:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hospital', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='customuser', + name='image', + field=models.ImageField(default='default.png', upload_to=''), + ), + ] diff --git a/hospital/migrations/__init__.py b/hospital/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hospital/migrations/__pycache__/0001_initial.cpython-39.pyc b/hospital/migrations/__pycache__/0001_initial.cpython-39.pyc new file mode 100644 index 0000000..61bfd28 Binary files /dev/null and b/hospital/migrations/__pycache__/0001_initial.cpython-39.pyc differ diff --git a/hospital/migrations/__pycache__/0002_customuser_image.cpython-39.pyc b/hospital/migrations/__pycache__/0002_customuser_image.cpython-39.pyc new file mode 100644 index 0000000..bed21d1 Binary files /dev/null and b/hospital/migrations/__pycache__/0002_customuser_image.cpython-39.pyc differ diff --git a/hospital/migrations/__pycache__/__init__.cpython-39.pyc b/hospital/migrations/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..7e30419 Binary files /dev/null and b/hospital/migrations/__pycache__/__init__.cpython-39.pyc differ diff --git a/hospital/models.py b/hospital/models.py new file mode 100644 index 0000000..c1e3d72 --- /dev/null +++ b/hospital/models.py @@ -0,0 +1,7 @@ +from django.db import models +from django.contrib.auth.models import User +# Create your models here. + +class customUser (User): + website = models.CharField(max_length=256) + image = models.ImageField(default='default.png') \ No newline at end of file diff --git a/hospital/serializers.py b/hospital/serializers.py new file mode 100644 index 0000000..0af7e24 --- /dev/null +++ b/hospital/serializers.py @@ -0,0 +1,37 @@ +from rest_framework import serializers +from django.contrib.auth import get_user_model # If used custom user model +from .models import customUser +from rest_framework_simplejwt.serializers import TokenObtainPairSerializer + +class UserSerializer(serializers.ModelSerializer): + + password = serializers.CharField(write_only=True) + # website = serializers.CharField(write_only=True) + + def create(self, validated_data): + + user = customUser.objects.create_user( + username=validated_data['username'], + password=validated_data['password'], + website = validated_data['website'], + ) + + return user + + class Meta: + model = customUser + # Tuple of serialized model fields (see link [2]) + fields = ( "id", "username", "password", "website", "image" ) + + +class MyTokenObtainPairSerializer(TokenObtainPairSerializer): + def validate(self, attrs): + data = super().validate(attrs) + refresh = self.get_token(self.user) + data['refresh'] = str(refresh) + data['access'] = str(refresh.access_token) + + # Add extra responses here + data['id'] = self.user.id + data['username'] = self.user.username + return data \ No newline at end of file diff --git a/hospital/tests.py b/hospital/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/hospital/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/hospital/urls.py b/hospital/urls.py new file mode 100644 index 0000000..3c54004 --- /dev/null +++ b/hospital/urls.py @@ -0,0 +1,10 @@ +# accounts/urls.py +from django.urls import path +from .views import CreateUserView, HospitalDetail +from .views import CustomObtainAuthToken + +urlpatterns = [ + path('signup/', CreateUserView.as_view(), name='signup'), + path("/", HospitalDetail.as_view(), name="hospital_detail"), + path('authenticate/', CustomObtainAuthToken.as_view()) +] \ No newline at end of file diff --git a/hospital/views.py b/hospital/views.py new file mode 100644 index 0000000..7cefef0 --- /dev/null +++ b/hospital/views.py @@ -0,0 +1,27 @@ +from rest_framework import permissions +from rest_framework.generics import CreateAPIView, RetrieveAPIView +from django.contrib.auth import get_user_model # If used custom user model +from .models import customUser +from .serializers import UserSerializer +from rest_framework_simplejwt.views import TokenObtainPairView +from .serializers import MyTokenObtainPairSerializer + + + + +class CustomObtainAuthToken(TokenObtainPairView): + serializer_class = MyTokenObtainPairSerializer + +class CreateUserView(CreateAPIView): + model = get_user_model() + permission_classes = [ + permissions.AllowAny # Or anon users can't register + ] + serializer_class = UserSerializer + +class HospitalDetail(RetrieveAPIView): + queryset = customUser.objects.all() + serializer_class = UserSerializer + permission_classes = [ + permissions.AllowAny # Or anon users can't register + ] \ No newline at end of file diff --git a/lifeshare/__init__.py b/lifeshare/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lifeshare/asgi.py b/lifeshare/asgi.py new file mode 100644 index 0000000..123b308 --- /dev/null +++ b/lifeshare/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for lifeshare 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', 'lifeshare.settings') + +application = get_asgi_application() diff --git a/lifeshare/settings.py b/lifeshare/settings.py new file mode 100644 index 0000000..941c2f8 --- /dev/null +++ b/lifeshare/settings.py @@ -0,0 +1,172 @@ +""" +Django settings for lifeshare project. + +Generated by 'django-admin startproject' using Django 4.0. + +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 +import environ +# 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-y-*f%f49t3ffr)al-#hw&&_^ro3510@%&h69re5+dy@z-@y%z1' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +env = environ.Env( + DEBUG=(bool, False), + ENVIRONMENT=(str, "PRODUCTION"), + ALLOW_ALL_ORIGINS=(bool, False), + ALLOWED_HOSTS=(list, []), + ALLOWED_ORIGINS=(list, []), + DATABASE_ENGINE=(str, "django.db.backends.sqlite3"), + DATABASE_NAME=(str, BASE_DIR / "db.sqlite3"), + DATABASE_USER=(str, ""), + DATABASE_PASSWORD=(str, ""), + DATABASE_HOST=(str, ""), + DATABASE_PORT=(int, 5432), +) + +ALLOWED_HOSTS = tuple(env.list("ALLOWED_HOSTS")) +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # 3rd party + "whitenoise.runserver_nostatic", + "rest_framework", + 'rest_framework_simplejwt', + "corsheaders", + ## local + 'blood_donating', + 'accounts', + 'hospital' +] + +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "corsheaders.middleware.CorsMiddleware", + "whitenoise.middleware.WhiteNoiseMiddleware", + "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 = 'lifeshare.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [BASE_DIR/'templates'], + '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 = 'lifeshare.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + + +DATABASES = { + "default": { + "ENGINE": env.str("DATABASE_ENGINE"), + "NAME": env.str("DATABASE_NAME"), + "USER": env.str("DATABASE_USER"), + "PASSWORD": env.str("DATABASE_PASSWORD"), + "HOST": env.str("DATABASE_HOST"), + "PORT": env.int("DATABASE_PORT"), + } +} + + +# 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/' + +STATIC_ROOT = BASE_DIR / 'staticfiles' +STATICFILES_DIRS = [ + BASE_DIR / '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' + + +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.IsAuthenticated', + ], + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework_simplejwt.authentication.JWTAuthentication', + 'rest_framework.authentication.BasicAuthentication', + 'rest_framework.authentication.SessionAuthentication' + ], +} + +MEDIA_ROOT = BASE_DIR / 'uploads' +MEDIA_URL = '/files/' diff --git a/lifeshare/urls.py b/lifeshare/urls.py new file mode 100644 index 0000000..779470f --- /dev/null +++ b/lifeshare/urls.py @@ -0,0 +1,31 @@ +"""lifeshare 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 +from rest_framework_simplejwt import views as jwt_views +from rest_framework_simplejwt.views import ( + TokenObtainPairView, + TokenRefreshView, +) + +urlpatterns = [ + path('admin/', admin.site.urls), + path('api/v1/add/',include('accounts.urls')), + path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'), + path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'), + path('hospital/', include('hospital.urls')), +] + diff --git a/lifeshare/wsgi.py b/lifeshare/wsgi.py new file mode 100644 index 0000000..4a094a4 --- /dev/null +++ b/lifeshare/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for lifeshare 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', 'lifeshare.settings') + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..3e7c243 --- /dev/null +++ b/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', 'lifeshare.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() diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..3918d60 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,334 @@ +[[package]] +name = "asgiref" +version = "3.4.1" +description = "ASGI specs, helper code, and adapters" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] + +[[package]] +name = "django" +version = "4.0" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +asgiref = ">=3.4.1,<4" +sqlparse = ">=0.2.2" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-cors-headers" +version = "3.10.1" +description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +Django = ">=2.2" + +[[package]] +name = "django-environ" +version = "0.8.1" +description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application." +category = "main" +optional = false +python-versions = ">=3.4,<4" + +[package.extras] +develop = ["coverage[toml] (>=5.0a4)", "pytest (>=4.6.11)", "furo (>=2021.8.17b43,<2021.9.0)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] +docs = ["furo (>=2021.8.17b43,<2021.9.0)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] +testing = ["coverage[toml] (>=5.0a4)", "pytest (>=4.6.11)"] + +[[package]] +name = "django-phone-field" +version = "1.8.1" +description = "Lightweight model and form field for phone numbers in Django" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +Django = ">=1.10" + +[[package]] +name = "djangorestframework" +version = "3.13.1" +description = "Web APIs for Django, made easy." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +django = ">=2.2" +pytz = "*" + +[[package]] +name = "djangorestframework-simplejwt" +version = "5.0.0" +description = "A minimal JSON Web Token authentication plugin for Django REST Framework" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +django = "*" +djangorestframework = "*" +pyjwt = ">=2,<3" + +[package.extras] +dev = ["pytest-watch", "wheel", "twine", "ipython", "cryptography", "pytest-cov", "pytest-django", "pytest-xdist", "pytest", "tox", "flake8", "pep8", "isort", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "python-jose (==3.0.0)"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] +lint = ["flake8", "pep8", "isort"] +python-jose = ["python-jose (==3.0.0)"] +test = ["cryptography", "pytest-cov", "pytest-django", "pytest-xdist", "pytest", "tox"] + +[[package]] +name = "gunicorn" +version = "20.1.0" +description = "WSGI HTTP Server for UNIX" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +tornado = ["tornado (>=0.2)"] + +[[package]] +name = "pillow" +version = "8.4.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "psycopg2-binary" +version = "2.9.3" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyjwt" +version = "2.3.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +crypto = ["cryptography (>=3.3.1)"] +dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] + +[[package]] +name = "pytz" +version = "2021.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sqlparse" +version = "0.4.2" +description = "A non-validating SQL parser." +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "tzdata" +version = "2021.5" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" + +[[package]] +name = "whitenoise" +version = "5.3.0" +description = "Radically simplified static file serving for WSGI applications" +category = "main" +optional = false +python-versions = ">=3.5, <4" + +[package.extras] +brotli = ["brotli"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "2e4554106aa28e22d929a0dfcc8a39a99afd9dd4b95a87f7b8ab2f02b0ab54f9" + + +[metadata.files] +asgiref = [ + {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"}, + {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"}, +] +django = [ + {file = "Django-4.0-py3-none-any.whl", hash = "sha256:59304646ebc6a77b9b6a59adc67d51ecb03c5e3d63ed1f14c909cdfda84e8010"}, + {file = "Django-4.0.tar.gz", hash = "sha256:d5a8a14da819a8b9237ee4d8c78dfe056ff6e8a7511987be627192225113ee75"}, +] +django-cors-headers = [ + {file = "django-cors-headers-3.10.1.tar.gz", hash = "sha256:b5a874b492bcad99f544bb76ef679472259eb41ee5644ca62d1a94ddb26b7f6e"}, + {file = "django_cors_headers-3.10.1-py3-none-any.whl", hash = "sha256:1390b5846e9835b0911e2574409788af87cd9154246aafbdc8ec546c93698fe6"}, +] +django-environ = [ + {file = "django-environ-0.8.1.tar.gz", hash = "sha256:6f0bc902b43891656b20486938cba0861dc62892784a44919170719572a534cb"}, + {file = "django_environ-0.8.1-py2.py3-none-any.whl", hash = "sha256:42593bee519a527602a467c7b682aee1a051c2597f98c45f4f4f44169ecdb6e5"}, +] +django-phone-field = [ + {file = "django-phone-field-1.8.1.tar.gz", hash = "sha256:db63af60fc3a3c66b9faa7e72bb7972cd1518299f2e93d68dd95d8df6214f7ed"}, + {file = "django_phone_field-1.8.1-py3-none-any.whl", hash = "sha256:407e74b65e8f7dd14d0a0aa89e277516d57ad6a09ce992cdd94e15b1624b9961"}, +] +djangorestframework = [ + {file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"}, + {file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"}, +] +djangorestframework-simplejwt = [ + {file = "djangorestframework_simplejwt-5.0.0-py3-none-any.whl", hash = "sha256:ddcbeef51155d1e71410dde44b581c7e04cfb74776f5337661ac3ef4c0c367e6"}, + {file = "djangorestframework_simplejwt-5.0.0.tar.gz", hash = "sha256:30b10e7732395c44d21980f773214d2b9bdeadf2a6c6809cd1a7c9abe272873c"}, +] +gunicorn = [ + {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, + {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, +] +pillow = [ + {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, + {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"}, + {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"}, + {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"}, + {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"}, + {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"}, + {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"}, + {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"}, + {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"}, + {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"}, + {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"}, + {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"}, + {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"}, + {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, + {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, +] +psycopg2-binary = [ + {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, + {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, + {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, + {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, + {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, + {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, +] +pyjwt = [ + {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"}, + {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"}, +] +pytz = [ + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, +] +sqlparse = [ + {file = "sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"}, + {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"}, +] +tzdata = [ + {file = "tzdata-2021.5-py2.py3-none-any.whl", hash = "sha256:3eee491e22ebfe1e5cfcc97a4137cd70f092ce59144d81f8924a844de05ba8f5"}, + {file = "tzdata-2021.5.tar.gz", hash = "sha256:68dbe41afd01b867894bbdfd54fa03f468cfa4f0086bfb4adcd8de8f24f3ee21"}, +] +whitenoise = [ + {file = "whitenoise-5.3.0-py2.py3-none-any.whl", hash = "sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c"}, + {file = "whitenoise-5.3.0.tar.gz", hash = "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..8843f9a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[tool.poetry] +name = "lifeshare-back" +version = "0.1.0" +description = "" +authors = ["Yahialabeeb "] + +[tool.poetry.dependencies] +python = "^3.9" +Django = "^4.0" +djangorestframework = "^3.13.1" +django-environ = "^0.8.1" +psycopg2-binary = "^2.9.3" +gunicorn = "^20.1.0" +whitenoise = "^5.3.0" +django-cors-headers = "^3.10.1" +djangorestframework-simplejwt = "^5.0.0" +django-phone-field = "^1.8.1" +Pillow = "^8.4.0" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..ec94dd0 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,14 @@ + + + + + + {% block title %}Django Auth Tutorial{% endblock %} + + +
+ {% block content %} + {% endblock %} +
+ + \ No newline at end of file diff --git a/templates/registration/signup.html b/templates/registration/signup.html new file mode 100644 index 0000000..404a990 --- /dev/null +++ b/templates/registration/signup.html @@ -0,0 +1,13 @@ + +{% extends 'base.html' %} + +{% block title %}Sign Up{% endblock %} + +{% block content %} +

Sign up

+
+ {% csrf_token %} + {{ form.as_p }} + +
+{% endblock %} \ No newline at end of file diff --git a/uploads/image/project.png b/uploads/image/project.png new file mode 100644 index 0000000..989ad5a Binary files /dev/null and b/uploads/image/project.png differ diff --git a/uploads/image/project4.png b/uploads/image/project4.png new file mode 100644 index 0000000..97c2286 Binary files /dev/null and b/uploads/image/project4.png differ diff --git a/uploads/image/project4_KSixa58.png b/uploads/image/project4_KSixa58.png new file mode 100644 index 0000000..97c2286 Binary files /dev/null and b/uploads/image/project4_KSixa58.png differ diff --git a/uploads/image/project4_lymYvKO.png b/uploads/image/project4_lymYvKO.png new file mode 100644 index 0000000..97c2286 Binary files /dev/null and b/uploads/image/project4_lymYvKO.png differ diff --git a/uploads/image/yaseen.PNG b/uploads/image/yaseen.PNG new file mode 100644 index 0000000..8828bf6 Binary files /dev/null and b/uploads/image/yaseen.PNG differ