Author: jacob
Date: 2008-09-01 23:09:40 -0500 (Mon, 01 Sep 2008)
New Revision: 8844

Added:
   djangoproject.com/djangodocs/forms.py
   djangoproject.com/djangodocs/templates/docs/search.html
   djangoproject.com/djangodocs/templates/docs/search_form.html
   djangoproject.com/djangodocs/templatetags/
   djangoproject.com/djangodocs/templatetags/__init__.py
   djangoproject.com/djangodocs/templatetags/docs.py
Modified:
   djangoproject.com/djangodocs/settings.py
   djangoproject.com/djangodocs/templates/docs/doc.html
   djangoproject.com/djangodocs/urls.py
   djangoproject.com/djangodocs/views.py
Log:
[djangoproject.com] Fixed #8723: added search, via a Google coop search. Thanks 
to frasern for figuring this out and providing detailed instructions.


Added: djangoproject.com/djangodocs/forms.py
===================================================================
--- djangoproject.com/djangodocs/forms.py                               (rev 0)
+++ djangoproject.com/djangodocs/forms.py       2008-09-02 04:09:40 UTC (rev 
8844)
@@ -0,0 +1,13 @@
+from django import newforms as forms
+
+AS_Q_CHOICES = (
+    ('more:dev_docs', 'Latest'),
+    ('more:1.0_docs', '1.0'),
+    ('more:0.96_docs', '0.96'),
+    ('more:all_docs', 'All'),
+)
+
+class SearchForm(forms.Form):
+    q = forms.CharField(widget=forms.TextInput({'class': 'query'}))
+    as_q = forms.ChoiceField(choices=AS_Q_CHOICES, widget=forms.RadioSelect, 
initial='more:dev_docs')
+    
\ No newline at end of file

Modified: djangoproject.com/djangodocs/settings.py
===================================================================
--- djangoproject.com/djangodocs/settings.py    2008-09-02 03:40:42 UTC (rev 
8843)
+++ djangoproject.com/djangodocs/settings.py    2008-09-02 04:09:40 UTC (rev 
8844)
@@ -1,8 +1,9 @@
 from django_website.settings import *
 
 PREPEND_WWW = False
-INSTALLED_APPS = []
+INSTALLED_APPS = ['djangodocs']
 TEMPLATE_DIRS = [os.path.join(os.path.dirname(__file__), "templates")] + 
TEMPLATE_DIRS
+TEMPLATE_CONTEXT_PROCESSORS = ['django.core.context_processors.request']
 ROOT_URLCONF = 'djangodocs.urls'
 CACHE_MIDDLEWARE_KEY_PREFIX = 'djangodocs'
 

Modified: djangoproject.com/djangodocs/templates/docs/doc.html
===================================================================
--- djangoproject.com/djangodocs/templates/docs/doc.html        2008-09-02 
03:40:42 UTC (rev 8843)
+++ djangoproject.com/djangodocs/templates/docs/doc.html        2008-09-02 
04:09:40 UTC (rev 8844)
@@ -4,10 +4,36 @@
 
 {% block extrahead %}
   {{ block.super }}
+  <style type="text/css" media="screen">
+    #docs-search {
+      color: #000;
+      float: right;
+    }
+    #docs-search form {
+      font-size: 92%;
+      margin: 0;
+      padding: 1em 1em 0;
+      white-space: nowrap;
+    }
+    form.search ul {
+      list-style: none;
+      margin: 0;
+      padding: 0;
+    }
+    form.search li {
+      display: inline;
+      padding-right: 1em;
+    }
+    form.search .query {
+      width: 18em;
+    }
+  </style>
   <link rel="stylesheet" 
href="http://media.djangoproject.com/css/pygments.css"; type="text/css" />
 {% endblock %}
 
-{% block billboard %}<h2><a href="{{ home }}">Django documentation</a></h2>{% 
endblock %}
+{% block billboard %}
+  <h2><a href="{{ home }}">Django documentation</a></h2>
+{% endblock %}
 
 {% block content %}
 
@@ -39,6 +65,12 @@
     {% endblock %}
   {% endblock %}
   
+  {% block search %}
+    <h2>Search</h2>
+    {% load docs %}
+    {% search_form %}
+  {% endblock %}
+  
   {% block browse-wrapper %}
     <h2>Browse</h2>
     <ul>
@@ -73,6 +105,8 @@
     </ul>
   {% endblock %}
   
-  <h3>Last update:</h3>
-  <div>{{ update_date|date:"F j, Y, P" }} (<a 
href="http://www.timeanddate.com/worldclock/city.html?n=64";>CDT</a>)</div>
+  {% block last-update-wrapper %}
+    <h3>Last update:</h3>
+    <div>{{ update_date|date:"F j, Y, P" }} (<a 
href="http://www.timeanddate.com/worldclock/city.html?n=64";>CDT</a>)</div>
+  {% endblock %}
 {% endblock %}

Added: djangoproject.com/djangodocs/templates/docs/search.html
===================================================================
--- djangoproject.com/djangodocs/templates/docs/search.html                     
        (rev 0)
+++ djangoproject.com/djangodocs/templates/docs/search.html     2008-09-02 
04:09:40 UTC (rev 8844)
@@ -0,0 +1,46 @@
+{% extends "docs/doc.html" %}
+
+{% load docs %}
+
+{% block title %}Search | Django Docuemtation{% endblock %}
+
+{% block extrahead %}
+  {{ block.super }}
+  <style type="text/css" media="screen">
+    #cse-search-results iframe {
+      width: 100%;
+    }
+  </style>
+{% endblock %}
+
+{% block toc-wrapper %}{% endblock %}
+
+{% block breadcrumbs-wrapper %}{% endblock %}
+
+{% block last-update-wrapper %}{% endblock %}
+
+{% block body %}
+  {% if query %}
+    <h1>Search Results</h1>
+    <div id="cse-search-results">
+      <div id="cse-search-results-js-required">
+        The Django Documentation search uses a Google Custom Search, which
+        requires Javascript. If your results don't appear here shortly, please
+        <a href="http://www.google.com/cse?{{ query_string|escape }}">view the 
results on Google's site</a>. 
+      </div>
+    </div>
+    <script type="text/javascript">
+      var googleSearchMessage = 
document.getElementById("cse-search-results-js-required");
+      googleSearchMessage.parentNode.removeChild(googleSearchMessage);
+    
+      var googleSearchIframeName = "cse-search-results";
+      var googleSearchFormName = "cse-search-box";
+      var googleSearchDomain = "www.google.com";
+      var googleSearchPath = "/cse";
+    </script>
+    <script type="text/javascript" 
src="http://www.google.com/afsonline/show_afs_search.js";></script>
+  {% else %}
+    <h1>Search</h1>
+    {% search_form "search_page" %}
+  {% endif %}
+{% endblock %}

Added: djangoproject.com/djangodocs/templates/docs/search_form.html
===================================================================
--- djangoproject.com/djangodocs/templates/docs/search_form.html                
                (rev 0)
+++ djangoproject.com/djangodocs/templates/docs/search_form.html        
2008-09-02 04:09:40 UTC (rev 8844)
@@ -0,0 +1,12 @@
+<form action="{{ action|escape }}" id="{{ search_form_id|escape }}" 
class="search">
+  <div>
+    <input type="hidden" name="cx" value="009763561546736975936:e88ek0eurf4" />
+    <input type="hidden" name="cof" value="FORID:11" />
+    <input type="hidden" name="ie" value="UTF-8" />
+    <input type="hidden" name="hl" value="{{ lang|escape }}" />
+    {{ form.q }}
+    <input type="submit" name="sa" class="submit" value="Search" />
+    {{ form.as_q }}
+  </div>
+</form>
+<script type="text/javascript" 
src="http://www.google.com/coop/cse/brand?form={{ search_form_id|escape 
}}&lang={{ lang|escape }}"></script>
\ No newline at end of file

Added: djangoproject.com/djangodocs/templatetags/__init__.py
===================================================================

Added: djangoproject.com/djangodocs/templatetags/docs.py
===================================================================
--- djangoproject.com/djangodocs/templatetags/docs.py                           
(rev 0)
+++ djangoproject.com/djangodocs/templatetags/docs.py   2008-09-02 04:09:40 UTC 
(rev 8844)
@@ -0,0 +1,16 @@
+from django.template import Library
+
+from djangodocs.forms import SearchForm
+
+
+register = Library()
+
[EMAIL PROTECTED]('docs/search_form.html', takes_context=True)
+def search_form(context, search_form_id='search'):
+    request = context['request']
+    auto_id = 'id_%s_%%s' % search_form_id
+    return {
+        'form': SearchForm(initial=request.GET, auto_id=auto_id),
+        'search_form_id': search_form_id,
+        'action': context['search'],
+    }
\ No newline at end of file

