Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions bsct/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.core.urlresolvers import reverse


class BSCTModelMixin( object ):
"""
Provides a default implementation for the url defining methods.
Expand All @@ -13,45 +14,49 @@ 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.
"""
# This used to be a class method, however it is only called in
# 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 )
8 changes: 8 additions & 0 deletions bsct/templatetags/bscttags.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
63 changes: 42 additions & 21 deletions bsct/urls.py
Original file line number Diff line number Diff line change
@@ -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 ):
"""
Expand All @@ -15,65 +15,85 @@ 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 ):
"""
Generate the update URL for the model.
"""
return url(
r'%s/update/(?P<pk>\d+)/?$' % self.bsct_view_prefix,
bsct_views.UpdateView.as_view( model = self.model, **kwargs ),
name = '%s_update' % self.bsct_view_prefix,
r'%supdate/(?P<pk>\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 ):
"""
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 ):
"""
Generate the delete URL for the model.
"""
return url(
r'%s/delete/(?P<pk>\d+)/?$' % self.bsct_view_prefix,
bsct_views.DeleteView.as_view(
model = self.model,
r'%sdelete/(?P<pk>\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 ):
"""
Generate the detail URL for the model.
"""
return url(
r'%s/(?P<pk>\d+)/?$' % self.bsct_view_prefix,
bsct_views.DetailView.as_view( model = self.model, **kwargs ),
name = '%s_detail' % self.bsct_view_prefix,
r'%s(?P<pk>\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 ):
Expand All @@ -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 ),
)