Beispiel #1
0
    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
Beispiel #2
0
 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())
Beispiel #3
0
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)