Skip to content

Commit 80598d6

Browse files
committed
3 module complete
1 parent e7a25cb commit 80598d6

File tree

6 files changed

+184
-48
lines changed

6 files changed

+184
-48
lines changed

server/djangoapp/admin.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
# from django.contrib import admin
2-
# from .models import related models
3-
1+
from django.contrib import admin
2+
from .models import CarMake, CarModel
43

4+
admin.site.register(CarMake)
5+
admin.site.register(CarModel)
56
# Register your models here.
67

78
# CarModelInline class

server/djangoapp/models.py

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,36 @@
11
# Uncomment the following imports before adding the Model code
22

3-
# from django.db import models
4-
# from django.utils.timezone import now
5-
# from django.core.validators import MaxValueValidator, MinValueValidator
3+
from django.db import models
4+
from django.utils.timezone import now
5+
from django.core.validators import MaxValueValidator, MinValueValidator
66

77

8-
# Create your models here.
8+
class CarMake(models.Model):
9+
name = models.CharField(max_length=100)
10+
description = models.TextField()
11+
# Other fields as needed
912

10-
# <HINT> Create a Car Make model `class CarMake(models.Model)`:
11-
# - Name
12-
# - Description
13-
# - Any other fields you would like to include in car make model
14-
# - __str__ method to print a car make object
13+
def __str__(self):
14+
return self.name
15+
# Return the name as the string representation
1516

1617

17-
# <HINT> Create a Car Model model `class CarModel(models.Model):`:
18-
# - Many-To-One relationship to Car Make model (One Car Make has many
19-
# Car Models, using ForeignKey field)
20-
# - Name
21-
# - Type (CharField with a choices argument to provide limited choices
22-
# such as Sedan, SUV, WAGON, etc.)
23-
# - Year (IntegerField) with min value 2015 and max value 2023
24-
# - Any other fields you would like to include in car model
25-
# - __str__ method to print a car make object
18+
class CarModel(models.Model):
19+
# Many-to-One relationship
20+
car_make = models.ForeignKey(CarMake, on_delete=models.CASCADE)
21+
name = models.CharField(max_length=100)
22+
CAR_TYPES = [
23+
("SEDAN", "Sedan"),
24+
("SUV", "SUV"),
25+
("WAGON", "Wagon"),
26+
# Add more choices as required
27+
]
28+
type = models.CharField(max_length=10, choices=CAR_TYPES, default="SUV")
29+
year = models.IntegerField(
30+
default=2023,
31+
validators=[MaxValueValidator(2023),
32+
MinValueValidator(2015)])
33+
# Other fields as needed
34+
35+
def __str__(self):
36+
return self.name

server/djangoapp/populate.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,38 @@
1+
from .models import CarMake, CarModel
2+
13
def initiate():
2-
print("Populate not implemented. Add data manually")
4+
car_make_data = [
5+
{"name":"NISSAN", "description":"Great cars. Japanese technology"},
6+
{"name":"Mercedes", "description":"Great cars. German technology"},
7+
{"name":"Audi", "description":"Great cars. German technology"},
8+
{"name":"Kia", "description":"Great cars. Korean technology"},
9+
{"name":"Toyota", "description":"Great cars. Japanese technology"},
10+
]
11+
12+
car_make_instances = []
13+
for data in car_make_data:
14+
car_make_instances.append(CarMake.objects.create(name=data['name'], description=data['description']))
15+
16+
17+
# Create CarModel instances with the corresponding CarMake instances
18+
car_model_data = [
19+
{"name":"Pathfinder", "type":"SUV", "year": 2023, "car_make":car_make_instances[0]},
20+
{"name":"Qashqai", "type":"SUV", "year": 2023, "car_make":car_make_instances[0]},
21+
{"name":"XTRAIL", "type":"SUV", "year": 2023, "car_make":car_make_instances[0]},
22+
{"name":"A-Class", "type":"SUV", "year": 2023, "car_make":car_make_instances[1]},
23+
{"name":"C-Class", "type":"SUV", "year": 2023, "car_make":car_make_instances[1]},
24+
{"name":"E-Class", "type":"SUV", "year": 2023, "car_make":car_make_instances[1]},
25+
{"name":"A4", "type":"SUV", "year": 2023, "car_make":car_make_instances[2]},
26+
{"name":"A5", "type":"SUV", "year": 2023, "car_make":car_make_instances[2]},
27+
{"name":"A6", "type":"SUV", "year": 2023, "car_make":car_make_instances[2]},
28+
{"name":"Sorrento", "type":"SUV", "year": 2023, "car_make":car_make_instances[3]},
29+
{"name":"Carnival", "type":"SUV", "year": 2023, "car_make":car_make_instances[3]},
30+
{"name":"Cerato", "type":"Sedan", "year": 2023, "car_make":car_make_instances[3]},
31+
{"name":"Corolla", "type":"Sedan", "year": 2023, "car_make":car_make_instances[4]},
32+
{"name":"Camry", "type":"Sedan", "year": 2023, "car_make":car_make_instances[4]},
33+
{"name":"Kluger", "type":"SUV", "year": 2023, "car_make":car_make_instances[4]},
34+
# Add more CarModel instances as needed
35+
]
36+
37+
for data in car_model_data:
38+
CarModel.objects.create(name=data['name'], car_make=data['car_make'], type=data['type'], year=data['year'])

server/djangoapp/restapis.py

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Uncomment the imports below before you add the function code
2-
# import requests
2+
import requests
33
import os
44
from dotenv import load_dotenv
55

@@ -11,12 +11,46 @@
1111
'sentiment_analyzer_url',
1212
default="http://localhost:5050/")
1313

14-
# def get_request(endpoint, **kwargs):
15-
# Add code for get requests to back end
14+
def get_request(endpoint, **kwargs):
15+
params = ""
16+
if kwargs:
17+
for key, value in kwargs.items():
18+
params = params + key + "=" + value + "&"
1619

17-
# def analyze_review_sentiments(text):
18-
# request_url = sentiment_analyzer_url+"analyze/"+text
19-
# Add code for retrieving sentiments
20+
request_url = backend_url + endpoint + "?" + params
2021

21-
# def post_review(data_dict):
22-
# Add code for posting review
22+
print("GET from {} ".format(request_url))
23+
try:
24+
# Call get method of requests library with URL and parameters
25+
# this one ignores *all* errors on the line
26+
response = requests.get(request_url) # noqa: F821
27+
return response.json()
28+
except Exception:
29+
# If any error occurs
30+
print("Network exception occurred")
31+
finally:
32+
print("get_request call complete!")
33+
34+
def analyze_review_sentiments(text):
35+
request_url = sentiment_analyzer_url + "analyze/" + text
36+
try:
37+
# Call get method of requests library with URL and parameters
38+
# this one ignores *all* errors on the line
39+
response = requests.get(request_url) # noqa: F821
40+
return response.json()
41+
except Exception as err:
42+
print(f"Unexpected {err=}, {type(err)=}")
43+
print("Network exception occurred")
44+
finally:
45+
print("analyze_review_sentiments call complete!")
46+
def post_review(data_dict):
47+
request_url = backend_url + "/insert_review"
48+
try:
49+
# this one ignores *all* errors on the line
50+
response = requests.post(request_url, json=data_dict) # noqa: F821
51+
print(response.json())
52+
return response.json()
53+
except Exception:
54+
print("Network exception occurred")
55+
finally:
56+
print("post_review call complete!")

