Denis Merigoux лет назад: 9
Родитель
Сommit
5e92eececf
6 измененных файлов с 84 добавлено и 81 удалено
  1. 2 0
      counter/models.py
  2. 1 35
      counter/templates/homeTemplate.html
  3. 45 0
      counter/templates/login.html
  4. 8 3
      counter/urls.py
  5. 25 43
      counter/views.py
  6. 3 0
      seum/settings.py.default

+ 2 - 0
counter/models.py

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

+ 1 - 35
counter/templates/homeTemplate.html

3
 	<h1>SeumBook™</h1>
3
 	<h1>SeumBook™</h1>
4
 </div>
4
 </div>
5
 <div class="container-fluid">
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
 	<div class="row" id="my-counter">
6
 	<div class="row" id="my-counter">
36
 		<div class="col-sm-12">
7
 		<div class="col-sm-12">
37
 			<div class="panel panel-warning">
8
 			<div class="panel panel-warning">
69
 			</div>
40
 			</div>
70
 		</div>
41
 		</div>
71
 	</div>
42
 	</div>
72
-	{% endif %}
73
 	<div class="row">
43
 	<div class="row">
74
 		{% for counter in counters %} {% if chooseCounter or not counter.id == myCounter.id %}
44
 		{% for counter in counters %} {% if chooseCounter or not counter.id == myCounter.id %}
75
 		<div class="col-md-4 col-sm-6 col-lg-3">
45
 		<div class="col-md-4 col-sm-6 col-lg-3">
160
 	</div>
130
 	</div>
161
 </div>
131
 </div>
162
 <div class="row text-center">
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
 </div>
134
 </div>
169
 {% endblock %}
135
 {% endblock %}

+ 45 - 0
counter/templates/login.html

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
 from django.conf.urls import url
1
 from django.conf.urls import url
2
 from counter.rss import SeumFeed
2
 from counter.rss import SeumFeed
3
+from django.contrib.auth import views as auth_views
3
 
4
 
4
 from . import views
5
 from . import views
5
 
6
 
7
     url(r'^$', views.home, name="home"),
8
     url(r'^$', views.home, name="home"),
8
     url(r'^reset-counter', views.resetCounter, name="reset-counter"),
9
     url(r'^reset-counter', views.resetCounter, name="reset-counter"),
9
     url(r'^counter/(?P<id_counter>\d+)$', views.counter, name="counter"),
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
 from django import forms
5
 from django import forms
6
 from django.http import HttpResponseRedirect
6
 from django.http import HttpResponseRedirect
7
 from django.core.mail import EmailMessage
7
 from django.core.mail import EmailMessage
8
+from django.contrib.auth.decorators import login_required
8
 from graphos.renderers import gchart
9
 from graphos.renderers import gchart
9
 from graphos.sources.simple import SimpleDataSource
10
 from graphos.sources.simple import SimpleDataSource
10
 from graphos.sources.model import ModelDataSource
11
 from graphos.sources.model import ModelDataSource
14
 from django.utils import timezone
15
 from django.utils import timezone
15
 
16
 
16
 
17
 
18
+@login_required
17
 def home(request):
19
 def home(request):
18
     # JSS above this limit will not be displayed on the col graph
20
     # JSS above this limit will not be displayed on the col graph
19
     JSS_limit = 7
21
     JSS_limit = 7
24
     # Calculates infos for each counter
26
     # Calculates infos for each counter
25
     timezero = timedelta(0)
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
     # Building data for counters display
51
     # Building data for counters display
55
     counters = Counter.objects.all()
52
     counters = Counter.objects.all()
212
         'noGraph': noGraph,
209
         'noGraph': noGraph,
213
         'noBestSeum': noBestSeum,
210
         'noBestSeum': noBestSeum,
214
         'noSeumActivity': noSeumActivity,
211
         'noSeumActivity': noSeumActivity,
215
-        'chooseCounter': chooseCounter,
216
         'myCounter': myCounter,
212
         'myCounter': myCounter,
217
     })
213
     })
218
 
214
 
219
 
215
 
216
+@login_required
220
 def resetCounter(request):
217
 def resetCounter(request):
221
     # Update Form counter
218
     # Update Form counter
222
     if (request.method == 'POST'):
219
     if (request.method == 'POST'):
246
     return HttpResponseRedirect(data['redirect'][0])
243
     return HttpResponseRedirect(data['redirect'][0])
247
 
244
 
248
 
245
 
246
+@login_required
249
 def counter(request, id_counter):
247
 def counter(request, id_counter):
250
 
248
 
251
     counter = Counter.objects.get(pk=id_counter)
249
     counter = Counter.objects.get(pk=id_counter)
312
         'resets': resets,
310
         'resets': resets,
313
         'seumFrequency': seumFrequency
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
 EMAIL_HOST_PASSWORD = ''
132
 EMAIL_HOST_PASSWORD = ''
133
 EMAIL_USE_TLS = False
133
 EMAIL_USE_TLS = False
134
 DEFAULT_FROM_EMAIL = 'SeumMan <seum@merigoux.ovh>'
134
 DEFAULT_FROM_EMAIL = 'SeumMan <seum@merigoux.ovh>'
135
+
136
+LOGIN_URL = 'login'
137
+LOGIN_REDIRECT_URL = 'home'