Source code for thorn.reverse
"""Tools for URL references."""
from __future__ import absolute_import, unicode_literals
from operator import attrgetter
from six import iteritems as items
from thorn._state import app_or_default
__all__ = ['model_reverser']
[docs]class model_reverser(object):
"""Describes how to get the canonical URL for a model instance.
Examples:
>>> # This:
>>> model_reverser('article-detail', uuid='uuid')
>>> # for an article instance will generate the URL by calling:
>>> reverse('article_detail', kwargs={'uuid': instance.uuid})
>>> # And this:
>>> model_reverser('article-detail', 'category.name', uuid='uuid')
>>> # for an article instance will generate the URL by calling:
>>> reverse('article-detail',
... args=[instance.category.name],
... kwargs={'uuid': instance.uuid},
... )
"""
def __init__(self, view_name, *args, **kwargs):
# type: (str, *Any, **Any) -> None
self.view_name = view_name
self.args = args
self.kwargs = kwargs
def __call__(self, instance, app=None, **kw):
# type: (Model, App, **Any) -> str
return app_or_default(app).reverse(
self.view_name,
args=[attrgetter(arg)(instance) for arg in self.args],
kwargs={
key: attrgetter(value)(instance)
for key, value in items(self.kwargs)
},
**kw
)