diff --git a/bsct/models.py b/bsct/models.py index f40750c..a23a774 100644 --- a/bsct/models.py +++ b/bsct/models.py @@ -1,5 +1,6 @@ from django.core.urlresolvers import reverse + class BSCTModelMixin( object ): """ Provides a default implementation for the url defining methods. @@ -13,33 +14,37 @@ def __init__( self, *args, **kwargs ): """ super( BSCTModelMixin, self ).__init__( *args, **kwargs ) - self.bsct_view_prefix = self.__class__.__name__.lower() + if not hasattr(self, 'bsct_view_prefix'): + self.bsct_view_prefix = self.__class__.__name__.lower() - def get_absolute_url( self ): + def get_absolute_url( self , kwargs={}): """ Returns the URL of the detail page for that instance. """ + kwargs.update({'pk': self.pk}) return reverse( - '%s_detail' % self.bsct_view_prefix, kwargs={'pk': self.pk } + '%s_detail' % self.bsct_view_prefix, kwargs=kwargs ) - def get_delete_url( self ): + def get_delete_url( self, kwargs={} ): """ Returns the URL of the deletion page for that instance. """ + kwargs.update({'pk': self.pk}) return reverse( - '%s_delete' % self.bsct_view_prefix, kwargs={'pk': self.pk } + '%s_delete' % self.bsct_view_prefix, kwargs=kwargs ) - def get_update_url( self ): + def get_update_url( self, kwargs={} ): """ Returns the URL of the update page for that instance. """ + kwargs.update({'pk': self.pk}) return reverse( - '%s_update' % self.bsct_view_prefix, kwargs={'pk': self.pk } + '%s_update' % self.bsct_view_prefix, kwargs=kwargs ) - def get_list_url( self ): + def get_list_url( self, kwargs={} ): """ Returns the URL of the listing page for the model. """ @@ -47,11 +52,11 @@ def get_list_url( self ): # templates in the # context of a model instance, making an instance # method more practical. ( Avoids having to create templatetags to # call class method on instance class. ) - return reverse( '%s_list' % self.bsct_view_prefix ) + return reverse( '%s_list' % self.bsct_view_prefix, kwargs=kwargs) @classmethod - def get_create_url( cls ): + def get_create_url( cls, kwargs={} ): """ Returns the URL of the creation page for the model. """ - return reverse( '%s_create' % cls.__name__.lower() ) + return reverse( '%s_create' % cls.__name__.lower(), kwargs=kwargs ) diff --git a/bsct/templatetags/bscttags.py b/bsct/templatetags/bscttags.py index 3765214..0f400f7 100644 --- a/bsct/templatetags/bscttags.py +++ b/bsct/templatetags/bscttags.py @@ -108,3 +108,11 @@ def get_detail( instance ): details[ field ] = detail_method() return details + + +# URL Helper +# ------------------------- +@register.assignment_tag +def get_url_from_model(instance, url_method='', **kwargs): + if url_method: + return getattr(instance, url_method)(kwargs=kwargs) \ No newline at end of file diff --git a/bsct/urls.py b/bsct/urls.py index d53fdbf..6261e3c 100644 --- a/bsct/urls.py +++ b/bsct/urls.py @@ -1,7 +1,7 @@ +import importlib from django.conf.urls import patterns, url from django.core.urlresolvers import reverse_lazy -from bsct import views as bsct_views class URLGenerator( object ): """ @@ -15,21 +15,41 @@ class URLGenerator( object ): - ``lowercasemodelname_delete``: For the DeleteView. """ - def __init__( self, model, bsct_view_prefix = None ): + def __init__(self, model, bsct_view_prefix=None, view_class=None): """ Internalize the model and set the view prefix. """ self.model = model - self.bsct_view_prefix = bsct_view_prefix or model.__name__.lower() + if bsct_view_prefix is None: + self.bsct_view_prefix = model.__name__.lower() + else: + self.bsct_view_prefix = bsct_view_prefix + + if len(bsct_view_prefix) > 1: + self.bsct_view_name = self.bsct_view_prefix + self.bsct_view_prefix += '/' + else: + # view_prefix not used + self.bsct_view_name = model.__name__.lower() + + # determine default view class for views + if view_class is None: + view_class = 'bsct' + for v in ['CreateView', 'UpdateView', 'ListView', 'DeleteView', 'DetailView']: + try: + setattr(self, v, getattr(importlib.import_module(view_class+'.views'), v)) + except ImportError as e: + print e + setattr(self, v, getattr(importlib.import_module('bsct.views'), v)) def get_create_url( self, **kwargs ): """ Generate the create URL for the model. """ return url( - r'%s/create/?$' % self.bsct_view_prefix, - bsct_views.CreateView.as_view( model = self.model, **kwargs ), - name = '%s_create' % self.bsct_view_prefix, + r'%screate/?$' % self.bsct_view_prefix, + self.CreateView.as_view( model = self.model, **kwargs ), + name = '%s_create' % self.bsct_view_name, ) def get_update_url( self, **kwargs ): @@ -37,9 +57,9 @@ def get_update_url( self, **kwargs ): Generate the update URL for the model. """ return url( - r'%s/update/(?P\d+)/?$' % self.bsct_view_prefix, - bsct_views.UpdateView.as_view( model = self.model, **kwargs ), - name = '%s_update' % self.bsct_view_prefix, + r'%supdate/(?P\d+)/?$' % self.bsct_view_prefix, + self.UpdateView.as_view( model = self.model, **kwargs ), + name = '%s_update' % self.bsct_view_name, ) def get_list_url( self, **kwargs ): @@ -47,9 +67,9 @@ def get_list_url( self, **kwargs ): Generate the list URL for the model. """ return url( - r'%s/(list/?)?$' % self.bsct_view_prefix, - bsct_views.ListView.as_view( model = self.model, **kwargs ), - name = '%s_list' % self.bsct_view_prefix, + r'%s(list/?)?$' % self.bsct_view_prefix, + self.ListView.as_view( model = self.model, **kwargs ), + name = '%s_list' % self.bsct_view_name, ) def get_delete_url( self, **kwargs ): @@ -57,13 +77,13 @@ def get_delete_url( self, **kwargs ): Generate the delete URL for the model. """ return url( - r'%s/delete/(?P\d+)/?$' % self.bsct_view_prefix, - bsct_views.DeleteView.as_view( - model = self.model, + r'%sdelete/(?P\d+)/?$' % self.bsct_view_prefix, + self.DeleteView.as_view( + model = self.model, success_url = reverse_lazy('%s_list' % self.bsct_view_prefix), **kwargs ), - name = '%s_delete' % self.bsct_view_prefix, + name = '%s_delete' % self.bsct_view_name, ) def get_detail_url( self, **kwargs ): @@ -71,9 +91,9 @@ def get_detail_url( self, **kwargs ): Generate the detail URL for the model. """ return url( - r'%s/(?P\d+)/?$' % self.bsct_view_prefix, - bsct_views.DetailView.as_view( model = self.model, **kwargs ), - name = '%s_detail' % self.bsct_view_prefix, + r'%s(?P\d+)/?$' % self.bsct_view_prefix, + self.DetailView.as_view( model = self.model, **kwargs ), + name = '%s_detail' % self.bsct_view_name, ) def get_urlpatterns( self, paginate_by = 10 ): @@ -84,7 +104,8 @@ def get_urlpatterns( self, paginate_by = 10 ): return patterns( '', self.get_create_url(), self.get_update_url(), - self.get_list_url( paginate_by = paginate_by ), self.get_delete_url(), - self.get_detail_url() + self.get_detail_url(), + # must be at end if prefix is empty + self.get_list_url( paginate_by = paginate_by ), )