diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py
index 0edc274f90..fb648dce2c 100644
--- a/server/djangoapp/urls.py
+++ b/server/djangoapp/urls.py
@@ -1,16 +1,21 @@
# Uncomment the imports before you add the code
-# from django.urls import path
+from django.urls import path
from django.conf.urls.static import static
from django.conf import settings
-# from . import views
+from django.contrib.auth import views as auth_views
+from django.http import HttpResponse
+from . import views
app_name = 'djangoapp'
+
urlpatterns = [
# # path for registration
# path for login
- # path(route='login', view=views.login_user, name='login'),
-
+ path(route='login', view=views.login_user, name='login'),
+ path('logout/', views.logout_request, name='logout'),
+ path('register/', views.registration, name='register'),
+
# path for dealer reviews view
# path for add a review view
diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py
index b16409f419..09b18872cf 100644
--- a/server/djangoapp/views.py
+++ b/server/djangoapp/views.py
@@ -1,12 +1,12 @@
# Uncomment the required imports before adding the code
-# from django.shortcuts import render
-# from django.http import HttpResponseRedirect, HttpResponse
-# from django.contrib.auth.models import User
-# from django.shortcuts import get_object_or_404, render, redirect
-# from django.contrib.auth import logout
-# from django.contrib import messages
-# from datetime import datetime
+from django.shortcuts import render
+from django.http import HttpResponseRedirect, HttpResponse
+from django.contrib.auth.models import User
+from django.shortcuts import get_object_or_404, render, redirect
+from django.contrib.auth import logout
+from django.contrib import messages
+from datetime import datetime
from django.http import JsonResponse
from django.contrib.auth import login, authenticate
@@ -39,13 +39,43 @@ def login_user(request):
return JsonResponse(data)
# Create a `logout_request` view to handle sign out request
-# def logout_request(request):
-# ...
+@csrf_exempt
+def logout_request(request):
+ if request.method == 'POST':
+ logout(request)
+ return JsonResponse({'status': 'success'})
+ return JsonResponse({'status': 'fail', 'message': 'Invalid request method'}, status=400)
# Create a `registration` view to handle sign up request
-# @csrf_exempt
-# def registration(request):
-# ...
+@csrf_exempt
+def registration(request):
+ context = {}
+ data = json.loads(request.body)
+ username = data['userName']
+ password = data['password']
+ first_name = data['firstName']
+ last_name = data['lastName']
+ email = data['email']
+ username_exist = False
+ email_exist = False
+ try:
+ # Check if user already exists
+ User.objects.get(username=username)
+ username_exist = True
+ except:
+ # If not, simply log this is a new user
+ logger.debug("{} is new user".format(username))
+ # If it is a new user
+ if not username_exist:
+ # Create user in auth_user table
+ user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name,password=password, email=email)
+ # Login the user and redirect to list page
+ login(request, user)
+ data = {"userName":username,"status":"Authenticated"}
+ return JsonResponse(data)
+ else :
+ data = {"userName":username,"error":"Already Registered"}
+ return JsonResponse(data)
# # Update the `get_dealerships` view to render the index page with
# a list of dealerships
diff --git a/server/djangoproj/settings.py b/server/djangoproj/settings.py
index 7d66d46d20..f70d101802 100644
--- a/server/djangoproj/settings.py
+++ b/server/djangoproj/settings.py
@@ -14,6 +14,8 @@
from pathlib import Path
+APPEND_SLASH = True
+
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
@@ -51,6 +53,7 @@
'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',
@@ -62,7 +65,9 @@
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
- os.path.join(BASE_DIR,'frontend/static')
+ os.path.join(BASE_DIR, 'frontend/static'),
+ os.path.join(BASE_DIR, 'frontend/build'),
+ os.path.join(BASE_DIR, 'frontend/build/static'),
],
'APP_DIRS': True,
'OPTIONS': {
@@ -137,6 +142,14 @@
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
STATICFILES_DIRS = [
- os.path.join(BASE_DIR,'frontend/static')
+ os.path.join(BASE_DIR, 'frontend/static'),
+ os.path.join(BASE_DIR, 'frontend/build'),
+ os.path.join(BASE_DIR, 'frontend/build/static'),
]
+LOGOUT_REDIRECT_URL = '/'
+
+SESSION_COOKIE_NAME = 'sessionid'
+SESSION_EXPIRE_AT_BROWSER_CLOSE = True
+
+
diff --git a/server/djangoproj/urls.py b/server/djangoproj/urls.py
index 5825f366ef..eaf6254de6 100644
--- a/server/djangoproj/urls.py
+++ b/server/djangoproj/urls.py
@@ -25,4 +25,6 @@
path('', TemplateView.as_view(template_name="Home.html")),
path('about/', TemplateView.as_view(template_name="About.html")),
path('contact/', TemplateView.as_view(template_name="Contact.html")),
+ path('login/', TemplateView.as_view(template_name="index.html")),
+ path('register/', TemplateView.as_view(template_name="index.html")),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
diff --git a/server/frontend/package-lock.json b/server/frontend/package-lock.json
index 0797425307..b9244446c9 100644
--- a/server/frontend/package-lock.json
+++ b/server/frontend/package-lock.json
@@ -16,6 +16,9 @@
"react-router-dom": "^6.19.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
+ },
+ "devDependencies": {
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -646,9 +649,17 @@
}
},
"node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "version": "7.21.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz",
+ "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
"engines": {
"node": ">=6.9.0"
},
@@ -1891,6 +1902,17 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/preset-env/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
diff --git a/server/frontend/src/App.js b/server/frontend/src/App.js
index aceac6974d..647d0afd42 100644
--- a/server/frontend/src/App.js
+++ b/server/frontend/src/App.js
@@ -1,10 +1,12 @@
import LoginPanel from "./components/Login/Login"
+import Register from "./components/Register/Register"
import { Routes, Route } from "react-router-dom";
function App() {
return (