class CategorizedFlatPages: def __init__(self): self.flat_pages = FlatPages() self.root_category = Category(None, '<root>') def init_app(self, app): self.flat_pages.init_app(app) self._set_categories() def __iter__(self): return iter(sorted(self.root_category.categories.values(), key=attrgetter('rank'))) def get(self, category_id, article_id): category = self.root_category.categories.get(category_id) if category is None: return None return category.articles.get(article_id) def get_articles_of_category(self, category_id): barticles = [] category = self.root_category.categories.get( category_id) if category: for a in list(category.articles.values()): if a.id != 'index': barticles.append(a) return barticles def get_or_404(self, category_id, article_id): page = self.get(category_id, article_id) if page is None: abort(404) return page def _set_categories(self): for page in self.flat_pages: components = page.path.split('/') parent = self.root_category for category_id in components[:-1]: parent = parent.add_category(category_id) page_name = components[-1] parent.add_article(page_name, page) def reload(self): self.flat_pages.reload() self._set_categories()
class CategorizedFlatPages: def __init__(self): self.flat_pages = FlatPages() self.root_category = Category(None, '<root>') def init_app(self, app): self.flat_pages.init_app(app) self._set_categories() def __iter__(self): return iter( sorted(self.root_category.categories.values(), key=attrgetter('rank'))) def get(self, category_id, article_id): category = self.root_category.categories.get(category_id) if category is None: return None return category.articles.get(article_id) def get_articles_of_category(self, category_id): barticles = [] category = self.root_category.categories.get(category_id) if category: for a in list(category.articles.values()): if a.id != 'index': barticles.append(a) return barticles def get_or_404(self, category_id, article_id): page = self.get(category_id, article_id) if page is None: abort(404) return page def _set_categories(self): for page in self.flat_pages: components = page.path.split('/') parent = self.root_category for category_id in components[:-1]: parent = parent.add_category(category_id) page_name = components[-1] parent.add_article(page_name, page) def reload(self): self.flat_pages.reload() self._set_categories()
class CategorizedFlatPages: """The main interface to gather pages and categories * What is it used for? - Looping: E.g. In the navbar - get news → get_articles_of_category('news') - get static page → get_or_404() """ def __init__(self): self.flat_pages = FlatPages() self.root_category = Category(None, '<root>') def init_app(self, app): self.flat_pages.init_app(app) self._init_categories() @property def categories(self): """Yield all categories as an iterable """ return sorted(self.root_category.categories.values(), key=attrgetter('rank')) def get(self, category_id, article_id): category = self.root_category.categories.get(category_id) if category is None: return None return category._articles.get(article_id) def get_category(self, category_id): """Return the `Category` object from a given name (id) """ return self.root_category.categories.get(category_id) def get_articles_of_category(self, category_id): """Get the articles of a category - ONLY used for fetching news """ articles = [] category = self.get_category(category_id) if category: for a in category._articles.values(): if a.id != 'index': articles.append(a) return articles def get_or_404(self, category_id, article_id): """Fetch a static page""" page = self.get(category_id, article_id) if page is None: abort(404) return page def _init_categories(self): # TODO: Store categories, not articles for page in self.flat_pages: # get category + page name # plus, assert that there is nothing more to that. components = page.path.split('/') parent = self.root_category for category_id in components[:-1]: parent = parent.add_child_category(category_id) basename = components[-1] parent.add_article(basename, page) def reload(self): self.flat_pages.reload() self._init_categories()