Parcourir la Source

Add settings for i18n in settings.default

Camille Masset il y a 9 ans
Parent
commit
0add8e5942
2 fichiers modifiés avec 64 ajouts et 61 suppressions
  1. 55 60
      counter/views/home.py
  2. 9 1
      seum/settings.py.default

+ 55 - 60
counter/views/home.py

@@ -1,26 +1,32 @@
1
-from django.shortcuts import render
2
-from django.utils.translation import ugettext as _
3
-from counter.models import Counter, Reset, Like, Keyword, Hashtag
4
-from django.contrib.auth.models import User
5
-from babel.dates import format_timedelta, format_datetime
1
+import copy
6 2
 from datetime import datetime, timedelta
3
+import functools
4
+import math
5
+import random
6
+
7 7
 from django import forms
8
-from django.http import HttpResponseRedirect
9
-from django.core.mail import EmailMessage
10 8
 from django.contrib.auth.decorators import login_required
9
+from django.contrib.auth.models import User
10
+from django.core.mail import EmailMessage
11 11
 from django.core.urlresolvers import reverse
12 12
 from django.db import IntegrityError
13
-from graphos.renderers import gchart
13
+from django.db.models import Prefetch, Count
14
+from django.http import HttpResponseRedirect
15
+from django.shortcuts import render
14 16
 from django.template.loader import render_to_string
15
-from graphos.sources.simple import SimpleDataSource
16
-from graphos.sources.model import ModelDataSource
17
-import random
18
-import math
19
-import copy
20
-import functools
21 17
 from django.utils import timezone
18
+from django.utils.translation import ugettext as _, get_language
19
+
20
+import arrow
21
+from babel.dates import format_timedelta, format_datetime
22
+from graphos.renderers import gchart
23
+from graphos.sources.model import ModelDataSource
24
+from graphos.sources.simple import SimpleDataSource
25
+
26
+from counter.models import *
22 27
 from counter.utils import parseSeumReason
23 28
 
29
+
24 30
 # Number of counters displayed on the home page's best seumeurs graph
25 31
 bestSeumeursNumber = 15
26 32
 
@@ -34,52 +40,52 @@ def index(request):
34 40
     # First select our counter
35 41
     try:
36 42
         myCounter = Counter.objects.get(user__id=request.user.id)
37
-        lastReset = Reset.objects.filter(
38
-            counter=myCounter).order_by('-timestamp')
39
-        if (lastReset.count() == 0):
43
+        myLastReset = Reset.objects.select_related('who').filter(counter=myCounter).order_by('-timestamp').first()
44
+
45
+        if myLastReset is None:
40 46
             # This person never had the seum
41 47
             myCounter.lastReset = Reset()
42 48
             myCounter.lastReset.delta = no_seum_delta
43 49
             myCounter.lastReset.noSeum = True
44 50
         else:
45
-            myCounter.lastReset = lastReset[0]
51
+            myCounter.lastReset = myLastReset
46 52
             myCounter.lastReset.noSeum = False
47
-            if (myCounter.lastReset.who is None or
48
-                    myCounter.lastReset.who.id == myCounter.id):
53
+            if myCounter.lastReset.who is None or myCounter.lastReset.who.id == myCounter.id:
49 54
                 myCounter.lastReset.selfSeum = True
50 55
             else:
51 56
                 myCounter.lastReset.selfSeum = False
52
-            myCounter.lastReset.delta = datetime.now(
53
-            ) - myCounter.lastReset.timestamp.replace(tzinfo=None)
54
-            likesMe = Like.objects.filter(
55
-                reset=myCounter.lastReset)
56
-            myCounter.likeCount = likesMe.count()
57
-            if myCounter.likeCount:
58
-                myCounter.likersString = functools.reduce(
59
-                    lambda a, b: a + ", " + b,
60
-                    [like.liker.trigramme for like in likesMe])
61
-        myCounter.lastReset.formatted_delta = format_timedelta(
62
-            myCounter.lastReset.delta, locale='fr', threshold=1)
57
+            likesMe = list(Like.objects.select_related('liker').filter(reset=myCounter.lastReset))
58
+            myCounter.likeCount = len(likesMe)
59
+            if myCounter.likeCount > 0:
60
+                myCounter.likersString = ", ".join([like.liker.trigramme for like in likesMe])
61
+
62
+        myCounter.lastReset.formatted_delta = arrow.Arrow.fromdatetime(myCounter.lastReset.timestamp).humanize(locale=get_language())
63
+
63 64
     except Counter.DoesNotExist:
64 65
         return HttpResponseRedirect(reverse('login'))
65 66
 
66 67
     # Building data for counters display
67
-    counters = Counter.objects.all()
68
+    counters = Counter.objects.prefetch_related(
69
+        'resets__likes',
70
+        Prefetch(
71
+            'resets',
72
+            queryset=Reset.objects.prefetch_related('who', Prefetch('likes', queryset=Like.objects.select_related('liker'))).order_by('-timestamp'),
73
+            to_attr='lastReset'
74
+        )
75
+    )
68 76
     for counter in counters:
69 77
         # Only the last reset is displayed
70
-        lastReset = Reset.objects.filter(
71
-            counter=counter).order_by('-timestamp')
72
-        if (lastReset.count() == 0):  # This person never had the seum
78
+        lastReset = list(counter.lastReset)
79
+        if len(lastReset) == 0:  # This person never had the seum
73 80
             counter.lastReset = Reset()
