web/lib/django/contrib/databrowse/plugins/fieldchoices.py
changeset 0 0d40e90630ef
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 from django import http
       
     2 from django.db import models
       
     3 from django.contrib.databrowse.datastructures import EasyModel
       
     4 from django.contrib.databrowse.sites import DatabrowsePlugin
       
     5 from django.shortcuts import render_to_response
       
     6 from django.utils.text import capfirst
       
     7 from django.utils.encoding import smart_str, force_unicode
       
     8 from django.utils.safestring import mark_safe
       
     9 import urllib
       
    10 
       
    11 class FieldChoicePlugin(DatabrowsePlugin):
       
    12     def __init__(self, field_filter=None):
       
    13         # If field_filter is given, it should be a callable that takes a
       
    14         # Django database Field instance and returns True if that field should
       
    15         # be included. If field_filter is None, that all fields will be used.
       
    16         self.field_filter = field_filter
       
    17 
       
    18     def field_dict(self, model):
       
    19         """
       
    20         Helper function that returns a dictionary of all fields in the given
       
    21         model. If self.field_filter is set, it only includes the fields that
       
    22         match the filter.
       
    23         """
       
    24         if self.field_filter:
       
    25             return dict([(f.name, f) for f in model._meta.fields if self.field_filter(f)])
       
    26         else:
       
    27             return dict([(f.name, f) for f in model._meta.fields if not f.rel and not f.primary_key and not f.unique and not isinstance(f, (models.AutoField, models.TextField))])
       
    28 
       
    29     def model_index_html(self, request, model, site):
       
    30         fields = self.field_dict(model)
       
    31         if not fields:
       
    32             return u''
       
    33         return mark_safe(u'<p class="filter"><strong>View by:</strong> %s</p>' % \
       
    34             u', '.join(['<a href="fields/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
       
    35 
       
    36     def urls(self, plugin_name, easy_instance_field):
       
    37         if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
       
    38             field_value = smart_str(easy_instance_field.raw_value)
       
    39             return [mark_safe(u'%s%s/%s/%s/' % (
       
    40                 easy_instance_field.model.url(),
       
    41                 plugin_name, easy_instance_field.field.name,
       
    42                 urllib.quote(field_value, safe='')))]
       
    43 
       
    44     def model_view(self, request, model_databrowse, url):
       
    45         self.model, self.site = model_databrowse.model, model_databrowse.site
       
    46         self.fields = self.field_dict(self.model)
       
    47 
       
    48         # If the model has no fields with choices, there's no point in going
       
    49         # further.
       
    50         if not self.fields:
       
    51             raise http.Http404('The requested model has no fields.')
       
    52 
       
    53         if url is None:
       
    54             return self.homepage_view(request)
       
    55         url_bits = url.split('/', 1)
       
    56         if self.fields.has_key(url_bits[0]):
       
    57             return self.field_view(request, self.fields[url_bits[0]], *url_bits[1:])
       
    58 
       
    59         raise http.Http404('The requested page does not exist.')
       
    60 
       
    61     def homepage_view(self, request):
       
    62         easy_model = EasyModel(self.site, self.model)
       
    63         field_list = self.fields.values()
       
    64         field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
       
    65         return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
       
    66 
       
    67     def field_view(self, request, field, value=None):
       
    68         easy_model = EasyModel(self.site, self.model)
       
    69         easy_field = easy_model.field(field.name)
       
    70         if value is not None:
       
    71             obj_list = easy_model.objects(**{field.name: value})
       
    72             return render_to_response('databrowse/fieldchoice_detail.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'value': value, 'object_list': obj_list})
       
    73         obj_list = [v[field.name] for v in self.model._default_manager.distinct().order_by(field.name).values(field.name)]
       
    74         return render_to_response('databrowse/fieldchoice_list.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'object_list': obj_list})