public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [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('&darr;')
+        else:
+            return mark_safe('&uarr;')
+
 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-06-30  0:22 [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-09-14 17:12 Slava Bacherikov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox