Bläddra i källkod

Hashtag management implemented

Denis Merigoux 9 år sedan
förälder
incheckning
4244b818d6

+ 7 - 1
counter/templates/baseTemplate.html

@@ -10,7 +10,13 @@
10 10
 	<link rel="shortcut icon" type="image/png" href="{{STATIC_URL}}/favicon.ico" />
11 11
 	<title>SeumBook™ – {% block title %}{% endblock %}</title>
12 12
 
13
-	{# Load the tag library #} {% load bootstrap3 %} {# Load CSS and JavaScript #} {% bootstrap_css %} {% bootstrap_javascript jquery=True %} {# Display django.contrib.messages as Bootstrap alerts #} {% bootstrap_messages %}
13
+	{# Load the tag library #}
14
+	{% load bootstrap3 %}
15
+	{# Load CSS and JavaScript #}
16
+	{% bootstrap_css %}
17
+	{% bootstrap_javascript jquery=True %}
18
+	{# Display django.contrib.messages as Bootstrap alerts #}
19
+	{% bootstrap_messages %}
14 20
 
15 21
 	<style>
16 22
 		body {

+ 4 - 4
counter/templates/counterTemplate.html

@@ -1,4 +1,4 @@
1
-{% extends 'baseTemplate.html' %} {% block title %}{{counter.trigramme}}{% endblock %} {% block content %}
1
+{% extends 'baseTemplate.html' %} {% block title %}{{counter.trigramme}}{% endblock %} {% block content %} {% load hashtags %}
2 2
 <div class="text-center">
3 3
   <h1>
4 4
       <a class="counter-link" href="{% url 'home' %}"><b>{{counter.trigramme}}</b> <small>{{ counter.name }}</small></a>
@@ -48,7 +48,7 @@
48 48
           </strong>
49 49
           <br> {% endif %}
50 50
 
51
-          <p>{{ counter.lastReset.reason }}</p>
51
+          <p>{{ counter.lastReset.reason | hashtag }}</p>
52 52
           <div class="text-center">
53 53
             <button id="button{{counter.id}}" class="btn btn-default btn-danger" type="button" onclick="revealSeumForm({{counter.id}})">Remettre à zéro</button>
54 54
           </div>
@@ -91,7 +91,7 @@
91 91
         <div class="panel-heading">
92 92
           <h2 class="panel-title">Historique du seum <small class="badge pull-right">{{seumFrequency}}/seum</small></h2>
93 93
         </div>
94
-        <div class="panel-body" style="max-height:350px;overflow:auto;">
94
+        <div class="panel-body">
95 95
           <table class="table table-striped">
96 96
             <thead>
97 97
               <tr>
@@ -105,7 +105,7 @@
105 105
               {% for reset in resets %}
106 106
               <tr>
107 107
                 <td><b>{{ reset.date }}</b></td>
108
-                <td>{{ reset.reason }}</td>
108
+                <td>{{ reset.reason | hashtag }}</td>
109 109
                 <td>
110 110
                 {% if not reset.selfSeum %}
111 111
                     {{ reset.who.trigramme }}

+ 52 - 0
counter/templates/hashtagTemplate.html

@@ -0,0 +1,52 @@
1
+{% extends 'baseTemplate.html' %} {% block title %}{{hashtag}}{% endblock %} {% block content %} {% load hashtags %}
2
+<div class="text-center">
3
+  <h1>
4
+      <a class="counter-link" href="{% url 'home' %}"><b>{{hashtag}}</b></a>
5
+  </h1>
6
+</div>
7
+<div class="container-fluid">
8
+  <div class="row">
9
+    <div class="col-sm-12">
10
+      <div class="panel panel-default">
11
+        <div class="panel-heading">
12
+          <h2 class="panel-title">Liste des seums contenant {{ hashtag }}<small class="badge pull-right">{{ totalNumber }}</small></h2>
13
+        </div>
14
+        <div class="panel-body">
15
+          <table class="table table-striped">
16
+            <thead>
17
+              <tr>
18
+                <th>Date</th>
19
+                <th>Motif</th>
20
+                <th>Victime</th>
21
+                <th>Fouteur de seum</th>
22
+                <th>Nombre de likes</th>
23
+              </tr>
24
+            </thead>
25
+            <tbody>
26
+              {% for reset in resets %}
27
+              <tr>
28
+                <td><b>{{ reset.date }}</b></td>
29
+                <td>{{ reset.reason | hashtag }}</td>
30
+                <td>{{ reset.counter.trigramme }}</td>
31
+                <td>
32
+                {% if not reset.selfSeum %}
33
+                    {{ reset.who.trigramme }}
34
+                {% endif %}
35
+                </td>
36
+                <td>{{ reset.likeCount }}</td>
37
+              </tr>
38
+              {% endfor %}
39
+            </tbody>
40
+          </table>
41
+        </div>
42
+      </div>
43
+    </div>
44
+  </div>
45
+</div>
46
+<div class="row">
47
+  <div class="text-center">
48
+    <a class="btn btn-success" href="{% url 'home' %}">Retour à la liste des compteurs</a>
49
+  </div>
50
+</div>
51
+</div>
52
+{% endblock %}

+ 3 - 4
counter/templates/homeTemplate.html

@@ -1,4 +1,4 @@
1
-{% extends 'baseTemplate.html' %} {% block title %}Compteurs{% endblock %} {% block content %}
1
+{% extends 'baseTemplate.html' %} {% block title %}Compteurs{% endblock %} {% block content %} {% load hashtags %}
2 2
 <div class="text-center">
3 3
 	<h1><a class="counter-link" href="{% url 'home' %}">SeumBook™</a></h1>
4 4
 </div>
@@ -31,8 +31,7 @@
31 31
 						{% endif %}
32 32
 					</strong>
33 33
 						<br> {% endif %}
34
-
35
-						<p>{{ myCounter.lastReset.reason }}</p>
34
+						<p>{{ myCounter.lastReset.reason | hashtag }}</p>
36 35
 						<div class="text-center" id="button{{myCounter.id}}">
37 36
 							<button class="btn btn-default btn-danger" type="button" onclick="revealSeumForm({{myCounter.id}})">Remettre à zéro</button>
38 37
 						</div>
@@ -130,7 +129,7 @@
130 129
 					</strong>
131 130
 					<br> {% endif %}
132 131
 
133
-					<p>{{ counter.lastReset.reason }}</p>
132
+					<p>{{ counter.lastReset.reason | hashtag }}</p>
134 133
 				</div>
135 134
 			</div>
136 135
 		</div>

+ 31 - 0
counter/templatetags/hashtags.py

@@ -0,0 +1,31 @@
1
+from django import template
2
+from django.utils.html import conditional_escape
3
+from django.utils.safestring import mark_safe
4
+import re
5
+from counter.utils import removeAccentsToLowercase
6
+from counter.models import Keyword
7
+from django.core.urlresolvers import reverse
8
+
9
+register = template.Library()
10
+
11
+
12
+@register.filter(needs_autoescape=True, name='hashtag')
13
+def linkifyHashtags(text, autoescape=True):
14
+    parts = re.split(r'(#[^#\s]+)', text)
15
+    result = ''
16
+    for part in parts:
17
+        if autoescape:
18
+            esc = conditional_escape
19
+        else:
20
+            esc = (lambda x: x)
21
+        if re.match(r'#[^#\s]+', part):
22
+            hashtag = removeAccentsToLowercase(part[1:])
23
+            try:
24
+                keyword = Keyword.objects.get(text=hashtag)
25
+                part = '<a href="%s">%s</a>' % (
26
+                    esc(reverse('hashtag', kwargs={'keyword': keyword.text})),
27
+                    esc(part))
28
+            except Keyword.DoesNotExist:
29
+                None
30
+        result += part
31
+    return mark_safe(result)

+ 1 - 0
counter/urls.py

@@ -9,6 +9,7 @@ urlpatterns = [
9 9
     url(r'^$', views.home, name='home'),
10 10
     url(r'^reset-counter/$', views.resetCounter, name='reset-counter'),
11 11
     url(r'^counter/(?P<id_counter>\d+)/$', views.counter, name='counter'),
12
+    url(r'^hashtag/(?P<keyword>.+)/$', views.hashtag, name='hashtag'),
12 13
     url(r'^rss/$', SeumFeed()),
13 14
     url(r'^create_user/$', views.createUser, name='create_user'),
14 15
     url(r'^like/$', views.like, name='like'),

+ 26 - 1
counter/views.py

@@ -330,7 +330,6 @@ def resetCounter(request):
330 330
 
331 331
 @login_required
332 332
 def counter(request, id_counter):
333
-
334 333
     try:
335 334
         myCounter = Counter.objects.get(user__id=request.user.id)
336 335
     except Counter.DoesNotExist:
@@ -432,6 +431,32 @@ def counter(request, id_counter):
432 431
     })
433 432
 
434 433
 
434
+@login_required
435
+def hashtag(request, keyword):
436
+    try:
437
+        keyword = Keyword.objects.get(text=keyword)
438
+    except Keyword.DoesNotExist:
439
+        print('erreur !')
440
+        return HttpResponseRedirect(reverse('home'))
441
+    hashtag = '#'+keyword.text
442
+    resets = Reset.objects.filter(hashtag__keyword=keyword)
443
+    for reset in resets:
444
+        if (reset.who is None or
445
+                reset.who.id == reset.counter.id):
446
+            reset.selfSeum = True
447
+        else:
448
+            reset.selfSeum = False
449
+        reset.date = format_datetime(
450
+            reset.timestamp, locale='fr',
451
+            format="dd/MM/Y HH:mm")
452
+        reset.likeCount = Like.objects.filter(reset=reset).count()
453
+    return render(request, 'hashtagTemplate.html', {
454
+        'hashtag': hashtag,
455
+        'totalNumber': resets.count(),
456
+        'resets': resets,
457
+    })
458
+
459
+
435 460
 def createUser(request):
436 461
     if (request.method == 'POST'):
437 462
         # create a form instance and populate it with data from the request: