1 |
commit: 8d2ac5e1b45a8c97dbd54b392480017fce2c0ff5 |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Fri Jun 29 21:55:48 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Fri Jun 29 21:55:48 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=8d2ac5e1 |
7 |
|
8 |
Add distinct for m2m. |
9 |
|
10 |
--- |
11 |
gpackages/apps/generic/views.py | 15 ++++++++++++++- |
12 |
gpackages/apps/packages/urls.py | 3 +-- |
13 |
gpackages/apps/packages/views.py | 12 +++++++----- |
14 |
gpackages/templates/license_groups.html | 4 ++-- |
15 |
4 files changed, 24 insertions(+), 10 deletions(-) |
16 |
|
17 |
diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py |
18 |
index 4afe2ec..6beb59e 100644 |
19 |
--- a/gpackages/apps/generic/views.py |
20 |
+++ b/gpackages/apps/generic/views.py |
21 |
@@ -57,9 +57,15 @@ def dynamic_order(args_list, allowed_list, reverse = None): |
22 |
class MultipleFilterListViewMixin(object): |
23 |
allowed_filter = {} |
24 |
allowed_order = {} |
25 |
+ m2m_filter = () |
26 |
|
27 |
base_queryset = None # should be queryset |
28 |
|
29 |
+ def __init__(self, *args, **kwargs): |
30 |
+ super(MultipleFilterListViewMixin, self).__init__(*args, **kwargs) |
31 |
+ l = (x for x in self.allowed_filter.itervalues()) |
32 |
+ self.m2m_set = frozenset(l) |
33 |
+ |
34 |
def get_queryset(self): |
35 |
qs = dynamic_filter(exclude_blank(self.request.GET), |
36 |
self.allowed_filter) |
37 |
@@ -78,7 +84,14 @@ class MultipleFilterListViewMixin(object): |
38 |
if self.kwargs.get('order') not in self.allowed_order: |
39 |
raise Http404('no such order') |
40 |
|
41 |
- return self.base_queryset.filter(**qs).order_by(order) |
42 |
+ queryset = self.base_queryset.filter(**qs).order_by(order) |
43 |
+ |
44 |
+ for q in qs.iterkeys(): |
45 |
+ if q in self.m2m_set: |
46 |
+ queryset = queryset.distinct() |
47 |
+ break |
48 |
+ |
49 |
+ return queryset |
50 |
|
51 |
@classmethod |
52 |
def get_url_part(cls): |
53 |
|
54 |
diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py |
55 |
index ca15890..045a5ea 100644 |
56 |
--- a/gpackages/apps/packages/urls.py |
57 |
+++ b/gpackages/apps/packages/urls.py |
58 |
@@ -15,6 +15,5 @@ urlpatterns = patterns('', |
59 |
# In Future I will write my onw URL Resolver !!! |
60 |
#url(r'^package/(?:(?P<pk>\d+)|(?P<category>[^/]+)/(?P<name>[^/]+))/$', PackageDetailView.as_view(), name = 'package'), |
61 |
url(r'^package/(?P<pk>\d+)/$', PackageDetailView.as_view(), name = 'package'), |
62 |
- url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)/$', PackageDetailView.as_view(), name = 'package'), |
63 |
- url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)::(?P<repository>[^/]+)/$', PackageDetailView.as_view(), name = 'package'), |
64 |
+ url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)(?:::(?P<repository>[^/]+))?/$', PackageDetailView.as_view(), name = 'package'), |
65 |
) |
66 |
|
67 |
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py |
68 |
index da330af..5d70510 100644 |
69 |
--- a/gpackages/apps/packages/views.py |
70 |
+++ b/gpackages/apps/packages/views.py |
71 |
@@ -7,6 +7,8 @@ from models import CategoryModel, HerdsModel, MaintainerModel, \ |
72 |
|
73 |
from django.shortcuts import get_object_or_404 |
74 |
|
75 |
+arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
76 |
+ |
77 |
class CategoriesListView(ContextListView): |
78 |
extra_context = {'page_name': 'Categories',} |
79 |
template_name = 'categories.html' |
80 |
@@ -39,7 +41,6 @@ class LicenseGroupsView(ContextListView): |
81 |
context_object_name = 'license_groups' |
82 |
|
83 |
class EbuildsListView(ContextListView): |
84 |
- arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
85 |
paginate_by = 40 |
86 |
extra_context = {'page_name': 'Ebuilds', 'arches' : arches} |
87 |
template_name = 'ebuilds.html' |
88 |
@@ -47,22 +48,24 @@ class EbuildsListView(ContextListView): |
89 |
queryset = EbuildModel.objects.all(). \ |
90 |
select_related('package', |
91 |
'package__virtual_package', |
92 |
- 'package__virtual_package__category').prefetch_keywords(arches) |
93 |
+ 'package__virtual_package__category'). \ |
94 |
+ prefetch_keywords(arches) |
95 |
|
96 |
class PackagesListsView(MultipleFilterListViewMixin, ContextListView): |
97 |
allowed_filter = { 'category':'virtual_package__category__category', |
98 |
'repo':'repository__name', |
99 |
'herd':'herds__name', |
100 |
'maintainer': 'maintainers__pk', |
101 |
- 'license': 'licenses__name' |
102 |
+ 'license': 'ebuildmodel__licenses__name' |
103 |
} |
104 |
|
105 |
+ m2m_filter = ['herd', 'maintainer', 'ebuildmodel' ] |
106 |
+ |
107 |
allowed_order = { 'create': 'created_datetime', |
108 |
'update': 'updated_datetime', |
109 |
'rand':'?', # it slow |
110 |
None: '-updated_datetime' |
111 |
} |
112 |
- arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
113 |
paginate_by = 40 |
114 |
extra_context = {'page_name': 'Packages', 'arches': arches} |
115 |
template_name = 'packages.html' |
116 |
@@ -82,7 +85,6 @@ class PackagesListsView(MultipleFilterListViewMixin, ContextListView): |
117 |
prefetch_keywords(arches) |
118 |
|
119 |
class PackageDetailView(ContextView, DetailView): |
120 |
- arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
121 |
template_name = 'package.html' |
122 |
extra_context = {'page_name': 'Package', 'arches': arches} |
123 |
context_object_name = 'package' |
124 |
|
125 |
diff --git a/gpackages/templates/license_groups.html b/gpackages/templates/license_groups.html |
126 |
index 00bc0a0..985c670 100644 |
127 |
--- a/gpackages/templates/license_groups.html |
128 |
+++ b/gpackages/templates/license_groups.html |
129 |
@@ -1,5 +1,5 @@ |
130 |
{% extends "base.html" %} |
131 |
- |
132 |
+{% load url from future %} |
133 |
{% block content %} |
134 |
|
135 |
<table class='table table-striped table-hover'> |
136 |
@@ -17,7 +17,7 @@ |
137 |
{% for license_group in license_groups %} |
138 |
<tr> |
139 |
<td class="nowrap"><a href="#">{{ license_group.name }}</a></td> |
140 |
- <td>{% for license in license_group.licenses.all %}<a href="#">{{ license }}</a>{% if not forloop.last %},{% endif %} {% endfor %}</td> |
141 |
+ <td>{% for license in license_group.licenses.all %}<a href="{% url 'packages' license=license.name %}">{{ license.name }}</a>{% if not forloop.last %},{% endif %} {% endfor %}</td> |
142 |
</tr> |
143 |
{% endfor %} |
144 |
</tbody> |