from django.core.urlresolvers import reverse
from django.views.generic.list_detail import *
from django.views.generic.create_update import *
from django.conf.urls.defaults import *
'''
Model based generic views
Keep all view in View.listView
Example: get url for Create Connection form in template: {{ view.listView.CreateConnection.getUrl }}
'''
def getPatterns(model):
list = ('List','Update','Create','Delete')
urlpatterns = []
for action in list:
view = globals()[action+"View"](model, action)
urlpatterns += patterns('', url(view.urlpattern, view.requestView, name=view.name))
return urlpatterns
def getUrlByName(name):
return View.listView[name].getUrl()
def getListUrl(model):
return getUrlByName('List'+model.__name__)
class View(object):
listView={}
def __init__(self, model, action):
self.model = model
self.name=action+model.__name__
self.urlpattern = r'^%s/$' % action.lower()
self.title="%s %s" % (action, model.__name__)
self.listView[self.name] = self
def do(self, *args, **kwargs):
return None # Override
def requestView(self, request, **kwargs):
return self.do(request, extra_context={'view': self}, **kwargs)
def getUrl(self):
if not hasattr(self,'url'):
self.url=reverse(self.name)
return self.url
class ListView(View):
def __init__(self, model, name):
View.__init__(self, model, name)
self.queryset= model.objects.all()
self.title = "%ss list" % model.__name__
def do(self, request, **kwargs):
return object_list(request, self.queryset, **kwargs)
class CreateView(View):
def do(self, request, **kwargs):
redirect=getListUrl(self.model)
return create_object(request, model=self.model, post_save_redirect=redirect, **kwargs)
class ObjectView(View):
def __init__(self, model, name):
View.__init__(self, model, name)
self.urlpattern = r'^%s/(?P<object_id>\d+)/$' % name
def getUrl(self):
return "Not supported (use object instead)"
class UpdateView(ObjectView):
def do(self, request, **kwargs):
return update_object(request, model=self.model, post_save_redirect=getListUrl(self.model), **kwargs)
class DeleteView(ObjectView):
def do(self, request, **kwargs):
return delete_object(request, model=self.model, post_delete_redirect=getListUrl(self.model), **kwargs)