Explorar el Código

Basic login and logout

Denis Merigoux hace 9 años
padre
commit
5e92eececf

+ 2 - 0
counter/models.py

@@ -1,12 +1,14 @@
1 1
 from django.db import models
2 2
 from datetime import datetime
3 3
 from babel.dates import format_timedelta
4
+from django.contrib.auth.models import User
4 5
 
5 6
 # Create your models here.
6 7
 class Counter(models.Model):
7 8
     name = models.CharField("Nom",max_length=60)
8 9
     email = models.EmailField("Email",max_length=264,default="null@localhost")
9 10
     trigramme = models.CharField("Trigramme", max_length=3)
11
+    user = models.ForeignKey(User,blank=True,null=True)
10 12
 
11 13
     def __str__(self):
12 14
         return "%s (%s)" % (self.trigramme,self.name)

+ 1 - 35
counter/templates/homeTemplate.html

@@ -3,35 +3,6 @@
3 3
 	<h1>SeumBook™</h1>
4 4
 </div>
5 5
 <div class="container-fluid">
6
-	{% if chooseCounter %}
7
-	<div class="row" id="my-counter">
8
-		<div class="col-sm-12">
9
-			<div class="panel panel-warning">
10
-				<div class="panel-heading">
11
-					<h2 class="panel-title">Mon compteur</h2>
12
-				</div>
13
-				<div class="panel-body">
14
-					<p>Choisis ton compteur pour qu'il apparaisse en haut de la liste quand tu reviendras sur le site !</p>
15
-					<form action="{% url 'set-my-counter'%}" method="post">
16
-						{% csrf_token %}
17
-						<div class="form-group">
18
-							<label for="myCounterSelect">Mon trigramme:</label>
19
-							<select class="form-control" name="myCounter">
20
-								{% for counter in counters %}
21
-								<option value="{{ counter.id }}">{{ counter.trigramme }} ({{ counter.name }})</option>
22
-								{% endfor %}
23
-							</select>
24
-						</div>
25
-						<input type="hidden" name="redirect" value="{% url 'home' %}"></input>
26
-						<div class="text-center">
27
-							<button type="submit" class="btn btn-default btn-success">Définir mon compteur</button>
28
-						</div>
29
-					</form>
30
-				</div>
31
-			</div>
32
-		</div>
33
-	</div>
34
-	{% else %}
35 6
 	<div class="row" id="my-counter">
36 7
 		<div class="col-sm-12">
37 8
 			<div class="panel panel-warning">
@@ -69,7 +40,6 @@
69 40
 			</div>
70 41
 		</div>
71 42
 	</div>
72
-	{% endif %}
73 43
 	<div class="row">
74 44
 		{% for counter in counters %} {% if chooseCounter or not counter.id == myCounter.id %}
75 45
 		<div class="col-md-4 col-sm-6 col-lg-3">
@@ -160,10 +130,6 @@
160 130
 	</div>
161 131
 </div>
162 132
 <div class="row text-center">
163
-	<form action="{% url 'reset-my-counter' %}" method="post">
164
-		{% csrf_token %}
165
-		<input type="hidden" name="redirect" value="{% url 'home' %}"></input>
166
-		<button type="submit" class="btn btn-success">Changer mon compteur</button>
167
-	</form>
133
+		<a href="{% url 'logout' %}" class="btn btn-danger">Se déconnecter</a>
168 134
 </div>
169 135
 {% endblock %}

+ 45 - 0
counter/templates/login.html

@@ -0,0 +1,45 @@
1
+{% extends 'baseTemplate.html' %} {% block title %}Login{% endblock %}{% block content %}
2
+<div class="container">
3
+    <div class="row">
4
+        <div class="text-center">
5
+            <h1>SeumBook™</h1>
6
+        </div>
7
+    </div>
8
+    <div class="row">
9
+        <div class="panel panel-primary">
10
+            <div class="panel-heading">
11
+                <h2 class="panel-title">Connecte toi pour avoir le seum !</h2>
12
+            </div>
13
+            <div class=" panel-body">
14
+                <form class='' method="POST" action="{% url 'login' %}">
15
+                    {% csrf_token %}
16
+                    <div class="form-group">
17
+                        <label for="id_username">Trigramme</label>
18
+                        <input id="id_username" maxlength="3" type="text" class="form-control text-uppercase" name="username" />
19
+                    </div>
20
+                    <div class="form-group">
21
+                        <label for="id_username">Mot de passe</label>
22
+                        <input id="id_username" type="password" class="form-control" name="password" />
23
+                    </div>
24
+                    <input type="hidden" name="next" value="{{ next }}" />
25
+                    <div class="text-center">
26
+                        <button type="submit" class="btn btn-default btn-success">Se connecter</button>
27
+                    </div>
28
+                </form>
29
+            </div>
30
+        </div>
31
+    </div>
32
+    {% if form.errors %}
33
+    <div class="row">
34
+        <div class="panel panel-danger">
35
+            <div class="panel-heading">
36
+                <h2 class="panel-title">Erreur</h2>
37
+            </div>
38
+            <div class=" panel-body">
39
+                <p>T'arrives même pas à te connecter, seum.</p>
40
+            </div>
41
+        </div>
42
+    </div>
43
+    {% endif %}
44
+</div>
45
+{% endblock %}

+ 8 - 3
counter/urls.py

@@ -1,5 +1,6 @@
1 1
 from django.conf.urls import url
2 2
 from counter.rss import SeumFeed
3
+from django.contrib.auth import views as auth_views
3 4
 
4 5
 from . import views
5 6
 
@@ -7,7 +8,11 @@ urlpatterns = [
7 8
     url(r'^$', views.home, name="home"),
8 9
     url(r'^reset-counter', views.resetCounter, name="reset-counter"),
9 10
     url(r'^counter/(?P<id_counter>\d+)$', views.counter, name="counter"),
10
-    url(r'^set-my-counter', views.setMyCounter, name="set-my-counter"),
11
-    url(r'^reset-my-counter', views.resetMyCounter, name="reset-my-counter"),
12
-    url(r'^rss', SeumFeed())
11
+    url(r'^rss', SeumFeed()),
12
+    url(r'^login', auth_views.login,
13
+        {'template_name': 'login.html'},
14
+        name="login"),
15
+    url(r'^logout', auth_views.logout,
16
+        {'next_page': 'login'},
17
+        name='logout')
13 18
 ]

+ 25 - 43
counter/views.py

@@ -5,6 +5,7 @@ from datetime import datetime, timedelta
5 5
 from django import forms
6 6
 from django.http import HttpResponseRedirect
7 7
 from django.core.mail import EmailMessage
8
+from django.contrib.auth.decorators import login_required
8 9
 from graphos.renderers import gchart
9 10
 from graphos.sources.simple import SimpleDataSource
10 11
 from graphos.sources.model import ModelDataSource
@@ -14,6 +15,7 @@ import copy
14 15
 from django.utils import timezone
15 16
 
16 17
 
18
+@login_required
17 19
 def home(request):
18 20
     # JSS above this limit will not be displayed on the col graph
19 21
     JSS_limit = 7
@@ -24,32 +26,27 @@ def home(request):
24 26
     # Calculates infos for each counter
25 27
     timezero = timedelta(0)
26 28
 
27
-    # First we determine if the session
28
-    if 'my-counter' in request.session:
29
-        chooseCounter = False
30
-        try:
31
-            myCounter = Counter.objects.get(id=request.session['my-counter'])
32
-            lastReset = Reset.objects.filter(
33
-                counter=myCounter).order_by('-timestamp')
34
-            if (lastReset.count() == 0):
35
-                # This person never had the seum
36
-                myCounter.lastReset = Reset()
37
-                myCounter.lastReset.delta = timezero
38
-                myCounter.lastReset.noSeum = True
39
-            else:
40
-                myCounter.lastReset = lastReset[0]
41
-                myCounter.lastReset.noSeum = False
42
-                myCounter.lastReset.delta = datetime.now(
43
-                ) - myCounter.lastReset.timestamp.replace(tzinfo=None)
44
-                myCounter.seumCount = Reset.objects.filter(
45
-                    counter=myCounter).count()
46
-            myCounter.lastReset.formatted_delta = format_timedelta(
47
-                myCounter.lastReset.delta, locale='fr', threshold=1)
48
-        except ObjectDoesNotExist:
49
-            chooseCounter = True
50
-    else:
51
-        myCounter = None
52
-        chooseCounter = True
29
+    # First select our counter
30
+    try:
31
+        myCounter = Counter.objects.get(user__id=request.user.id)
32
+        lastReset = Reset.objects.filter(
33
+            counter=myCounter).order_by('-timestamp')
34
+        if (lastReset.count() == 0):
35
+            # This person never had the seum
36
+            myCounter.lastReset = Reset()
37
+            myCounter.lastReset.delta = timezero
38
+            myCounter.lastReset.noSeum = True
39
+        else:
40
+            myCounter.lastReset = lastReset[0]
41
+            myCounter.lastReset.noSeum = False
42
+            myCounter.lastReset.delta = datetime.now(
43
+            ) - myCounter.lastReset.timestamp.replace(tzinfo=None)
44
+            myCounter.seumCount = Reset.objects.filter(
45
+                counter=myCounter).count()
46
+        myCounter.lastReset.formatted_delta = format_timedelta(
47
+            myCounter.lastReset.delta, locale='fr', threshold=1)
48
+    except Counter.DoesNotExist:
49
+        return HttpResponseRedirect('login')
53 50
 
54 51
     # Building data for counters display
55 52
     counters = Counter.objects.all()
@@ -212,11 +209,11 @@ def home(request):
212 209
         'noGraph': noGraph,
213 210
         'noBestSeum': noBestSeum,
214 211
         'noSeumActivity': noSeumActivity,
215
-        'chooseCounter': chooseCounter,
216 212
         'myCounter': myCounter,
217 213
     })
218 214
 
219 215
 
216
+@login_required
220 217
 def resetCounter(request):
221 218
     # Update Form counter
222 219
     if (request.method == 'POST'):
@@ -246,6 +243,7 @@ P.S. : Pour ne plus recevoir ces messages, envoie un mail à denis.merigoux@gmai
246 243
     return HttpResponseRedirect(data['redirect'][0])
247 244
 
248 245
 
246
+@login_required
249 247
 def counter(request, id_counter):
250 248
 
251 249
     counter = Counter.objects.get(pk=id_counter)
@@ -312,19 +310,3 @@ def counter(request, id_counter):
312 310
         'resets': resets,
313 311
         'seumFrequency': seumFrequency
314 312
     })
315
-
316
-
317
-def setMyCounter(request):
318
-    if (request.method == 'POST'):
319
-        # create a form instance and populate it with data from the request:
320
-        data = dict(request.POST)
321
-        # We put the id of the counter in the session
322
-        request.session['my-counter'] = data['myCounter'][0]
323
-        return HttpResponseRedirect(data['redirect'][0])
324
-
325
-
326
-def resetMyCounter(request):
327
-    if (request.method == 'POST'):
328
-        data = dict(request.POST)
329
-        del request.session['my-counter']
330
-        return HttpResponseRedirect(data['redirect'][0])

+ 3 - 0
seum/settings.py.default

@@ -132,3 +132,6 @@ EMAIL_HOST_USER = ''
132 132
 EMAIL_HOST_PASSWORD = ''
133 133
 EMAIL_USE_TLS = False
134 134
 DEFAULT_FROM_EMAIL = 'SeumMan <seum@merigoux.ovh>'
135
+
136
+LOGIN_URL = 'login'
137
+LOGIN_REDIRECT_URL = 'home'