def init(cls): # Включаем прослушивание сигналов, необходимое для функционировая области. tie_model = get_tie_model() # url-синдикации будут обновлены в случае добавления/удаления связи сущности с категорией. signals.post_save.connect(cls.update_syndication_urls, sender=tie_model) signals.post_delete.connect(cls.update_syndication_urls, sender=tie_model)
def get_syndication_urls(cls) -> List: """Возвращает url-шаблоны с привязанными сгенерированными представлениями для потоков синдикации (RSS) с перечислением новых материалов в категориях. """ feeds = [] tie_model = get_tie_model() categories = tie_model.get_linked_objects(by_category=True) def get_in_category(category_id): """Возвращает объекты из разных областей в указанной категории.""" linked = tie_model.get_linked_objects( filter_kwargs={'category_id': category_id}, id_only=True) result = [] for model, ids in linked.items(): result.extend(model.get_actual().filter( id__in=ids)[:SYNDICATION_ITEMS_LIMIT]) result = sorted(result, key=attrgetter('time_published'), reverse=True) return result[:SYNDICATION_ITEMS_LIMIT] for category in categories.keys(): title = category.title category_id = category.id feed = RealmBase._get_syndication_feed( title=title, description=f'Материалы в категории «{title}». {category.note}', func_link=lambda self: reverse(CategoryRealm. get_details_urlname(), args=[self.category_id]), func_items=lambda self: get_in_category(self.category_id), cls_name=f'Category{category_id}') feed.category_id = category_id feeds.append( url(fr'^{category_id}/{SYNDICATION_URL_MARKER}/$', feed, name=f'category_{category_id}')) _, realm_name_plural = CategoryRealm.get_names() return [ url(fr'^{realm_name_plural}/', (feeds, realm_name_plural, cls.SYNDICATION_NAMESPACE)) ]
def get_syndication_urls(cls): """Возвращает url-шаблоны с привязанными сгенерированными представлениями для потоков синдикации (RSS) с перечислением новых материалов в категориях. :return: """ feeds = [] tie_model = get_tie_model() categories = tie_model.get_linked_objects(by_category=True) def get_in_category(category_id): """Возвращает объекты из разных областей в указанной категории.""" linked = tie_model.get_linked_objects(filter_kwargs={'category_id': category_id}, id_only=True) result = [] for model, ids in linked.items(): result.extend(model.get_actual().filter(id__in=ids)[:SYNDICATION_ITEMS_LIMIT]) result = sorted(result, key=attrgetter('time_published'), reverse=True) return result[:SYNDICATION_ITEMS_LIMIT] for category in categories.keys(): title = category.title category_id = category.id feed = RealmBase._get_syndication_feed( title=title, description='Материалы в категории «%s». %s' % (title, category.note), func_link=lambda self: reverse(CategoryRealm.get_details_urlname(), args=[self.category_id]), func_items=lambda self: get_in_category(self.category_id), cls_name='Category%s' % category_id ) feed.category_id = category_id feeds.append( url(r'^%s/%s/$' % (category_id, SYNDICATION_URL_MARKER), feed, name='category_%s' % category_id)) _, realm_name_plural = CategoryRealm.get_names() return [url(r'^%s/' % realm_name_plural, (feeds, realm_name_plural, cls.SYNDICATION_NAMESPACE))]
from uuid import uuid4 import pytest from django.db.utils import IntegrityError from django.template.base import TemplateSyntaxError from django.template.context import Context from sitecats.exceptions import SitecatsLockedCategoryDelete, SitecatsConfigurationError from sitecats.models import Category, Tie from sitecats.settings import UNRESOLVED_URL_MARKER from sitecats.toolbox import CategoryList, get_category_aliases_under, get_tie_model, \ get_category_model MODEL_TIE = get_tie_model() MODEL_CATEGORY = get_category_model() from sitecats.tests.testapp.models import Comment, Article @pytest.fixture def create_comment(): from sitecats.tests.testapp.models import Comment def create_comment_(): comment = Comment(title='comment%s' % uuid4().hex) comment.save() return comment return create_comment_