diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000000..74b74a5d3d --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,28 @@ + FROM python:3.8.2 + + ENV PYTHONBUFFERED 1 + ENV PYTHONWRITEBYTECODE 1 + + RUN apt-get update \ + && apt-get install -y netcat + + ENV APP=/app + + # Change the workdir. + WORKDIR $APP + + # Install the requirements + COPY requirements.txt $APP + + RUN pip3 install -r requirements.txt + + # Copy the rest of the files + COPY . $APP + + EXPOSE 8000 + + RUN chmod +x ./entrypoint.sh + + ENTRYPOINT ["/bin/bash","/app/entrypoint.sh"] + + CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "djangobackend.wsgi"] \ No newline at end of file diff --git a/server/db.sqlite3 b/server/db.sqlite3 new file mode 100644 index 0000000000..efec7a90a1 Binary files /dev/null and b/server/db.sqlite3 differ diff --git a/server/deployment.yaml b/server/deployment.yaml new file mode 100644 index 0000000000..0ac0c34786 --- /dev/null +++ b/server/deployment.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + run: dealership + name: dealership +spec: + replicas: 1 + selector: + matchLabels: + run: dealership + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + run: dealership + spec: + containers: + - image: us.icr.io/sn-labs-jacksavino/dealership:latest + imagePullPolicy: Always + name: dealership + ports: + - containerPort: 8000 + protocol: TCP + restartPolicy: Always \ No newline at end of file diff --git a/server/djangoapp/admin.py b/server/djangoapp/admin.py index b1039e16b8..abb3608be2 100644 --- a/server/djangoapp/admin.py +++ b/server/djangoapp/admin.py @@ -1,13 +1,22 @@ from django.contrib import admin -# from .models import related models - - -# Register your models here. +from .models import CarMake, CarModel # CarModelInline class +class CarModelInline(admin.StackedInline): + model = CarModel + extra = 2 # CarModelAdmin class +class CarModelAdmin(admin.ModelAdmin): + list_display = ('name', 'type', 'year') + list_filter = ['year'] + search_fields = ['name', 'type'] # CarMakeAdmin class with CarModelInline +class CarMakeAdmin(admin.ModelAdmin): + inlines = [CarModelInline] + list_display = ('name', 'description') # Register models here +admin.site.register(CarMake, CarMakeAdmin) +admin.site.register(CarModel, CarModelAdmin) diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 27d96f4eff..272e5ae95c 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -1,27 +1,118 @@ from django.db import models from django.utils.timezone import now +from django.core import serializers +import uuid +import json +# Car Make model +class CarMake(models.Model): + name = models.CharField(null=False, max_length=100, default='Make') + description = models.CharField(max_length=500) -# Create your models here. + def __str__(self): + return "Name: " + self.name -# Create a Car Make model `class CarMake(models.Model)`: -# - Name -# - Description -# - Any other fields you would like to include in car make model -# - __str__ method to print a car make object +# Car Model model +class CarModel(models.Model): + make = models.ForeignKey(CarMake, null=False, on_delete=models.CASCADE) + # - Many-To-One relationship to Car Make model (One Car Make has many Car Models, using ForeignKey field) + name = models.CharField(null=False, max_length=40, default='undefined') + # - Name + id = models.IntegerField(default=1, primary_key=True) + # - Dealer id, used to refer a dealer created in cloudant database + + COUPE = 'Coupe' + MINIVAN = 'Minivan' + SEDAN = 'Sedan' + SUV = 'SUV' + TRUCK = 'Truck' + WAGON = 'Wagon' + CAR_TYPES = [ + (COUPE, 'Coupe'), + (MINIVAN, 'Minivan'), + (SEDAN, 'Sedan'), + (SUV, 'SUV'), + (TRUCK, 'Truck'), + (WAGON, 'Wagon'), + ] + type = models.CharField( + null=False, + max_length=50, + choices=CAR_TYPES, + default=SEDAN + ) + + year = models.IntegerField(default=now().year) -# Create a Car Model model `class CarModel(models.Model):`: -# - Many-To-One relationship to Car Make model (One Car Make has many Car Models, using ForeignKey field) -# - Name -# - Dealer id, used to refer a dealer created in cloudant database -# - Type (CharField with a choices argument to provide limited choices such as Sedan, SUV, WAGON, etc.) -# - Year (DateField) -# - Any other fields you would like to include in car model -# - __str__ method to print a car make object + def __str__(self): + return "Name: " + self.name +# Get dealer data +class CarDealer: -# Create a plain Python class `CarDealer` to hold dealer data + def __init__(self, address, city, id, lat, long, st, zip, full_name): + # Dealer name + self.full_name = full_name + + # Dealer address + self.address = address + # Dealer city + self.city = city + + # Dealer id + self.id = id + # Location lat + self.lat = lat + # Location long + self.long = long + # Dealer state + self.st = st + # Dealer zip + self.zip = zip -# Create a plain Python class `DealerReview` to hold review data + def __str__(self): + return "Dealer Name: " + self.full_name + +# Get review data +class DealerReview: + + def __init__(self, dealership, name, purchase, review): + # Required attributes + self.dealership = dealership + self.name = name + self.purchase = purchase + self.review = review + # Optional attributes + self.purchase_date = "" + self.purchase_make = "" + self.purchase_model = "" + self.purchase_year = "" + self.sentiment = "" + self.id = "" + + def __str__(self): + return "Review: " + self.review + + def to_json(self): + return json.dumps(self, default=lambda o: o.__dict__, + sort_keys=True, indent=4) + +# Post review data +class ReviewPost: + + def __init__(self, dealership, name, purchase, review): + self.dealership = dealership + self.name = name + self.purchase = purchase + self.review = review + self.purchase_date = "" + self.car_make = "" + self.car_model = "" + self.car_year = "" + + def to_json(self): + return json.dumps(self, default=lambda o: o.__dict__, + sort_keys=True, indent=4) + \ No newline at end of file diff --git a/server/djangoapp/restapis.py b/server/djangoapp/restapis.py index b4d13f596a..6f06d822f8 100644 --- a/server/djangoapp/restapis.py +++ b/server/djangoapp/restapis.py @@ -1,34 +1,128 @@ import requests import json -# import related models here +from .models import CarDealer, DealerReview from requests.auth import HTTPBasicAuth +from ibm_cloud_sdk_core.authenticators import IAMAuthenticator +from ibm_watson import NaturalLanguageUnderstandingV1 +from ibm_watson.natural_language_understanding_v1 import Features,SentimentOptions +import time +def get_request(url, **kwargs): + # If argument contains API key + api_key = kwargs.get("api_key") + print("GET from {} ".format(url)) + try: + if api_key: + params = dict() + params["text"] = kwargs["text"] + params["version"] = kwargs["version"] + params["features"] = kwargs["features"] + params["return_analyzed_text"] = kwargs["return_analyzed_text"] + response = requests.get(url, params=params, headers={'Content-Type': 'application/json'}, + auth=HTTPBasicAuth('apikey', api_key)) + else: + # Call get method of requests library with URL and parameters + response = requests.get(url, headers={'Content-Type': 'application/json'}, + params=kwargs) + except: + # If any error occurs + print("Network exception occurred") -# 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)) + status_code = response.status_code + print("With status {} ".format(status_code)) + json_data = json.loads(response.text) + 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(kwargs) + print("POST to {} ".format(url)) + print(payload) + response = requests.post(url, params=kwargs, json=payload) + status_code = response.status_code + print("With status {} ".format(status_code)) + json_data = json.loads(response.text) + return json_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 = [] + state = kwargs.get("state") + if state: + json_result = get_request(url, state=state) + else: + json_result = get_request(url) + if json_result: + # Get the row list in JSON as dealers + dealers = json_result + # For each dealer object + for dealer in dealers: + # Get its content in `doc` object + dealer_doc = dealer["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"], + st=dealer_doc["st"], zip=dealer_doc["zip"]) + results.append(dealer_obj) -# 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 + 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 get_dealer_by_id_from_cf(url, id): + json_result = get_request(url, id=id) + if json_result: + dealers = json_result[0] + dealer_doc = dealers + dealer_obj = CarDealer(address=dealer_doc["address"], city=dealer_doc["city"], + id=dealer_doc["id"], lat=dealer_doc["lat"], long=dealer_doc["long"], full_name=dealer_doc["full_name"], + st=dealer_doc["st"], zip=dealer_doc["zip"]) + return dealer_obj +def get_dealer_reviews_from_cf(url, **kwargs): + results = [] + id = kwargs.get("id") + if id: + json_result = get_request(url, id=id) + else: + json_result = get_request(url) + if json_result: + reviews = json_result["data"]["docs"] + + for dealer_review in reviews: + review_obj = DealerReview(dealership=dealer_review["dealership"], + name=dealer_review["name"], + purchase=dealer_review["purchase"], + review=dealer_review["review"]) + if "id" in dealer_review: + review_obj.id = dealer_review["id"] + if "purchase_date" in dealer_review: + review_obj.purchase_date = dealer_review["purchase_date"] + if "car_make" in dealer_review: + review_obj.car_make = dealer_review["car_make"] + if "car_model" in dealer_review: + review_obj.car_model = dealer_review["car_model"] + if "car_year" in dealer_review: + review_obj.car_year = dealer_review["car_year"] + + sentiment = analyze_review_sentiments(review_obj.review) + print(sentiment) + review_obj.sentiment = sentiment + results.append(review_obj) + + return results + + +def analyze_review_sentiments(text): + url = "https://api.us-south.natural-language-understanding.watson.cloud.ibm.com/instances/39e30a1e-daa0-43f9-baee-a2a9eab7d505" + api_key = "lbhukj5iEH9QDmXoMTQWFJqlOs4X-i3_NPC9R_7XNsw2" + authenticator = IAMAuthenticator(api_key) + natural_language_understanding = NaturalLanguageUnderstandingV1(version='2021-08-01',authenticator=authenticator) + natural_language_understanding.set_service_url(url) + response = natural_language_understanding.analyze( text=text+"hello hello hello",features=Features(sentiment=SentimentOptions(targets=[text+"hello hello hello"]))).get_result() + label=json.dumps(response, indent=2) + label = response['sentiment']['document']['label'] + + return(label) diff --git a/server/djangoapp/static/css/about.css b/server/djangoapp/static/css/about.css new file mode 100644 index 0000000000..7f8d6e0fc6 --- /dev/null +++ b/server/djangoapp/static/css/about.css @@ -0,0 +1,26 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + text-align: center; +} + +h1 { + font-size: 36px; + color: #333; + background-color: #ff9900; + padding: 20px; + border-radius: 10px; + margin: 40px; +} + +.small-text { + font-size: 28px; + color: #439; +} + +p { + font-size: 18px; + font-style: italic; + color: #555; + margin: 10px; +} diff --git a/server/djangoapp/static/css/contact.css b/server/djangoapp/static/css/contact.css new file mode 100644 index 0000000000..5183a7d60e --- /dev/null +++ b/server/djangoapp/static/css/contact.css @@ -0,0 +1,29 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + text-align: center; +} + +h1 { + font-size: 36px; + color: #333; + background-color: #ff9900; + padding: 20px; + border-radius: 10px; + margin: 40px; + text-align: center; +} + +h2 { + font-size: 24px; + font-style: bold; + color: #333; + margin-top: 50px; + text-align: center; +} + +p { + font-size: 20px; + color: #555; + text-align: center; +} \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/about.html b/server/djangoapp/templates/djangoapp/about.html new file mode 100644 index 0000000000..ef3dddcd8b --- /dev/null +++ b/server/djangoapp/templates/djangoapp/about.html @@ -0,0 +1,53 @@ + + + + {% load static %} + + About Us + + + + + + + +

Welcome to Best Cars Dealership
Home to the best cars in North America!

+

We sell domestic and imported cars at reasonable prices.

+ + diff --git a/server/djangoapp/templates/djangoapp/add_review.html b/server/djangoapp/templates/djangoapp/add_review.html index 768ddf508c..e85bb473cd 100644 --- a/server/djangoapp/templates/djangoapp/add_review.html +++ b/server/djangoapp/templates/djangoapp/add_review.html @@ -5,12 +5,117 @@ {% load static %} + - + Add a Review - - - - \ No newline at end of file + + + +
+
+

Add a review for {{dealer.full_name}}

+
+
+ +
+ + +
+ +
+ + +
+
+ + + +
+ {% csrf_token %} +
+ +
+ {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} +
+
+ + + diff --git a/server/djangoapp/templates/djangoapp/contact.html b/server/djangoapp/templates/djangoapp/contact.html new file mode 100644 index 0000000000..5fbf5b5f0c --- /dev/null +++ b/server/djangoapp/templates/djangoapp/contact.html @@ -0,0 +1,56 @@ + + + + {% load static %} + + Contact Us + + + + + + + +

Contact Us

+

Address

+

123 Broadway Ave
Denver, CO 80218

+

Phone Number

+

123-456-7890

+ + diff --git a/server/djangoapp/templates/djangoapp/dealer_details.html b/server/djangoapp/templates/djangoapp/dealer_details.html index 25bd9a223d..bfe56dd76c 100644 --- a/server/djangoapp/templates/djangoapp/dealer_details.html +++ b/server/djangoapp/templates/djangoapp/dealer_details.html @@ -2,17 +2,87 @@ - Dealership Review + Dealership Reviews {% load static %} + + + - +
+ {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} - +

