diff options
| -rw-r--r-- | pydis_site/apps/content/resources/_info.yml | 2 | ||||
| -rw-r--r-- | pydis_site/apps/content/resources/guides/_info.yml (renamed from pydis_site/apps/content/resources/content/guides/_info.yml) | 0 | ||||
| -rw-r--r-- | pydis_site/apps/content/resources/guides/pydis-guides/_info.yml (renamed from pydis_site/apps/content/resources/content/guides/pydis-guides/_info.yml) | 0 | ||||
| -rw-r--r-- | pydis_site/apps/content/resources/guides/pydis-guides/how-to-write-a-article.md (renamed from pydis_site/apps/content/resources/content/guides/pydis-guides/how-to-write-a-article.md) | 0 | ||||
| -rw-r--r-- | pydis_site/apps/content/urls.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/content/utils.py | 42 | ||||
| -rw-r--r-- | pydis_site/apps/content/views/__init__.py | 3 | ||||
| -rw-r--r-- | pydis_site/apps/content/views/page_category.py | 61 | ||||
| -rw-r--r-- | pydis_site/apps/content/views/pages.py | 16 | ||||
| -rw-r--r-- | pydis_site/settings.py | 2 | ||||
| -rw-r--r-- | pydis_site/templates/content/listing.html | 5 | ||||
| -rw-r--r-- | pydis_site/templates/content/page.html | 1 | 
12 files changed, 43 insertions, 91 deletions
| diff --git a/pydis_site/apps/content/resources/_info.yml b/pydis_site/apps/content/resources/_info.yml new file mode 100644 index 00000000..4ccdd7e1 --- /dev/null +++ b/pydis_site/apps/content/resources/_info.yml @@ -0,0 +1,2 @@ +name: Pages +description: Guides, articles and pages hosted on the site. diff --git a/pydis_site/apps/content/resources/content/guides/_info.yml b/pydis_site/apps/content/resources/guides/_info.yml index 369f05d4..369f05d4 100644 --- a/pydis_site/apps/content/resources/content/guides/_info.yml +++ b/pydis_site/apps/content/resources/guides/_info.yml diff --git a/pydis_site/apps/content/resources/content/guides/pydis-guides/_info.yml b/pydis_site/apps/content/resources/guides/pydis-guides/_info.yml index 64111a83..64111a83 100644 --- a/pydis_site/apps/content/resources/content/guides/pydis-guides/_info.yml +++ b/pydis_site/apps/content/resources/guides/pydis-guides/_info.yml diff --git a/pydis_site/apps/content/resources/content/guides/pydis-guides/how-to-write-a-article.md b/pydis_site/apps/content/resources/guides/pydis-guides/how-to-write-a-article.md index ec89988c..ec89988c 100644 --- a/pydis_site/apps/content/resources/content/guides/pydis-guides/how-to-write-a-article.md +++ b/pydis_site/apps/content/resources/guides/pydis-guides/how-to-write-a-article.md diff --git a/pydis_site/apps/content/urls.py b/pydis_site/apps/content/urls.py index 1406f672..c11b222a 100644 --- a/pydis_site/apps/content/urls.py +++ b/pydis_site/apps/content/urls.py @@ -4,6 +4,6 @@ from . import views  app_name = "content"  urlpatterns = [ -    path("", views.PagesView.as_view(), name='pages'), +    path("", views.PageOrCategoryView.as_view(), name='pages'),      path("<path:location>/", views.PageOrCategoryView.as_view(), name='page_category'),  ] diff --git a/pydis_site/apps/content/utils.py b/pydis_site/apps/content/utils.py index db502a71..ef02a8cb 100644 --- a/pydis_site/apps/content/utils.py +++ b/pydis_site/apps/content/utils.py @@ -1,65 +1,49 @@ -import os -from typing import Dict, List, Optional, Union +from pathlib import Path +from typing import Dict, Union  import yaml -from django.conf import settings  from django.http import Http404  from markdown2 import markdown -def get_category(path: List[str]) -> Dict[str, str]: +def get_category(path: Path) -> Dict[str, str]:      """Load category information by name from _info.yml.""" -    path = settings.PAGES_PATH.joinpath(*path)      if not path.exists() or not path.is_dir():          raise Http404("Category not found.")      return yaml.safe_load(path.joinpath("_info.yml").read_text()) -def get_categories(path: Optional[List[str]] = None) -> Dict[str, Dict]: +def get_categories(path: Path) -> Dict[str, Dict]:      """Get all categories information."""      categories = {} -    if path is None: -        categories_path = settings.PAGES_PATH -        path = [] -    else: -        categories_path = settings.PAGES_PATH.joinpath(*path) -    for name in categories_path.iterdir(): +    for name in path.iterdir():          if name.is_dir(): -            categories[name.name] = get_category([*path, name.name]) +            categories[name.name] = get_category(path.joinpath(name.name))      return categories -def get_pages(path: Optional[List[str]] = None) -> Dict[str, Dict]: -    """Get all root or category pages.""" -    if path is None: -        base_dir = settings.PAGES_PATH -    else: -        base_dir = settings.PAGES_PATH.joinpath(*path) - +def get_pages(path: Path) -> Dict[str, Dict]: +    """Get all root or category page names and their metadata."""      pages = {} -    for item in base_dir.iterdir(): +    for item in path.iterdir():          if item.is_file() and item.name.endswith(".md"):              md = markdown(item.read_text(), extras=["metadata"]) -            pages[os.path.splitext(item.name)[0]] = md.metadata +            pages[item.stem] = md.metadata      return pages -def get_page(path: List[str]) -> Dict[str, Union[str, Dict]]: +def get_page(path: Path) -> Dict[str, Union[str, Dict]]:      """Get one specific page. When category is specified, get it from there.""" -    page_path = settings.PAGES_PATH.joinpath(*path[:-1]) - -    # We need to include extension MD -    page_path = page_path.joinpath(f"{path[-1]}.md") -    if not page_path.exists() or not page_path.is_file(): +    if not path.exists() or not path.is_file():          raise Http404("Page not found.")      html = markdown( -        page_path.read_text(), +        path.read_text(),          extras=[              "metadata",              "fenced-code-blocks", diff --git a/pydis_site/apps/content/views/__init__.py b/pydis_site/apps/content/views/__init__.py index 740d98e9..70ea1c7a 100644 --- a/pydis_site/apps/content/views/__init__.py +++ b/pydis_site/apps/content/views/__init__.py @@ -1,4 +1,3 @@  from .page_category import PageOrCategoryView -from .pages import PagesView -__all__ = ["PageOrCategoryView", "PagesView"] +__all__ = ["PageOrCategoryView"] diff --git a/pydis_site/apps/content/views/page_category.py b/pydis_site/apps/content/views/page_category.py index f00a79ee..7e04e2f3 100644 --- a/pydis_site/apps/content/views/page_category.py +++ b/pydis_site/apps/content/views/page_category.py @@ -1,4 +1,5 @@  import typing as t +from pathlib import Path  from django.conf import settings  from django.http import Http404 @@ -10,14 +11,18 @@ from pydis_site.apps.content import utils  class PageOrCategoryView(TemplateView):      """Handles pages and page categories.""" +    def dispatch(self, request: t.Any, *args, **kwargs) -> t.Any: +        """Conform URL path location to the filesystem path.""" +        self.location = Path(self.kwargs.get("location", "")) +        self.full_location = settings.PAGES_PATH / self.location + +        return super().dispatch(request, *args, **kwargs) +      def get_template_names(self) -> t.List[str]:          """Checks does this use page template or listing template.""" -        location = self.kwargs["location"].split("/") -        full_location = settings.PAGES_PATH.joinpath(*location) - -        if full_location.is_dir(): +        if self.full_location.is_dir():              template_name = "content/listing.html" -        elif full_location.with_suffix(".md").is_file(): +        elif self.full_location.with_suffix(".md").is_file():              template_name = "content/page.html"          else:              raise Http404 @@ -28,42 +33,24 @@ class PageOrCategoryView(TemplateView):          """Assign proper context variables based on what resource user requests."""          context = super().get_context_data(**kwargs) -        location: list = self.kwargs["location"].split("/") -        full_location = settings.PAGES_PATH.joinpath(*location) - -        if full_location.is_dir(): -            context["category_info"] = utils.get_category(location) -            context["content"] = utils.get_pages(location) -            context["categories"] = utils.get_categories(location) -            # Add trailing slash here to simplify template -            context["path"] = "/".join(location) + "/" -            context["in_category"] = True -        elif full_location.with_suffix(".md").is_file(): -            page_result = utils.get_page(location) - -            if len(location) > 1: -                context["category_data"] = utils.get_category(location[:-1]) -                context["category_data"]["raw_name"] = location[:-1][-1] -            else: -                context["category_data"] = {"name": None, "raw_name": None} - +        if self.full_location.is_dir(): +            context["categories"] = utils.get_categories(self.full_location) +            context["category_info"] = utils.get_category(self.full_location) +            context["content"] = utils.get_pages(self.full_location) +            context["path"] = f"{self.location}/"  # Add trailing slash here to simplify template +        elif self.full_location.with_suffix(".md").is_file(): +            page_result = utils.get_page(self.full_location.with_suffix(".md"))              context["page"] = page_result              context["relevant_links"] = page_result["metadata"].get("relevant_links", {})          else:              raise Http404 -        location.pop() -        breadcrumb_items = [] -        while len(location): -            breadcrumb_items.insert( -                0, -                { -                    "name": utils.get_category(location)["name"], -                    "path": "/".join(location) -                } -            ) -            location.pop() - -        context["breadcrumb_items"] = breadcrumb_items +        breadcrumb_items = [ +            { +                "name": utils.get_category(settings.PAGES_PATH / location)["name"], +                "path": str(location) +            } for location in self.location.parents +        ] +        context["breadcrumb_items"] = reversed(breadcrumb_items)          return context diff --git a/pydis_site/apps/content/views/pages.py b/pydis_site/apps/content/views/pages.py deleted file mode 100644 index 11ac0eeb..00000000 --- a/pydis_site/apps/content/views/pages.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.views.generic import TemplateView - -from pydis_site.apps.content.utils import get_pages, get_categories - - -class PagesView(TemplateView): -    """Shows all pages and categories.""" - -    template_name = "content/listing.html" - -    def get_context_data(self, **kwargs) -> dict: -        """Add page and category data to template context.""" -        context = super().get_context_data(**kwargs) -        context["content"] = get_pages() -        context["categories"] = get_categories() -        return context diff --git a/pydis_site/settings.py b/pydis_site/settings.py index 0b4d9fd1..3abf556a 100644 --- a/pydis_site/settings.py +++ b/pydis_site/settings.py @@ -287,4 +287,4 @@ SITE_REPOSITORY_OWNER = "python-discord"  SITE_REPOSITORY_NAME = "site"  SITE_REPOSITORY_BRANCH = "master" -PAGES_PATH = Path(BASE_DIR, "pydis_site", "apps", "content", "resources", "content") +PAGES_PATH = Path(BASE_DIR, "pydis_site", "apps", "content", "resources") diff --git a/pydis_site/templates/content/listing.html b/pydis_site/templates/content/listing.html index 39eae1c2..097cac4f 100644 --- a/pydis_site/templates/content/listing.html +++ b/pydis_site/templates/content/listing.html @@ -16,13 +16,10 @@          <div class="container">              <nav class="breadcrumb is-pulled-left" aria-label="breadcrumbs">                  <ul> -                    {% if in_category %} -                        <li><a href="{% url "content:pages" %}">Pages</a></li> -                    {% endif %}                      {% for item in breadcrumb_items %}                          <li><a href="{% url "content:page_category" location=item.path %}">{{ item.name }}</a></li>                      {% endfor %} -                    <li class="is-active"><a href="#">{{ category_info.name|default:"Pages" }}</a></li> +                    <li class="is-active"><a href="#">{{ category_info.name }}</a></li>                  </ul>              </nav>          </div> diff --git a/pydis_site/templates/content/page.html b/pydis_site/templates/content/page.html index 3b0ebb5f..433baa69 100644 --- a/pydis_site/templates/content/page.html +++ b/pydis_site/templates/content/page.html @@ -20,7 +20,6 @@          <div class="container">              <nav class="breadcrumb is-pulled-left" aria-label="breadcrumbs">                  <ul> -                    <li><a href="{% url "content:pages" %}">Pages</a></li>                      {% for item in breadcrumb_items %}                          <li><a href="{% url "content:page_category" location=item.path %}">{{ item.name }}</a></li>                      {% endfor %} | 
