|
|
import xml.etree.ElementTree as et
|
|
|
|
|
|
from boards.models import Post, Tag
|
|
|
|
|
|
TAG_THREAD = 'thread'
|
|
|
TAG_TAGS = 'tags'
|
|
|
TAG_TAG = 'tag'
|
|
|
TAG_TIME_FROM = 'timestamp_from'
|
|
|
|
|
|
|
|
|
class PostFilter:
|
|
|
def __init__(self, content=None):
|
|
|
self.content = content
|
|
|
|
|
|
def filter(self, posts):
|
|
|
return posts
|
|
|
|
|
|
def add_filter(self, model_tag, value):
|
|
|
return model_tag
|
|
|
|
|
|
|
|
|
class ThreadFilter(PostFilter):
|
|
|
def filter(self, posts):
|
|
|
op_id = self.content.text
|
|
|
|
|
|
op = Post.objects.filter(opening=True, id=op_id).first()
|
|
|
if op:
|
|
|
return posts.filter(thread=op.get_thread())
|
|
|
else:
|
|
|
return posts.none()
|
|
|
|
|
|
def add_filter(self, model_tag, value):
|
|
|
thread_tag = et.SubElement(model_tag, TAG_THREAD)
|
|
|
thread_tag.text = str(value)
|
|
|
|
|
|
|
|
|
class TagsFilter(PostFilter):
|
|
|
def filter(self, posts):
|
|
|
tags = []
|
|
|
for tag_tag in self.content:
|
|
|
try:
|
|
|
tags.append(Tag.objects.get(name=tag_tag.text))
|
|
|
except Tag.DoesNotExist:
|
|
|
pass
|
|
|
|
|
|
if tags:
|
|
|
return posts.filter(thread__tags__in=tags)
|
|
|
else:
|
|
|
return posts.none()
|
|
|
|
|
|
def add_filter(self, model_tag, value):
|
|
|
tags_tag = et.SubElement(model_tag, TAG_TAGS)
|
|
|
for tag_name in value:
|
|
|
tag_tag = et.SubElement(tags_tag, TAG_TAG)
|
|
|
tag_tag.text = tag_name
|
|
|
|
|
|
|
|
|
class TimestampFromFilter(PostFilter):
|
|
|
def filter(self, posts):
|
|
|
from_time = self.content.text
|
|
|
return posts.filter(pub_time__gt=from_time)
|
|
|
|
|
|
def add_filter(self, model_tag, value):
|
|
|
tags_from_time = et.SubElement(model_tag, TAG_TIME_FROM)
|
|
|
tags_from_time.text = value
|
|
|
|
|
|
|