server/djangoapp/urls.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,25 @@
77
app_name = 'djangoapp'
88
urlpatterns = [
99
path(route="register", view=views.registration, name="register"),
10-
1110
path(route="login", view=views.login_user, name="login"),
1211
path(route="logout", view=views.logout_request, name="logout"),
13-
14-
15-
# path for login
16-
# path(route='login', view=views.login_user, name='login'),
17-
18-
# path for dealer reviews view
19-
20-
# path for add a review view
12+
path(route="get_dealers", view=views.get_dealerships, name="get_dealers"),
13+
path(
14+
route="get_dealers/<str:state>",
15+
view=views.get_dealerships,
16+
name="get_dealers_by_state",
17+
),
18+
path(
19+
route="dealer/<int:dealer_id>",
20+
view=views.get_dealer_details,
21+
name="dealer_details",
22+
),
23+
path(
24+
route="reviews/dealer/<int:dealer_id>",
25+
view=views.get_dealer_reviews,
26+
name="dealer_details",
27+
),
2128

29+
path(route="add_review", view=views.add_review, name="add_review"),
30+
path(route='get_cars', view=views.get_cars, name ='getcars'),
2231
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

server/djangoapp/views.py

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import json
1616
from django.views.decorators.csrf import csrf_exempt
1717
from .populate import initiate
18+
from .models import CarMake, CarModel
1819

1920

2021
#Get an instance of a logger
@@ -79,18 +80,62 @@ def registration(request):
7980
return JsonResponse(data)
8081

8182
# # Update the `get_dealerships` view to render the index page with
82-
# a list of dealerships
83-
# def get_dealerships(request):
84-
# ...
83+
def get_dealerships(request, state="All"):
84+
if state == "All":
85+
endpoint = "/fetchDealers"
86+
else:
87+
endpoint = "/fetchDealers/" + state
88+
dealerships = get_request(endpoint)
89+
return JsonResponse({"status": 200, "dealers": dealerships})
8590

8691
# Create a `get_dealer_reviews` view to render the reviews of a dealer
87-
# def get_dealer_reviews(request,dealer_id):
88-
# ...
92+
def get_dealer_reviews(request, dealer_id):
93+
# if dealer id has been provided
94+
if dealer_id:
95+
endpoint = "/fetchReviews/dealer/" + str(dealer_id)
96+
reviews = get_request(endpoint)
97+
for review_detail in reviews:
98+
response = analyze_review_sentiments(review_detail["review"])
99+
print(response)
100+
review_detail["sentiment"] = response["sentiment"]
101+
return JsonResponse({"status": 200, "reviews": reviews})
102+
else:
103+
return JsonResponse({"status": 400, "message": "Bad Request"})
89104

90105
# Create a `get_dealer_details` view to render the dealer details
91-
# def get_dealer_details(request, dealer_id):
92-
# ...
106+
def get_dealer_details(request, dealer_id):
107+
if dealer_id:
108+
endpoint = "/fetchDealer/" + str(dealer_id)
109+
dealership = get_request(endpoint)
110+
return JsonResponse({"status": 200, "dealer": dealership})
111+
else:
112+
return JsonResponse({"status": 400, "message": "Bad Request"})
93113

94114
# Create a `add_review` view to submit a review
95-
# def add_review(request):
96-
# ...
115+
def add_review(request):
116+
if request.user.is_anonymous is False:
117+
data = json.loads(request.body)
118+
try:
119+
post_review(data)
120+
return JsonResponse({"status": 200})
121+
except Exception:
122+
return JsonResponse({"status": 401,
123+
"message": "Error in posting review"})
124+
finally:
125+
print("add_review request successful!")
126+
else:
127+
return JsonResponse({"status": 403, "message": "Unauthorized"})
128+
129+
130+
# def get_cars(request):
131+
def get_cars(request):
132+
count = CarMake.objects.filter().count()
133+
print(count)
134+
if count == 0:
135+
initiate()
136+
car_models = CarModel.objects.select_related("car_make")
137+
cars = []
138+
for car_model in car_models:
139+
cars.append({"CarModel": car_model.name,
140+
"CarMake": car_model.car_make.name})
141+
return JsonResponse({"CarModels": cars})

0 commit comments

Comments
 (0)