summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/urls.py1
-rw-r--r--packages/utils.py2
-rw-r--r--packages/views/display.py2
-rw-r--r--packages/views/search.py42
-rw-r--r--sitemaps.py20
-rw-r--r--sitestatic/archweb.css52
-rw-r--r--sitestatic/konami.min.js4
-rw-r--r--sitestatic/konami.pack.js1
-rw-r--r--templates/news/paginator.html10
-rw-r--r--templates/packages/search.html3
-rw-r--r--templates/packages/search_paginator.html8
-rw-r--r--templates/public/index.html19
-rw-r--r--templates/releng/result_list.html2
-rw-r--r--todolists/views.py3
14 files changed, 62 insertions, 107 deletions
diff --git a/packages/urls.py b/packages/urls.py
index 9a151b4..4e2e263 100644
--- a/packages/urls.py
+++ b/packages/urls.py
@@ -24,7 +24,6 @@ urlpatterns = patterns('packages.views',
(r'^update/$', 'update'),
(r'^$', SearchListView.as_view(), {}, 'packages-search'),
- (r'^(?P<page>\d+)/$', SearchListView.as_view()),
(r'^search/json/$', 'search_json'),
(r'^differences/$', 'arch_differences', {}, 'packages-differences'),
diff --git a/packages/utils.py b/packages/utils.py
index 49aeb8c..ef6311e 100644
--- a/packages/utils.py
+++ b/packages/utils.py
@@ -79,7 +79,7 @@ def get_split_packages_info():
pkgnames = Package.objects.values('pkgname')
split_pkgs = Package.objects.exclude(pkgname=F('pkgbase')).exclude(
pkgbase__in=pkgnames).values('pkgbase', 'repo', 'arch').annotate(
- last_update=Max('last_update'))
+ last_update=Max('last_update')).order_by().distinct()
all_arches = Arch.objects.in_bulk({s['arch'] for s in split_pkgs})
all_repos = Repo.objects.in_bulk({s['repo'] for s in split_pkgs})
for split in split_pkgs:
diff --git a/packages/views/display.py b/packages/views/display.py
index 497c8d4..fcf8fde 100644
--- a/packages/views/display.py
+++ b/packages/views/display.py
@@ -104,6 +104,8 @@ def redirect_agnostic(request, name, repo, arch):
def redirect_to_search(request, name, repo, arch):
+ if request.GET.get('q'):
+ name = request.GET.get('q')
pkg_data = [
('arch', arch.lower()),
('repo', repo.lower()),
diff --git a/packages/views/search.py b/packages/views/search.py
index 9cb5f38..0362602 100644
--- a/packages/views/search.py
+++ b/packages/views/search.py
@@ -1,6 +1,4 @@
-from datetime import datetime
import json
-from pytz import utc
from django import forms
from django.contrib.auth.models import User
@@ -14,26 +12,6 @@ from ..models import PackageRelation
from ..utils import attach_maintainers, PackageJSONEncoder
-def coerce_limit_value(value):
- if not value:
- return None
- if value == 'all':
- # negative value indicates show all results
- return -1
- value = int(value)
- if value < 0:
- raise ValueError
- return value
-
-class LimitTypedChoiceField(forms.TypedChoiceField):
- def valid_value(self, value):
- try:
- coerce_limit_value(value)
- return True
- except (ValueError, TypeError):
- return False
-
-
class PackageSearchForm(forms.Form):
repo = forms.MultipleChoiceField(required=False)
arch = forms.MultipleChoiceField(required=False)
@@ -46,11 +24,6 @@ class PackageSearchForm(forms.Form):
flagged = forms.ChoiceField(
choices=[('', 'All')] + make_choice(['Flagged', 'Not Flagged']),
required=False)
- limit = LimitTypedChoiceField(
- choices=make_choice([50, 100, 250]) + [('all', 'All')],
- coerce=coerce_limit_value,
- required=False,
- initial=50)
def __init__(self, *args, **kwargs):
show_staging = kwargs.pop('show_staging', False)
@@ -119,6 +92,7 @@ def parse_form(form, packages):
class SearchListView(ListView):
template_name = "packages/search.html"
+ paginate_by = 100
sort_fields = ("arch", "repo", "pkgname", "pkgbase", "compressed_size",
"installed_size", "build_date", "last_update", "flag_date")
@@ -145,19 +119,11 @@ class SearchListView(ListView):
# Form had errors so don't return any results
return Package.objects.none()
- def get_paginate_by(self, queryset):
- limit = 50
- if self.form.is_valid():
- asked_limit = self.form.cleaned_data['limit']
- if asked_limit and asked_limit < 0:
- limit = None
- elif asked_limit:
- limit = asked_limit
- return limit
-
def get_context_data(self, **kwargs):
context = super(SearchListView, self).get_context_data(**kwargs)
- context['current_query'] = self.request.GET.urlencode()
+ query_params = self.request.GET.copy()
+ query_params.pop('page', None)
+ context['current_query'] = query_params.urlencode()
context['search_form'] = self.form
return context
diff --git a/sitemaps.py b/sitemaps.py
index b079d8b..d206a1b 100644
--- a/sitemaps.py
+++ b/sitemaps.py
@@ -11,17 +11,27 @@ from releng.models import Release
class PackagesSitemap(Sitemap):
- changefreq = "weekly"
- priority = "0.5"
-
def items(self):
- return Package.objects.normal().filter(repo__staging=False).only(
+ return Package.objects.normal().only(
'pkgname', 'last_update', 'files_last_update',
- 'repo__name', 'arch__name').order_by()
+ 'repo__name', 'repo__testing', 'repo__staging',
+ 'arch__name').order_by()
def lastmod(self, obj):
return obj.last_update
+ def changefreq(self, obj):
+ if obj.repo.testing or obj.repo.staging:
+ return "daily"
+ return "weekly"
+
+ def priority(self, obj):
+ if obj.repo.testing:
+ return "0.4"
+ if obj.repo.staging:
+ return "0.1"
+ return "0.5"
+
class PackageFilesSitemap(PackagesSitemap):
changefreq = "weekly"
diff --git a/sitestatic/archweb.css b/sitestatic/archweb.css
index dcc964e..a0dfb2e 100644
--- a/sitestatic/archweb.css
+++ b/sitestatic/archweb.css
@@ -1002,19 +1002,30 @@ ul.admin-actions {
padding-left: 1.5em;
}
-/* todo lists (public and private) */
-.todo-table .complete {
+/* colored yes/no type values */
+.todo-table .complete,
+.signoff-yes,
+#key-status .signed-yes,
+#releng-result .success-yes,
+#release-list .available-yes {
color: green;
}
-.todo-table .incomplete {
+.todo-table .incomplete,
+.signoff-no,
+#key-status .signed-no,
+#releng-result .success-no,
+#release-list .available-no {
color: red;
}
-.todo-table .inprogress {
+.todo-table .inprogress,
+.signoff-bad {
color: darkorange;
}
+
+/* todo lists (public and private) */
.todo-info {
margin: 0; color: #999;
}
@@ -1036,18 +1047,9 @@ ul.signoff-list {
}
.signoff-yes {
- color: green;
font-weight: bold;
}
-.signoff-no {
- color: red;
-}
-
-.signoff-bad {
- color: darkorange;
-}
-
.signoff-disabled {
color: gray;
}
@@ -1071,30 +1073,6 @@ ul.signoff-list {
position: relative; top: -0.9em;
}
-#releng-result .success-yes {
- color: green;
-}
-
-#releng-result .success-no {
- color: red;
-}
-
-#release-list .available-yes {
- color: green;
-}
-
-#release-list .available-no {
- color: red;
-}
-
-#key-status .signed-yes {
- color: green;
-}
-
-#key-status .signed-no {
- color: red;
-}
-
/* highlight current website in the navbar */
#archnavbar.anb-home ul li#anb-home a,
#archnavbar.anb-packages ul li#anb-packages a,
diff --git a/sitestatic/konami.min.js b/sitestatic/konami.min.js
new file mode 100644
index 0000000..f69ca4f
--- /dev/null
+++ b/sitestatic/konami.min.js
@@ -0,0 +1,4 @@
+var Konami=function(t){var e={addEvent:function(t,e,n,i){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&(t["e"+e+n]=n,t[e+n]=function(){t["e"+e+n](window.event,i)},t.attachEvent("on"+e,t[e+n]))},input:"",pattern:"3838404037393739666513",load:function(t){this.addEvent(document,"keydown",function(n,i){return i&&(e=i),e.input+=n?n.keyCode:event.keyCode,e.input.length>e.pattern.length&&(e.input=e.input.substr(e.input.length-e.pattern.length)),e.input==e.pattern?(e.code(t),e.input="",void 0):void 0},this),this.iphone.load(t)},code:function(t){window.location=t},iphone:{start_x:0,start_y:0,stop_x:0,stop_y:0,tap:!1,capture:!1,orig_keys:"",keys:["UP","UP","DOWN","DOWN","LEFT","RIGHT","LEFT","RIGHT","TAP","TAP","TAP"],code:function(t){e.code(t)},load:function(t){this.orig_keys=this.keys,e.addEvent(document,"touchmove",function(t){if(1==t.touches.length&&e.iphone.capture===!0){var n=t.touches[0]
+ e.iphone.stop_x=n.pageX,e.iphone.stop_y=n.pageY,e.iphone.tap=!1,e.iphone.capture=!1,e.iphone.check_direction()}}),e.addEvent(document,"touchend",function(){e.iphone.tap===!0&&e.iphone.check_direction(t)},!1),e.addEvent(document,"touchstart",function(t){e.iphone.start_x=t.changedTouches[0].pageX,e.iphone.start_y=t.changedTouches[0].pageY,e.iphone.tap=!0,e.iphone.capture=!0})},check_direction:function(t){var e=Math.abs(this.start_x-this.stop_x),n=Math.abs(this.start_y-this.stop_y),i=0>this.start_x-this.stop_x?"RIGHT":"LEFT",o=0>this.start_y-this.stop_y?"DOWN":"UP",s=e>n?i:o
+ s=this.tap===!0?"TAP":s,s==this.keys[0]&&(this.keys=this.keys.slice(1,this.keys.length)),0==this.keys.length&&(this.keys=this.orig_keys,this.code(t))}}}
+return"string"==typeof t&&e.load(t),"function"==typeof t&&(e.code=t,e.load()),e}
diff --git a/sitestatic/konami.pack.js b/sitestatic/konami.pack.js
deleted file mode 100644
index bff279f..0000000
--- a/sitestatic/konami.pack.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(){"use strict";var a=Function("return this")(),b=function(){var a={addEvent:function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&(a["e"+b+c]=c,a[b+c]=function(){a["e"+b+c](window.event,d)},a.attachEvent("on"+b,a[b+c]))},input:"",pattern:"3838404037393739666513",load:function(b){this.addEvent(document,"keydown",function(c,d){return d&&(a=d),a.input+=c?c.keyCode:event.keyCode,a.input.length>a.pattern.length&&(a.input=a.input.substr(a.input.length-a.pattern.length)),a.input==a.pattern?(a.code(b),a.input="",void 0):void 0},this),this.iphone.load(b)},code:function(a){window.location=a},iphone:{start_x:0,start_y:0,stop_x:0,stop_y:0,tap:!1,capture:!1,orig_keys:"",keys:["UP","UP","DOWN","DOWN","LEFT","RIGHT","LEFT","RIGHT","TAP","TAP","TAP"],code:function(b){a.code(b)},load:function(b){this.orig_keys=this.keys,a.addEvent(document,"touchmove",function(b){if(1==b.touches.length&&1==a.iphone.capture){var c=b.touches[0];a.iphone.stop_x=c.pageX,a.iphone.stop_y=c.pageY,a.iphone.tap=!1,a.iphone.capture=!1,a.iphone.check_direction()}}),a.addEvent(document,"touchend",function(){1==a.iphone.tap&&a.iphone.check_direction(b)},!1),a.addEvent(document,"touchstart",function(b){a.iphone.start_x=b.changedTouches[0].pageX,a.iphone.start_y=b.changedTouches[0].pageY,a.iphone.tap=!0,a.iphone.capture=!0})},check_direction:function(a){x_magnitude=Math.abs(this.start_x-this.stop_x),y_magnitude=Math.abs(this.start_y-this.stop_y),x=0>this.start_x-this.stop_x?"RIGHT":"LEFT",y=0>this.start_y-this.stop_y?"DOWN":"UP",result=x_magnitude>y_magnitude?x:y,result=1==this.tap?"TAP":result,result==this.keys[0]&&(this.keys=this.keys.slice(1,this.keys.length)),0==this.keys.length&&(this.keys=this.orig_keys,this.code(a))}}};return a};"undefined"!=typeof module?module.exports=b:a.Konami=b})();
diff --git a/templates/news/paginator.html b/templates/news/paginator.html
index fbd0546..57fbeb1 100644
--- a/templates/news/paginator.html
+++ b/templates/news/paginator.html
@@ -1,20 +1,20 @@
{% if is_paginated %}
<div class="pagination">
- <p>{{paginator.count}} news items, viewing page {{page_obj.number}} of {{paginator.num_pages}}.</p>
+ <p>{{ paginator.count }} news items, viewing page {{ page_obj.number }} of {{ paginator.num_pages }}.</p>
<p class="news-nav">
{% if page_obj.has_previous %}
- <a class="prev" href="?page={{page_obj.previous_page_number}}"
+ <a class="prev" href="?page={{ page_obj.previous_page_number }}"
title="Go to previous page">&lt; Prev</a>
{% endif %}
{% for num in paginator.page_range %}
{% ifequal num page_obj.number %}
- <span>{{num}}</span>
+ <span>{{ num }}</span>
{% else %}
- <a href="?page={{num}}" title="Go to page {{num}}">{{num}}</a>
+ <a href="?page={{ num }}" title="Go to page {{ num }}">{{ num }}</a>
{% endifequal %}
{% endfor %}
{% if page_obj.has_next %}
- <a class="next" href="?page={{page_obj.next_page_number}}"
+ <a class="next" href="?page={{ page_obj.next_page_number }}"
title="Go to next page">Next &gt;</a>
{% endif %}
</p>
diff --git a/templates/packages/search.html b/templates/packages/search.html
index a5d52d6..bf1eecd 100644
--- a/templates/packages/search.html
+++ b/templates/packages/search.html
@@ -36,9 +36,6 @@
<div>{{ search_form.flagged.errors }}
<label for="id_flagged" title="Limit results based on out-of-date status">
Flagged</label>{{ search_form.flagged }}</div>
- <div>{{ search_form.limit.errors }}
- <label for="id_limit" title="Select the number of results to display per page">
- Per Page</label>{{ search_form.limit }}</div>
<div ><label>&nbsp;</label><input title="Search for packages using this criteria"
type="submit" value="Search" /></div>
</fieldset>
diff --git a/templates/packages/search_paginator.html b/templates/packages/search_paginator.html
index 362b7cb..3c368b8 100644
--- a/templates/packages/search_paginator.html
+++ b/templates/packages/search_paginator.html
@@ -1,12 +1,12 @@
<div class="pkglist-stats">
{% if is_paginated %}
- <p>{{paginator.count}} packages found.
- Page {{page_obj.number}} of {{paginator.num_pages}}.</p>
+ <p>{{ paginator.count }} packages found.
+ Page {{ page_obj.number }} of {{ paginator.num_pages }}.</p>
<div class="pkglist-nav">
<span class="prev">
{% if page_obj.has_previous %}
- <a href="/packages/{{page_obj.previous_page_number}}/?{{current_query}}"
+ <a href="?page={{ page_obj.previous_page_number }}&amp;{{ current_query }}"
title="Go to previous page">&lt; Prev</a>
{% else %}
&lt; Prev
@@ -14,7 +14,7 @@
</span>
<span class="next">
{% if page_obj.has_next %}
- <a href="/packages/{{page_obj.next_page_number}}/?{{current_query}}"
+ <a href="?page={{ page_obj.next_page_number }}&amp;{{ current_query }}"
title="Go to next page">Next &gt;</a>
{% else %}
Next &gt;
diff --git a/templates/public/index.html b/templates/public/index.html
index 3f88c18..abdb027 100644
--- a/templates/public/index.html
+++ b/templates/public/index.html
@@ -211,10 +211,8 @@
<div id="konami" style="display:none;"></div>
{% load cdn %}{% jquery %}
-<script type="text/javascript" src="{% static "bootstrap-typeahead.min.js" %}"></script>
-<script type="text/javascript" src="{% static "konami.pack.js" %}"></script>
<script type="text/javascript">
-$(document).ready(function() {
+function setupTypeahead() {
$('#pkgsearch-field').typeahead({
source: function(query, callback) {
$.getJSON('/opensearch/packages/suggest', {q: query}, function(data) {
@@ -226,10 +224,9 @@ $(document).ready(function() {
menu: '<ul class="pkgsearch-typeahead"></ul>',
items: 10
}).attr('autocomplete', 'off');
-});
-$(document).ready(function() {
- var konami = new Konami();
- konami.code = function() {
+}
+function setupKonami() {
+ var konami = new Konami(function() {
$('#konami').html('<img src="{% static "vector_tux.png" %}" alt=""/>');
setTimeout(function() {
$('#konami').fadeIn(500);
@@ -237,9 +234,11 @@ $(document).ready(function() {
$('#konami').click(function() {
$('#konami').fadeOut(500);
});
- };
- konami.iphone.code = konami.code;
- konami.load();
+ });
+}
+$(document).ready(function() {
+ $.ajax({ url: "{% static "bootstrap-typeahead.min.js" %}", cache: true, dataType: "script", success: setupTypeahead });
+ $.ajax({ url: "{% static "konami.min.js" %}", cache: true, dataType: "script", success: setupKonami });
});
</script>
{% endblock %}
diff --git a/templates/releng/result_list.html b/templates/releng/result_list.html
index 12bf39d..67e5934 100644
--- a/templates/releng/result_list.html
+++ b/templates/releng/result_list.html
@@ -5,7 +5,7 @@
<div class="box">
<h2>Results for:
{% if option %}{{ option.verbose_name|title }}: {{ value }}{% endif %}
- {{ iso_name|default:"" }}
+ {% if iso_name %}{{ iso_name|default:"" }}{% endif %}
</h2>
<p><a href="{% url 'releng-test-overview' %}">Go back to testing results</a></p>
diff --git a/todolists/views.py b/todolists/views.py
index 9935987..36a0d97 100644
--- a/todolists/views.py
+++ b/todolists/views.py
@@ -219,7 +219,8 @@ def send_todolist_emails(todo_list, new_packages):
def public_list(request):
- todo_lists = Todolist.objects.incomplete().defer('raw')
+ todo_lists = Todolist.objects.incomplete().defer(
+ 'raw').order_by('-created')
# total hackjob, but it makes this a lot less query-intensive.
all_pkgs = [tp for tl in todo_lists for tp in tl.packages()]
attach_maintainers(all_pkgs)