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 }}">&larr; 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to