Bladeren bron

Started working on the auth system.

Adam Day 4 jaren geleden
bovenliggende
commit
4b9180a7b1
7 gewijzigde bestanden met toevoegingen van 99 en 7 verwijderingen
  1. 7 1
      app/admin.py
  2. 11 0
      app/forms.py
  3. 9 0
      app/models.py
  4. 13 2
      app/templates/home.html
  5. 2 1
      app/urls.py
  6. 51 3
      app/views.py
  7. 6 0
      static/app/js/keypad.js

+ 7 - 1
app/admin.py

@@ -1,3 +1,9 @@
 from django.contrib import admin
-
+from . models import User
 # Register your models here.
+
+
+@admin.register(User)
+class UserAdmin(admin.ModelAdmin):
+    list_display = ['last_name', 'first_name', 'status']
+

+ 11 - 0
app/forms.py

@@ -0,0 +1,11 @@
+from django import forms
+from django.core.validators import RegexValidator
+
+numeric = RegexValidator(r'^[0-9+]', 'Only numeric characters.')
+
+
+class LoginForm(forms.Form):
+    pin = forms.CharField(strip=True, widget=forms.PasswordInput(attrs={
+        'class': 'form-control form-control-lg p-4 text-center',
+        'id': 'pin',
+    }), label=None, validators=[numeric])

+ 9 - 0
app/models.py

@@ -1,3 +1,12 @@
 from django.db import models
 
+
 # Create your models here.
+class User(models.Model):
+    status = models.BooleanField(default=True, blank=True)
+    first_name = models.CharField(max_length=255, default="", blank=False)
+    last_name = models.CharField(max_length=255, default="", blank=False)
+    pin = models.CharField(max_length=255, default="", blank=False, unique=True)
+
+    def __str__(self):
+        return "%s, %s (Enabled: %s)" % (self.last_name, self.first_name, self.status)

+ 13 - 2
app/templates/home.html

@@ -1,11 +1,22 @@
 {% extends 'layout.html' %}
 
 {% block content %}
-    <form action="" method="post">
+    <form action="{% url 'home' %}" method="post">
         {% csrf_token %}
+        {% if form.pin.errors %}
+        <div class="row mb-3 justify-content-center" id="error_wrapper">
+            <div class="col-sm-12 col-md-6 text-danger">
+                <ul class="list-unstyled">
+                {% for error in form.pin.errors %}
+                    <li><span class="oi" data-glyph="warning"></span> {{ error }}</li>
+                {% endfor %}
+                </ul>
+            </div>
+        </div>
+        {% endif %}
         <div class="row mb-3 justify-content-center">
             <div class="col-sm-12 col-md-6">
-                <input type="password" class="form-control form-control-lg p-4 text-center" id="pin" placeholder="Account PIN">
+                {{ form.pin }}
             </div>
         </div>
         <div class="row mb-3">

+ 2 - 1
app/urls.py

@@ -18,5 +18,6 @@ from . import views
 
 urlpatterns = [
     path('', views.home, name='home'),
-    path('timesheet', views.timesheet, name="timesheet")
+    path('timesheet', views.timesheet, name="timesheet"),
+    path('logout', views.logout, name="logout"),
 ]

+ 51 - 3
app/views.py

@@ -1,19 +1,67 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
+from . forms import LoginForm
+from . models import User
+from hashlib import sha256
+from django.core import serializers
+
+
+def logout(request):
+    try:
+        del request.session['user']
+    except Exception as e:
+        print(e)
+
+    return redirect('home')
+
+
+def secure_page(request):
+    try:
+        session_user = serializers.deserialize('json', request.session.get('u'))
+        print(session_user)
+        user = User.objects.filter(pin=session_user.pin).first()
+        if user:
+            return True
+        else:
+            del request.session['u']
+            return redirect('home')
+    except Exception as e:
+        print(e)
+
+    return redirect('home')
 
 
 def home(request):
+    form = LoginForm
+
+    login_error = False
+    if request.method == "POST":
+        form = LoginForm(request.POST or None)
+        if form.is_valid():
+            data = form.cleaned_data
+            pin = sha256(data['pin'].encode('utf-8')).hexdigest()
+            print(pin)
+            user = User.objects.filter(pin=pin)
+
+            if user is None:
+                form.add_error('pin', 'Invalid login')
+                login_error = True
+            else:
+                request.session['u'] = serializers.serialize('json', user)
+                return redirect('timesheet')
 
     context = {
-        'title': 'Login',
+        'form': form,
+        'login_error': login_error
     }
 
     return render(request, 'home.html', context=context)
 
 
+@secure_page
 def timesheet(request):
 
     context = {
-        'title': 'Timesheet',
+
     }
 
     return render(request, 'timesheet.html', context=context)

+ 6 - 0
static/app/js/keypad.js

@@ -1,4 +1,10 @@
 $(document).ready(function() {
+    setTimeout(hide_errors, 10000);
+
+    function hide_errors() {
+        $('#error_wrapper').slideUp();
+    }
+
     let new_pin_value
     $('.keypad-button').click(function(e) {
         e.preventDefault();