summaryrefslogtreecommitdiff
path: root/parts/django/django/contrib/databrowse/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'parts/django/django/contrib/databrowse/plugins')
-rw-r--r--parts/django/django/contrib/databrowse/plugins/__init__.py0
-rw-r--r--parts/django/django/contrib/databrowse/plugins/calendars.py86
-rw-r--r--parts/django/django/contrib/databrowse/plugins/fieldchoices.py74
-rw-r--r--parts/django/django/contrib/databrowse/plugins/objects.py14
4 files changed, 174 insertions, 0 deletions
diff --git a/parts/django/django/contrib/databrowse/plugins/__init__.py b/parts/django/django/contrib/databrowse/plugins/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/parts/django/django/contrib/databrowse/plugins/__init__.py
diff --git a/parts/django/django/contrib/databrowse/plugins/calendars.py b/parts/django/django/contrib/databrowse/plugins/calendars.py
new file mode 100644
index 0000000..9bbd02d
--- /dev/null
+++ b/parts/django/django/contrib/databrowse/plugins/calendars.py
@@ -0,0 +1,86 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+from django.utils.text import capfirst
+from django.utils.encoding import force_unicode
+from django.utils.safestring import mark_safe
+from django.views.generic import date_based
+from django.utils import datetime_safe
+
+class CalendarPlugin(DatabrowsePlugin):
+ def __init__(self, field_names=None):
+ self.field_names = field_names
+
+ def field_dict(self, model):
+ """
+ Helper function that returns a dictionary of all DateFields or
+ DateTimeFields in the given model. If self.field_names is set, it takes
+ take that into account when building the dictionary.
+ """
+ if self.field_names is None:
+ return dict([(f.name, f) for f in model._meta.fields if isinstance(f, models.DateField)])
+ else:
+ return dict([(f.name, f) for f in model._meta.fields if isinstance(f, models.DateField) and f.name in self.field_names])
+
+ def model_index_html(self, request, model, site):
+ fields = self.field_dict(model)
+ if not fields:
+ return u''
+ return mark_safe(u'<p class="filter"><strong>View calendar by:</strong> %s</p>' % \
+ u', '.join(['<a href="calendars/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
+
+ def urls(self, plugin_name, easy_instance_field):
+ if isinstance(easy_instance_field.field, models.DateField):
+ d = easy_instance_field.raw_value
+ return [mark_safe(u'%s%s/%s/%s/%s/%s/' % (
+ easy_instance_field.model.url(),
+ plugin_name, easy_instance_field.field.name,
+ str(d.year),
+ datetime_safe.new_date(d).strftime('%b').lower(),
+ d.day))]
+
+ def model_view(self, request, model_databrowse, url):
+ self.model, self.site = model_databrowse.model, model_databrowse.site
+ self.fields = self.field_dict(self.model)
+
+ # If the model has no DateFields, there's no point in going further.
+ if not self.fields:
+ raise http.Http404('The requested model has no calendars.')
+
+ if url is None:
+ return self.homepage_view(request)
+ url_bits = url.split('/')
+ if self.fields.has_key(url_bits[0]):
+ return self.calendar_view(request, self.fields[url_bits[0]], *url_bits[1:])
+
+ raise http.Http404('The requested page does not exist.')
+
+ def homepage_view(self, request):
+ easy_model = EasyModel(self.site, self.model)
+ field_list = self.fields.values()
+ field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
+ return render_to_response('databrowse/calendar_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
+
+ def calendar_view(self, request, field, year=None, month=None, day=None):
+ easy_model = EasyModel(self.site, self.model)
+ queryset = easy_model.get_query_set()
+ extra_context = {'root_url': self.site.root_url, 'model': easy_model, 'field': field}
+ if day is not None:
+ return date_based.archive_day(request, year, month, day, queryset, field.name,
+ template_name='databrowse/calendar_day.html', allow_empty=False, allow_future=True,
+ extra_context=extra_context)
+ elif month is not None:
+ return date_based.archive_month(request, year, month, queryset, field.name,
+ template_name='databrowse/calendar_month.html', allow_empty=False, allow_future=True,
+ extra_context=extra_context)
+ elif year is not None:
+ return date_based.archive_year(request, year, queryset, field.name,
+ template_name='databrowse/calendar_year.html', allow_empty=False, allow_future=True,
+ extra_context=extra_context)
+ else:
+ return date_based.archive_index(request, queryset, field.name,
+ template_name='databrowse/calendar_main.html', allow_empty=True, allow_future=True,
+ extra_context=extra_context)
+ assert False, ('%s, %s, %s, %s' % (field, year, month, day))
diff --git a/parts/django/django/contrib/databrowse/plugins/fieldchoices.py b/parts/django/django/contrib/databrowse/plugins/fieldchoices.py
new file mode 100644
index 0000000..8f77792
--- /dev/null
+++ b/parts/django/django/contrib/databrowse/plugins/fieldchoices.py
@@ -0,0 +1,74 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+from django.utils.text import capfirst
+from django.utils.encoding import smart_str, force_unicode
+from django.utils.safestring import mark_safe
+import urllib
+
+class FieldChoicePlugin(DatabrowsePlugin):
+ def __init__(self, field_filter=None):
+ # If field_filter is given, it should be a callable that takes a
+ # Django database Field instance and returns True if that field should
+ # be included. If field_filter is None, that all fields will be used.
+ self.field_filter = field_filter
+
+ def field_dict(self, model):
+ """
+ Helper function that returns a dictionary of all fields in the given
+ model. If self.field_filter is set, it only includes the fields that
+ match the filter.
+ """
+ if self.field_filter:
+ return dict([(f.name, f) for f in model._meta.fields if self.field_filter(f)])
+ else:
+ 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))])
+
+ def model_index_html(self, request, model, site):
+ fields = self.field_dict(model)
+ if not fields:
+ return u''
+ return mark_safe(u'<p class="filter"><strong>View by:</strong> %s</p>' % \
+ u', '.join(['<a href="fields/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
+
+ def urls(self, plugin_name, easy_instance_field):
+ if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
+ field_value = smart_str(easy_instance_field.raw_value)
+ return [mark_safe(u'%s%s/%s/%s/' % (
+ easy_instance_field.model.url(),
+ plugin_name, easy_instance_field.field.name,
+ urllib.quote(field_value, safe='')))]
+
+ def model_view(self, request, model_databrowse, url):
+ self.model, self.site = model_databrowse.model, model_databrowse.site
+ self.fields = self.field_dict(self.model)
+
+ # If the model has no fields with choices, there's no point in going
+ # further.
+ if not self.fields:
+ raise http.Http404('The requested model has no fields.')
+
+ if url is None:
+ return self.homepage_view(request)
+ url_bits = url.split('/', 1)
+ if self.fields.has_key(url_bits[0]):
+ return self.field_view(request, self.fields[url_bits[0]], *url_bits[1:])
+
+ raise http.Http404('The requested page does not exist.')
+
+ def homepage_view(self, request):
+ easy_model = EasyModel(self.site, self.model)
+ field_list = self.fields.values()
+ field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
+ return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
+
+ def field_view(self, request, field, value=None):
+ easy_model = EasyModel(self.site, self.model)
+ easy_field = easy_model.field(field.name)
+ if value is not None:
+ obj_list = easy_model.objects(**{field.name: value})
+ 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})
+ obj_list = [v[field.name] for v in self.model._default_manager.distinct().order_by(field.name).values(field.name)]
+ return render_to_response('databrowse/fieldchoice_list.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'object_list': obj_list})
diff --git a/parts/django/django/contrib/databrowse/plugins/objects.py b/parts/django/django/contrib/databrowse/plugins/objects.py
new file mode 100644
index 0000000..7326566
--- /dev/null
+++ b/parts/django/django/contrib/databrowse/plugins/objects.py
@@ -0,0 +1,14 @@
+from django import http
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+import urlparse
+
+class ObjectDetailPlugin(DatabrowsePlugin):
+ def model_view(self, request, model_databrowse, url):
+ # If the object ID wasn't provided, redirect to the model page, which is one level up.
+ if url is None:
+ return http.HttpResponseRedirect(urlparse.urljoin(request.path, '../'))
+ easy_model = EasyModel(model_databrowse.site, model_databrowse.model)
+ obj = easy_model.object_by_pk(url)
+ return render_to_response('databrowse/object_detail.html', {'object': obj, 'root_url': model_databrowse.site.root_url})