From a408f6ff56950c6a942a03add334535e18b26436 Mon Sep 17 00:00:00 2001 From: waleedrehman31 Date: Sat, 1 Jul 2023 03:06:48 -0400 Subject: [PATCH 1/4] complete second module --- server/db.sqlite3 | Bin 0 -> 131072 bytes .../djangoapp/templates/djangoapp/about.html | 45 +++++++++++ .../templates/djangoapp/contact.html | 49 +++++++++++ .../djangoapp/templates/djangoapp/index.html | 62 +++++++++----- .../templates/djangoapp/registration.html | 76 ++++++++++++++++-- server/djangoapp/urls.py | 7 +- server/djangoapp/views.py | 53 +++++++++--- 7 files changed, 257 insertions(+), 35 deletions(-) create mode 100644 server/db.sqlite3 create mode 100644 server/djangoapp/templates/djangoapp/about.html create mode 100644 server/djangoapp/templates/djangoapp/contact.html diff --git a/server/db.sqlite3 b/server/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..4b435d2dc51cb6ccb048e68234a2889ea3024504 GIT binary patch literal 131072 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 AV*mgE literal 0 HcmV?d00001 diff --git a/server/djangoapp/templates/djangoapp/about.html b/server/djangoapp/templates/djangoapp/about.html new file mode 100644 index 0000000000..e56fe95374 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/about.html @@ -0,0 +1,45 @@ + + + + + Dealership Review - About + + + + + + + + + + + + + +
+
+

About Us

+
+

+ Welcome to Best Cars dealership, home to the best cars in North America. We sell domestic and imported cars at reasonable prices. +

+
+
+ + \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/contact.html b/server/djangoapp/templates/djangoapp/contact.html new file mode 100644 index 0000000000..ad6ca6b088 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/contact.html @@ -0,0 +1,49 @@ + + + + + Dealership Review - About + + + + + + + + + + + + + +
+
+

Contact Details

+
+

+ Address: New Jersy, USA +

+

+ Contact Number: +1 521 56424 +

+
+
+ + + diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 1a9ee6e39a..2926f83ae3 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -1,23 +1,49 @@ - - - Dealership Review - - - - - - - - - - - - - This is the index page of your Django app! - - + + + Dealership Review - About + + + + + + + + + + + + + diff --git a/server/djangoapp/templates/djangoapp/registration.html b/server/djangoapp/templates/djangoapp/registration.html index ae11ea4b71..461d9fe829 100644 --- a/server/djangoapp/templates/djangoapp/registration.html +++ b/server/djangoapp/templates/djangoapp/registration.html @@ -1,11 +1,75 @@ - - - {% load static %} - - - + + + Dealership Review - About + + + + + + +
+
+

Sign Up

+
+
+ {% csrf_token %} +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 37b1c89d01..dadeeb40fa 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -10,14 +10,17 @@ # name the URL # path for about view - + path(route="about", view= views.about, name='about'), # path for contact us view - + path(route="contact", view=views.contact, name='contact'), # path for registration + path(route="register", view=views.registration_request, name="register"), # path for login + path(route="login", view=views.login_request, name="login"), # path for logout + path(route='logout', view=views.logout_request, name="logout"), path(route='', view=views.get_dealerships, name='index'), diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 61cc664da0..82a7c10e36 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -18,24 +18,59 @@ # Create an `about` view to render a static about page -# def about(request): -# ... +def about(request): + context = {} + if request.method == "GET": + return render(request, "djangoapp/about.html", context) # Create a `contact` view to return a static contact page -#def contact(request): +def contact(request): + context = {} + if request.method == "GET": + return render(request, "djangoapp/contact.html", context) # Create a `login_request` view to handle sign in request -# def login_request(request): -# ... +def login_request(request): + context = {} + if request.method == "POST": + username = request.POST['username'] + password = request.POST['password'] + + user = authenticate(username=username,password=password) + + if user is not None: + login(request, user) + return redirect('djangoapp:index') # Create a `logout_request` view to handle sign out request -# def logout_request(request): -# ... +def logout_request(request): + logout(request) + return redirect('djangoapp:index') # Create a `registration_request` view to handle sign up request -# def registration_request(request): -# ... +def registration_request(request): + context = {} + if request.method == 'GET': + return render(request, 'djangoapp/registration.html', context) + + if request.method == "POST": + username = request.POST['username'] + password = request.POST['password'] + first_name = request.POST['firstname'] + last_name = request.POST['lastname'] + user_exist = False + try: + User.objects.get(username=username) + user_exist = True + except: + logger.debug("{} is new user".format(username)) + + if not user_exist: + user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name, + password=password) + login(request, user) + return redirect("djangoapp:index") # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): From 1e215b5ae94db9059363043020111970a8e45725 Mon Sep 17 00:00:00 2001 From: Waleed ur Rehman <54763708+waleedrehman31@users.noreply.github.com> Date: Sat, 1 Jul 2023 12:37:13 +0500 Subject: [PATCH 2/4] Update linter.yml --- .github/workflows/linter.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 05ca50d23b..f0ee775a17 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,10 +1,12 @@ name: 'Lint Code' -on: - push: - branches: [master, main] - pull_request: - branches: [master, main] +on: workflow_dispatch + +# on: +# push: +# branches: [master, main] +# pull_request: +# branches: [master, main] jobs: # list of things to do lint_function_js: From e3d43925fb23d8439acccd063a80648bb919b4eb Mon Sep 17 00:00:00 2001 From: waleedrehman31 Date: Sat, 1 Jul 2023 22:52:03 +0500 Subject: [PATCH 3/4] create models --- server/db.sqlite3 | Bin 131072 -> 143360 bytes server/djangoapp/admin.py | 14 +++++++++ server/djangoapp/models.py | 63 +++++++++++++++++++++++++++++++++++++ server/manage.py | 0 4 files changed, 77 insertions(+) mode change 100755 => 100644 server/manage.py diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 4b435d2dc51cb6ccb048e68234a2889ea3024504..2e6677cd687c913c497260d70d965bca4f81bdba 100644 GIT binary patch delta 4476 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 delta 2648 zcmZveeM}qY9mnr?cRs)1yT=$DLyfTkJ3w9F?tH$p-KHH7-ty9tGzlr11`aqt0yeQB zr2GSx7HLYVHuTh<)TvFo|F%_AoowQdq*7FAt< zNXWAKt>2VI!TAy~wXfN<4}}+mD6hU`*5tS%W9^U4PjP!SkmXpMSA&6=uPRBgcueFe z3*im-rluF>GU_`4Z#9-IDzYT0uLoL9HUcli)DHuZ@SaU9o=_43i{2m@bdf-RM|aUJ zbP-)e@1je^!X!FW$50VSEicVZET(e{bNT#SHq*eeREy0JXL8x)Mg1LCUT*2ma#WzS zYB`_IQCCDp7i;L;J>9d8UJs#r$xr}#jEpZt&X7yzb~IQcAYQZeHNMsx0%A2gE?uM@Obpn z=)qVDlUFArn484dqGL5!EzpG5|9`>svNUi30`)w^Rrxi#f!;)y(E=JnLr6j`$c2D= z$n9{SaGTs)++{AqeV-fRL@rP)JYd({G=zbGXVhDP0l0C2?vt zm6_QS_tnzS225&tx-!kPkA^O=7x){68=k|fAcBy1%dv9o6;9I zYZw230yUHm%5|k2RAc!wX{9{&TsFIO<2{>;v+qtq%G%0)@EW+wUukQfvtbM zj`*5D=eR}oSI)mV9yp$||J1f)b2Ix+)RIj&Y&c6a=Y9wx!1WI_bk`V zx!JGSPucg_%j^lZ&G~QVUFW;bA37(Cg$}2!wZTF_xQo%A*aE-Ri=k6sw9zeSvFNtr&U~Qv2Bsv|E`n z{7DB3hE9Rhm|X~3L$rmkw+mYLE(EL{_&*nWB&MC*#ReT@3D$LJ1q|UH?dQ9=%j>Vu S>LSr!@p;}t(7e(6*#7{{IK$Zh diff --git a/server/djangoapp/admin.py b/server/djangoapp/admin.py index b1039e16b8..f414dd91bd 100644 --- a/server/djangoapp/admin.py +++ b/server/djangoapp/admin.py @@ -1,13 +1,27 @@ from django.contrib import admin # from .models import related models +from .models import CarMake, CarModel # Register your models here. # CarModelInline class +class CarModelInline(admin.StackedInline): + model = CarModel + extra = 6 # CarModelAdmin class +class CarModelAdmin(admin.ModelAdmin): + list_display = ['name', 'dealer_id', 'c_type', 'year'] + search_fields = ['name'] + # CarMakeAdmin class with CarModelInline +class CarMakeAdmin(admin.ModelAdmin): + inlines = [CarModelInline] + list_display = ['name', 'description'] + search_fields = ['name'] # Register models here +admin.site.register(CarMake, CarMakeAdmin) +admin.site.register(CarModel) \ No newline at end of file diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 27d96f4eff..7f7e753c58 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -9,6 +9,12 @@ # - Description # - Any other fields you would like to include in car make model # - __str__ method to print a car make object +class CarMake(models.Model): + name = models.CharField(null=False, max_length=30) + description = models.CharField(null=False, max_length=30) + + def __str__(self): + return self.name + "" + self.description # Create a Car Model model `class CarModel(models.Model):`: @@ -19,9 +25,66 @@ # - Year (DateField) # - Any other fields you would like to include in car model # - __str__ method to print a car make object +class CarModel(models.Model): + TYPES = ( + ("SEDAN", "Sedan"), ("SUV", "SUV"), ("WAGON", "Wagon"), ("LIMOUSINE", "Limousine"), ("BATMOBILE", "Batmobile") + ) + + make = models.ForeignKey(CarMake, on_delete=models.CASCADE) + name = models.CharField(null=False, max_length=30) + c_type = models.CharField(max_length=30, choices=TYPES) + dealer_id = models.IntegerField() + year = models.DateField() + + def __str__(self): + return "Name: " + self.name + \ + " Make Name: "+ self.make.name + \ + " Type: " + self.c_type + \ + " Dealer ID: " + str(self.dealer_id)+ \ + " Year: " + str(self.year) + # Create a plain Python class `CarDealer` to hold dealer data +class CarDealer: + def __init__(self, address, city, full_name, id, lat, long, short_name, st, zip): + # Dealer address + self.address = address + # Dealer city + self.city = city + # Dealer Full Name + self.full_name = full_name + # Dealer id + self.id = id + # Location lat + self.lat = lat + # Location long + self.long = long + # Dealer short name + self.short_name = short_name + # Dealer state + self.st = st + # Dealer zip + self.zip = zip + + def __str__(self): + return "Dealer name: " + self.full_name # Create a plain Python class `DealerReview` to hold review data +class DealerReview: + def __init__(self, dealership, name, purchase, review, purchase_date, car_make, car_model, car_year,sentiment, id): + self.dealership=dealership + self.name=name + self.purchase=purchase + self.review=review + self.purchase_date=purchase_date + self.car_make=car_make + self.car_model=car_model + self.car_year=car_year + self.sentiment=sentiment #Watson NLU service + self.id=id + + def __str__(self): + return "Review: " + self.review +\ + " Sentiment: " + self.sentiment \ No newline at end of file diff --git a/server/manage.py b/server/manage.py old mode 100755 new mode 100644 From a05107809d152a056b116516f4032e32af4ce5a8 Mon Sep 17 00:00:00 2001 From: waleedrehman31 Date: Sun, 2 Jul 2023 10:11:30 +0500 Subject: [PATCH 4/4] add dynamic page --- server/db.sqlite3 | Bin 143360 -> 143360 bytes server/djangoapp/restapis.py | 93 ++++++++++++- .../templates/djangoapp/add_review.html | 87 ++++++++++-- .../templates/djangoapp/dealer_details.html | 125 ++++++++++++++++-- .../djangoapp/templates/djangoapp/index.html | 38 +++++- server/djangoapp/urls.py | 4 +- server/djangoapp/views.py | 64 ++++++++- 7 files changed, 379 insertions(+), 32 deletions(-) diff --git a/server/db.sqlite3 b/server/db.sqlite3 index 2e6677cd687c913c497260d70d965bca4f81bdba..b463531559964577a38312f95118afb25770ebcc 100644 GIT binary patch delta 318 zcmZp8z|ru4V}dlJ+C&*=MzxIzk@Aue6%5U-Of0Mn4fPC-%*{*;0BpxyK>z>% delta 116 zcmZp8z|ru4V}dlJ@q3u;3E^^gHrQ8k<=r+~b#%Wp?B=GB7gMH89sT NG(|Gb$lT1t002L~A+G=c diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index b4d13f596a..c5482d11ab 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -1,34 +1,117 @@ import requests import json # import related models here +from .models import CarDealer, DealerReview from requests.auth import HTTPBasicAuth + # Create a `get_request` to make HTTP GET requests # e.g., response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, # auth=HTTPBasicAuth('apikey', api_key)) +def get_request(url, **kwargs): + #print(kwargs) + print("GET from {} ".format(url)) + json_data={} + try: + if "apikey" in kwargs: + response = requests.get(url, headers={'Content-Type':'application/json'}, params=kwargs, auth=HTTPBasicAuth("apikey", kwargs["apikey"])) + else: + response = requests.get(url, headers={'Content-Type':'application/json'}, params=kwargs) + status_code = response.status_code + print("With status {} ".format(status_code)) + json_data = json.loads(response.text) + #print(json_data) + except Exception as e: + print("Error " ,e) + + return json_data # Create a `post_request` to make HTTP POST requests # e.g., response = requests.post(url, params=kwargs, json=payload) - +def post_request(url, payload, **kwargs): + print(url) + print(payload) + print(kwargs) + try: + response = requests.post(url, params=kwargs, json=payload) + except Exception as e: + print("Error" ,e) + print("Status Code ", {response.status_code}) + data = json.loads(response.text) + return data # Create a get_dealers_from_cf method to get dealers from a cloud function # def get_dealers_from_cf(url, **kwargs): # - Call get_request() with specified arguments # - Parse JSON results into a CarDealer object list +def get_dealers_from_cf(url, **kwargs): + results = [] + # Call get_request with a URL parameter + json_result = get_request(url) + #print(json_result) + if json_result: + # Get the row list in JSON as dealers + dealers = json_result["entries"] + # For each dealer object + for dealer_doc in dealers: + # Get its content in `doc` object + #dealer_doc = dealers["doc"] + # Create a CarDealer object with values in `doc` object + dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], full_name=dealer_doc["full_name"], + id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], + short_name=dealer_doc["short_name"], + st=dealer_doc["st"], zip=dealer_doc["zip"]) + results.append(dealer_obj) + + return results +#Coding practice: create a get_dealer_by_id or get_dealers_by_state method in restapis.py. HINT, the only difference from the get_dealers_from_cf method is adding a dealer id or state URL parameter argument when calling the def get_request(url, **kwargs): method such as get_request(url, dealerId=dealerId). # Create a get_dealer_reviews_from_cf method to get reviews by dealer id from a cloud function # def get_dealer_by_id_from_cf(url, dealerId): # - Call get_request() with specified arguments # - Parse JSON results into a DealerView object list - +def get_dealer_reviews_from_cf(url, dealer_id): + results = [] + # Call get_request with a URL parameter + json_result = get_request(url, dealerId=dealer_id) + + if "entries" in json_result: + reviews = json_result["entries"] + # For each review object + for review in reviews: + review_obj = DealerReview( + dealership=review["dealership"], + name=review["name"], + purchase=review["purchase"], + review=review["review"], + purchase_date=review["purchase_date"], + car_make=review["car_make"], + car_model=review["car_model"], + car_year=review["car_year"], + sentiment=analyze_review_sentiments(review["review"]), + id=review['id'] + ) + results.append(review_obj) + #print(results[0]) + return results # Create an `analyze_review_sentiments` method to call Watson NLU and analyze text # def analyze_review_sentiments(text): # - Call get_request() with specified arguments # - Get the returned sentiment label such as Positive or Negative - - - +def analyze_review_sentiments(dealerreview, **kwargs): + API_KEY="MxFCXuNdAY4i7RdB1PTx0LGspyMbNVmVOKxtpJ5XPxkz" + #API_KEY="0614ccd0-1e9f-4d49-923e-e7741f963747:Q3ZX2R1b3oBEb0XebEO99rpulJ31yoY7X5GfjoQykN4RpM9eThYrrs14If0aOHtG" + NLU_URL='https://api.us-south.natural-language-understanding.watson.cloud.ibm.com/instances/93a549ab-8f15-404e-a8ed-97f6fb8a35aa/v1/analyze?version=2020-08-01' + params = json.dumps({"text": dealerreview, "features": {"sentiment": {}}}) + response = requests.post(NLU_URL,data=params,headers={'Content-Type':'application/json'},auth=HTTPBasicAuth("apikey", API_KEY)) + + #print(response.json()) + try: + sentiment=response.json()['sentiment']['document']['label'] + return sentiment + except: + return "neutral" \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/add_review.html b/server/djangoapp/templates/djangoapp/add_review.html index 768ddf508c..5b9d4fc398 100644 --- a/server/djangoapp/templates/djangoapp/add_review.html +++ b/server/djangoapp/templates/djangoapp/add_review.html @@ -1,16 +1,81 @@ - - - {% load static %} - - - - - - - - + + + Dealership Review - About + + + + + + + + + + + + + +
+
+
+ {% csrf_token %} + +

Review for {{dealer_name}}


+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+
\ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/dealer_details.html b/server/djangoapp/templates/djangoapp/dealer_details.html index 25bd9a223d..f771cea718 100644 --- a/server/djangoapp/templates/djangoapp/dealer_details.html +++ b/server/djangoapp/templates/djangoapp/dealer_details.html @@ -1,18 +1,119 @@ - - - Dealership Review - {% load static %} - - + + + Dealership Review - About + + + + + + + + + + + + + - +
+
+ {% if reviews %} +
+ {% for review in reviews %} +
- - - - - +
+
+ +
+ +
+
{{review.name}}
+

{{review.review}}

+
+ +
+
+ {% endfor %} +
+
+
Write Your Own Review!
+
+
+

Want to review this dealership?

+

Click the button below!

+
+ + +
+
+ {% else %} +
+
+
No Reviews
+
+
+ + +

There are no reviews for this dealership. Be the first to write one!

+
+ + +
+ {% endif %} +
+
+ \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 2926f83ae3..203f9d4726 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -15,7 +15,7 @@ -