From: Joseph Spiros Date: Tue, 26 Apr 2011 15:59:19 +0000 (-0400) Subject: Merge branch 'master' of git://github.com/melinath/philo X-Git-Tag: philo-0.9~14 X-Git-Url: http://git.ithinksw.org/philo.git/commitdiff_plain/b3fd01202e71b1a43ab372b8f19e9ff6f13dae7b?hp=8a7ab75997519a2e99d8a1bf7218af016eaf187d Merge branch 'master' of git://github.com/melinath/philo * 'master' of git://github.com/melinath/philo: Added slug to the context for ajax searches. Added search.result_template to the context for search views with ajax enabled. Added support for limit_choices_to use in the ModelLookupWidget and switched its output generation from concatanation to array joining. Corrected Page.clean_fields method's handling of the exclude kwarg. Added sortable_field_name to the collection member inline for grappelli. Set GoogleSearch to allow default args and to default to a search within the current site. --- diff --git a/admin/collections.py b/admin/collections.py index dfc4826..d422b74 100644 --- a/admin/collections.py +++ b/admin/collections.py @@ -10,6 +10,7 @@ class CollectionMemberInline(admin.TabularInline): classes = COLLAPSE_CLASSES allow_add = True fields = ('member_content_type', 'member_object_id', 'index') + sortable_field_name = 'index' class CollectionAdmin(admin.ModelAdmin): diff --git a/admin/widgets.py b/admin/widgets.py index 7a47c63..aa0aa30 100644 --- a/admin/widgets.py +++ b/admin/widgets.py @@ -1,6 +1,6 @@ from django import forms from django.conf import settings -from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.admin.widgets import FilteredSelectMultiple, url_params_from_lookup_dict from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe from django.utils.text import truncate_words @@ -10,28 +10,34 @@ from django.utils.html import escape class ModelLookupWidget(forms.TextInput): # is_hidden = False - def __init__(self, content_type, attrs=None): + def __init__(self, content_type, attrs=None, limit_choices_to=None): self.content_type = content_type + self.limit_choices_to = limit_choices_to super(ModelLookupWidget, self).__init__(attrs) def render(self, name, value, attrs=None): related_url = '../../../%s/%s/' % (self.content_type.app_label, self.content_type.model) + params = url_params_from_lookup_dict(self.limit_choices_to) + if params: + url = u'?' + u'&'.join([u'%s=%s' % (k, v) for k, v in params.items()]) + else: + url = u'' if attrs is None: attrs = {} - if not attrs.has_key('class'): + if "class" not in attrs: attrs['class'] = 'vForeignKeyRawIdAdminField' - output = super(ModelLookupWidget, self).render(name, value, attrs) - output += '' % (related_url, name) - output += '%s' % (settings.ADMIN_MEDIA_PREFIX, _('Lookup')) - output += '' + output = [super(ModelLookupWidget, self).render(name, value, attrs)] + output.append('' % (related_url, url, name)) + output.append('%s' % (settings.ADMIN_MEDIA_PREFIX, _('Lookup'))) + output.append('') if value: value_class = self.content_type.model_class() try: value_object = value_class.objects.get(pk=value) - output += ' %s' % escape(truncate_words(value_object, 14)) + output.append(' %s' % escape(truncate_words(value_object, 14))) except value_class.DoesNotExist: pass - return mark_safe(output) + return mark_safe(u''.join(output)) class TagFilteredSelectMultiple(FilteredSelectMultiple): diff --git a/contrib/sobol/models.py b/contrib/sobol/models.py index e4e4202..ee8187d 100644 --- a/contrib/sobol/models.py +++ b/contrib/sobol/models.py @@ -198,7 +198,7 @@ class SearchView(MultiView): }) else: context.update({ - 'searches': [{'verbose_name': verbose_name, 'url': self.reverse('ajax_api_view', kwargs={'slug': slug}, node=request.node)} for slug, verbose_name in registry.iterchoices() if slug in self.searches] + 'searches': [{'verbose_name': verbose_name, 'slug': slug, 'url': self.reverse('ajax_api_view', kwargs={'slug': slug}, node=request.node), 'result_template': registry[slug].result_template} for slug, verbose_name in registry.iterchoices() if slug in self.searches] }) else: form = SearchForm() diff --git a/contrib/sobol/search.py b/contrib/sobol/search.py index 8c695c6..39b93c7 100644 --- a/contrib/sobol/search.py +++ b/contrib/sobol/search.py @@ -300,10 +300,21 @@ class JSONSearch(URLSearch): class GoogleSearch(JSONSearch): search_url = "http://ajax.googleapis.com/ajax/services/search/web" - query_format_str = "?v=1.0&q=%s" # TODO: Change this template to reflect the app's actual name. result_template = 'search/googlesearch.html' _cache_timeout = 60 + verbose_name = "Google search (current site)" + + @property + def query_format_str(self): + default_args = self.default_args + if default_args: + default_args += " " + return "?v=1.0&q=%s%%s" % urlquote_plus(default_args).replace('%', '%%') + + @property + def default_args(self): + return "site:%s" % Site.objects.get_current().domain def parse_response(self, response, limit=None): responseData = json.loads(response.read())['responseData'] diff --git a/models/pages.py b/models/pages.py index 86db88f..2221ee4 100644 --- a/models/pages.py +++ b/models/pages.py @@ -171,6 +171,9 @@ class Page(View): return self.title def clean_fields(self, exclude=None): + if exclude is None: + exclude = [] + try: super(Page, self).clean_fields(exclude) except ValidationError, e: