Przeglądaj źródła

Seum by other people

Denis Merigoux 9 lat temu
rodzic
commit
2e55df0a3d

+ 19 - 7
counter/models.py

@@ -4,25 +4,37 @@ from babel.dates import format_timedelta
4 4
 from django.contrib.auth.models import User
5 5
 
6 6
 # Create your models here.
7
+
8
+
7 9
 class Counter(models.Model):
8
-    name = models.CharField("Nom",max_length=60)
9
-    email = models.EmailField("Email",max_length=264,default="null@localhost")
10
+    name = models.CharField("Nom", max_length=60)
11
+    email = models.EmailField("Email", max_length=264,
12
+                              default="null@localhost")
10 13
     trigramme = models.CharField("Trigramme", max_length=3)
11
-    user = models.ForeignKey(User,blank=True,null=True)
14
+    user = models.ForeignKey(User, blank=True, null=True)
15
+    email_notifications = models.BooleanField(
16
+        "Notifications par email", default=False)
12 17
 
13 18
     def __str__(self):
14
-        return "%s (%s)" % (self.trigramme,self.name)
19
+        return "%s (%s)" % (self.trigramme, self.name)
15 20
 
16 21
     class Meta:
17 22
         verbose_name = "Compteur"
18 23
 
24
+
19 25
 class Reset(models.Model):
20
-    timestamp = models.DateTimeField("Date et heure",auto_now_add=True)
26
+    timestamp = models.DateTimeField("Date et heure", auto_now_add=True)
21 27
     reason = models.TextField("Raison")
22
-    counter = models.ForeignKey('Counter')
28
+    counter = models.ForeignKey('Counter', related_name='counter')
29
+    who = models.ForeignKey('Counter', related_name='who',
30
+                            blank=True, null=True, default=None)
23 31
 
24 32
     def __str__(self):
25
-        return "%s : %s (%s)" % (self.counter,format_timedelta(datetime.now()-self.timestamp.replace(tzinfo=None),locale='fr'),self.reason)
33
+        return "%s : %s (%s)" % (self.counter,
34
+                                 format_timedelta(
35
+                                     datetime.now() -
36
+                                     self.timestamp.replace(tzinfo=None),
37
+                                     locale='fr'), self.reason)
26 38
 
27 39
     class Meta:
28 40
         verbose_name = "Remise à zéro"

+ 14 - 1
counter/templates/counterTemplate.html

@@ -15,7 +15,13 @@
15 15
           {% if counter.lastReset.noSeum %}
16 16
           <strong>N'a pas encore eu le seum.</strong>
17 17
           <br> {% else %}
18
-          <strong>N'a pas eu le seum depuis {{ counter.lastReset.formatted_delta }}.</strong>
18
+          <strong>
19
+          {% if counter.lastReset.selfSeum %}
20
+              A eu le seum il y a {{ counter.lastReset.formatted_delta }}.
21
+          {% else %}
22
+              {{ counter.lastReset.who.trigramme }} lui a foutu le seum il y a {{ counter.lastReset.formatted_delta }}.
23
+          {% endif %}
24
+          </strong>
19 25
           <br> {% endif %}
20 26
 
21 27
           <p>{{ counter.lastReset.reason }}</p>
@@ -30,6 +36,7 @@
30 36
             </div>
31 37
             <input type="hidden" name="counter" value="{{counter.id}}"></input>
32 38
             <input type="hidden" name="redirect" value="{% url 'counter' id_counter=counter.id %}"></input>
39
+            <input type="hidden" name="who" value="{{myCounter.id}}"></input>
33 40
             <div class="text-center">
34 41
               <button type="submit" class="btn btn-default btn-success">Foutre le seum</button>
35 42
             </div>
@@ -66,6 +73,7 @@
66 73
               <tr>
67 74
                 <th>Date</th>
68 75
                 <th>Motif</th>
76
+                <th>Fouteur de seum</th>
69 77
               </tr>
70 78
             </thead>
71 79
             <tbody>
@@ -73,6 +81,11 @@
73 81
               <tr>
74 82
                 <td>{{ reset.date }}</td>
75 83
                 <td>{{ reset.reason }}</td>
84
+                <td>
85
+                {% if not reset.selfSeum %}
86
+                    {{ reset.who.trigramme }}
87
+                {% endif %}
88
+                </td>
76 89
               </tr>
77 90
               {% endfor %}
78 91
             </tbody>

+ 17 - 4
counter/templates/homeTemplate.html

@@ -17,7 +17,13 @@
17 17
 					{% if myCounter.lastReset.noSeum %}
18 18
 					<strong>N'a pas encore eu le seum.</strong>
19 19
 					<br> {% else %}
20
-					<strong>Je n'ai pas eu le seum depuis {{ myCounter.lastReset.formatted_delta }}.</strong>
20
+					<strong>
21
+						{% if myCounter.lastReset.selfSeum %}
22
+						J'ai eu le seum il y a {{ myCounter.lastReset.formatted_delta }}.
23
+						{% else %}
24
+						{{myCounter.lastReset.who.trigramme}} m'a foutu le seum il y a {{ myCounter.lastReset.formatted_delta }}.
25
+						{% endif %}
26
+					</strong>
21 27
 					<br> {% endif %}
22 28
 
23 29
 					<p>{{ myCounter.lastReset.reason }}</p>
@@ -32,6 +38,7 @@
32 38
 						</div>
33 39
 						<input type="hidden" name="counter" value="{{myCounter.id}}"></input>
34 40
 						<input type="hidden" name="redirect" value="{% url 'home' %}"></input>
41
+						<input type="hidden" name="who" value="{{myCounter.id}}"></input>
35 42
 						<div class="text-center">
36 43
 							<button type="submit" class="btn btn-default btn-success">J'ai le seum</button>
37 44
 						</div>
@@ -55,7 +62,13 @@
55 62
 					{% if counter.lastReset.noSeum %}
56 63
 					<strong>N'a pas encore eu le seum.</strong>
57 64
 					<br> {% else %}
58
-					<strong>N'a pas eu le seum depuis {{ counter.lastReset.formatted_delta }}.</strong>
65
+					<strong>
66
+					{% if counter.lastReset.selfSeum %}
67
+						A eu le seum il y a {{ counter.lastReset.formatted_delta }}.
68
+					{% else %}
69
+						{{ counter.lastReset.who.trigramme }} lui a foutu le seum il y a {{ counter.lastReset.formatted_delta }}.
70
+					{% endif %}
71
+					</strong>
59 72
 					<br> {% endif %}
60 73
 
61 74
 					<p>{{ counter.lastReset.reason }}</p>
@@ -130,7 +143,7 @@
130 143
 	</div>
131 144
 </div>
132 145
 <div class="row text-center">
133
-		<a href="{% url 'logout' %}" class="btn btn-danger">Se déconnecter</a>
134
-		<a href="{% url 'password_change' %}" class="btn btn-warning">Changer de mot de passe</a>
146
+	<a href="{% url 'logout' %}" class="btn btn-danger">Se déconnecter</a>
147
+	<a href="{% url 'password_change' %}" class="btn btn-warning">Changer de mot de passe</a>
135 148
 </div>
136 149
 {% endblock %}

+ 1 - 1
counter/templates/login.html

@@ -15,7 +15,7 @@
15 15
                     {% csrf_token %}
16 16
                     <div class="form-group">
17 17
                         <label for="id_username">Trigramme</label>
18
-                        <input id="id_username" maxlength="3" type="text" class="form-control text-uppercase" name="username" required />
18
+                        <input id="id_username" maxlength="3" type="text" class="text-uppercase form-control" name="username" onkeyup="javascript:this.value=this.value.toUpperCase();" required />
19 19
                     </div>
20 20
                     <div class="form-group">
21 21
                         <label for="id_username">Mot de passe</label>

+ 19 - 0
counter/templates/passwordResetDone.html

@@ -0,0 +1,19 @@
1
+{% extends 'baseTemplate.html' %} {% block title %}Mail envoyé !{% 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-success">
10
+            <div class="panel-heading">
11
+                <h2 class="panel-title">Victoire !</h2>
12
+            </div>
13
+            <div class=" panel-body">
14
+                <p>Un mail t'as été envoyé, suis les instructions pour aller réinitialiser ton mot de passe.</p>
15
+            </div>
16
+        </div>
17
+    </div>
18
+</div>
19
+{% endblock %}

+ 4 - 0
counter/templates/seumEmail.txt

@@ -1,4 +1,8 @@
1
+{% if selfSeum %}
1 2
 {{name}} a le seum : {{reason}}
3
+{% else %}
4
+{{who.trigramme}} ({{who.name}}) a foutu le seum à {{name}} : {{reason}}
5
+{% endif %}
2 6
 --
3 7
 SeumBook™ - http://seum.merigoux.ovh
4 8
 

+ 4 - 0
counter/urls.py

@@ -34,5 +34,9 @@ urlpatterns = [
34 34
         auth_views.password_reset_complete,
35 35
         {'template_name': 'passwordResetComplete.html'},
36 36
         name="password_reset_complete"),
37
+    url(r'^password/reset/done/$',
38
+        auth_views.password_reset_done,
39
+        {'template_name': 'passwordResetDone.html'},
40
+        name="password_reset_done"),
37 41
     url(r'^', RedirectView.as_view(pattern_name='home')),
38 42
 ]

+ 41 - 5
counter/views.py

@@ -41,6 +41,11 @@ def home(request):
41 41
         else:
42 42
             myCounter.lastReset = lastReset[0]
43 43
             myCounter.lastReset.noSeum = False
44
+            if (myCounter.lastReset.who is None or
45
+                    myCounter.lastReset.who.id == myCounter.id):
46
+                myCounter.lastReset.selfSeum = True
47
+            else:
48
+                myCounter.lastReset.selfSeum = False
44 49
             myCounter.lastReset.delta = datetime.now(
45 50
             ) - myCounter.lastReset.timestamp.replace(tzinfo=None)
46 51
             myCounter.seumCount = Reset.objects.filter(
@@ -63,6 +68,11 @@ def home(request):
63 68
             counter.CSSclass = "warning"
64 69
         else:
65 70
             counter.lastReset = lastReset[0]
71
+            if (counter.lastReset.who is None or
72
+                    counter.lastReset.who.id == counter.id):
73
+                counter.lastReset.selfSeum = True
74
+            else:
75
+                counter.lastReset.selfSeum = False
66 76
             counter.lastReset.noSeum = False
67 77
             counter.lastReset.delta = datetime.now(
68 78
             ) - counter.lastReset.timestamp.replace(tzinfo=None)
@@ -222,18 +232,28 @@ def resetCounter(request):
222 232
         # create a form instance and populate it with data from the request:
223 233
         data = dict(request.POST)
224 234
         counter = Counter.objects.get(pk=int(data['counter'][0]))
235
+        who = Counter.objects.get(pk=int(data['who'][0]))
225 236
         reset = Reset()
226 237
         reset.counter = counter
238
+        reset.who = who
227 239
         reset.reason = data['reason'][0]
228 240
         reset.timestamp = datetime.now()
229 241
         reset.save()
230
-        # We send the emails only to those who have an email address
231
-        emails = [u[0] for u in Counter.objects.all().values_list('email')
232
-                  if u[0] != 'null@localhost']
242
+        # We send the emails only to those who want
243
+        emails = [u.email for u in Counter.objects.all()
244
+                  if u.email_notifications]
233 245
         # Now send emails to everyone
246
+        if (reset.who is None or
247
+                reset.who.id == counter.id):
248
+            selfSeum = True
249
+        else:
250
+            selfSeum = False
234 251
         text_of_email = render_to_string(
235 252
             'seumEmail.txt', {'reason': data['reason'][0],
236
-                              'name': counter.name})
253
+                              'name': counter.name,
254
+                              'who': reset.who,
255
+                              'selfSeum': selfSeum,
256
+                              })
237 257
         email_to_send = EmailMessage(
238 258
             '[SeumBook] ' + counter.trigramme + ' a le seum',
239 259
             text_of_email,
@@ -247,6 +267,11 @@ def resetCounter(request):
247 267
 @login_required
248 268
 def counter(request, id_counter):
249 269
 
270
+    try:
271
+        myCounter = Counter.objects.get(user__id=request.user.id)
272
+    except Counter.DoesNotExist:
273
+        return HttpResponseRedirect(reverse('login'))
274
+
250 275
     counter = Counter.objects.get(pk=id_counter)
251 276
     resets = Reset.objects.filter(counter=counter).order_by('-timestamp')
252 277
     firstReset = copy.copy(resets[len(resets) - 1])
@@ -260,6 +285,11 @@ def counter(request, id_counter):
260 285
     else:
261 286
         counter.lastReset = resets[0]
262 287
         counter.lastReset.noSeum = False
288
+        if (counter.lastReset.who is None or
289
+                counter.lastReset.who.id == counter.id):
290
+            counter.lastReset.selfSeum = True
291
+        else:
292
+            counter.lastReset.selfSeum = False
263 293
         counter.lastReset.delta = datetime.now(
264 294
         ) - counter.lastReset.timestamp.replace(tzinfo=None)
265 295
         counter.lastReset.formatted_delta = format_timedelta(
@@ -271,6 +301,11 @@ def counter(request, id_counter):
271 301
             counter.seumCount, locale='fr', threshold=1)
272 302
 
273 303
     for reset in resets:
304
+        if (reset.who is None or
305
+                reset.who.id == reset.counter.id):
306
+            reset.selfSeum = True
307
+        else:
308
+            reset.selfSeum = False
274 309
         reset.date = format_datetime(
275 310
             reset.timestamp, locale='fr',
276 311
             format="EEEE dd MMMM Y 'à' HH:mm").capitalize()
@@ -309,5 +344,6 @@ def counter(request, id_counter):
309 344
         'counter': counter,
310 345
         'chart': chart,
311 346
         'resets': resets,
312
-        'seumFrequency': seumFrequency
347
+        'seumFrequency': seumFrequency,
348
+        'myCounter': myCounter,
313 349
     })