* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/, gpackages/templates/
@ 2012-06-30 0:22 Slava Bacherikov
0 siblings, 0 replies; 3+ messages in thread
From: Slava Bacherikov @ 2012-06-30 0:22 UTC (permalink / raw
To: gentoo-commits
commit: 8d2ac5e1b45a8c97dbd54b392480017fce2c0ff5
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Fri Jun 29 21:55:48 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Fri Jun 29 21:55:48 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=8d2ac5e1
Add distinct for m2m.
---
gpackages/apps/generic/views.py | 15 ++++++++++++++-
gpackages/apps/packages/urls.py | 3 +--
gpackages/apps/packages/views.py | 12 +++++++-----
gpackages/templates/license_groups.html | 4 ++--
4 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
index 4afe2ec..6beb59e 100644
--- a/gpackages/apps/generic/views.py
+++ b/gpackages/apps/generic/views.py
@@ -57,9 +57,15 @@ def dynamic_order(args_list, allowed_list, reverse = None):
class MultipleFilterListViewMixin(object):
allowed_filter = {}
allowed_order = {}
+ m2m_filter = ()
base_queryset = None # should be queryset
+ def __init__(self, *args, **kwargs):
+ super(MultipleFilterListViewMixin, self).__init__(*args, **kwargs)
+ l = (x for x in self.allowed_filter.itervalues())
+ self.m2m_set = frozenset(l)
+
def get_queryset(self):
qs = dynamic_filter(exclude_blank(self.request.GET),
self.allowed_filter)
@@ -78,7 +84,14 @@ class MultipleFilterListViewMixin(object):
if self.kwargs.get('order') not in self.allowed_order:
raise Http404('no such order')
- return self.base_queryset.filter(**qs).order_by(order)
+ queryset = self.base_queryset.filter(**qs).order_by(order)
+
+ for q in qs.iterkeys():
+ if q in self.m2m_set:
+ queryset = queryset.distinct()
+ break
+
+ return queryset
@classmethod
def get_url_part(cls):
diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py
index ca15890..045a5ea 100644
--- a/gpackages/apps/packages/urls.py
+++ b/gpackages/apps/packages/urls.py
@@ -15,6 +15,5 @@ urlpatterns = patterns('',
# In Future I will write my onw URL Resolver !!!
#url(r'^package/(?:(?P<pk>\d+)|(?P<category>[^/]+)/(?P<name>[^/]+))/$', PackageDetailView.as_view(), name = 'package'),
url(r'^package/(?P<pk>\d+)/$', PackageDetailView.as_view(), name = 'package'),
- url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)/$', PackageDetailView.as_view(), name = 'package'),
- url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)::(?P<repository>[^/]+)/$', PackageDetailView.as_view(), name = 'package'),
+ url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)(?:::(?P<repository>[^/]+))?/$', PackageDetailView.as_view(), name = 'package'),
)
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index da330af..5d70510 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -7,6 +7,8 @@ from models import CategoryModel, HerdsModel, MaintainerModel, \
from django.shortcuts import get_object_or_404
+arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
+
class CategoriesListView(ContextListView):
extra_context = {'page_name': 'Categories',}
template_name = 'categories.html'
@@ -39,7 +41,6 @@ class LicenseGroupsView(ContextListView):
context_object_name = 'license_groups'
class EbuildsListView(ContextListView):
- arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
paginate_by = 40
extra_context = {'page_name': 'Ebuilds', 'arches' : arches}
template_name = 'ebuilds.html'
@@ -47,22 +48,24 @@ class EbuildsListView(ContextListView):
queryset = EbuildModel.objects.all(). \
select_related('package',
'package__virtual_package',
- 'package__virtual_package__category').prefetch_keywords(arches)
+ 'package__virtual_package__category'). \
+ prefetch_keywords(arches)
class PackagesListsView(MultipleFilterListViewMixin, ContextListView):
allowed_filter = { 'category':'virtual_package__category__category',
'repo':'repository__name',
'herd':'herds__name',
'maintainer': 'maintainers__pk',
- 'license': 'licenses__name'
+ 'license': 'ebuildmodel__licenses__name'
}
+ m2m_filter = ['herd', 'maintainer', 'ebuildmodel' ]
+
allowed_order = { 'create': 'created_datetime',
'update': 'updated_datetime',
'rand':'?', # it slow
None: '-updated_datetime'
}
- arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
paginate_by = 40
extra_context = {'page_name': 'Packages', 'arches': arches}
template_name = 'packages.html'
@@ -82,7 +85,6 @@ class PackagesListsView(MultipleFilterListViewMixin, ContextListView):
prefetch_keywords(arches)
class PackageDetailView(ContextView, DetailView):
- arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
template_name = 'package.html'
extra_context = {'page_name': 'Package', 'arches': arches}
context_object_name = 'package'
diff --git a/gpackages/templates/license_groups.html b/gpackages/templates/license_groups.html
index 00bc0a0..985c670 100644
--- a/gpackages/templates/license_groups.html
+++ b/gpackages/templates/license_groups.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
+{% load url from future %}
{% block content %}
<table class='table table-striped table-hover'>
@@ -17,7 +17,7 @@
{% for license_group in license_groups %}
<tr>
<td class="nowrap"><a href="#">{{ license_group.name }}</a></td>
- <td>{% for license in license_group.licenses.all %}<a href="#">{{ license }}</a>{% if not forloop.last %},{% endif %} {% endfor %}</td>
+ <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>
</tr>
{% endfor %}
</tbody>
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/, gpackages/templates/
@ 2012-06-30 0:22 Slava Bacherikov
0 siblings, 0 replies; 3+ messages in thread
From: Slava Bacherikov @ 2012-06-30 0:22 UTC (permalink / raw
To: gentoo-commits
commit: ec64f86aadb7bb5895ef851a73c2f6c69f7603e0
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Fri Jun 29 20:49:51 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Fri Jun 29 20:49:51 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=ec64f86a
Change in general filter.
---
gpackages/apps/generic/views.py | 71 ++++++++++++++++++++++++++++++++++
gpackages/apps/packages/urls.py | 3 +-
gpackages/apps/packages/views.py | 61 ++---------------------------
gpackages/templates/maintainers.html | 2 +-
4 files changed, 77 insertions(+), 60 deletions(-)
diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
index 3c11dd3..4afe2ec 100644
--- a/gpackages/apps/generic/views.py
+++ b/gpackages/apps/generic/views.py
@@ -1,4 +1,5 @@
from django.views.generic import TemplateView, ListView
+from string import Template
class ContextView(object):
extra_context = {}
@@ -18,3 +19,73 @@ class SetLang(ContextTemplateView):
extra_context = {'page_name': 'Set Language', 'nav_name' : 'setlanguage'}
set_lang_view = SetLang.as_view()
+
+# there is another dynamic filter for django, and it maybe better
+# but it is too big and i need just a litle of its functionly
+# but if this code have to be grove maybe i replace it to django-filter
+# application or another.
+def dynamic_filter(filter_set, allowed):
+ result = {}
+ for k in allowed.iterkeys():
+ if k in filter_set:
+ result[allowed[k]] = filter_set[k]
+ return result
+
+def exclude_blank(res_dict):
+ result = {}
+ for k in res_dict.iterkeys():
+ if res_dict[k]:
+ result[k] = res_dict[k]
+ return result
+
+def dynamic_order(args_list, allowed_list, reverse = None):
+ order = allowed_list.get(None)
+ if reverse is None:
+ reverse = args_list.get('reverse', False)
+ if args_list.get('order') in allowed_list:
+ order = allowed_list.get(args_list.get('order'))
+
+ if order == '?':
+ return order
+
+ if reverse and order[0] != '-':
+ order = '-' + order
+ elif reverse:
+ order = order[1:]
+ return order
+
+class MultipleFilterListViewMixin(object):
+ allowed_filter = {}
+ allowed_order = {}
+
+ base_queryset = None # should be queryset
+
+ def get_queryset(self):
+ qs = dynamic_filter(exclude_blank(self.request.GET),
+ self.allowed_filter)
+ qs.update( dynamic_filter(exclude_blank(self.kwargs),
+ self.allowed_filter) )
+
+ if self.kwargs.get('rev') is None:
+ reverse = bool(self.request.GET.get('rev',False))
+ else:
+ reverse = bool(self.kwargs.get('rev',False))
+
+ if 'order' in self.request.GET:
+ order = dynamic_order(self.request.GET, self.allowed_order,reverse)
+ else:
+ order = dynamic_order(self.kwargs, self.allowed_order, reverse)
+ if self.kwargs.get('order') not in self.allowed_order:
+ raise Http404('no such order')
+
+ return self.base_queryset.filter(**qs).order_by(order)
+
+ @classmethod
+ def get_url_part(cls):
+ t = "(?:{0}/(?P<{0}>[^/]+)/)?"
+ l =[]
+ for key in cls.allowed_filter.iterkeys():
+ l.append(t.format(key))
+
+ return ''.join(l) + "(?:order/(?P<order>[a-z]*)/)?(?P<rev>rev/)?"
+
diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py
index f597026..ca15890 100644
--- a/gpackages/apps/packages/urls.py
+++ b/gpackages/apps/packages/urls.py
@@ -10,8 +10,7 @@ urlpatterns = patterns('',
url(r'^repositories/$', RepositoriesListView.as_view(), name = 'repositories'),
url(r'^license-groups/$', LicenseGroupsView.as_view(), name = 'license_groups'),
url(r'^$', EbuildsListView.as_view(), name = 'ebuilds'),
- url(r'^packages/(?:category/(?P<category>[^/]+)/)?(?:repo/(?P<repo>[^/]*)/)?(?:herd/(?P<herd>[^/]+)/)?(?:maintainer/(?P<maintainer_pk>[^/]+)/)?(?:order/(?P<order>[a-z]*)/)?(?P<rev>rev/)?$',
- PackagesListsView.as_view(), name = 'packages'),
+ url(r'^packages/{0}$'.format(PackagesListsView.get_url_part()), PackagesListsView.as_view(), name = 'packages'),
# In Future I will write my onw URL Resolver !!!
#url(r'^package/(?:(?P<pk>\d+)|(?P<category>[^/]+)/(?P<name>[^/]+))/$', PackageDetailView.as_view(), name = 'package'),
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index 2c75ed6..da330af 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -1,5 +1,6 @@
from django.views.generic import DetailView
-from generic.views import ContextListView, ContextTemplateView, ContextView
+from generic.views import ContextListView, ContextTemplateView, ContextView, \
+ MultipleFilterListViewMixin
from models import CategoryModel, HerdsModel, MaintainerModel, \
RepositoryModel, LicenseGroupModel, EbuildModel, \
PackageModel
@@ -48,45 +49,11 @@ class EbuildsListView(ContextListView):
'package__virtual_package',
'package__virtual_package__category').prefetch_keywords(arches)
-# there is another dynamic filter for django, and it maybe better
-# but it is too big and i need just a litle of its functionly
-# but if this code have to be grove maybe i replace it to django-filter
-# application or another.
-def dynamic_filter(filter_set, allowed):
- result = {}
- for k in allowed.iterkeys():
- if k in filter_set:
- result[allowed[k]] = filter_set[k]
- return result
-
-def exclude_blank(res_dict):
- result = {}
- for k in res_dict.iterkeys():
- if res_dict[k]:
- result[k] = res_dict[k]
- return result
-
-def dynamic_order(args_list, allowed_list, reverse = None):
- order = allowed_list.get(None)
- if reverse is None:
- reverse = args_list.get('reverse', False)
- if args_list.get('order') in allowed_list:
- order = allowed_list.get(args_list.get('order'))
-
- if order == '?':
- return order
-
- if reverse and order[0] != '-':
- order = '-' + order
- elif reverse:
- order = order[1:]
- return order
-
-class PackagesListsView(ContextListView):
+class PackagesListsView(MultipleFilterListViewMixin, ContextListView):
allowed_filter = { 'category':'virtual_package__category__category',
'repo':'repository__name',
'herd':'herds__name',
- 'maintainer_pk': 'maintainers__pk',
+ 'maintainer': 'maintainers__pk',
'license': 'licenses__name'
}
@@ -114,26 +81,6 @@ class PackagesListsView(ContextListView):
prefetch_related('repository'). \
prefetch_keywords(arches)
- def get_queryset(self):
- qs = dynamic_filter(exclude_blank(self.request.GET),
- self.allowed_filter)
- qs.update( dynamic_filter(exclude_blank(self.kwargs),
- self.allowed_filter) )
-
- if self.kwargs.get('rev') is None:
- reverse = bool(self.request.GET.get('rev',False))
- else:
- reverse = bool(self.kwargs.get('rev',False))
-
- if 'order' in self.request.GET:
- order = dynamic_order(self.request.GET, self.allowed_order,reverse)
- else:
- order = dynamic_order(self.kwargs, self.allowed_order, reverse)
- if self.kwargs.get('order') not in self.allowed_order:
- raise Http404('no such order')
-
- return self.base_queryset.filter(**qs).order_by(order)
-
class PackageDetailView(ContextView, DetailView):
arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
template_name = 'package.html'
diff --git a/gpackages/templates/maintainers.html b/gpackages/templates/maintainers.html
index ecd087e..9c01184 100644
--- a/gpackages/templates/maintainers.html
+++ b/gpackages/templates/maintainers.html
@@ -18,7 +18,7 @@
<tbody>
{% for maintainer in maintainers %}
<tr>
- <td class="nowrap"><a href="{% url 'packages' maintainer_pk=maintainer.pk %}">{{ maintainer.name|default:"Not represented" }}</a></td>
+ <td class="nowrap"><a href="{% url 'packages' maintainer=maintainer.pk %}">{{ maintainer.name|default:"Not represented" }}</a></td>
<!-- email should be obfuscated -->
<td class="nowrap"><a href="{{ 'mailto:'|add:maintainer.email|obfuscate }}">{{ maintainer.email|obfuscate }}</a></td>
</tr>
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/, gpackages/templates/
@ 2012-09-14 17:12 Slava Bacherikov
0 siblings, 0 replies; 3+ messages in thread
From: Slava Bacherikov @ 2012-09-14 17:12 UTC (permalink / raw
To: gentoo-commits
commit: 81dbdfc8901de049ee866f6733554416404102c2
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Fri Sep 14 17:12:53 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Fri Sep 14 17:12:53 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=81dbdfc8
Sorting maintainers by many attributes
---
gpackages/apps/generic/views.py | 69 ++++++++++++++++++++++++++++++++--
gpackages/apps/packages/views.py | 3 +-
gpackages/templates/maintainers.html | 4 +-
3 files changed, 69 insertions(+), 7 deletions(-)
diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
index da0048e..910d3a5 100644
--- a/gpackages/apps/generic/views.py
+++ b/gpackages/apps/generic/views.py
@@ -1,11 +1,14 @@
from django.views.generic import TemplateView, ListView
-from string import Template
-import re
from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Atom1Feed, rfc3339_date
from django.utils import tzinfo
from django.utils.timezone import is_naive
from django.http import Http404
+from django.core.urlresolvers import reverse, NoReverseMatch
+from django.utils.html import mark_safe
+from string import Template
+from collections import namedtuple
+import re
class ContextView(object):
"Mixin to add additional data to context"
@@ -71,6 +74,23 @@ def dynamic_order(order_attr, allowed_list, reverse = None):
order = order[1:]
return order
+OrderClass = namedtuple('OrderClass', ['active', 'link', 'reverse'])
+
+class OrderClass(object):
+
+ __slots__ = ('active', 'link', 'reverse')
+
+ def __init__(self, active, link, reverse = False):
+ self.active = active
+ self.link = link
+ self.reverse = reverse
+
+ def arr(self):
+ if self.reverse:
+ return mark_safe('↓')
+ else:
+ return mark_safe('↑')
+
class MultipleFilterListViewMixin(object):
"""Mixin for dynamical objects filtering
"""
@@ -95,9 +115,17 @@ class MultipleFilterListViewMixin(object):
"""Indicates that this attribute is m2m fields and filtering by it should done
with ``distinct`` attribute.
"""
+ view_name = str()
+ """Name of url view"""
@classmethod
def get_url_kwargs(cls, filters, order = None, rev = False):
+ """Args:
+ filters -- dict, search filters.
+ order -- order name.
+ rev -- bolean, reverse order
+ Return: dict used in reverse
+ """
kwargs = {}
for name, value in filters.iteritems():
if not value or name not in cls.allowed_filter:
@@ -114,22 +142,51 @@ class MultipleFilterListViewMixin(object):
kwargs[name] = value
- if order is not None and order in self.allowed_order:
+ if order is not None and order in cls.allowed_order:
kwargs['order'] = order
if rev:
- kwargs['rev'] = 'rev'
+ kwargs['rev'] = 'rev/'
return kwargs
+ @classmethod
+ def get_url(cls, kwargs):
+ try:
+ url = reverse(cls.view_name, kwargs = kwargs)
+ except NoReverseMatch:
+ url = '#'
+
+ return url
+
def get_context_data(self, **kwargs):
"""In addition to default context value will return all filters as
:py:class:`.dict`.
"""
cd = super(MultipleFilterListViewMixin, self).get_context_data(**kwargs)
cd['filters_dict'] = self.queries_dict
+ cd['orders'] = self.get_orders_context()
return cd
+ def get_orders_context(self):
+ dct = {}
+ for name in self.allowed_order:
+ if name == self.order:
+ active = True
+ else:
+ active = False
+
+ is_reverse = not self.reverse
+
+ link = self.get_url_kwargs(self.queries_dict, name, is_reverse)
+ link = self.get_url(link)
+ obj = OrderClass(active = active, link = link, reverse = is_reverse)
+ if name is None:
+ dct['default'] = obj
+ else:
+ dct[name] = obj
+ return dct
+
def get_base_filters(self):
qs = filter_req(self.request.GET, self.allowed_filter)
qs.update(filter_req(self.kwargs, self.allowed_filter))
@@ -176,6 +233,10 @@ class MultipleFilterListViewMixin(object):
if order_attr not in self.allowed_order:
raise Http404('no such order')
+
+ self.order = order_attr
+ self.reverse = reverse
+
order = dynamic_order(order_attr, self.allowed_order, reverse)
return order
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index b597a12..2ceb965 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -114,7 +114,7 @@ class HerdsListView(ArchesCacheViewMixin, ContextListView):
class MaintainersListView(CacheFilterListView, ContextListView):
cache_time = 560
allowed_filter = { 'dev' : 'is_dev',
- 'herd' : 'herdsmodel__name'}
+ 'herd' : 'herdsmodel__name' }
allowed_order = { None: 'name', 'dev' : 'is_dev'}
boolean_filters = ('dev',)
paginate_by = 40
@@ -122,6 +122,7 @@ class MaintainersListView(CacheFilterListView, ContextListView):
template_name = 'maintainers.html'
queryset = MaintainerModel.objects.only('name', 'email' ).all()
context_object_name = 'maintainers'
+ view_name = 'maintainers'
class RepositoriesListView(ArchesCacheViewMixin, ContextListView):
extra_context = {'page_name': 'Repsitories',}
diff --git a/gpackages/templates/maintainers.html b/gpackages/templates/maintainers.html
index b337f18..4303c9d 100644
--- a/gpackages/templates/maintainers.html
+++ b/gpackages/templates/maintainers.html
@@ -14,9 +14,9 @@
</colgroup>
<thead>
<tr>
- <th>{% trans 'Name' %}</th>
+ <th><a href="{{ orders.default.link }}">{% trans 'Name' %} {{ orders.default.arr }}</a></th>
<th>{% trans 'Email' %}</th>
- <th>{% trans 'Gentoo dev' %}</th>
+ <th><a href="{{ orders.dev.link }}">{% trans 'Gentoo dev' %} {{ orders.dev.arr }}</a></th>
</tr>
</thead>
<tbody>
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-09-14 17:13 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-14 17:12 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/, gpackages/templates/ Slava Bacherikov
-- strict thread matches above, loose matches on Subject: below --
2012-06-30 0:22 Slava Bacherikov
2012-06-30 0:22 Slava Bacherikov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox