summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/arch.css29
-rw-r--r--packages/templatetags/package_extras.py4
-rw-r--r--packages/views.py66
-rw-r--r--templates/forms/td_input.html5
-rw-r--r--templates/packages/search.html89
-rw-r--r--templates/packages/signoffs.html2
-rw-r--r--urls.py1
7 files changed, 126 insertions, 70 deletions
diff --git a/media/arch.css b/media/arch.css
index f1419fc..335e56b 100644
--- a/media/arch.css
+++ b/media/arch.css
@@ -129,7 +129,7 @@ body {
div.listing {
padding-right: 10px;
}
-.error {
+.error, .errorlist {
color: #dd0000;
font-size: small;
}
@@ -390,3 +390,30 @@ textarea.vLargeTextField {
background-color: #eee4cb;
}
+/* override some calendar attributes copied from */
+/* CALENDARS & CLOCKS */
+.calendarbox, .clockbox { margin:5px auto; font-size:11px; width:16em; text-align:center; background:white; position:relative; }
+.clockbox { width:9em; }
+.calendar { margin:0; padding: 0; }
+.calendar table { margin:0; padding:0; border-collapse:collapse; background:white; width:99%; }
+.calendar caption, .calendarbox h2 { margin: 0; font-size:11px; text-align:center; border-top:none; }
+.calendar th { font-size:10px; color:#666; padding:2px 3px; text-align:center; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; border-bottom:1px solid #ddd; }
+.calendar td { font-size:11px; text-align: center; padding: 0; border-top:1px solid #eee; border-bottom:none; }
+.calendar td.selected a { background: #C9DBED; }
+.calendar td.nonday { background:#efefef; }
+.calendar td.today a { background:#ffc; }
+.calendar td a, .timelist a { display: block; font-weight:bold; padding:4px; text-decoration: none; color:#444; }
+.calendar td a:hover, .timelist a:hover { background: #5b80b2; color:white; }
+.calendar td a:active, .timelist a:active { background: #036; color:white; }
+.calendarnav { font-size:10px; text-align: center; color:#ccc; margin:0; padding:1px 3px; }
+.calendarnav a:link, #calendarnav a:visited, #calendarnav a:hover { color: #999; }
+.calendar-shortcuts { background:white; font-size:10px; line-height:11px; border-top:1px solid #eee; padding:3px 0 4px; color:#ccc; }
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { display:block; position:absolute; font-weight:bold; font-size:12px; background:#C9DBED url(../img/admin/default-bg.gif) bottom left repeat-x; padding:1px 4px 2px 4px; color:white; }
+.calendarnav-previous:hover, .calendarnav-next:hover { background:#036; }
+.calendarnav-previous { top:0; left:0; }
+.calendarnav-next { top:0; right:0; }
+.calendar-cancel { margin:0 !important; padding:0; font-size:10px; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; border-top:1px solid #ddd; }
+.calendar-cancel a { padding:2px; color:#999; }
+ul.timelist, .timelist li { list-style-type:none; margin:0; padding:0; }
+.timelist a { padding:2px; }
+
diff --git a/packages/templatetags/package_extras.py b/packages/templatetags/package_extras.py
index 5a92565..5644583 100644
--- a/packages/templatetags/package_extras.py
+++ b/packages/templatetags/package_extras.py
@@ -30,6 +30,10 @@ def do_buildsortqs(parser, token):
def space2br(value):
return value.replace(' ', '<br />')
+@register.inclusion_tag('forms/td_input.html')
+def td_input(form_element):
+ return {'form_element': form_element}
+
@register.inclusion_tag('errors.html')
def print_errors(errors):
errs = []
diff --git a/packages/views.py b/packages/views.py
index 09d76b3..4a3db85 100644
--- a/packages/views.py
+++ b/packages/views.py
@@ -1,6 +1,15 @@
+from django import forms
+from itertools import chain
+from django.shortcuts import render_to_response
+from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
+from django.forms.util import flatatt
from django.contrib.auth.models import User
+from django.utils.safestring import mark_safe
+from django.utils.encoding import force_unicode
+from django.utils.html import escape, conditional_escape
+from django.contrib.admin.widgets import AdminDateWidget
from datetime import datetime
from archweb_dev.main.utils import render_response
from archweb_dev.main.models import Package, PackageFile
@@ -44,8 +53,61 @@ def details(request, pkgid=0, name='', repo='', arch=''):
return render_response(request, 'packages/details.html', {'pkg': pkg})
-# @TODO: replace search form with a newform
-def search(request, query=''):
+class EmptySelectWidget(forms.widgets.Select):
+ '''Like any select box but allows you to use a custom string for the
+ 'empty' field.'''
+ def __init__(self, empty_string="All", attrs=None, choices=()):
+ self.empty_string = empty_string
+ super(EmptySelectWidget, self).__init__(attrs, choices)
+
+ def render(self, name, value, attrs=None, choices=()):
+ if value is None: value = ''
+ final_attrs = self.build_attrs(attrs, name=name)
+ output = [u'<select%s>' % flatatt(final_attrs)]
+ # Normalize to string.
+ str_value = force_unicode(value)
+ for option_value, option_label in chain(self.choices, choices):
+ if option_value == '':
+ option_label = self.empty_string
+ option_value = force_unicode(option_value)
+ selected_html = (
+ option_value == str_value) and u' selected="selected"' or ''
+ output.append(u'<option value="%s"%s>%s</option>' % (
+ escape(option_value), selected_html,
+ conditional_escape(force_unicode(option_label))))
+ output.append(u'</select>')
+ return mark_safe(u'\n'.join(output))
+
+class PackageSearchForm(forms.Form):
+ repo = forms.ModelChoiceField(Repo.objects.all(),
+ widget=EmptySelectWidget, required=False)
+ arch = forms.ModelChoiceField(Arch.objects.all(),
+ widget=EmptySelectWidget, required=False)
+ keywords = forms.CharField(required=False)
+ maintainer = forms.ModelChoiceField(User.objects.all(),
+ widget=EmptySelectWidget, required=False)
+ last_update = forms.DateField(required=False, widget=AdminDateWidget())
+ limit = forms.ChoiceField(choices=[
+ ('50', '50'),
+ ('100', '100'),
+ ('250', '250'),
+ ('All', 'All')], required=False)
+
+def search(request):
+ if request.GET:
+ form = PackageSearchForm(data=request.GET)
+ if form.is_valid():
+ pass
+ else:
+ form = PackageSearchForm()
+
+ page_dict = {'search_form': form}
+ return render_to_response('packages/search.html',
+ RequestContext(request, page_dict))
+
+
+
+ # OLD IMPLEMENTATION BELOW HERE
if request.GET.has_key('q'):
# take the q GET var over the one passed on the URL
query = request.GET['q'].strip()
diff --git a/templates/forms/td_input.html b/templates/forms/td_input.html
new file mode 100644
index 0000000..38ff5a1
--- /dev/null
+++ b/templates/forms/td_input.html
@@ -0,0 +1,5 @@
+<td>
+ {{form_element.errors}}
+ {{form_element}}
+ {{form_element.help_text}}
+</td>
diff --git a/templates/packages/search.html b/templates/packages/search.html
index f671c3a..a181801 100644
--- a/templates/packages/search.html
+++ b/templates/packages/search.html
@@ -1,76 +1,35 @@
-{% load package_extras %}
{% extends "base.html" %}
+{% load package_extras %}
{% block title %}Arch Linux - Package Search{% endblock %}
{% block head %}
-<script type="text/JavaScript" src="/media/calendar.js"></script>
-<link href="/media/calendar.css" rel="stylesheet" type="text/css" />
+<script type="text/javascript" src="/admin/jsi18n/"></script>
+<script type="text/javascript" src="/media/admin_media/js/core.js"></script>
+{{search_form.media}}
{% endblock %}
{% block content %}
<div class="greybox">
<h4 style="text-align: right">Search Criteria</h4>
- {% if errors %}
- {% print_errors errors %}
- {% endif %}
- <hr />
- <form method="get" action="/packages/search/">
- <table width="100%">
- <tr>
- <td><span class="smalltext">Arch</span></td>
- <td><span class="smalltext">Repository</span></td>
- <td><span class="smalltext">Keywords</span></td>
- <td><span class="smalltext">Maintainer</span></td>
- <td><span class="smalltext">Last Update</span></td>
- <td><span class="smalltext">Per Page</span></td>
- </tr><tr>
- <td>
- <select name="arch">
- <option value="all">All</option>
- {% for a in arches %}
- <option value="{{ a.name }}"{% ifequal arch a.name %} selected{% endifequal %}>{{ a.name }}</option>
- {% endfor %}
- </select>
- </td><td>
- <select name="repo">
- <option value="all">All</option>
- {% for r in repos %}
- <option value="{{ r.name }}"{% ifequal repo r.name %} selected{% endifequal %}>{{ r.name|capfirst }}</option>
- {% endfor %}
- </select>
- </td><td>
- <input type="text" name="q" value="{{ query|escape }}" size="30" maxlength="200" />
- </td><td>
- <select name="maint">
- <option value="all">All</option>
- {% for u in users %}
- <option value="{{u.id}}" {% ifequal maint u.id
- %}selected=selected {%
- %endifequal%}>{{u.username}}</option>
- {% endfor %}
- </td><td>
- <input type="text" name="lastupdate" value="{{ lastupdate|escape }}" size="10" maxlength="10" id="f_lastupdate" /> <button type="reset" id="f_trigger">...</button>
- <script type="text/javascript">
- Calendar.setup({
- inputField : "f_lastupdate", // id of the input field
- ifFormat : "%Y-%m-%d", // format of the input field
- showsTime : false, // will display a time selector
- button : "f_trigger", // trigger for the calendar (button ID)
- singleClick : true, // double-click mode
- step : 1 // show all years in drop-down boxes (instead of every other year as default)
- });
- </script>
- </td><td>
- <select name="limit">
- <option value="50"{% ifequal limit 50 %} selected{% endifequal %}>50</option>
- <option value="100"{% ifequal limit 100 %} selected{% endifequal %}>100</option>
- <option value="250"{% ifequal limit 250 %} selected{% endifequal %}>250</option>
- <option value="0"{% ifequal limit 0 %} selected{% endifequal %}>All</option>
- </select>
- </td><td>
- <input type="submit" value=" Search " />
- </td>
- </tr>
- </table>
+ <form method="get">
+ <table width="100%">
+ <tr>
+ <td><span class="smalltext">Arch</span></td>
+ <td><span class="smalltext">Repository</span></td>
+ <td><span class="smalltext">Keywords</span></td>
+ <td><span class="smalltext">Maintainer</span></td>
+ <td><span class="smalltext">Last Update</span></td>
+ <td><span class="smalltext">Per Page</span></td>
+ </tr>
+ <tr>
+ {% td_input search_form.arch %}
+ {% td_input search_form.repo %}
+ {% td_input search_form.keywords %}
+ {% td_input search_form.maintainer%}
+ {% td_input search_form.last_update %}
+ {% td_input search_form.limit %}
+ <td><input type="submit" value="Search" />
+ </tr>
+ </table>
</form>
</div>
<br /><br />
diff --git a/templates/packages/signoffs.html b/templates/packages/signoffs.html
index 55d534d..7db2927 100644
--- a/templates/packages/signoffs.html
+++ b/templates/packages/signoffs.html
@@ -1,5 +1,5 @@
-{% load package_extras %}
{% extends "base.html" %}
+{% load package_extras %}
{% block title %}Arch Linux - Package Signoffs{% endblock %}
{% block head %}
<script type="text/JavaScript" src="/media/calendar.js"></script>
diff --git a/urls.py b/urls.py
index 6d345db..55b9a37 100644
--- a/urls.py
+++ b/urls.py
@@ -16,7 +16,6 @@ urlpatterns = patterns('',
(r'^packages/signoff_package/(?P<arch>[A-z0-9]+)/(?P<pkgname>[A-z0-9\-+.]+)/$',
'archweb_dev.packages.views.signoff_package'),
(r'^packages/search/$', 'archweb_dev.packages.views.search'),
- (r'^packages/search/([A-z0-9]+)/$', 'archweb_dev.packages.views.search'),
(r'^packages/update/$', 'archweb_dev.packages.views.update'),
(r'^packages/(?P<pkgid>\d+)/$', 'archweb_dev.packages.views.details'),
(r'^packages/(?P<name>[A-z0-9]+)/$', 'archweb_dev.packages.views.details'),