74 81
             counter.lastReset.delta = no_seum_delta
75 82
             counter.lastReset.noSeum = True
83
+            counter.lastReset.likes_count = -1
76 84
             counter.CSSclass = "warning"
77
-            counter.likeCount = -1
78 85
         else:  # This person already had the seum
79 86
             counter.lastReset = lastReset[0]
80 87
             # To display the last seum we have to know if it is self-inflicted
81
-            if (counter.lastReset.who is None or
82
-                    counter.lastReset.who.id == counter.id):
88
+            if counter.lastReset.who is None or counter.lastReset.who == counter:
83 89
                 counter.lastReset.selfSeum = True
84 90
             else:
85 91
                 counter.lastReset.selfSeum = False
@@ -88,20 +94,13 @@ def index(request):
88 94
             counter.lastReset.delta = datetime.now(
89 95
             ) - counter.lastReset.timestamp.replace(tzinfo=None)
90 96
             # Defining CSS attributes for the counter
91
-            if counter.id == myCounter.id:
92
-                counter.CSSclass = 'primary'
93
-            else:
94
-                counter.CSSclass = 'default'
97
+            counter.CSSclass = 'primary' if counter == myCounter else 'default'
95 98
             # Computing the total number of likes for this counter
96
-            likesMe = Like.objects.filter(
97
-                reset=counter.lastReset)
98
-            counter.likeCount = likesMe.count()
99
-            counter.alreadyLiked = (Like.objects.filter(
100
-                reset=counter.lastReset, liker=myCounter).exists())
101
-            if counter.likeCount > 0:
102
-                counter.likersString = functools.reduce(
103
-                    lambda a, b: a + ", " + b,
104
-                    [like.liker.trigramme for like in likesMe])
99
+            likesMe = list(counter.lastReset.likes.all())
100
+            counter.lastReset.likes_count = len(likesMe)
101
+            counter.alreadyLiked = myCounter in likesMe
102
+            if counter.lastReset.likes_count > 0:
103
+                counter.likersString = ", ".join([like.liker.trigramme for like in likesMe])
105 104
 
106 105
         counter.lastReset.formatted_delta = format_timedelta(
107 106
             counter.lastReset.delta, locale='fr', threshold=1)
@@ -112,18 +111,14 @@ def index(request):
112 111
         # We take into account the number of likes of a reset and recentness
113 112
         # The log on the score will give increased value to the first likes
114 113
         # The counters with no seum have a like count of -1 by convention
115
-        counters = sorted(counters, key=lambda t: - (
116
-            math.log(t.likeCount + 2) /
117
-            (1 + (t.lastReset.delta.total_seconds()) /
118
-             (24 * 3600))))
114
+        sorting_key = lambda t: - (math.log(t.lastReset.likes_count + 2) / (1 + (t.lastReset.delta.total_seconds()) / (24 * 3600)))
115
+        counters = sorted(counters, key=sorting_key)
119 116
     else:
120
-        counters = sorted(counters, key=lambda t: +
121
-                          t.lastReset.delta.total_seconds())
117
+        counters = sorted(counters, key=lambda t: + t.lastReset.delta.total_seconds())
122 118
 
123 119
     # Timeline graph
124
-    resets = Reset.objects.filter(
125
-        timestamp__gte=timezone.now() - timedelta(days=1))
126
-    if (resets.count() == 0):
120
+    resets = Reset.objects.select_related('who', 'counter').filter(timestamp__gte=timezone.now() - timedelta(days=1))
121
+    if resets.count() == 0:
127 122
         noTimeline = True
128 123
         line_chart = None
129 124
     else:

+ 9 - 1
seum/settings.py.default

@@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/1.9/ref/settings/
12 12
 
13 13
 import os
14 14
 from django.core.urlresolvers import reverse_lazy
15
+from django.utils.translation import ugettext_lazy as _
15 16
 
16 17
 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
17 18
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -38,12 +39,14 @@ INSTALLED_APPS = [
38 39
     'django.contrib.sessions',
39 40
     'django.contrib.messages',
40 41
     'django.contrib.staticfiles',
42
+    'django_extensions',
41 43
     'counter'
42 44
 ]
43 45
 
44 46
 MIDDLEWARE_CLASSES = [
45 47
     'django.middleware.security.SecurityMiddleware',
46 48
     'django.contrib.sessions.middleware.SessionMiddleware',
49
+    'django.middleware.locale.LocaleMiddleware',
47 50
     'django.middleware.common.CommonMiddleware',
48 51
     'django.middleware.csrf.CsrfViewMiddleware',
49 52
     'django.contrib.auth.middleware.AuthenticationMiddleware',
@@ -87,7 +90,7 @@ DATABASES = {
87 90
 # Internationalization
88 91
 # https://docs.djangoproject.com/en/1.9/topics/i18n/
89 92
 
90
-LANGUAGE_CODE = 'en-US'
93
+LANGUAGE_CODE = 'en'
91 94
 
92 95
 TIME_ZONE = 'UTC'
93 96
 
@@ -97,6 +100,11 @@ USE_L10N = True
97 100
 
98 101
 USE_TZ = True
99 102
 
103
+LANGUAGES = [
104
+    ('en', _('English')),
105
+    ('fr', _('French')),
106
+]
107
+
100 108
 
101 109
 # Static files (CSS, JavaScript, Images)
102 110
 # https://docs.djangoproject.com/en/1.9/howto/static-files/