##// END OF EJS Templates
Started work on the method caching decorator (BB-57)
neko259 -
r957:3848eb1f default
parent child Browse files
Show More
@@ -4,7 +4,6 b' import logging'
4 import re
4 import re
5
5
6 from adjacent import Client
6 from adjacent import Client
7 from django.core.cache import cache
8 from django.core.urlresolvers import reverse
7 from django.core.urlresolvers import reverse
9 from django.db import models, transaction
8 from django.db import models, transaction
10 from django.db.models import TextField
9 from django.db.models import TextField
@@ -16,7 +15,7 b' from boards.mdx_neboard import bbcode_ex'
16 from boards.models import PostImage
15 from boards.models import PostImage
17 from boards.models.base import Viewable
16 from boards.models.base import Viewable
18 from boards.models.thread import Thread
17 from boards.models.thread import Thread
19 from boards.utils import datetime_to_epoch
18 from boards.utils import datetime_to_epoch, cached_result
20
19
21
20
22 WS_NOTIFICATION_TYPE_NEW_POST = 'new_post'
21 WS_NOTIFICATION_TYPE_NEW_POST = 'new_post'
@@ -26,9 +25,6 b' WS_CHANNEL_THREAD = "thread:"'
26
25
27 APP_LABEL_BOARDS = 'boards'
26 APP_LABEL_BOARDS = 'boards'
28
27
29 CACHE_KEY_PPD = 'ppd'
30 CACHE_KEY_POST_URL = 'post_url'
31
32 POSTS_PER_DAY_RANGE = 7
28 POSTS_PER_DAY_RANGE = 7
33
29
34 BAN_REASON_AUTO = 'Auto'
30 BAN_REASON_AUTO = 'Auto'
@@ -157,6 +153,7 b' class PostManager(models.Manager):'
157 referenced_thread.last_edit_time = post.pub_time
153 referenced_thread.last_edit_time = post.pub_time
158 referenced_thread.save(update_fields=['last_edit_time'])
154 referenced_thread.save(update_fields=['last_edit_time'])
159
155
156 @cached_result
160 def get_posts_per_day(self):
157 def get_posts_per_day(self):
161 """
158 """
162 Gets average count of posts per day for the last 7 days
159 Gets average count of posts per day for the last 7 days
@@ -165,11 +162,6 b' class PostManager(models.Manager):'
165 day_end = date.today()
162 day_end = date.today()
166 day_start = day_end - timedelta(POSTS_PER_DAY_RANGE)
163 day_start = day_end - timedelta(POSTS_PER_DAY_RANGE)
167
164
168 cache_key = CACHE_KEY_PPD + str(day_end)
169 ppd = cache.get(cache_key)
170 if ppd:
171 return ppd
172
173 day_time_start = timezone.make_aware(datetime.combine(
165 day_time_start = timezone.make_aware(datetime.combine(
174 day_start, dtime()), timezone.get_current_timezone())
166 day_start, dtime()), timezone.get_current_timezone())
175 day_time_end = timezone.make_aware(datetime.combine(
167 day_time_end = timezone.make_aware(datetime.combine(
@@ -181,7 +173,6 b' class PostManager(models.Manager):'
181
173
182 ppd = posts_per_period / POSTS_PER_DAY_RANGE
174 ppd = posts_per_period / POSTS_PER_DAY_RANGE
183
175
184 cache.set(cache_key, ppd)
185 return ppd
176 return ppd
186
177
187 def _preparse_text(self, text):
178 def _preparse_text(self, text):
@@ -285,27 +276,22 b' class Post(models.Model, Viewable):'
285 thread.last_edit_time = edit_time
276 thread.last_edit_time = edit_time
286 thread.save(update_fields=['last_edit_time'])
277 thread.save(update_fields=['last_edit_time'])
287
278
279 @cached_result
288 def get_url(self, thread=None):
280 def get_url(self, thread=None):
289 """
281 """
290 Gets full url to the post.
282 Gets full url to the post.
291 """
283 """
292
284
293 cache_key = CACHE_KEY_POST_URL + str(self.id)
285 if not thread:
294 link = cache.get(cache_key)
286 thread = self.get_thread()
295
287
296 if not link:
288 opening_id = thread.get_opening_post_id()
297 if not thread:
298 thread = self.get_thread()
299
289
300 opening_id = thread.get_opening_post_id()
290 if self.id != opening_id:
301
291 link = reverse('thread', kwargs={
302 if self.id != opening_id:
292 'post_id': opening_id}) + '#' + str(self.id)
303 link = reverse('thread', kwargs={
293 else:
304 'post_id': opening_id}) + '#' + str(self.id)
294 link = reverse('thread', kwargs={'post_id': self.id})
305 else:
306 link = reverse('thread', kwargs={'post_id': self.id})
307
308 cache.set(cache_key, link)
309
295
310 return link
296 return link
311
297
@@ -1,9 +1,12 b''
1 import logging
1 import logging
2
2 from django.db.models import Count, Sum
3 from django.db.models import Count, Sum
3 from django.utils import timezone
4 from django.utils import timezone
4 from django.core.cache import cache
5 from django.db import models
5 from django.db import models
6
6 from boards import settings
7 from boards import settings
8 from boards.utils import cached_result
9
7
10
8 __author__ = 'neko259'
11 __author__ = 'neko259'
9
12
@@ -11,9 +14,6 b' from boards import settings'
11 logger = logging.getLogger(__name__)
14 logger = logging.getLogger(__name__)
12
15
13
16
14 CACHE_KEY_OPENING_POST = 'opening_post_id'
15
16
17 class ThreadManager(models.Manager):
17 class ThreadManager(models.Manager):
18 def process_oldest_threads(self):
18 def process_oldest_threads(self):
19 """
19 """
@@ -153,18 +153,13 b' class Thread(models.Model):'
153
153
154 return opening_post
154 return opening_post
155
155
156 @cached_result
156 def get_opening_post_id(self):
157 def get_opening_post_id(self):
157 """
158 """
158 Gets ID of the first thread post.
159 Gets ID of the first thread post.
159 """
160 """
160
161
161 cache_key = CACHE_KEY_OPENING_POST + str(self.id)
162 return self.get_opening_post(only_id=True).id
162 opening_post_id = cache.get(cache_key)
163 if not opening_post_id:
164 opening_post_id = self.get_opening_post(only_id=True).id
165 cache.set(cache_key, opening_post_id)
166
167 return opening_post_id
168
163
169 def __unicode__(self):
164 def __unicode__(self):
170 return str(self.id)
165 return str(self.id)
@@ -3,6 +3,8 b' This module contains helper functions an'
3 """
3 """
4 import time
4 import time
5 import hmac
5 import hmac
6 from django.core.cache import cache
7 from django.db.models import Model
6
8
7 from django.utils import timezone
9 from django.utils import timezone
8
10
@@ -40,4 +42,27 b" def get_websocket_token(user_id='', time"
40 sign.update(timestamp.encode())
42 sign.update(timestamp.encode())
41 token = sign.hexdigest()
43 token = sign.hexdigest()
42
44
43 return token No newline at end of file
45 return token
46
47
48 def cached_result(function):
49 """
50 Caches method result in the Django's cache system, persisted by object name,
51 object name and model id if object is a Django model.
52 """
53 def inner_func(obj, *args, **kwargs):
54 # TODO Include method arguments to the cache key
55 cache_key = obj.__class__.__name__ + '_' + function.__name__
56 if isinstance(obj, Model):
57 cache_key += '_' + str(obj.id)
58
59 persisted_result = cache.get(cache_key)
60 if persisted_result:
61 result = persisted_result
62 else:
63 result = function(obj, *args, **kwargs)
64 cache.set(cache_key, result)
65
66 return result
67
68 return inner_func No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now