diff --git a/.gitignore b/.gitignore index 224c7ac2850..b7703837ad4 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,6 @@ share/python-wheels/ *.egg-info/ .installed.cfg *.egg -MANIFEST .idea/ # PyInstaller diff --git a/server/database/app.js b/server/database/app.js index e623694ef2f..e2cdfad0855 100644 --- a/server/database/app.js +++ b/server/database/app.js @@ -1,11 +1,12 @@ +/*jshint esversion: 8 */ const express = require('express'); const mongoose = require('mongoose'); const fs = require('fs'); -const cors = require('cors') -const app = express() +const cors = require('cors'); +const app = express(); const port = 3030; -app.use(cors()) +app.use(cors()); app.use(require('body-parser').urlencoded({ extended: false })); const reviews_data = JSON.parse(fs.readFileSync("reviews.json", 'utf8')); @@ -20,10 +21,10 @@ const Dealerships = require('./dealership'); try { Reviews.deleteMany({}).then(()=>{ - Reviews.insertMany(reviews_data['reviews']); + Reviews.insertMany(reviews_data.reviews); }); Dealerships.deleteMany({}).then(()=>{ - Dealerships.insertMany(dealerships_data['dealerships']); + Dealerships.insertMany(dealerships_data.dealerships); }); } catch (error) { @@ -33,7 +34,7 @@ try { // Express route to home app.get('/', async (req, res) => { - res.send("Welcome to the Mongoose API") + res.send("Welcome to the Mongoose API"); }); // Express route to fetch all reviews @@ -91,19 +92,19 @@ app.get('/fetchDealer/:id', async (req, res) => { //Express route to insert review app.post('/insert_review', express.raw({ type: '*/*' }), async (req, res) => { data = JSON.parse(req.body); - const documents = await Reviews.find().sort( { id: -1 } ) - let new_id = documents[0]['id']+1 + const documents = await Reviews.find().sort( { id: -1 } ); + let new_id = documents[0].id+1; const review = new Reviews({ "id": new_id, - "name": data['name'], - "dealership": data['dealership'], - "review": data['review'], - "purchase": data['purchase'], - "purchase_date": data['purchase_date'], - "car_make": data['car_make'], - "car_model": data['car_model'], - "car_year": data['car_year'], + "name": data.name, + "dealership": data.dealership, + "review": data.review, + "purchase": data.purchase, + "purchase_date": data.purchase_date, + "car_make": data.car_make, + "car_model": data.car_model, + "car_year": data.car_year, }); try { diff --git a/server/database/dealership.js b/server/database/dealership.js index b10d6b47304..4c87270316e 100644 --- a/server/database/dealership.js +++ b/server/database/dealership.js @@ -1,3 +1,4 @@ +/*jshint esversion: 8 */ const mongoose = require('mongoose'); const Schema = mongoose.Schema; diff --git a/server/database/inventory.js b/server/database/inventory.js index 2c22fd092ce..6c04f39d229 100644 --- a/server/database/inventory.js +++ b/server/database/inventory.js @@ -1,3 +1,4 @@ +/*jshint esversion: 8 */ const { Int32 } = require('mongodb'); const mongoose = require('mongoose'); diff --git a/server/database/review.js b/server/database/review.js index 4759725a3a3..217c8289023 100644 --- a/server/database/review.js +++ b/server/database/review.js @@ -1,3 +1,4 @@ +/*jshint esversion: 8 */ const mongoose = require('mongoose'); const Schema = mongoose.Schema; diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 6a89edee919..e2eee2f9414 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -1,10 +1,11 @@ # Uncomment the following imports before adding the Model code from django.db import models -from django.utils.timezone import now +# from django.utils.timezone import now from django.core.validators import MaxValueValidator, MinValueValidator # Create your models here. + # Create a Car Make model `class CarMake(models.Model)`: # - Name # - Description @@ -29,23 +30,21 @@ def __str__(self): # - Any other fields you would like to include in car model # - __str__ method to print a car make object class CarModel(models.Model): - car_make = models.ForeignKey(CarMake, on_delete=models.CASCADE) # Many-to-One relationship + car_make = models.ForeignKey( + CarMake, + on_delete=models.CASCADE) # Many-to-One relationship name = models.CharField(max_length=100) CAR_TYPES = [ ('SEDAN', 'Sedan'), ('SUV', 'SUV'), - ('WAGON', 'Wagon'), - # Add more choices as required - ] + ('WAGON', 'Wagon')] type = models.CharField(max_length=10, choices=CAR_TYPES, default='SUV') - year = models.IntegerField(default=2023, + year = models.IntegerField( + default=2023, validators=[ MaxValueValidator(2023), - MinValueValidator(2015) - ]) + MinValueValidator(2015)]) # Other fields as needed def __str__(self): return self.name # Return the name as the string representation - - diff --git a/server/djangoapp/populate.py b/server/djangoapp/populate.py index dc131d82e62..603c9b60d33 100644 --- a/server/djangoapp/populate.py +++ b/server/djangoapp/populate.py @@ -1,38 +1,62 @@ from .models import CarMake, CarModel + def initiate(): car_make_data = [ - {"name": "NISSAN", "description": "Great cars. Japanese technology"}, - {"name": "Mercedes", "description": "Great cars. German technology"}, - {"name": "Audi", "description": "Great cars. German technology"}, - {"name": "Kia", "description": "Great cars. Korean technology"}, - {"name": "Toyota", "description": "Great cars. Japanese technology"}, + {"name": "NISSAN", + "description": "Great cars. Japanese technology"}, + {"name": "Mercedes", + "description": "Great cars. German technology"}, + {"name": "Audi", + "description": "Great cars. German technology"}, + {"name": "Kia", + "description": "Great cars. Korean technology"}, + {"name": "Toyota", + "description": "Great cars. Japanese technology"}, ] car_make_instances = [] for data in car_make_data: - car_make_instances.append(CarMake.objects.create(name=data['name'], description=data['description'])) - + car_make_instances.append( + CarMake.objects.create( + name=data['name'], + description=data['description'])) - # Create CarModel instances with the corresponding CarMake instances car_model_data = [ - {"name": "Pathfinder", "type": "SUV", "year": 2023, "car_make": car_make_instances[0]}, - {"name": "Qashqai", "type": "SUV", "year": 2023, "car_make": car_make_instances[0]}, - {"name": "XTRAIL", "type": "SUV", "year": 2023, "car_make": car_make_instances[0]}, - {"name": "A-Class", "type": "SUV", "year": 2023, "car_make": car_make_instances[1]}, - {"name": "C-Class", "type": "SUV", "year": 2023, "car_make": car_make_instances[1]}, - {"name": "E-Class", "type": "SUV", "year": 2023, "car_make": car_make_instances[1]}, - {"name": "A4", "type": "SUV", "year": 2023, "car_make": car_make_instances[2]}, - {"name": "A5", "type": "SUV", "year": 2023, "car_make": car_make_instances[2]}, - {"name": "A6", "type": "SUV", "year": 2023, "car_make": car_make_instances[2]}, - {"name": "Sorrento", "type": "SUV", "year": 2023, "car_make": car_make_instances[3]}, - {"name": "Carnival", "type": "SUV", "year": 2023, "car_make": car_make_instances[3]}, - {"name": "Cerato", "type": "Sedan", "year": 2023, "car_make": car_make_instances[3]}, - {"name": "Corolla", "type": "Sedan", "year": 2023, "car_make": car_make_instances[4]}, - {"name": "Camry", "type": "Sedan", "year": 2023, "car_make": car_make_instances[4]}, - {"name": "Kluger", "type": "SUV", "year": 2023, "car_make": car_make_instances[4]}, - # Add more CarModel instances as needed + {"name": "Pathfinder", "type": "SUV", + "year": 2023, "car_make": car_make_instances[0]}, + {"name": "Qashqai", "type": "SUV", + "year": 2023, "car_make": car_make_instances[0]}, + {"name": "XTRAIL", "type": "SUV", + "year": 2023, "car_make": car_make_instances[0]}, + {"name": "A-Class", "type": "SUV", + "year": 2023, "car_make": car_make_instances[1]}, + {"name": "C-Class", "type": "SUV", + "year": 2023, "car_make": car_make_instances[1]}, + {"name": "E-Class", "type": "SUV", + "year": 2023, "car_make": car_make_instances[1]}, + {"name": "A4", "type": "SUV", + "year": 2023, "car_make": car_make_instances[2]}, + {"name": "A5", "type": "SUV", + "year": 2023, "car_make": car_make_instances[2]}, + {"name": "A6", "type": "SUV", + "year": 2023, "car_make": car_make_instances[2]}, + {"name": "Sorrento", "type": "SUV", + "year": 2023, "car_make": car_make_instances[3]}, + {"name": "Carnival", "type": "SUV", + "year": 2023, "car_make": car_make_instances[3]}, + {"name": "Cerato", "type": "Sedan", + "year": 2023, "car_make": car_make_instances[3]}, + {"name": "Corolla", "type": "Sedan", + "year": 2023, "car_make": car_make_instances[4]}, + {"name": "Camry", "type": "Sedan", + "year": 2023, "car_make": car_make_instances[4]}, + {"name": "Kluger", "type": "SUV", + "year": 2023, "car_make": car_make_instances[4]} ] - for data in car_model_data: - CarModel.objects.create(name=data['name'], car_make=data['car_make'], type=data['type'], year=data['year']) \ No newline at end of file + CarModel.objects.create( + name=data['name'], + car_make=data['car_make'], + type=data['type'], + year=data['year']) diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index c761676f501..82dbfa99e49 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -11,13 +11,14 @@ 'sentiment_analyzer_url', default="http://localhost:5050/") + # def get_request(endpoint, **kwargs): # Add code for get requests to back end def get_request(endpoint, **kwargs): params = "" - if(kwargs): - for key,value in kwargs.items(): - params=params+key+"="+value+"&" + if (kwargs): + for key, value in kwargs.items(): + params = params + key + "=" + value + "&" request_url = backend_url+endpoint+"?"+params @@ -26,15 +27,16 @@ def get_request(endpoint, **kwargs): # Call get method of requests library with URL and parameters response = requests.get(request_url) return response.json() - except: + except Exception: # If any error occurs print("Network exception occurred") + # def analyze_review_sentiments(text): # request_url = sentiment_analyzer_url+"analyze/"+text # Add code for retrieving sentiments def analyze_review_sentiments(text): - request_url = sentiment_analyzer_url+"analyze/"+text + request_url = sentiment_analyzer_url + "analyze/" + text try: # Call get method of requests library with URL and parameters response = requests.get(request_url) @@ -43,13 +45,14 @@ def analyze_review_sentiments(text): print(f"Unexpected {err=}, {type(err)=}") print("Network exception occurred") + # def post_review(data_dict): # Add code for posting review def post_review(data_dict): - request_url = backend_url+"/insert_review" + request_url = backend_url + "/insert_review" try: - response = requests.post(request_url,json=data_dict) + response = requests.post(request_url, json=data_dict) print(response.json()) return response.json() - except: + except Exception: print("Network exception occurred") diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 793c506a7de..fd9318ba34d 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -14,9 +14,12 @@ path(route='registration', view=views.registration, name='registration'), path(route='get_cars', view=views.get_cars, name='getcars'), path(route='get_dealers/', view=views.get_dealerships, name='get_dealers'), - path(route='get_dealers/', view=views.get_dealerships, name='get_dealers_by_state'), - path(route='dealer/', view=views.get_dealer_details, name='dealer_details'), - path(route='reviews/dealer/', view=views.get_dealer_reviews, name='dealer_details'), + path(route='get_dealers/', + view=views.get_dealerships, name='get_dealers_by_state'), + path(route='dealer/', + view=views.get_dealer_details, name='dealer_details'), + path(route='reviews/dealer/', + view=views.get_dealer_reviews, name='dealer_details'), path(route='add_review', view=views.add_review, name='add_review'), # path for dealer reviews view diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index f5163751a08..f360a092e05 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.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.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.contrib import messages +# from datetime import datetime from django.http import JsonResponse from django.contrib.auth import login, authenticate @@ -15,7 +15,8 @@ from django.views.decorators.csrf import csrf_exempt from .populate import initiate from .models import CarMake, CarModel -from .restapis import get_request, analyze_review_sentiments, post_review +from .restapis import (get_request, analyze_review_sentiments) +# post_review # Get an instance of a logger logger = logging.getLogger(__name__) @@ -39,6 +40,7 @@ def login_user(request): data = {"userName": username, "status": "Authenticated"} return JsonResponse(data) + # Create a `logout_request` view to handle sign out request def logout_request(request): logout(request) # Terminate user session @@ -46,10 +48,11 @@ def logout_request(request): return JsonResponse(data) # ... + # Create a `registration` view to handle sign up request @csrf_exempt def registration(request): - context = {} + # context = {} # Load JSON data from the request body data = json.loads(request.body) @@ -59,89 +62,86 @@ def registration(request): last_name = data['lastName'] email = data['email'] username_exist = False - email_exist = False + # email_exist = False try: # Check if user already exists User.objects.get(username=username) username_exist = True - except: + except Exception: # 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) + 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"} + data = {"userName": username, "status": "Authenticated"} return JsonResponse(data) - else : - data = {"userName": username,"error": "Already Registered"} + else: + data = {"userName": username, "error": "Already Registered"} return JsonResponse(data) + @csrf_exempt def get_cars(request): count = CarMake.objects.filter().count() print(count) - if(count == 0): + if (count == 0): initiate() car_models = CarModel.objects.select_related('car_make') cars = [] for car_model in car_models: - cars.append({"CarModel": car_model.name, "CarMake": car_model.car_make.name}) + cars.append({"CarModel": car_model.name, + "CarMake": car_model.car_make.name}) return JsonResponse({"CarModels": cars}) -# # Update the `get_dealerships` view to render the index page with -# a list of dealerships -# def get_dealerships(request): -# ... -#Update the `get_dealerships` render list of dealerships all by default, particular state if state is passed + def get_dealerships(request, state="All"): - if(state == "All"): + if (state == "All"): endpoint = "/fetchDealers" else: endpoint = "/fetchDealers/"+state dealerships = get_request(endpoint) - return JsonResponse({"status": 200,"dealers": dealerships}) + return JsonResponse({"status": 200, "dealers": dealerships}) + -# Create a `get_dealer_reviews` view to render the reviews of a dealer -# def get_dealer_reviews(request,dealer_id): -# ... def get_dealer_reviews(request, dealer_id): # if dealer id has been provided - if(dealer_id): + if (dealer_id): endpoint = "/fetchReviews/dealer/"+str(dealer_id) reviews = get_request(endpoint) for review_detail in reviews: response = analyze_review_sentiments(review_detail['review']) print(response) review_detail['sentiment'] = response['sentiment'] - return JsonResponse({"status": 200,"reviews": reviews}) + return JsonResponse({"status": 200, "reviews": reviews}) else: - return JsonResponse({"status": 400,"message": "Bad Request"}) + return JsonResponse({"status": 400, "message": "Bad Request"}) + -# Create a `get_dealer_details` view to render the dealer details -# def get_dealer_details(request, dealer_id): -# ... def get_dealer_details(request, dealer_id): - if(dealer_id): + if (dealer_id): endpoint = "/fetchDealer/"+str(dealer_id) dealership = get_request(endpoint) - return JsonResponse({"status": 200,"dealer": dealership}) + return JsonResponse({"status": 200, "dealer": dealership}) else: - return JsonResponse({"status": 400,"message": "Bad Request"}) + return JsonResponse({"status": 400, "message": "Bad Request"}) + -# Create a `add_review` view to submit a review -# def add_review(request): -# ... def add_review(request): - if(request.user.is_anonymous == False): - data = json.loads(request.body) + if not request.user.is_anonymous: + # data = json.loads(request.body) try: - response = post_review(data) + # response = post_review(data) return JsonResponse({"status": 200}) - except: - return JsonResponse({"status": 401,"message": "Error in posting review"}) + except Exception: + return JsonResponse({"status": 401, + "message": "Error in posting review"}) else: - return JsonResponse({"status": 403,"message": "Unauthorized"}) + return JsonResponse({"status": 403, "message": "Unauthorized"}) diff --git a/server/djangoproj/settings.py b/server/djangoproj/settings.py index 2349ce171ec..7081cffab5f 100644 --- a/server/djangoproj/settings.py +++ b/server/djangoproj/settings.py @@ -28,8 +28,22 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['localhost', '127.0.0.1','https://nicholassuta-8000.theianext-0-labs-prod-misc-tools-us-east-0.proxy.cognitiveclass.ai'] -CSRF_TRUSTED_ORIGINS = ['https://nicholassuta-8000.theiadockernext-0-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai','https://nicholassuta-8000.theianext-0-labs-prod-misc-tools-us-east-0.proxy.cognitiveclass.ai'] +ALLOWED_HOSTS = [ + 'localhost', + '127.0.0.1', + 'https://nicholassuta-8000.' + 'theianext-0-labs-prod-misc-tools-us-east-0.' + 'proxy.cognitiveclass.ai', + 'https://nicholassuta-8000.' + 'theiadockernext-0-labs-prod-theiak8s-4-tor01.' + 'proxy.cognitiveclass.ai'] +CSRF_TRUSTED_ORIGINS = [ + 'https://nicholassuta-8000.' + 'theianext-0-labs-prod-misc-tools-us-east-0.' + 'proxy.cognitiveclass.ai', + 'https://nicholassuta-8000.' + 'theiadockernext-0-labs-prod-theiak8s-4-tor01.' + 'proxy.cognitiveclass.ai'] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [], @@ -62,9 +76,9 @@ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ - os.path.join(BASE_DIR,'frontend/static'), - os.path.join(BASE_DIR,'frontend/build'), - os.path.join(BASE_DIR,'frontend/build/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': { @@ -94,7 +108,8 @@ AUTH_PASSWORD_VALIDATORS = [ { 'NAME': - 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + 'django.contrib.auth.password_validation.' + 'UserAttributeSimilarityValidator', }, { 'NAME': @@ -139,7 +154,7 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' STATICFILES_DIRS = [ - os.path.join(BASE_DIR,'frontend/static'), - os.path.join(BASE_DIR,'frontend/build'), - os.path.join(BASE_DIR,'frontend/build/static'), -] \ No newline at end of file + os.path.join(BASE_DIR, 'frontend/static'), + os.path.join(BASE_DIR, 'frontend/build'), + os.path.join(BASE_DIR, 'frontend/build/static'), +] diff --git a/server/djangoproj/urls.py b/server/djangoproj/urls.py index dd2799cfde5..45704641f29 100644 --- a/server/djangoproj/urls.py +++ b/server/djangoproj/urls.py @@ -29,10 +29,8 @@ path('register/', TemplateView.as_view(template_name="index.html")), path('dealers/', TemplateView.as_view(template_name="index.html")), path('dealer/', TemplateView.as_view(template_name="index.html")), - path( - 'dealer/', + path('dealer/', TemplateView.as_view(template_name="index.html")), - path( - 'postreview/', - TemplateView.as_view(template_name="index.html")), + path('postreview/', + TemplateView.as_view(template_name="index.html")) ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)