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