Quellcode durchsuchen

Add settings for i18n in settings.default

Camille Masset vor 9 Jahren
Ursprung
Commit
0add8e5942
2 geänderte Dateien mit 64 neuen und 61 gelöschten Zeilen
  1. 55 60
      counter/views/home.py
  2. 9 1
      seum/settings.py.default

+ 55 - 60
counter/views/home.py

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
 from datetime import datetime, timedelta
2
 from datetime import datetime, timedelta
3
+import functools
4
+import math
5
+import random
6
+
7
 from django import forms
7
 from django import forms
8
-from django.http import HttpResponseRedirect
9
-from django.core.mail import EmailMessage
10
 from django.contrib.auth.decorators import login_required
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
 from django.core.urlresolvers import reverse
11
 from django.core.urlresolvers import reverse
12
 from django.db import IntegrityError
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
 from django.template.loader import render_to_string
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
 from django.utils import timezone
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
 from counter.utils import parseSeumReason
27
 from counter.utils import parseSeumReason
23
 
28
 
29
+
24
 # Number of counters displayed on the home page's best seumeurs graph
30
 # Number of counters displayed on the home page's best seumeurs graph
25
 bestSeumeursNumber = 15
31
 bestSeumeursNumber = 15
26
 
32
 
34
     # First select our counter
40
     # First select our counter
35
     try:
41
     try:
36
         myCounter = Counter.objects.get(user__id=request.user.id)
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
             # This person never had the seum
46
             # This person never had the seum
41
             myCounter.lastReset = Reset()
47
             myCounter.lastReset = Reset()
42
             myCounter.lastReset.delta = no_seum_delta
48
             myCounter.lastReset.delta = no_seum_delta
43
             myCounter.lastReset.noSeum = True
49
             myCounter.lastReset.noSeum = True
44
         else:
50
         else:
45
-            myCounter.lastReset = lastReset[0]
51
+            myCounter.lastReset = myLastReset
46
             myCounter.lastReset.noSeum = False
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
                 myCounter.lastReset.selfSeum = True
54
                 myCounter.lastReset.selfSeum = True
50
             else:
55
             else:
51
                 myCounter.lastReset.selfSeum = False
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
     except Counter.DoesNotExist:
64
     except Counter.DoesNotExist:
64
         return HttpResponseRedirect(reverse('login'))
65
         return HttpResponseRedirect(reverse('login'))
65
 
66
 
66
     # Building data for counters display
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
     for counter in counters:
76
     for counter in counters:
69
         # Only the last reset is displayed
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
             counter.lastReset = Reset()
80
             counter.lastReset = Reset()
74
             counter.lastReset.delta = no_seum_delta
81
             counter.lastReset.delta = no_seum_delta
75
             counter.lastReset.noSeum = True
82
             counter.lastReset.noSeum = True
83
+            counter.lastReset.likes_count = -1
76
             counter.CSSclass = "warning"
84
             counter.CSSclass = "warning"
77
-            counter.likeCount = -1
78
         else:  # This person already had the seum
85
         else:  # This person already had the seum
79
             counter.lastReset = lastReset[0]
86
             counter.lastReset = lastReset[0]
80
             # To display the last seum we have to know if it is self-inflicted
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
                 counter.lastReset.selfSeum = True
89
                 counter.lastReset.selfSeum = True
84
             else:
90
             else:
85
                 counter.lastReset.selfSeum = False
91
                 counter.lastReset.selfSeum = False
88
             counter.lastReset.delta = datetime.now(
94
             counter.lastReset.delta = datetime.now(
89
             ) - counter.lastReset.timestamp.replace(tzinfo=None)
95
             ) - counter.lastReset.timestamp.replace(tzinfo=None)
90
             # Defining CSS attributes for the counter
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
             # Computing the total number of likes for this counter
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
         counter.lastReset.formatted_delta = format_timedelta(
105
         counter.lastReset.formatted_delta = format_timedelta(
107
             counter.lastReset.delta, locale='fr', threshold=1)
106
             counter.lastReset.delta, locale='fr', threshold=1)
112
         # We take into account the number of likes of a reset and recentness
111
         # We take into account the number of likes of a reset and recentness
113
         # The log on the score will give increased value to the first likes
112
         # The log on the score will give increased value to the first likes
114
         # The counters with no seum have a like count of -1 by convention
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
     else:
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
     # Timeline graph
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
         noTimeline = True
122
         noTimeline = True
128
         line_chart = None
123
         line_chart = None
129
     else:
124
     else:

+ 9 - 1
seum/settings.py.default

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