sync.py
83 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
neko259
|
r1834 | import logging | ||
neko259
|
r836 | import xml.etree.ElementTree as et | ||
neko259
|
r1511 | |||
neko259
|
r837 | from django.http import HttpResponse, Http404 | ||
neko259
|
r1834 | |||
neko259
|
r1844 | from boards.abstracts.sync_filters import ThreadFilter, TagsFilter,\ | ||
neko259
|
r1846 | TimestampFromFilter,\ | ||
TAG_THREAD, TAG_TAGS, TAG_TIME_FROM | ||||
neko259
|
r836 | from boards.models import GlobalId, Post | ||
neko259
|
r1177 | from boards.models.post.sync import SyncManager | ||
neko259
|
r836 | |||
neko259
|
r1834 | logger = logging.getLogger('boards.sync') | ||
FILTERS = { | ||||
TAG_THREAD: ThreadFilter, | ||||
neko259
|
r1844 | TAG_TAGS: TagsFilter, | ||
neko259
|
r1846 | TAG_TIME_FROM: TimestampFromFilter, | ||
neko259
|
r1834 | } | ||
neko259
|
r1566 | def response_list(request): | ||
neko259
|
r1321 | request_xml = request.body | ||
neko259
|
r1834 | filters = [] | ||
neko259
|
r1566 | if request_xml is None or len(request_xml) == 0: | ||
neko259
|
r1321 | return HttpResponse(content='Use the API') | ||
neko259
|
r1834 | else: | ||
root_tag = et.fromstring(request_xml) | ||||
model_tag = root_tag[0] | ||||
neko259
|
r1321 | |||
neko259
|
r1834 | for tag_filter in model_tag: | ||
filter_name = tag_filter.tag | ||||
neko259
|
r1844 | model_filter = FILTERS.get(filter_name) | ||
neko259
|
r1834 | if not model_filter: | ||
logger.warning('Unavailable filter: {}'.format(filter_name)) | ||||
neko259
|
r1844 | filters.append(model_filter(tag_filter)) | ||
neko259
|
r1834 | |||
response_xml = SyncManager.generate_response_list(filters) | ||||
neko259
|
r1321 | |||
return HttpResponse(content=response_xml) | ||||
neko259
|
r810 | |||
neko259
|
r1177 | def response_get(request): | ||
neko259
|
r836 | """ | ||
Processes a GET request with post ID list and returns the posts XML list. | ||||
Request should contain an 'xml' post attribute with the actual request XML. | ||||
""" | ||||
neko259
|
r1177 | request_xml = request.body | ||
neko259
|
r1566 | if request_xml is None or len(request_xml) == 0: | ||
neko259
|
r1177 | return HttpResponse(content='Use the API') | ||
neko259
|
r836 | |||
posts = [] | ||||
root_tag = et.fromstring(request_xml) | ||||
model_tag = root_tag[0] | ||||
for id_tag in model_tag: | ||||
neko259
|
r1233 | global_id, exists = GlobalId.from_xml_element(id_tag) | ||
if exists: | ||||
neko259
|
r1177 | posts.append(Post.objects.get(global_id=global_id)) | ||
neko259
|
r836 | |||
neko259
|
r1236 | response_xml = SyncManager.generate_response_get(posts) | ||
neko259
|
r836 | |||
neko259
|
r837 | return HttpResponse(content=response_xml) | ||
def get_post_sync_data(request, post_id): | ||||
try: | ||||
post = Post.objects.get(id=post_id) | ||||
except Post.DoesNotExist: | ||||
raise Http404() | ||||
neko259
|
r1511 | xml_str = SyncManager.generate_response_get([post]) | ||
neko259
|
r837 | |||
return HttpResponse( | ||||
neko259
|
r1574 | content_type='text/xml; charset=utf-8', | ||
content=xml_str, | ||||
) | ||||