##// END OF EJS Templates
Optimized imports and added some docstrings to the post module
Optimized imports and added some docstrings to the post module

File last commit:

r584:72b216a3 default
r622:d08e30ea default
Show More
api.py
224 lines | 6.4 KiB | text/x-python | PythonLexer
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450 from datetime import datetime
import json
from django.db import transaction
from django.http import HttpResponse
neko259
Moved get_post to an API views module
r491 from django.shortcuts import get_object_or_404, render
from django.template import RequestContext
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450 from django.utils import timezone
neko259
Fixed tests failing with error 404 handler not imported
r564 from django.core import serializers
neko259
Added posting over ajax
r533 from boards.forms import PostForm, PlainErrorList
neko259
Added api for getting thread list
r499 from boards.models import Post, Thread, Tag
neko259
Rewriting views to class-based
r542 from boards.utils import datetime_to_epoch
from boards.views.thread import ThreadView
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450
__author__ = 'neko259'
neko259
Api module refactoring, moved some values to the module scope
r501 PARAMETER_TRUNCATED = 'truncated'
PARAMETER_TAG = 'tag'
PARAMETER_OFFSET = 'offset'
neko259
Added api for thread update in json
r524 PARAMETER_DIFF_TYPE = 'type'
DIFF_TYPE_HTML = 'html'
DIFF_TYPE_JSON = 'json'
neko259
Api module refactoring, moved some values to the module scope
r501
neko259
Added posting over ajax
r533 STATUS_OK = 'ok'
STATUS_ERROR = 'error'
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450
@transaction.atomic
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).thread_new
filter_time = datetime.fromtimestamp(float(last_update_time) / 1000000,
timezone.get_current_timezone())
json_data = {
'added': [],
'updated': [],
'last_update': None,
neko259
Style cleanup in api module
r504 }
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450 added_posts = Post.objects.filter(thread_new=thread,
pub_time__gt=filter_time) \
.order_by('pub_time')
updated_posts = Post.objects.filter(thread_new=thread,
pub_time__lte=filter_time,
last_edit_time__gt=filter_time)
neko259
Added api for thread update in json
r524
diff_type = DIFF_TYPE_HTML
if PARAMETER_DIFF_TYPE in request.GET:
diff_type = request.GET[PARAMETER_DIFF_TYPE]
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450 for post in added_posts:
neko259
Added api for thread update in json
r524 json_data['added'].append(_get_post_data(post.id, diff_type, request))
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450 for post in updated_posts:
neko259
Added api for thread update in json
r524 json_data['updated'].append(_get_post_data(post.id, diff_type, request))
neko259
Rewriting views to class-based
r542 json_data['last_update'] = datetime_to_epoch(thread.last_edit_time)
neko259
Removed hiding the form row with CSS as it causes problems with error rows
r450
return HttpResponse(content=json.dumps(json_data))
neko259
Added posting over ajax
r533 def api_add_post(request, opening_post_id):
"""
Add a post and return the JSON response for it
"""
opening_post = get_object_or_404(Post, id=opening_post_id)
status = STATUS_OK
errors = []
if request.method == 'POST':
form = PostForm(request.POST, request.FILES,
error_class=PlainErrorList)
form.session = request.session
#if form.need_to_ban:
# # Ban user because he is suspected to be a bot
# _ban_current_user(request)
# status = STATUS_ERROR
if form.is_valid():
neko259
Rewriting views to class-based
r542 ThreadView().new_post(request, form, opening_post,
html_response=False)
neko259
Added posting over ajax
r533 else:
status = STATUS_ERROR
errors = form.as_json_errors()
response = {
'status': status,
'errors': errors,
}
return HttpResponse(content=json.dumps(response))
neko259
Added api for getting thread list
r499
neko259
Moved get_post to an API views module
r491 def get_post(request, post_id):
neko259
Added api for getting thread list
r499 """
Get the html of a post. Used for popups. Post can be truncated if used
in threads list with 'truncated' get parameter.
"""
neko259
Moved get_post to an API views module
r491
post = get_object_or_404(Post, id=post_id)
context = RequestContext(request)
neko259
Api module refactoring, moved some values to the module scope
r501 context['post'] = post
if PARAMETER_TRUNCATED in request.GET:
context[PARAMETER_TRUNCATED] = True
neko259
Moved get_post to an API views module
r491
neko259
Fixed post loading with cache
r584 return render(request, 'boards/api_post.html', context)
neko259
Added api for getting thread list
r499
neko259
Added api for getting thread posts
r502 # TODO Test this
neko259
Added api for getting thread list
r499 def api_get_threads(request, count):
"""
Get the JSON thread opening posts list.
Parameters that can be used for filtering:
tag, offset (from which thread to get results)
"""
neko259
Api module refactoring, moved some values to the module scope
r501 if PARAMETER_TAG in request.GET:
tag_name = request.GET[PARAMETER_TAG]
neko259
Added api for getting thread list
r499 if tag_name is not None:
tag = get_object_or_404(Tag, name=tag_name)
threads = tag.threads.filter(archived=False)
else:
threads = Thread.objects.filter(archived=False)
neko259
Api module refactoring, moved some values to the module scope
r501 if PARAMETER_OFFSET in request.GET:
offset = request.GET[PARAMETER_OFFSET]
neko259
Added api for getting thread list
r499 offset = int(offset) if offset is not None else 0
else:
offset = 0
threads = threads.order_by('-bump_time')
threads = threads[offset:offset + int(count)]
opening_posts = []
for thread in threads:
opening_post = thread.get_opening_post()
neko259
Added api for thread update in json
r524 # TODO Add tags, replies and images count
neko259
Added bump time to the thread JSON
r526 opening_posts.append(_get_post_data(opening_post.id,
include_last_update=True))
neko259
Added api for getting thread list
r499
return HttpResponse(content=json.dumps(opening_posts))
neko259
Added api for the tags list
r500
neko259
Added api for getting thread posts
r502 # TODO Test this
neko259
Added api for the tags list
r500 def api_get_tags(request):
"""
Get all tags or user tags.
"""
# TODO Get favorite tags for the given user ID
tags = Tag.objects.get_not_empty_tags()
tag_names = []
for tag in tags:
tag_names.append(tag.name)
return HttpResponse(content=json.dumps(tag_names))
neko259
Added api for getting thread posts
r502
# TODO The result can be cached by the thread last update time
# TODO Test this
def api_get_thread_posts(request, opening_post_id):
"""
Get the JSON array of thread posts
"""
opening_post = get_object_or_404(Post, id=opening_post_id)
thread = opening_post.thread_new
posts = thread.get_replies()
neko259
Added last update time to the initial thread result in api
r525 json_data = {
'posts': [],
'last_update': None,
}
neko259
Added api for getting thread posts
r502 json_post_list = []
for post in posts:
neko259
Added api for thread update in json
r524 json_post_list.append(_get_post_data(post.id))
neko259
Rewriting views to class-based
r542 json_data['last_update'] = datetime_to_epoch(thread.last_edit_time)
neko259
Added last update time to the initial thread result in api
r525 json_data['posts'] = json_post_list
neko259
Added api for thread update in json
r524
neko259
Added last update time to the initial thread result in api
r525 return HttpResponse(content=json.dumps(json_data))
neko259
Added api for thread update in json
r524
neko259
Fixed tests failing with error 404 handler not imported
r564 def api_get_post(request, post_id):
"""
Get the JSON of a post. This can be
used as and API for external clients.
"""
post = get_object_or_404(Post, id=post_id)
json = serializers.serialize("json", [post], fields=(
"pub_time", "_text_rendered", "title", "text", "image",
"image_width", "image_height", "replies", "tags"
))
return HttpResponse(content=json)
neko259
Added api for thread update in json
r524 # TODO Add pub time and replies
neko259
Added bump time to the thread JSON
r526 def _get_post_data(post_id, format_type=DIFF_TYPE_JSON, request=None,
include_last_update=False):
neko259
Added api for thread update in json
r524 if format_type == DIFF_TYPE_HTML:
return get_post(request, post_id).content.strip()
elif format_type == DIFF_TYPE_JSON:
post = get_object_or_404(Post, id=post_id)
neko259
Added api for getting thread posts
r502 post_json = {
neko259
Style cleanup in api module
r504 'id': post.id,
'title': post.title,
'text': post.text.rendered,
}
neko259
Added api for getting thread posts
r502 if post.image:
neko259
Fixed api methods returning post image
r508 post_json['image'] = post.image.url
post_json['image_preview'] = post.image.url_200x150
neko259
Added bump time to the thread JSON
r526 if include_last_update:
neko259
Rewriting views to class-based
r542 post_json['bump_time'] = datetime_to_epoch(
neko259
Added bump time to the thread JSON
r526 post.thread_new.bump_time)
neko259
Added api for thread update in json
r524 return post_json