diff options
| -rw-r--r-- | app/app/settings.py | 4 | ||||
| -rw-r--r-- | app/app/urls.py | 2 | ||||
| -rw-r--r-- | app/dispatch/middleware.py | 31 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/base.html | 30 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/companies/create.html | 15 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/companies/detail.html | 10 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/companies/edit.html | 15 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/companies/list.html | 39 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/index.html | 36 | ||||
| -rw-r--r-- | app/dispatch/templates/dispatch/login.html | 70 | ||||
| -rw-r--r-- | app/dispatch/urls.py | 12 | ||||
| -rw-r--r-- | app/dispatch/views.py | 57 |
12 files changed, 246 insertions, 75 deletions
diff --git a/app/app/settings.py b/app/app/settings.py index 60e03fd..bbfc325 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -48,6 +48,7 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'dispatch.middleware.LoginRequiredMiddleware', ] ROOT_URLCONF = 'app.urls' @@ -119,3 +120,6 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' + +LOGIN_URL = 'login/' +LOGIN_REDIRECT_URL = '/'
\ No newline at end of file diff --git a/app/app/urls.py b/app/app/urls.py index 89d5431..6e1b869 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -17,6 +17,6 @@ from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ - url(r'^dispatch/', include('dispatch.urls')), + url(r'^', include('dispatch.urls')), url(r'^admin/', admin.site.urls), ] diff --git a/app/dispatch/middleware.py b/app/dispatch/middleware.py new file mode 100644 index 0000000..2b3e349 --- /dev/null +++ b/app/dispatch/middleware.py @@ -0,0 +1,31 @@ +from django.http import HttpResponseRedirect +from django.conf import settings +from re import compile +from django.core.urlresolvers import reverse + +EXEMPT_URLS = [reverse('login'),reverse('logout')] + +if hasattr(settings, 'LOGIN_EXEMPT_URLS'): + EXEMPT_URLS += settings.LOGIN_EXEMPT_URLS + +""" +Middleware that requires a user to be authenticated to view any page other +than LOGIN_URL. Exemptions to this requirement can optionally be specified +in settings via a list of regular expressions in LOGIN_EXEMPT_URLS (which +you can copy from your urls.py). + +Requires authentication middleware and template context processors to be +loaded. You'll get an error if they aren't. +""" +class LoginRequiredMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + if not request.user or not request.user.is_authenticated(): + path = request.path_info + if path not in EXEMPT_URLS: + login_uri = '%s?next=%s' % (settings.LOGIN_URL, request.path_info) + return HttpResponseRedirect(login_uri) + + return self.get_response(request)
\ No newline at end of file diff --git a/app/dispatch/templates/dispatch/base.html b/app/dispatch/templates/dispatch/base.html index 8654d2e..d7a85a9 100644 --- a/app/dispatch/templates/dispatch/base.html +++ b/app/dispatch/templates/dispatch/base.html @@ -12,18 +12,40 @@ <!--Let browser know website is optimized for mobile--> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> - + <style> + h1 { + font-size: 2rem; + margin: 0; + } + main { + padding: 16px; + } + </style> </head> <body> <nav class="light-blue lighten-1" role="navigation"> - <div class="nav-wrapper container"><a id="logo-container" href="#" class="brand-logo">Dispatch Tracker</a> + <div class="nav-wrapper container"><a id="logo-container" href="{% url 'home' %}" class="brand-logo">Dispatch Tracker</a> <ul class="right hide-on-med-and-down"> - <li><a href="#">Navbar Link</a></li> + {% if user.is_authenticated %} + <li><a href="#">Drivers</a></li> + <li><a href="{% url 'company_list' %}">Companies</a></li> + <li><a href="#">Contacts</a></li> + <li><a href="{% url 'logout' %}">Logout</a></li> + {% else %} + <li><a href="{% url 'login' %}">Login</a></li> + {% endif %} </ul> <ul id="nav-mobile" class="side-nav"> - <li><a href="#">Navbar Link</a></li> + {% if user.is_authenticated %} + <li><a href="#">Drivers</a></li> + <li><a href="#">Companies</a></li> + <li><a href="#">Contacts</a></li> + <li><a href="{% url 'logout' %}">Logout</a></li> + {% else %} + <li><a href="{% url 'login' %}">Login</a></li> + {% endif %} </ul> <a href="#" data-activates="nav-mobile" class="button-collapse"><i class="material-icons">menu</i></a> </div> diff --git a/app/dispatch/templates/dispatch/companies/create.html b/app/dispatch/templates/dispatch/companies/create.html new file mode 100644 index 0000000..fb6030e --- /dev/null +++ b/app/dispatch/templates/dispatch/companies/create.html @@ -0,0 +1,15 @@ +{% extends 'dispatch/base.html' %} + + +{% block content %} +<div class="row"> + <div class="col s12 m6"> + <h1>New Company</h1> + </div> +</div> + +<form action="" method="post">{% csrf_token %} + {{ form.as_p }} + <input type="submit" class="btn green" value="Save" /> +</form> +{% endblock %} diff --git a/app/dispatch/templates/dispatch/companies/detail.html b/app/dispatch/templates/dispatch/companies/detail.html new file mode 100644 index 0000000..e939fdb --- /dev/null +++ b/app/dispatch/templates/dispatch/companies/detail.html @@ -0,0 +1,10 @@ +{% extends 'dispatch/base.html' %} + + +{% block content %} +<div class="row"> + <div class="col s12 m6"> + <h1>{{ object.name }} details</h1> + </div> +</div> +{% endblock %} diff --git a/app/dispatch/templates/dispatch/companies/edit.html b/app/dispatch/templates/dispatch/companies/edit.html new file mode 100644 index 0000000..fe8460d --- /dev/null +++ b/app/dispatch/templates/dispatch/companies/edit.html @@ -0,0 +1,15 @@ +{% extends 'dispatch/base.html' %} + + +{% block content %} +<div class="row"> + <div class="col s12 m6"> + <h1>{{object.name}}</h1> + </div> +</div> + +<form action="" method="post">{% csrf_token %} + {{ form.as_p }} + <input type="submit" class="btn blue" value="Update" /> +</form> +{% endblock %} diff --git a/app/dispatch/templates/dispatch/companies/list.html b/app/dispatch/templates/dispatch/companies/list.html new file mode 100644 index 0000000..48612d9 --- /dev/null +++ b/app/dispatch/templates/dispatch/companies/list.html @@ -0,0 +1,39 @@ +{% extends 'dispatch/base.html' %} + + +{% block content %} +<div class="row"> + <div class="col s12 m6"> + <h1>Companies</h1> + </div> + <div class="col s12 m6 right-align"> + <a href="{% url 'company_new' %}" class="btn green">Add Company</a> + </div> +</div> +<table class="striped"> + <thead> + <tr> + <th>Name</th> + <th>Address</th> + <th>Phone</th> + <th>Email</th> + </tr> + </thead> + <tbody> + {% for company in object_list %} + <tr> + <td>{{ company.name }}</td> + <td>{{ company.address }}</td> + <td>{{ company.phone_number }}</td> + <td>{{ company.email_address }}</td> + <td class="right-align"> + <a href="{% url 'company_edit' company.id %}" class="btn orange">Edit</a> + <a href="{% url 'company_detail' company.id %}" class="btn blue">View</a> + </td> + </tr> + {% empty %} + <tr><td colspan="4">No companies yet.</td></tr> + {% endfor %} + </tbody> +</table> +{% endblock %} diff --git a/app/dispatch/templates/dispatch/index.html b/app/dispatch/templates/dispatch/index.html index fd87570..79df18c 100644 --- a/app/dispatch/templates/dispatch/index.html +++ b/app/dispatch/templates/dispatch/index.html @@ -2,8 +2,36 @@ {% block content %} -<br /> - -<h1>Index Page</h1> - +<h2>Tuesday, September 12, 2017</h2> +<table class="striped"> + <thead> + <tr> + <th>Driver</th> + <th>Company</th> + <th>Load</th> + <th>Amount</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Alvin</td> + <td>Eclair</td> + <td>Ecasdfasflair</td> + <td>$0.87</td> + </tr> + <tr> + <td>Alan</td> + <td>Jellybean</td> + <td>Ecasdfasflair</td> + <td>$3.76</td> + </tr> + <tr> + <td>Jonathan</td> + <td>Lollipop</td> + <td>Ecasdfasflair</td> + <td>$7.00</td> + </tr> + </tbody> +</table> {% endblock %} diff --git a/app/dispatch/templates/dispatch/login.html b/app/dispatch/templates/dispatch/login.html index b43f363..eb7f1a7 100644 --- a/app/dispatch/templates/dispatch/login.html +++ b/app/dispatch/templates/dispatch/login.html @@ -1,51 +1,37 @@ {% extends 'dispatch/base.html' %} - - {% block content %} - {% if form.errors %} - -<p>Your username and password didn't match. Please try again.</p> -{% endif %} - -{% if next %} - {% if user.is_authenticated %} - -<p>Your account doesn't have access to this page. To proceed, - please login with an account that has access.</p> - {% else %} - -<p>Please login to see this page.</p> - {% endif %} -{% endif %} - <div class="container"> + <br /> <div class="row"> - <div class="col-md-4 col-md-offset-4"> - <div class="login-panel panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title">Please Sign In</h3> + <div class="col s12 m8 push-m2 l6 push-l3"> + {% if form.errors %} + <div class="card red lighten-5"> + <div class="card-content red-text"> + Your username and password didn't match. Please try again. + </div> </div> - <div class="panel-body"> - <form method="post" action=""> -{% csrf_token %} - <p class="bs-component"> - <table> - <tr> - <td>{{ form.username.label_tag }}</td> - <td>{{ form.username }}</td> - </tr> - <tr> - <td>{{ form.password.label_tag }}</td> - <td>{{ form.password }}</td> - </tr> - </table> - </p> - <p class="bs-component"> - <center> - <input class="btn btn-success btn-sm" type="submit" value="login" /> - </center> - </p> + {% endif %} + <div class="card"> + <div class="card-content"> + <span class="card-title"> + Please Sign In + </span> + <form method="post" action="{% url 'login' %}"> + {% csrf_token %} + <div class="row"> + <div class="input-field col s12"> + {{ form.username }} + {{ form.username.label_tag }} + </div> + <div class="input-field col s12"> + {{ form.password }} + {{ form.password.label_tag }} + </div> + </div> + <div class="right-align"> + <input class="btn" type="submit" value="login" /> + </div> <input type="hidden" name="next" value="{{ next }}" /> </form> </div> diff --git a/app/dispatch/urls.py b/app/dispatch/urls.py index d40462b..688839e 100644 --- a/app/dispatch/urls.py +++ b/app/dispatch/urls.py @@ -1,12 +1,18 @@ from django.conf.urls import url from . import views - +from django.conf import settings from django.contrib.auth import views as authviews urlpatterns = [ url(r'^$', views.home, name='home'), - url(r'^login/$', authviews.LoginView.as_view(template_name="dispatch/login.html")), - url(r'^logout/$', views.logout), + url(r'^%s$' % settings.LOGIN_URL, authviews.LoginView.as_view(template_name="dispatch/login.html"), name='login'), + url(r'^logout/$', authviews.LogoutView.as_view(next_page='/'), name='logout'), + + url(r'^companies/$', views.CompanyList.as_view(), name='company_list'), + url(r'^companies/new$', views.CompanyCreate.as_view(), name='company_new'), + url(r'^companies/view/(?P<pk>\d+)$', views.CompanyDetail.as_view(), name='company_detail'), + url(r'^companies/edit/(?P<pk>\d+)$', views.CompanyUpdate.as_view(), name='company_edit'), + url(r'^companies/delete/(?P<pk>\d+)$', views.CompanyDelete.as_view(), name='company_delete'), ] diff --git a/app/dispatch/views.py b/app/dispatch/views.py index 916c04b..600a746 100644 --- a/app/dispatch/views.py +++ b/app/dispatch/views.py @@ -1,30 +1,45 @@ from django.shortcuts import render, redirect from django.http import HttpResponse from django.template import loader - -from django.contrib.auth.decorators import login_required -# from django.contrib.auth import authenticate, login, logout +from django.core.urlresolvers import reverse import django.contrib.auth as auth - +from django.conf import settings # Create your views here. +from django.views.generic import TemplateView,ListView +from django.views.generic.detail import DetailView +from django.views.generic.edit import CreateView, UpdateView, DeleteView +from django.core.urlresolvers import reverse_lazy +from dispatch.models import Company - -@login_required(login_url="login/") def home(request): return render(request,"dispatch/index.html") -def login(request): - username = request.POST['username'] - password = request.POST['password'] - user = auth.authenticate(request, username=username, password=password) - if user is not None: - auth.login(request, user) - return redirect('/dispatch/') - else: - template = loader.get_template('dispatch/login.html') - context = {} - return HttpResponse(template.render(context, request)) - -def logout(request): - auth.logout(request) - return redirect('/dispatch/login', permanent=False) + +class CompanyList(ListView): + template_name = "dispatch/companies/list.html" + model = Company + +class CompanyCreate(CreateView): + template_name = "dispatch/companies/create.html" + model = Company + success_url = reverse_lazy('company_list') + fields = ['name', 'address', 'phone_number','email_address'] + +class CompanyDetail(DetailView): + template_name = "dispatch/companies/detail.html" + model = Company + + def get_context_data(self, **kwargs): + context = super(CompanyDetail, self).get_context_data(**kwargs) + return context + +class CompanyUpdate(UpdateView): + template_name = "dispatch/companies/edit.html" + model = Company + success_url = reverse_lazy('company_list') + fields = ['name', 'address', 'phone_number','email_address'] + +class CompanyDelete(DeleteView): + template_name = "dispatch/companies/delete.html" + model = Company + success_url = reverse_lazy('company_list')
\ No newline at end of file |
