-
-
Notifications
You must be signed in to change notification settings - Fork 127
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1228 from python-discord/resources_config_ready
Resources config ready
- Loading branch information
Showing
3 changed files
with
102 additions
and
95 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,99 @@ | ||
from pathlib import Path | ||
|
||
import yaml | ||
from django.apps import AppConfig | ||
|
||
from pydis_site import settings | ||
from pydis_site.apps.resources.templatetags.to_kebabcase import to_kebabcase | ||
|
||
RESOURCES_PATH = Path(settings.BASE_DIR, "pydis_site", "apps", "resources", "resources") | ||
|
||
|
||
class ResourcesConfig(AppConfig): | ||
"""AppConfig instance for Resources app.""" | ||
|
||
name = 'pydis_site.apps.resources' | ||
|
||
@staticmethod | ||
def _sort_key_disregard_the(tuple_: tuple) -> str: | ||
"""Sort a tuple by its key alphabetically, disregarding 'the' as a prefix.""" | ||
name, resource = tuple_ | ||
name = name.casefold() | ||
if name.startswith(("the ", "the_")): | ||
return name[4:] | ||
return name | ||
|
||
|
||
def ready(self) -> None: | ||
"""Set up all the resources.""" | ||
# Load the resources from the yaml files in /resources/ | ||
self.resources = { | ||
path.stem: yaml.safe_load(path.read_text()) | ||
for path in RESOURCES_PATH.rglob("*.yaml") | ||
} | ||
|
||
# Sort the resources alphabetically | ||
self.resources = dict(sorted(self.resources.items(), key=self._sort_key_disregard_the)) | ||
|
||
# Parse out all current tags | ||
resource_tags = { | ||
"topics": set(), | ||
"payment_tiers": set(), | ||
"difficulty": set(), | ||
"type": set(), | ||
} | ||
for resource_name, resource in self.resources.items(): | ||
css_classes = [] | ||
for tag_type in resource_tags: | ||
# Store the tags into `resource_tags` | ||
tags = resource.get("tags", {}).get(tag_type, []) | ||
for tag in tags: | ||
tag = tag.title() | ||
tag = tag.replace("And", "and") | ||
resource_tags[tag_type].add(tag) | ||
|
||
# Make a CSS class friendly representation too, while we're already iterating. | ||
for tag in tags: | ||
css_tag = to_kebabcase(f"{tag_type}-{tag}") | ||
css_classes.append(css_tag) | ||
|
||
# Now add the css classes back to the resource, so we can use them in the template. | ||
self.resources[resource_name]["css_classes"] = " ".join(css_classes) | ||
|
||
# Set up all the filter checkbox metadata | ||
self.filters = { | ||
"Difficulty": { | ||
"filters": sorted(resource_tags.get("difficulty")), | ||
"icon": "fas fa-brain", | ||
"hidden": False, | ||
}, | ||
"Type": { | ||
"filters": sorted(resource_tags.get("type")), | ||
"icon": "fas fa-photo-video", | ||
"hidden": False, | ||
}, | ||
"Payment tiers": { | ||
"filters": sorted(resource_tags.get("payment_tiers")), | ||
"icon": "fas fa-dollar-sign", | ||
"hidden": True, | ||
}, | ||
"Topics": { | ||
"filters": sorted(resource_tags.get("topics")), | ||
"icon": "fas fa-lightbulb", | ||
"hidden": True, | ||
} | ||
} | ||
|
||
# The bottom topic should always be "Other". | ||
self.filters["Topics"]["filters"].remove("Other") | ||
self.filters["Topics"]["filters"].append("Other") | ||
|
||
# A complete list of valid filter names | ||
self.valid_filters = { | ||
"topics": [to_kebabcase(topic) for topic in self.filters["Topics"]["filters"]], | ||
"payment_tiers": [ | ||
to_kebabcase(tier) for tier in self.filters["Payment tiers"]["filters"] | ||
], | ||
"type": [to_kebabcase(type_) for type_ in self.filters["Type"]["filters"]], | ||
"difficulty": [to_kebabcase(tier) for tier in self.filters["Difficulty"]["filters"]], | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters