Author: floguy
Date: Sat Sep 20 19:26:34 2008
New Revision: 12
Modified:
trunk/things/fields.py
trunk/things/options.py
trunk/things/sites.py
trunk/things/templates/things/detail.html
trunk/things/templates/things/list.html
trunk/things/templatetags/things_tags.py
trunk/thingsproject/dev.db
trunk/thingsproject/twitter/thing.py
trunk/thingsproject/urls.py
Log:
Refactored options.py and sites.py to make options standalone and not
depend on a particular site. Also, made a BaseThing object whose main
interface with the database is a QuerySet, which will allow for custom
Thing objects which don't depend on a specific model, but on a query
against that model.
Modified: trunk/things/fields.py
==============================================================================
--- trunk/things/fields.py (original)
+++ trunk/things/fields.py Sat Sep 20 19:26:34 2008
@@ -66,14 +66,12 @@
return reverse('%s_%s_list_asc' % (
self.parent.name_prefix, self.field_url),
kwargs={
- 'app_label': self.parent.model._meta.app_label,
- 'model_name': self.parent.model._meta.module_name,
+ 'url_prefix': self.parent.url_prefix,
})
def full_url_desc(self):
return reverse('%s_%s_list_desc' % (
self.parent.name_prefix, self.field_url),
kwargs={
- 'app_label': self.parent.model._meta.app_label,
- 'model_name': self.parent.model._meta.module_name,
+ 'url_prefix': self.parent.url_prefix,
})
Modified: trunk/things/options.py
==============================================================================
--- trunk/things/options.py (original)
+++ trunk/things/options.py Sat Sep 20 19:26:34 2008
@@ -1,6 +1,6 @@
import re
from django.conf.urls.defaults import *
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.template.loader import select_template
@@ -9,89 +9,125 @@
DETAIL_RE = re.compile('^(\d+)/$')
-class ModelThingMetaclass(type):
+class BaseThingMetaclass(type):
def __new__(cls, name, bases, attrs):
fields = {}
for k, v in attrs.iteritems():
if isinstance(v, BaseField):
fields[k] = v
attrs['fields'] = fields
- new_class = super(ModelThingMetaclass, cls).__new__(cls, name,
bases,
+ new_class = super(BaseThingMetaclass, cls).__new__(cls, name,
bases,
attrs)
return new_class
-class ModelThing(object):
- __metaclass__ = ModelThingMetaclass
+class BaseThing(object):
+ __metaclass__ = BaseThingMetaclass
fields = {}
- comments = True
+ detail_template_name = None
+ list_template_name = None
+ url_prefix = None
+ search = []
- def __init__(self, model, thing_site):
- self.model = model
- self.opts = model._meta
- self.thing_site = thing_site
- super(ModelThing, self).__init__() # TODO: Think about order of
operations
+ def __init__(self, qs):
+ self.qs = qs
+ if not self.url_prefix:
+ self.url_prefix = "%s/%s" % (self.qs.model._meta.app_label,
+ self.qs.model._meta.module_name)
for (name, field) in self.fields.iteritems():
assert isinstance(field, BaseField) == True
field.parent = self
field.field_name = name
+ if not self.detail_template_name:
+ self.detail_template_name = self.qs.model._meta.module_name
+ if not self.list_template_name:
+ self.list_template_name = self.qs.model._meta.module_name
- def urls(self, prefix, name_prefix):
- self.name_prefix = name_prefix # Is this robust enough? Needs
testing.
- tmp_urls = [
- url('%sorder/%s/%s/' % (prefix, field.field_url,
field.url_asc),
- self.list_view,
- {
- 'descending': False,
- 'field': self.fields.get(field.field_name, None),
- },
- name='%s_%s_list_asc' % (name_prefix, field.field_url))
- for (name, field) in self.fields.iteritems()
- ]
- tmp_urls.extend([
- url('%sorder/%s/%s/' % (prefix, field.field_url,
field.url_desc),
- self.list_view,
- {
- 'descending': True,
- 'field': self.fields.get(field.field_name, None)
- },
- name='%s_%s_list_desc' % (name_prefix, field.field_url))
- for (name, field) in self.fields.iteritems()
- ])
- return patterns('', *tmp_urls)
-
- def list_view(self, request, descending=False, app_label=None,
model_name=None, field=None):
- assert app_label is None or app_label == self.opts.app_label
- assert model_name is None or model_name == self.opts.module_name
- items = self.model._default_manager.all()
+ def list_view(self, request, descending=False, field=None,
+ template_object_name='objects', template_name=None, **kwargs):
+ if template_name is None:
+ template_name = self.list_template_name
+ items = self.qs
+ terms = request.REQUEST.get('search', '')
+ if terms and bool(self.search):
+ kwargs = {}
+ if isinstance(self.search, basestring):
+ kwargs[self.search] = terms
+ else:
+ for search_field in self.search:
+ kwargs['%s__icontains' % (search_field,)] = terms
+ items = items.filter(**kwargs)
if field is not None:
pre = ''
if descending == True:
pre = '-'
items = items.order_by('%s%s' % (pre, field.field_name))
- context = {
- 'items': items,
+ templates = ['things/%s_list.html' % (template_name,),
+ 'things/list.html']
+ t = select_template(templates)
+ c = RequestContext(request, {
+ template_object_name: items,
'fields': self.fields.values(),
- 'field': field,
+ 'field': field,
+ 'url_prefix': self.url_prefix,
'name_prefix': self.name_prefix,
- }
- return render_to_response('things/list.html', context,
- context_instance=RequestContext(request))
+ 'search_enabled': bool(self.search),
+ 'terms': terms,
+ })
+ return HttpResponse(t.render(c))
- def detail_view(self, request, pk, template_object_name='object',
template_name=None):
+ def detail_view(self, request, pk, template_object_name='object',
+ template_name=None, url_prefix=None):
if template_name is None:
- template_name = self.opts.module_name
- obj = get_object_or_404(self.model, pk=pk)
- templates = ['things/%s_detail.html' % (template_name,),
- 'things/detail.html']
+ template_name = self.detail_template_name
+ try:
+ obj = self.qs.get(pk=pk)
+ except self.qs.model.DoesNotExist:
+ raise Http404
list_url = reverse('%s_list' % (self.name_prefix,), kwargs={
- 'app_label': self.opts.app_label,
- 'model_name': self.opts.module_name,
+ 'url_prefix': self.url_prefix,
})
+ templates = ['things/%s_detail.html' % (template_name,),
+ 'things/detail.html']
t = select_template(templates)
c = RequestContext(request, {
template_object_name: obj,
- 'comments': self.comments,
'list_url': list_url,
})
- return HttpResponse(t.render(c))
\ No newline at end of file
+ return HttpResponse(t.render(c))
+
+ def urls(self, prefix='^', name_prefix=None):
+ self.name_prefix = name_prefix # Is this robust enough? Needs
testing.
+ tmp_urls = [
+ url(r'%s(?P<url_prefix>%s)/$' % (prefix, self.url_prefix),
+ self.list_view, name='%s_list' % name_prefix),
+ url(r'%s(?P<url_prefix>%s)/detail/(?P<pk>\d+)/$' % (prefix,
+ self.url_prefix),
+ self.detail_view, name='%s_detail' % name_prefix)
+ ]
+ tmp_urls.extend([
+ url('%s(?P<url_prefix>%s)/order/%s/%s/' % (prefix,
self.url_prefix, field.field_url,
+ field.url_asc),
+ self.list_view,
+ {'descending': False,
+ 'field': self.fields.get(field.field_name, None),},
+ name='%s_%s_list_asc' % (name_prefix, field.field_url))
+ for (name, field) in self.fields.iteritems()
+ ])
+ tmp_urls.extend([
+ url('%s(?P<url_prefix>%s)/order/%s/%s/' % (prefix,
self.url_prefix, field.field_url,
+ field.url_desc),
+ self.list_view,
+ {'descending': True,
+ 'field': self.fields.get(field.field_name, None)},
+ name='%s_%s_list_desc' % (name_prefix, field.field_url))
+ for (name, field) in self.fields.iteritems()
+ ])
+ return patterns('', *tmp_urls)
+
+class ModelThing(BaseThing):
+ def __init__(self, model):
+ self.model = model
+ self.opts = model._meta
+ qs = model._default_manager.all()
+ super(ModelThing, self).__init__(qs)
\ No newline at end of file
Modified: trunk/things/sites.py
==============================================================================
--- trunk/things/sites.py (original)
+++ trunk/things/sites.py Sat Sep 20 19:26:34 2008
@@ -36,7 +36,7 @@
if model in self._registry:
raise AlreadyRegistered('The model %s is already
registered' % model.__name__)
if not thing_class:
- thing = things.ModelThing(model, self)
+ thing = things.ModelThing(model)
thing.fields = {}
for field in model._meta.fields:
of = things.OrderField()
@@ -44,7 +44,7 @@
of.field_name = field.attname
thing.fields[field.attname] = of
else:
- thing = thing_class(model, self)
+ thing = thing_class(model)
self._registry[model] = thing
def unregister(self, model_or_iterable):
@@ -64,44 +64,15 @@
urlpatterns = patterns('',
url(r'%s$' % (prefix,), self.index, name="%s_index" %
self.name_prefix)
)
- if any([o.comments for o in self._registry.itervalues()]):
- urlpatterns += patterns('',
- url(r'%scomments/' % (prefix,),
- include('django.contrib.comments.urls')),
- )
for (model, model_thing) in self._registry.iteritems():
- urlpatterns += patterns('',
- url(r'%s(?P<app_label>%s)/(?P<model_name>%s)/$' % (prefix,
- model._meta.app_label, model._meta.module_name),
- self.dispatch, {'func': 'list_view'},
- name='%s_list' % self.name_prefix),
-
url(r'%s(?P<app_label>%s)/(?P<model_name>%s)/detail/(?P<pk>\d+)/$' %
(prefix,
- model._meta.app_label, model._meta.module_name),
- self.dispatch, {'func': 'detail_view'},
- name='%s_detail' % self.name_prefix)
- )
- urlpatterns +=
model_thing.urls("%s(?P<app_label>%s)/(?P<model_name>%s)/" % (prefix,
model._meta.app_label, model._meta.module_name), self.name_prefix)
+ urlpatterns += model_thing.urls(prefix, self.name_prefix)
return urlpatterns
-
- def dispatch(self, request, *args, **kwargs):
- from django.db import models
- app_label = kwargs.pop('app_label')
- model_name = kwargs.pop('model_name')
- model = models.get_model(app_label, model_name)
- if model is None:
- raise Http404("App %r, model %r, not found." % (app_label,
model_name))
- try:
- thing_obj = self._registry[model]
- except KeyError:
- raise Http404("This model exists but has not been registered
with the thing site.")
- return getattr(thing_obj, kwargs.pop('func'))(request, *args,
**kwargs)
def index(self, request):
models = [{ 'model': m,
'model_thing': self._registry[m],
'url': reverse('%s_list' % self.name_prefix, kwargs={
- 'app_label': m._meta.app_label,
- 'model_name': m._meta.module_name,
+ 'url_prefix': self._registry[m].url_prefix,
}) } for m in self._registry.iterkeys()]
context = {
'models': models,
Modified: trunk/things/templates/things/detail.html
==============================================================================
--- trunk/things/templates/things/detail.html (original)
+++ trunk/things/templates/things/detail.html Sat Sep 20 19:26:34 2008
@@ -1,11 +1,2 @@
-{% load comments %}
<a href="{{ list_url }}">← Back to List</a>
-{{ object }}
-
-{% if comments %}
- {% get_comment_list for object as comment_list %}
- {% for comment in comment_list %}
- <p>{{ comment }}</p>
- {% endfor %}
- {% render_comment_form for object %}
-{% endif %}
\ No newline at end of file
+{{ object }}
\ No newline at end of file
Modified: trunk/things/templates/things/list.html
==============================================================================
--- trunk/things/templates/things/list.html (original)
+++ trunk/things/templates/things/list.html Sat Sep 20 19:26:34 2008
@@ -4,6 +4,12 @@
{% block main_content %}
<p>Order By:</p>
+ {% if search_enabled %}
+ <form method="GET" action="">
+ <input type="text" name="search" value="{{ terms }}" />
+ <input type="submit" value="Search" />
+ </form>
+ {% endif %}
<ul>
{% for field in fields %}
<li><a href="{{ field.full_url_asc }}">{{
field.verbose_name_asc }}</a></li>
@@ -11,8 +17,8 @@
{% endfor %}
</ul>
<ul>
- {% for item in items %}
- <li><a href="{% item_url name_prefix item %}">{{ item
}}</a></li>
+ {% for item in objects %}
+ <li><a href="{% item_url url_prefix name_prefix item %}">{{
item }}</a></li>
{% endfor %}
</ul>
{% endblock %}
Modified: trunk/things/templatetags/things_tags.py
==============================================================================
--- trunk/things/templatetags/things_tags.py (original)
+++ trunk/things/templatetags/things_tags.py Sat Sep 20 19:26:34 2008
@@ -3,10 +3,9 @@
register = template.Library()
-def item_url(name_prefix, item):
+def item_url(url_prefix, name_prefix, item):
return reverse('%s_detail' % name_prefix, kwargs={
- 'app_label': item._meta.app_label,
- 'model_name': item._meta.module_name,
+ 'url_prefix': url_prefix,
'pk': item.pk,
})
Modified: trunk/thingsproject/dev.db
==============================================================================
Binary files. No diff available.
Modified: trunk/thingsproject/twitter/thing.py
==============================================================================
--- trunk/thingsproject/twitter/thing.py (original)
+++ trunk/thingsproject/twitter/thing.py Sat Sep 20 19:26:34 2008
@@ -6,5 +6,7 @@
verbose_name_desc='Oldest', url_asc='newest', url_desc='oldest',
field_url='date')
message = things.OrderField()
+ search = 'message'
+ url_prefix = 'tweet'
-things.site.register(Tweet, TweetThing)
+#things.site.register(Tweet, TweetThing)
Modified: trunk/thingsproject/urls.py
==============================================================================
--- trunk/thingsproject/urls.py (original)
+++ trunk/thingsproject/urls.py Sat Sep 20 19:26:34 2008
@@ -3,8 +3,13 @@
import things
admin.autodiscover()
-things.autodiscover()
+#things.autodiscover()
+
+from twitter.thing import TweetThing
+from twitter.models import Tweet
+
+tt = TweetThing(Tweet)
urlpatterns = patterns('',
(r'^admin/(.*)$', admin.site.root),
-) + things.site.urls()
\ No newline at end of file
+) + tt.urls()
\ No newline at end of file
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pinax-updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/pinax-updates?hl=en
-~----------~----~----~----~------~----~------~--~---