diff --git a/server/db.sqlite3 b/server/db.sqlite3 new file mode 100644 index 0000000000..3d1c9c07a6 Binary files /dev/null and b/server/db.sqlite3 differ diff --git a/server/djangoapp/models.py b/server/djangoapp/models.py index 27d96f4eff..961dc9af7c 100644 --- a/server/djangoapp/models.py +++ b/server/djangoapp/models.py @@ -9,6 +9,13 @@ # - 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, default='Name') + description = models.CharField(null=False, max_length=30, default='Description') + + # Create a toString method for object string representation + def __str__(self): + return self.name + " " + self.description # <HINT> Create a Car Model model `class CarModel(models.Model):`: @@ -19,6 +26,31 @@ # - 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): + SEDAN = 'Sedan' + SUV = 'SUV' + WAGON = 'WAGON' + TYPE_CHOICES = [ + (SEDAN, 'Sedan'), + (SUV, 'SUV'), + (WAGON, 'WAGON') + ] + dealer_id = models.IntegerField() + name = models.CharField(null=False, max_length=100, default='name') + description = models.CharField(max_length=500) + type = models.CharField( + null=False, + max_length=20, + choices=TYPE_CHOICES, + default=SEDAN + ) + year = models.IntegerField() + carMade = models.ManyToManyField(CarMake) + + # Create a toString method for object string representation + def __str__(self): + return "Name: " + self.name + "," + \ + "Description: " + self.type # <HINT> Create a plain Python class `CarDealer` to hold dealer data diff --git a/server/djangoapp/templates/djangoapp/about.html b/server/djangoapp/templates/djangoapp/about.html new file mode 100644 index 0000000000..f78e6cd8d1 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/about.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Dealership Review</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> + <link href="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.css" rel="stylesheet"> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.js"></script> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/extensions/filter-control/bootstrap-table-filter-control.min.js"></script> + +</head> + + <body> + <!--Add a nav bar here --> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> + + <!--Add a dealer table here --> + <h1> + Welcome to Best Cars dealership, home to the best cars in North America. We sell domestic and imported cars at reasonable prices. + </h1> + + </body> + +</html> diff --git a/server/djangoapp/templates/djangoapp/contact.html b/server/djangoapp/templates/djangoapp/contact.html new file mode 100644 index 0000000000..268af6e3f6 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/contact.html @@ -0,0 +1,139 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Dealership Review</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> + <link href="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.css" rel="stylesheet"> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.js"></script> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/extensions/filter-control/bootstrap-table-filter-control.min.js"></script> + +</head> + + <body> + <!--Add a nav bar here --> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> + + <!--Add a dealer table here --> + <div class="container"> + <div class="row"> + <div class="col-md-10 offset-md-1"> + <div class="card my-5 p-2"> + + <div class="container contact"> + <div class="row"> + <div class="col-md-3"> + <div class="contact-info"> + <img src="https://image.ibb.co/kUASdV/contact-image.png" alt="image"/> + <h2>Contact Us</h2> + <h4>We would love to hear from you !</h4> + </div> + </div> + <div class="col-md-9"> + <div class="contact-form"> + <div class="form-group"> + <label class="control-label col-sm-2" for="fname">First Name:</label> + <div class="col-sm-10"> + <input type="text" class="form-control" id="fname" placeholder="Enter First Name" name="fname"> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="lname">Last Name:</label> + <div class="col-sm-10"> + <input type="text" class="form-control" id="lname" placeholder="Enter Last Name" name="lname"> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="email">Email:</label> + <div class="col-sm-10"> + <input type="email" class="form-control" id="email" placeholder="Enter email" name="email"> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="comment">Comment:</label> + <div class="col-sm-10"> + <textarea class="form-control" rows="5" id="comment"></textarea> + </div> + </div> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <button type="submit" class="btn btn-default">Submit</button> + </div> + </div> + </div> + </div> + </div> + </div> + + </div> + + </div> + </div> + </div> + + </body> + +</html> diff --git a/server/djangoapp/templates/djangoapp/custom_template.html b/server/djangoapp/templates/djangoapp/custom_template.html new file mode 100644 index 0000000000..9e64f279ae --- /dev/null +++ b/server/djangoapp/templates/djangoapp/custom_template.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Dealership Review</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> + <link href="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.css" rel="stylesheet"> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.js"></script> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/extensions/filter-control/bootstrap-table-filter-control.min.js"></script> + +</head> + + <body> + <!--Add a nav bar here --> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> + + <!--Add a dealer table here --> + <div class="row"> + <div class="col-sm-6"> + <div class="card"> + <div class="card-body"> + <h5 class="card-title">Special title treatment</h5> + <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> + <a href="#" class="btn btn-primary">Go somewhere</a> + </div> + </div> + </div> + <div class="col-sm-6"> + <div class="card"> + <div class="card-body"> + <h5 class="card-title">Special title treatment</h5> + <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> + <a href="#" class="btn btn-primary">Go somewhere</a> + </div> + </div> + </div> + </div> + + </body> + +</html> diff --git a/server/djangoapp/templates/djangoapp/dealer_details.html b/server/djangoapp/templates/djangoapp/dealer_details.html index 25bd9a223d..6be3523825 100644 --- a/server/djangoapp/templates/djangoapp/dealer_details.html +++ b/server/djangoapp/templates/djangoapp/dealer_details.html @@ -10,6 +10,67 @@ <body> <!--Add a nav bar here --> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> <!-- Add reviews as cards --> diff --git a/server/djangoapp/templates/djangoapp/index.html b/server/djangoapp/templates/djangoapp/index.html index 1a9ee6e39a..7ada791ed7 100644 --- a/server/djangoapp/templates/djangoapp/index.html +++ b/server/djangoapp/templates/djangoapp/index.html @@ -14,9 +14,68 @@ </head> <body> - <!-- Remove this line the first time you edit this file --> - This is the index page of your Django app! <!--Add a nav bar here --> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> <!--Add a dealer table here --> diff --git a/server/djangoapp/templates/djangoapp/registration.html b/server/djangoapp/templates/djangoapp/registration.html index ae11ea4b71..e9e9306cfe 100644 --- a/server/djangoapp/templates/djangoapp/registration.html +++ b/server/djangoapp/templates/djangoapp/registration.html @@ -4,8 +4,109 @@ <meta charset="UTF-8"> {% load static %} <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> + <link href="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.css" rel="stylesheet"> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.js"></script> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/extensions/filter-control/bootstrap-table-filter-control.min.js"></script> </head> <body> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> <!--Add a registration form here --> + <div class="container"> + <div class="row"> + <div class="col-md-6 offset-md-3"> + <div class="card my-5 p-2"> + + <form action="{% url 'djangoapp:registration' %}" method="post"> + {% csrf_token %} + <h2>Sign Up</h2> + <p>Please fill in this form to create an account!</p> + <hr> + <div class="form-group"> + <div class="row"> + <div class="col"><input type="text" class="form-control" name="firstname" placeholder="First Name" required="required"></div> + <div class="col"><input type="text" class="form-control" name="lastname" placeholder="Last Name" required="required"></div> + </div> + </div> + <div class="form-group"> + <input type="text" class="form-control" name="username" placeholder="User Name" required="required"> + </div> + <div class="form-group"> + <input type="password" class="form-control" name="psw" placeholder="Password" required="required"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-lg">Sign Up</button> + </div> + </form> + + </div> + + </div> + </div> + </div> + </body> </html> \ No newline at end of file diff --git a/server/djangoapp/templates/djangoapp/user_login.html b/server/djangoapp/templates/djangoapp/user_login.html new file mode 100644 index 0000000000..f877965710 --- /dev/null +++ b/server/djangoapp/templates/djangoapp/user_login.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Dealership Review</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> + <link href="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.css" rel="stylesheet"> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/bootstrap-table.min.js"></script> + <script src="https://unpkg.com/bootstrap-table@1.18.2/dist/extensions/filter-control/bootstrap-table-filter-control.min.js"></script> + +</head> + + <body> + <!--Add a nav bar here --> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Navbar</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/djangoapp">Home <span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/contact">Contact</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/djangoapp/about">About</a> + </li> + </ul> + <ul class="navbar-nav my-2 my-lg-0"> + {% if user.is_authenticated %} + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/signup">{{user.first_name}}</a> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="{% url 'djangoapp:logout' %}">Logout</a> + </li> + {% else %} + <li class="dropdown order-1"> + <button type="button" id="dropdownMenu1" data-toggle="dropdown" class="btn btn-outline-secondary dropdown-toggle">Login <span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right mt-1"> + <li class="p-3"> + <form class="form" role="form" action="{% url 'djangoapp:login' %}" method="post"> + {% csrf_token %} + <div class="form-group"> + <input id="emailInput" placeholder="Email" class="form-control form-control-sm" type="text" required="" name="username"> + </div> + <div class="form-group"> + <input id="passwordInput" placeholder="Password" class="form-control form-control-sm" type="password" required="" name="psw"> + </div> + <div class="form-group"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + <div class="form-group text-xs-center"> + <small><a href="#">Forgot password?</a></small> + </div> + {% if message %} + <div class="alert alert-warning"> <!--Style the message paragraph with .alert and .alert-warning class --> + {{ message }} + </div> + {% endif %} + </form> + </li> + </ul> + </li> + <li class="nav-item order-2"> + <a class="nav-link" href="/djangoapp/registration">Sign Up</a> + </li> + {% endif %} + </ul> + </div> + </nav> + + <div class="container"> + <div class="row"> + <div class="col-md-6 offset-md-3"> + <h2 class="text-center text-dark mt-5">Login Form</h2> + <div class="text-center mb-5 text-dark">Made with bootstrap</div> + <div class="card my-5"> + + <form role="form" class="card-body cardbody-color p-lg-5" action="{% url 'djangoapp:login' %}" method="post"> + + {% csrf_token %} + <div class="text-center"> + <img src="https://www.clipartmax.com/png/full/405-4050774_avatar-icon-flat-icon-shop-download-free-icons-for-avatar-icon-flat.png" class="img-fluid profile-image-pic img-thumbnail rounded-circle my-3" + width="200px" alt="profile"> + </div> + + <div class="mb-3"> + <input type="text" class="form-control" id="Username" aria-describedby="emailHelp" + placeholder="User Name" name="username" required> + </div> + <div class="mb-3"> + <input type="password" class="form-control" id="password" placeholder="password" name="psw" required> + </div> + <div class="text-center"> + <button type="submit" class="btn btn-primary btn-block">Login</button> + </div> + {% if message %} + <div class="alert alert-warning"> + {{ message }} + </div> + {% endif %} + </form> + </div> + + </div> + </div> + </div> + + </body> + +</html> diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py index 37b1c89d01..05c4a3cf0f 100644 --- a/server/djangoapp/urls.py +++ b/server/djangoapp/urls.py @@ -10,19 +10,25 @@ # 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('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(route='', view=views.get_dealerships, name='index'), # path for dealer reviews view # path for add a review view + path(route='profile', view=views.custom_profile, name='profile'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py index 61cc664da0..a704fb1e93 100644 --- a/server/djangoapp/views.py +++ b/server/djangoapp/views.py @@ -15,27 +15,90 @@ # Create your views here. - +def custom_profile(request): + context = {} + if request.method == "GET": + return render(request, 'djangoapp/custom_template.html', context) # 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 = {} + # Handles POST request + if request.method == "POST": + # Get username and password from request.POST dictionary + username = request.POST['username'] + password = request.POST['psw'] + # Try to check if provide credential can be authenticated + user = authenticate(username=username, password=password) + if user is not None: + # If user is valid, call login method to login current user + login(request, user) + return redirect('djangoapp:index') + else: + # If not, return to login page again + return render(request, 'djangoapp/user_login.html', context) + else: + return render(request, 'djangoapp/user_login.html', context) # Create a `logout_request` view to handle sign out request # def logout_request(request): -# ... +def logout_request(request): + # Get the user object based on session id in request + print("Log out the user `{}`".format(request.user.username)) + # Logout user in the request + logout(request) + # Redirect user back to course list view + return redirect('djangoapp:index') # Create a `registration_request` view to handle sign up request # def registration_request(request): -# ... +def registration_request(request): + context = {} + # If it is a GET request, just render the registration page + if request.method == 'GET': + return render(request, 'djangoapp/registration.html', context) + # If it is a POST request + elif request.method == 'POST': + # Get user information from request.POST + username = request.POST['username'] + password = request.POST['psw'] + first_name = request.POST['firstname'] + last_name = request.POST['lastname'] + user_exist = False + try: + # Check if user already exists + User.objects.get(username=username) + user_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 user_exist: + # Create user in auth_user table + user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name, + password=password) + # Login the user and redirect to course list page + login(request, user) + return redirect("djangoapp:index") + else: + return render(request, 'djangoapp/registration.html', context) # Update the `get_dealerships` view to render the index page with a list of dealerships def get_dealerships(request): diff --git a/server/requirements.txt b/server/requirements.txt index 2851cca128..a3e766f47a 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -1,6 +1,6 @@ requests Django==3.1.3 -Pillow==8.0.1 +Pillow==10.1.0 gunicorn==20.1.0 ibm-cloud-sdk-core==3.10.0 ibm-watson==5.2.2