# HG changeset patch # User neko259 # Date 2013-11-16 19:00:12 # Node ID 6fac0ec7e4875c6ccb6d7e664c1319428784bae9 # Parent e4c238552fe3b346d528d41eea6f52b7a902762b Use proper last update timestamps in thread autoupdate diff --git a/boards/models.py b/boards/models.py --- a/boards/models.py +++ b/boards/models.py @@ -47,6 +47,8 @@ class PostManager(models.Manager): def create_post(self, title, text, image=None, thread=None, ip=NO_IP, tags=None, user=None): + posting_time = timezone.now() + post = self.create(title=title, text=text, pub_time=timezone.now(), @@ -54,8 +56,8 @@ class PostManager(models.Manager): image=image, poster_ip=ip, poster_user_agent=UNKNOWN_UA, - last_edit_time=timezone.now(), - bump_time=timezone.now(), + last_edit_time=posting_time, + bump_time=posting_time, user=user) if tags: @@ -66,7 +68,7 @@ class PostManager(models.Manager): if thread: thread.replies.add(post) thread.bump() - thread.last_edit_time = timezone.now() + thread.last_edit_time = posting_time thread.save() #cache_key = thread.get_cache_key() diff --git a/boards/views.py b/boards/views.py --- a/boards/views.py +++ b/boards/views.py @@ -2,6 +2,7 @@ import hashlib import json import string import time +import calendar from datetime import datetime @@ -215,9 +216,7 @@ def thread(request, post_id): context['bumplimit_progress'] = str( float(context['posts_left']) / neboard.settings.MAX_POSTS_PER_THREAD * 100) - # TODO This last update time may not be accurate cause some posts can be - # changed or added after this point. See the diff method. - context["last_update"] = int(time.time() * 1000) + context["last_update"] = _datetime_to_epoch(posts[0].last_edit_time) return render(request, 'boards/thread.html', context) @@ -253,23 +252,23 @@ def settings(request): is_moderator = user.is_moderator() if request.method == 'POST': - with transaction.commit_on_success(): - if is_moderator: - form = ModeratorSettingsForm(request.POST, - error_class=PlainErrorList) - else: - form = SettingsForm(request.POST, error_class=PlainErrorList) + with transaction.commit_on_success(): + if is_moderator: + form = ModeratorSettingsForm(request.POST, + error_class=PlainErrorList) + else: + form = SettingsForm(request.POST, error_class=PlainErrorList) - if form.is_valid(): - selected_theme = form.cleaned_data['theme'] + if form.is_valid(): + selected_theme = form.cleaned_data['theme'] - user.save_setting('theme', selected_theme) + user.save_setting('theme', selected_theme) - if is_moderator: - moderate = form.cleaned_data['moderate'] - user.save_setting(SETTING_MODERATE, moderate) + if is_moderator: + moderate = form.cleaned_data['moderate'] + user.save_setting(SETTING_MODERATE, moderate) - return redirect(settings) + return redirect(settings) else: selected_theme = _get_theme(request) @@ -326,7 +325,7 @@ def delete(request, post_id): if user.is_moderator(): # TODO Show confirmation page before deletion Post.objects.delete_post(post) - + if not post.thread: return _redirect_to_next(request) else: @@ -417,25 +416,27 @@ def api_get_post(request, post_id): def api_get_threaddiff(request, thread_id, last_update_time): + """Get posts that were changed or added since time""" + thread = get_object_or_404(Post, id=thread_id) - filter_time = datetime.fromtimestamp(float(last_update_time) / 1000) + filter_time = datetime.fromtimestamp(float(last_update_time) / 1000, + timezone.get_current_timezone()) - # TODO Set the last update date more properly, cause new posts can be - # changed after this point. Perhaps we need to get it from the thread last - # update time at the point of filtering, or as the latest post update time. json_data = { 'added': [], 'updated': [], - 'last_update' : int(time.time() * 1000), + 'last_update': None, } added_posts = Post.objects.filter(thread=thread, pub_time__gt=filter_time) updated_posts = Post.objects.filter(thread=thread, - pub_time__lt=filter_time, last_edit_time__gt=filter_time) + pub_time__lt=filter_time, + last_edit_time__gt=filter_time) for post in added_posts: json_data['added'].append(get_post(request, post.id).content.strip()) for post in updated_posts: json_data['updated'].append(get_post(request, post.id).content.strip()) + json_data['last_update'] = _datetime_to_epoch(thread.last_edit_time) return HttpResponse(content=json.dumps(json_data)) @@ -554,3 +555,9 @@ def _remove_invalid_links(text): text = string.replace(text, '>>' + id, id) return text + + +def _datetime_to_epoch(datetime): + return int(time.mktime(timezone.localtime( + datetime,timezone.get_current_timezone()).timetuple()) + * 1000 + datetime.microsecond) \ No newline at end of file