Source code for signoffs.core.urls.signoffs
"""
It can be very convenient for a signoff to know the endpoints to POST / DELETE their `Signet`.
In fact, the default renderers assume a signoff knows the URLs for sign and revoke requests.
This component can be extended to provide flexible url services to `Signoff` instances.
They are generally "injected" into the Signoff Type using a `SignoffUrlsManager` service descriptor
"""
from django.urls import reverse
from signoffs.core.utils import service
[docs]class SignoffInstanceUrls:
"""
Defines the urls for Signing and Revoking a Signoff instance
"""
# Define URL patterns for saving and revoking signoffs
save_url_name: str = ""
revoke_url_name: str = ""
def __init__(self, signoff_instance, save_url_name=None, revoke_url_name=None):
"""Override default actions, or leave parameter None to use class default"""
self.signoff = signoff_instance
self.save_url_name = save_url_name or self.save_url_name
self.revoke_url_name = revoke_url_name or self.revoke_url_name
[docs] def get_save_url(self, args=None, kwargs=None):
"""Return the URL for requests to save the signoff"""
args = args or ()
kwargs = kwargs or {}
return (
reverse(self.save_url_name, args=args, kwargs=kwargs)
if self.save_url_name
else ""
)
[docs] def get_revoke_url(self, args=None, kwargs=None):
"""Return the URL for requests to revoke this signoff"""
args = args or (self.signoff.signet.pk,)
kwargs = kwargs or {}
return (
reverse(self.revoke_url_name, args=args, kwargs=kwargs)
if self.revoke_url_name
else ""
)
[docs]class SignoffUrlsManager(service(SignoffInstanceUrls)):
"""
A descriptor class that "injects" a SignoffInstanceUrls instance into a Signoff instance.
To inject custom URL services:
- provide a custom service_class: `urls=SignoffUrlsManager(service_class=MyInstanceUrls)`
- OR specialize class attributes:
`SignoffUrlsManager = utils.service(SignoffInstanceUrls, revoke_url_name="my:app:revoke_view")`
- OR both... `SignoffUrlsManager = utils.service(MyInstanceUrls)`
"""