Skip to content

Commit

Permalink
Simplify entity URL generation (#2302)
Browse files Browse the repository at this point in the history
  • Loading branch information
bartfeenstra authored Feb 7, 2025
1 parent cc95926 commit 9a99a51
Showing 1 changed file with 10 additions and 20 deletions.
30 changes: 10 additions & 20 deletions betty/project/url.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

from typing_extensions import override

from betty import model
from betty.media_type.media_types import HTML, JSON, JSON_LD
from betty.project.factory import ProjectDependentFactory
from betty.string import camel_case_to_kebab_case
Expand All @@ -20,11 +19,11 @@
StaticUrlGenerator as StdStaticUrlGenerator,
)
from betty.url.proxy import ProxyLocalizedUrlGenerator
from betty.model import Entity

if TYPE_CHECKING:
from betty.media_type import MediaType
from betty.project import Project
from betty.model import Entity
from betty.locale import Localey
from collections.abc import Mapping

Expand Down Expand Up @@ -122,21 +121,16 @@ def generate(


class _EntityTypeDependentUrlGenerator(_ProjectUrlGenerator, StdLocalizedUrlGenerator):
_pattern_pattern: str
_pattern: str

def __init__(
self,
base_url: str,
root_path: str,
locales: Mapping[str, str],
clean_urls: bool,
entity_type: type[Entity],
):
super().__init__(base_url, root_path, locales, clean_urls)
self._entity_type = entity_type
self._pattern = self._pattern_pattern.format(
entity_type=camel_case_to_kebab_case(entity_type.plugin_id())
)

def _get_extension_and_locale(
self, media_type: MediaType, *, locale: Localey | None
Expand All @@ -151,11 +145,11 @@ def _get_extension_and_locale(

@final
class _EntityTypeUrlGenerator(_EntityTypeDependentUrlGenerator):
_pattern_pattern = "/{entity_type}/index.{{extension}}"
_pattern = "/{entity_type}/index.{extension}"

@override
def supports(self, resource: Any) -> bool:
return resource is self._entity_type
return isinstance(resource, type) and issubclass(resource, Entity)

@override
def generate(
Expand All @@ -170,6 +164,7 @@ def generate(
extension, locale = self._get_extension_and_locale(media_type, locale=locale)
return self._generate_from_path(
self._pattern.format(
entity_type=camel_case_to_kebab_case(resource.plugin_id()),
extension=extension,
),
absolute=absolute,
Expand All @@ -179,11 +174,11 @@ def generate(

@final
class _EntityUrlGenerator(_EntityTypeDependentUrlGenerator):
_pattern_pattern = "/{entity_type}/{{entity_id}}/index.{{extension}}"
_pattern = "/{entity_type}/{entity_id}/index.{extension}"

@override
def supports(self, resource: Any) -> bool:
return isinstance(resource, self._entity_type)
return isinstance(resource, Entity)

@override
def generate(
Expand All @@ -198,6 +193,7 @@ def generate(
extension, locale = self._get_extension_and_locale(media_type, locale=locale)
return self._generate_from_path(
self._pattern.format(
entity_type=camel_case_to_kebab_case(resource.plugin_id()),
entity_id=quote(resource.id),
extension=extension,
),
Expand Down Expand Up @@ -232,14 +228,8 @@ async def new_for_project(cls, project: Project) -> Self:
project.configuration.clean_urls,
)
return cls(
*(
_EntityTypeUrlGenerator(*args, entity_type)
for entity_type in await model.ENTITY_TYPE_REPOSITORY.select()
),
*(
_EntityUrlGenerator(*args, entity_type)
for entity_type in await model.ENTITY_TYPE_REPOSITORY.select()
),
_EntityTypeUrlGenerator(*args),
_EntityUrlGenerator(*args),
_LocalizedPathUrlGenerator(*args),
)

Expand Down

0 comments on commit 9a99a51

Please sign in to comment.