Reviews for {{dealer.full_name}}

- - - - - \ No newline at end of file +
+
+ {% for review in reviews %} +
+
+ {% if review.sentiment == "positive" %} + Sentiment + {% elif review.sentiment == "negative" %} + Sentiment + {% else %} + Sentiment + {% endif %} +
+ {% if review.car_make%} +
{{review.car_make}}, {{review.car_model}}
+
{{review.car_year}}
+ {% endif %} +

{{review.review}}

+
+
+
+ {% endfor %} +
+
+
+ + diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 1a9ee6e39a..1797c03815 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -1,8 +1,9 @@ + {% load static %} - Dealership Review + Home @@ -10,16 +11,93 @@ - + + + - - - This is the index page of your Django app! - - - + +
+ {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + + + + + + + + + + + + + + {% for dealer in dealership_list %} + + + + + + + + + {% endfor %} + +
IDDealer NameCityAddressZipState
{{dealer.id}}{{dealer.full_name}}{{dealer.city}}{{dealer.address}}{{dealer.zip}}{{dealer.st}}
+
+ + + - + diff --git a/server/djangoapp/templates/djangoapp/login.html b/server/djangoapp/templates/djangoapp/login.html new file mode 100644 index 0000000000..ce75684d08 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/login.html @@ -0,0 +1,69 @@ + + + + + {% load static %} + + Login/Signup Page + + + + + + +
+ {% csrf_token %} +
+

Login

+
+ + + + +
+ {% if message %} +
+ {{ message }} +
+ {% endif %} + +
+
+ + diff --git a/server/djangoapp/templates/djangoapp/registration.html b/server/djangoapp/templates/djangoapp/registration.html index ae11ea4b71..e3dfea0df4 100644 --- a/server/djangoapp/templates/djangoapp/registration.html +++ b/server/djangoapp/templates/djangoapp/registration.html @@ -4,8 +4,72 @@ {% load static %} + Registration Page - - - - \ No newline at end of file + + + + + +
+
+ {% csrf_token %} +

Sign Up

+
+
+ + + + + + + + + {% if message %} +
+ {{ message }} +
+ {% endif %} +
+ +
+
+
+ + diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 37b1c89d01..e17de98148 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -5,24 +5,28 @@ app_name = 'djangoapp' urlpatterns = [ - # route is a string contains a URL pattern - # view refers to the view function - # name the URL - # path for about view + path('about/', views.about, name='about'), # path for contact us view + path('contact/', views.contact, name='contact'), # path for registration + path('registration/', views.registration_request, name='registration'), # path for login + path('login/', views.login_request, name='login'), # path for logout + path('logout/', views.logout_request, name='logout'), + # path for all dealerships view path(route='', view=views.get_dealerships, name='index'), # path for dealer reviews view + path(route='dealer_details//', view=views.get_dealer_details, name='dealer_details'), # path for add a review view + path(route='add_review//', view=views.add_review, name='add_review'), -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 61cc664da0..d92967d0da 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -2,8 +2,8 @@ from django.http import HttpResponseRedirect, HttpResponse from django.contrib.auth.models import User from django.shortcuts import get_object_or_404, render, redirect -# from .models import related models -# from .restapis import related methods +from .models import CarModel, CarMake, CarDealer, DealerReview, ReviewPost +from .restapis import get_request, post_request, get_dealers_from_cf, get_dealer_by_id_from_cf, get_dealer_reviews_from_cf from django.contrib.auth import login, logout, authenticate from django.contrib import messages from datetime import datetime @@ -13,42 +13,124 @@ # Get an instance of a logger logger = logging.getLogger(__name__) +# About view to render static about page +def about(request): + return render(request, 'djangoapp/about.html') -# Create your views here. +# Contact view to render static contact page +def contact(request): + return render(request, 'djangoapp/contact.html') +# View to handle sign in request +def login_request(request): + context = {} + if request.method == "POST": + username = request.POST['username'] + password = request.POST['psw'] + user = authenticate(username=username, password=password) + if user is not None: + login(request, user) + return redirect('djangoapp:index') + else: + context['message'] = "Invalid username or password." + return render(request, 'djangoapp/login.html', context) + else: + return render(request, 'djangoapp/login.html', context) -# Create an `about` view to render a static about page -# def about(request): -# ... - - -# Create a `contact` view to return a static contact page -#def contact(request): - -# Create a `login_request` view to handle sign in request -# def login_request(request): -# ... - -# Create a `logout_request` view to handle sign out request -# def logout_request(request): -# ... +# View to handle sign out 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): -# ... +# View to handle sign up request +def registration_request(request): + context = {} + if request.method == 'GET': + return render(request, 'djangoapp/registration.html', context) + if request.method == 'POST': + # Check if user exists + username = request.POST['username'] + password = request.POST['psw'] + first_name = request.POST['firstname'] + last_name = request.POST['lastname'] + user_exist = False + try: + User.objects.get(username=username) + user_exist = True + except: + logger.error("New user") + if not user_exist: + user = User.objects.create_user(first_name=first_name, last_name=last_name, username=username, + password=password) + login(request, user) + return redirect("djangoapp:index") + else: + context['message'] = "User already exists." + return render(request, 'djangoapp/registration.html', context) -# Update the `get_dealerships` view to render the index page with a list of dealerships +# View to render list of dealerships def get_dealerships(request): - context = {} if request.method == "GET": + context = {} + url = "https://us-south.functions.appdomain.cloud/api/v1/web/ad39ee7e-0d06-4e9e-8de9-35be2c866619/dealership-package/get_dealerships" + dealerships = get_dealers_from_cf(url) + context["dealership_list"] = dealerships return render(request, 'djangoapp/index.html', context) +# View to render dealer details (reviews) +def get_dealer_details(request, id): + if request.method == "GET": + context = {} + dealer_url = "https://us-south.functions.appdomain.cloud/api/v1/web/ad39ee7e-0d06-4e9e-8de9-35be2c866619/dealership-package/get_dealerships" + dealer = get_dealer_by_id_from_cf(dealer_url, id=id) + context["dealer"] = dealer + + review_url = "https://us-south.functions.appdomain.cloud/api/v1/web/ad39ee7e-0d06-4e9e-8de9-35be2c866619/dealership-package/get_reviews" + reviews = get_dealer_reviews_from_cf(review_url, id=id) + print(reviews) + context["reviews"] = reviews + + return render(request, 'djangoapp/dealer_details.html', context) -# Create a `get_dealer_details` view to render the reviews of a dealer -# def get_dealer_details(request, dealer_id): -# ... - -# Create a `add_review` view to submit a review -# def add_review(request, dealer_id): -# ... +# View to post a review +def add_review(request, id): + context = {} + dealer_url = "https://us-south.functions.appdomain.cloud/api/v1/web/ad39ee7e-0d06-4e9e-8de9-35be2c866619/dealership-package/get_dealerships" + dealer = get_dealer_by_id_from_cf(dealer_url, id=id) + context["dealer"] = dealer + if request.method == 'GET': + cars = CarModel.objects.all() + context["cars"] = cars + return render(request, 'djangoapp/add_review.html', context) + elif request.method == 'POST': + if request.user.is_authenticated: + user = request.user + first_name = user.first_name + last_name = user.last_name + full_name = f"{first_name} {last_name}" + print(request.POST) + payload = dict() + car_id = request.POST["car"] + car = CarModel.objects.get(pk=car_id) + payload["time"] = datetime.utcnow().isoformat() + payload["name"] = full_name + payload["dealership"] = id + payload["id"] = id + payload["review"] = request.POST["content"] + + # Check if "purchasecheck" is checked + if "purchasecheck" in request.POST and request.POST["purchasecheck"] == 'on': + payload["purchase"] = True + payload["purchase_date"] = request.POST["purchasedate"] + payload["car_make"] = car.make.name + payload["car_model"] = car.name + payload["car_year"] = int(car.year) + else: + payload["purchase"] = False + + json_payload = {} + json_payload["review"] = payload + review_url = "https://us-south.functions.appdomain.cloud/api/v1/web/ad39ee7e-0d06-4e9e-8de9-35be2c866619/dealership-package/post_review" + post_request(review_url, json_payload, id=id) + return redirect("djangoapp:dealer_details", id=id) diff --git a/server/djangobackend/settings.py b/server/djangobackend/settings.py index ff43f444a8..09cb005e8d 100644 --- a/server/djangobackend/settings.py +++ b/server/djangobackend/settings.py @@ -27,7 +27,7 @@ APPEND_SLASH = True -ALLOWED_HOSTS = ["localhost"] +ALLOWED_HOSTS = ['localhost', 'localhost:8000', 'https://jacksavino-8000.theiadocker-2-labs-prod-theiak8s-4-tor01.proxy.cognitiveclass.ai'] # Application definition diff --git a/server/entrypoint.sh b/server/entrypoint.sh new file mode 100644 index 0000000000..cdb9f3c311 --- /dev/null +++ b/server/entrypoint.sh @@ -0,0 +1,17 @@ + #!/bin/sh + + if [ "$DATABASE" = "postgres" ]; then + echo "Waiting for postgres..." + + while ! nc -z $DATABASE_HOST $DATABASE_PORT; do + sleep 0.1 + done + + echo "PostgreSQL started" + fi + + # Make migrations and migrate the database. + echo "Making migrations and migrating the database." + python manage.py makemigrations main --noinput + python manage.py migrate --noinput + exec "$@" \ No newline at end of file