Modified: djangoproject.com/djangodocs/urls.py
===================================================================
--- djangoproject.com/djangodocs/urls.py        2008-09-02 03:40:42 UTC (rev 
8843)
+++ djangoproject.com/djangodocs/urls.py        2008-09-02 04:09:40 UTC (rev 
8844)
@@ -11,8 +11,8 @@
         djangodocs.views.language,
     ),
     url(
-        r'^(?P<lang>[a-z-]+)/(?P<version>[\w.-]+)/(?P<url>[\w./-]*)$',
-        djangodocs.views.document,
+        r'^(?P<lang>[a-z-]+)/(?P<version>[\w.-]+)/search/$',
+        djangodocs.views.search,
     ),
     url(
         r'^(?P<lang>[a-z-]+)/(?P<version>[\w.-]+)/_images/(?P<path>.*)$',
@@ -22,4 +22,8 @@
         r'^(?P<lang>[a-z-]+)/(?P<version>[\w.-]+)/_source/(?P<path>.*)$',
         djangodocs.views.source,
     ),
+    url(
+        r'^(?P<lang>[a-z-]+)/(?P<version>[\w.-]+)/(?P<url>[\w./-]*)$',
+        djangodocs.views.document,
+    ),
 )

Modified: djangoproject.com/djangodocs/views.py
===================================================================
--- djangoproject.com/djangodocs/views.py       2008-09-02 03:40:42 UTC (rev 
8843)
+++ djangoproject.com/djangodocs/views.py       2008-09-02 04:09:40 UTC (rev 
8844)
@@ -5,6 +5,7 @@
 from django.core import urlresolvers
 from django.http import HttpResponseRedirect, Http404
 from django.shortcuts import render_to_response
+from django.template import RequestContext
 from unipath import FSPath as Path
 
 def index(request):
@@ -26,7 +27,7 @@
     )
 
 def document(request, lang, version, url):
-    if lang != 'en' or version != 'dev' or url == "search/": raise Http404()
+    if lang != 'en' or version != 'dev': raise Http404()
 
     docroot = Path(settings.DOCS_PICKLE_ROOT)
 
@@ -44,12 +45,13 @@
         'docs/%s.html' % '-'.join([b for b in bits if b]), 
         'docs/doc.html'
     ]
-    return render_to_response(template_names, {
-        'doc': pickle.load(open(doc)),
-        'env': pickle.load(open(docroot.child('globalcontext.pickle'))),
+    return render_to_response(template_names, RequestContext(request, {
+        'doc': pickle.load(open(doc, 'rb')),
+        'env': pickle.load(open(docroot.child('globalcontext.pickle'), 'rb')),
         'update_date': 
datetime.datetime.fromtimestamp(docroot.child('last_build').mtime()),
         'home': urlresolvers.reverse(document, kwargs={'lang':lang, 
'version':version, 'url':''}),
-    })
+        'search': urlresolvers.reverse(search, kwargs={'lang':lang, 
'version':version}),
+    }))
 
 def images(request, lang, version, path):
     if lang != 'en' or version != 'dev': raise Http404()
@@ -65,4 +67,23 @@
         request,
         document_root = Path(settings.DOCS_PICKLE_ROOT).child('_sources'),
         path = path,
-    )
\ No newline at end of file
+    )
+
+def search(request, lang, version):
+    if lang != 'en' or version != 'dev': raise Http404()
+    
+    docroot = Path(settings.DOCS_PICKLE_ROOT)
+    
+    # Remove the 'cof' GET variable from the query string so that the page
+    # linked to by the Javascript fallback doesn't think its inside an iframe.
+    mutable_get = request.GET.copy()
+    if 'cof' in mutable_get:
+        del mutable_get['cof']
+    
+    return render_to_response('docs/search.html', RequestContext(request, {
+        'query': request.GET.get('q'),
+        'query_string': mutable_get.urlencode(),
+        'env': pickle.load(open(docroot.child('globalcontext.pickle'), 'rb')),
+        'home': urlresolvers.reverse(document, kwargs={'lang':lang, 
'version':version, 'url':''}),
+        'search': urlresolvers.reverse(search, kwargs={'lang':lang, 
'version':version}),
+    }))
\ No newline at end of file


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django 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/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to