aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps
diff options
context:
space:
mode:
Diffstat (limited to 'pydis_site/apps')
-rw-r--r--pydis_site/apps/content/resources/_info.yml2
-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.py2
-rw-r--r--pydis_site/apps/content/utils.py42
-rw-r--r--pydis_site/apps/content/views/__init__.py3
-rw-r--r--pydis_site/apps/content/views/page_category.py61
-rw-r--r--pydis_site/apps/content/views/pages.py16
9 files changed, 41 insertions, 85 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