aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorKyle Blanker <kyle@stridet.com>2017-09-12 14:46:33 -0400
committerKyle Blanker <kyle@stridet.com>2017-09-12 14:46:33 -0400
commit0e1a08683b888606fb9566113cbaff41c6b65d39 (patch)
tree95e380e050779ff8a7a6e29fdf03bb2b2db40452 /app
parent8df0bda39f6c7e56e6f8f4e59b42c8b82aeb750b (diff)
downloaddispatch-tracker-0e1a08683b888606fb9566113cbaff41c6b65d39.tar.gz
dispatch-tracker-0e1a08683b888606fb9566113cbaff41c6b65d39.tar.xz
Fixed up login page, added auth middleware, adding company crud operations
Diffstat (limited to 'app')
-rw-r--r--app/app/settings.py4
-rw-r--r--app/app/urls.py2
-rw-r--r--app/dispatch/middleware.py31
-rw-r--r--app/dispatch/templates/dispatch/base.html30
-rw-r--r--app/dispatch/templates/dispatch/companies/create.html15
-rw-r--r--app/dispatch/templates/dispatch/companies/detail.html10
-rw-r--r--app/dispatch/templates/dispatch/companies/edit.html15
-rw-r--r--app/dispatch/templates/dispatch/companies/list.html39
-rw-r--r--app/dispatch/templates/dispatch/index.html36
-rw-r--r--app/dispatch/templates/dispatch/login.html70
-rw-r--r--app/dispatch/urls.py12
-rw-r--r--app/dispatch/views.py57
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