def create_test_filter(self): filter = Filter() item = FilterItem() item.name = "category" filter.add_item(item) item = FilterItem() item.name = "tag" filter.add_item(item) return filter
def init_filters(self): self.filter = Filter() self.filter.add_item(OwnerFilter()) self.filter.add_item(LangFilter()) self.filter.add_item(CategoryFilter()) self.filter.add_item(TagFilter()) self.filter.add_item(AuthorFilter())
class ArticleService(object): mail_service = MailService() def init_filters(self): self.filter = Filter() self.filter.add_item(OwnerFilter()) self.filter.add_item(LangFilter()) self.filter.add_item(CategoryFilter()) self.filter.add_item(TagFilter()) self.filter.add_item(AuthorFilter()) def filter_articles(self, request): query = Article.objects.all() self.init_filters() query = self.filter.filter_query(request, query) return query def get_current_filters(self): params = self.filter.get_params() current_filters = [] #------------------------------------- own = params.get('own') if own: if own == 'articles': own = u'Articles' elif own == 'drafts': own = u'Drafts' current_filters.append({ 'name': 'own', 'value': own, 'slug': None, }) #------------------------------------- category_slug = params.get('category') if category_slug: category = Category.objects.filter(slug=category_slug) if category: current_filters.append({ 'name': 'category', 'value': category[0].title, 'slug': category_slug, }) #------------------------------------ tags = params.get('tags') if tags: for tag_slug in tags: tag = Tag.objects.filter(slug=tag_slug) if tag: current_filters.append({ 'name': 'tag', 'value': tag[0].name, 'slug': tag_slug }) del params['tags'] return current_filters def get_control_panel_context(self, filtered_items): context = self.filter.get_context_data(filtered_items) context["filter"] = filter context['current_filters'] = self.get_current_filters() return context @staticmethod def get_feed_articles(): return Article.get_published()[:LATEST_FEED_COUNT] @staticmethod def get_articles_by_author(user, ids=None): query = Article.objects.filter(authors__in=[user], is_public=True) if ids: query = query.filter(id__in=ids) return query @staticmethod def get_drafts_by_author(user, ids=None): query = Article.objects.filter(authors__in=[user], is_public=False) if ids: query = query.filter(id__in=ids) return query @staticmethod def get_article_ids_by_category(category): return Article.objects.filter(category=category, is_public=True).only("id") def publish_article(self, article, user=None): article.is_public = True article.save() self.mail_service.send_mail_on_first_article_publish(article, user) def unpublish_article(self, article, user=None): article.is_public = False article.save() @staticmethod def render_markup(markup, raw_data): data = raw_data if markup == Article.MARKUP_MARKDOWN: data = markdown(data) elif markup == Article.MARKUP_RST: data = publish_parts(source=data, writer_name="html4css1")["fragment"] elif markup == Article.MARKUP_TEXTILE: data = textile(data) data = html_parser(data) return data @classmethod def render_markups(cls, article): class RenderedArticle(object): def __init__(self, short, description): self.short = short self.description = description markup = article.markup short = cls.render_markup(markup, article.short_raw) description = cls.render_markup(markup, article.description_raw) return RenderedArticle(short, description) @classmethod def get_translation_data(cls, article, user): trans_article = {} trans_article['title'] = article.title trans_article['category'] = article.category trans_article['tags'] = ', '.join(tag.name for tag in article.tags.all()) trans_article['markup'] = article.markup trans_article['short_raw'] = article.short_raw trans_article['description_raw'] = article.description_raw trans_article['parent'] = article if article.is_original(): trans_article['original'] = article else: trans_article['original'] = article.original return trans_article @classmethod def get_all_translations_ids(cls, article): ids = [article.lang.id] ids.extend(trans['lang__id'] for trans in article.get_translations().values('lang__id')) return ids @classmethod def get_untranslated_ids(cls, article): article_ids = set(cls.get_all_translations_ids(article)) all_ids = set(lang['id'] for lang in Language.objects.values('id')) all_ids.difference_update(article_ids) return list(all_ids)