public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Slava Bacherikov" <slava@bacherikov.org.ua>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/templates/
Date: Mon,  2 Jul 2012 22:25:34 +0000 (UTC)	[thread overview]
Message-ID: <1341252608.f69717f90b90d5a2be3ec2389771e9726ae0beb0.bacher09@gentoo> (raw)

commit:     f69717f90b90d5a2be3ec2389771e9726ae0beb0
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Mon Jul  2 18:10:08 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Mon Jul  2 18:10:08 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=f69717f9

More cool links

---
 gpackages/apps/packages/models.py       |   53 ++++++++++++++---
 gpackages/apps/packages/urls.py         |    3 +-
 gpackages/apps/packages/utils.py        |   96 +++++++++++++++++++++++++++++++
 gpackages/apps/packages/validators.py   |    8 +++
 gpackages/apps/packages/views.py        |   29 ++++++++-
 gpackages/templates/keywords_table.html |    3 +-
 6 files changed, 176 insertions(+), 16 deletions(-)

diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index 29a2d64..624afc0 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -6,11 +6,8 @@ from package_info.generic import get_from_kwargs_and_del
 from package_info.repo_info import REPOS_TYPE
 # relative
 from .keywords import KeywordRepr
-
-from django.core.validators import URLValidator, validate_email 
-from django.core.exceptions import ValidationError
-
-validate_url = URLValidator()
+from utils import get_link
+from .validators import validate_url, validate_email
 
 
 class AbstractDateTimeModel(models.Model):
@@ -228,10 +225,17 @@ class VirtualPackageModel(models.Model):
 
     objects = managers.VirtualPackageManager()
 
+    #forum_template = /
+    #"http://forums.gentoo.org/search.php?search_terms=all&show_results=topics&search_keywords=%s&mode=results"
+
     @property
     def cp(self):
         return "%s/%s" % (unicode(self.category), self.name)
 
+    @property
+    def forum_link(self):
+        return self.forum_template % self.name
+
     def __unicode__(self):
         return unicode(self.cp)
 
@@ -273,6 +277,16 @@ class PackageModel(AbstractDateTimeModel):
     def cp(self):
         return self.virtual_package.cp 
 
+    @property
+    def cpr(self):
+        return '%s::%s' % (self.cp, self.repository.name)
+
+    def cp_or_cpr(self):
+        if self.repository.name == 'gentoo':
+            return self.cp
+        else:
+            return self.cpr
+
     def init_by_package(self, package, category = None, virtual_package = None):
         #self.name = package.name
         self.update_info(package)
@@ -324,10 +338,7 @@ class PackageModel(AbstractDateTimeModel):
     @models.permalink
     def get_absolute_url(self):
         # It coold been in many repositories
-        kwargs = { 'category': self.virtual_package.category.category,
-                   'name': self.virtual_package.name }
-        if self.repository.name != 'gentoo':
-            kwargs['repository'] = self.repository.name
+        kwargs = { 'cpr': self.cp_or_cpr() }
         return ('package',(), kwargs )
             
     class Meta:
@@ -460,10 +471,24 @@ class EbuildModel(AbstractDateTimeModel):
         return self.package.cp
 
     @property
+    def cpr(self):
+        return self.package.cpr
+
+    @property
     def cpv(self):
         return '%s-%s' % (self.package, self.fullversion) 
 
     @property
+    def cpvr(self):
+        return '%s::%s' % (self.cpv, self.package.repository.name)
+
+    def cpv_or_cpvr(self):
+        if self.package.repository.name == 'gentoo':
+            return self.cpv
+        else:
+            return self.cpvr
+
+    @property
     def fullversion(self):
         return '%s%s' %  (self.version, ('-'+ self.revision if self.revision else ''))
 
@@ -503,6 +528,16 @@ class EbuildModel(AbstractDateTimeModel):
         self.keywords = self.get_keywords(arch_list)
         return (self, )
 
+    @models.permalink
+    def get_absolute_url_by_pk(self):
+        return ('ebuild',(), {'pk': self.pk})
+
+    @models.permalink
+    def get_absolute_url(self):
+        # It coold been in many repositories
+        kwargs = { 'cpvr': self.cpv_or_cpvr() }
+        return ('ebuild',(), kwargs )
+
     class Meta:
         unique_together = ('package', 'version', 'revision')
         ordering = ('-updated_datetime',)

diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py
index 4d47a08..1eb23ef 100644
--- a/gpackages/apps/packages/urls.py
+++ b/gpackages/apps/packages/urls.py
@@ -13,10 +13,11 @@ urlpatterns = patterns('',
     url(r'^license-groups/$', LicenseGroupsView.as_view(), name = 'license_groups'),
     url(r'^$', EbuildsListView.as_view(), name = 'ebuilds'),
     url(r'^ebuild/(?P<pk>\d+)/$', EbuildDetailView.as_view(), name = 'ebuild'),
+    url(r'^ebuild/(?P<cpvr>[^/]+/[^/]+)/$', EbuildDetailView.as_view(), name = 'ebuild'),
     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'),
     url(r'^package/(?P<pk>\d+)/$', PackageDetailView.as_view(), name = 'package'),
-    url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)(?:::(?P<repository>[^/]+))?/$', PackageDetailView.as_view(), name = 'package'),
+    url(r'^package/(?P<cpr>[^/]+/[^/]+)/$', PackageDetailView.as_view(), name = 'package'),
 )

diff --git a/gpackages/apps/packages/utils.py b/gpackages/apps/packages/utils.py
new file mode 100644
index 0000000..fc2bd8d
--- /dev/null
+++ b/gpackages/apps/packages/utils.py
@@ -0,0 +1,96 @@
+import re
+from .validators import REVISION_RE, VERSION_RE, NAME_RE
+from package_info.generic import ToStrMixin
+
+def gen_args(args):
+    t = '%s=%s'
+    l = (t % arg for arg in args)
+    return '&'.join(l)
+
+def get_link(host, script, args):
+    return 'http://%(host)s/%(script)s?%(args)' % {'host': host,
+                                                   'script': script,
+                                                   'args': get_args(args)}
+
+BASE_PACKAGE_RE_P = r'(?P<category>[^/]+)/(?P<name>%(name)s)' %  \
+                    {'name' : NAME_RE}
+
+REPOSITORY_RE_P = r'(?:::(?P<repository>\w+))?'
+
+PACKAGE_RE_P = r'%(base)s%(repository)s' % {'base' : BASE_PACKAGE_RE_P,
+                                           'repository' : REPOSITORY_RE_P}
+
+PACKAGE_RE = r'^%s$' % PACKAGE_RE_P
+
+VERSIONS_RE_P = r'-(?P<version>%(version)s)(?:-(?P<revision>%(revision)s))?' % \
+                    { 'version' : VERSION_RE,
+                      'revision': REVISION_RE
+                    }
+EBUILD_CPVR_RE_P = r'%(base)s%(versions)s%(repository)s' % {
+                    'base': BASE_PACKAGE_RE_P,
+                    'versions': VERSIONS_RE_P,
+                    'repository': REPOSITORY_RE_P
+                   }
+
+EBUILD_CPVR_RE = r'^%s$' % EBUILD_CPVR_RE_P
+
+ebuild_cpvr_re = re.compile(EBUILD_CPVR_RE)
+package_re = re.compile(PACKAGE_RE)
+
+def _gen_func(name):
+    return lambda self: self.gr_dict.get(name)
+
+class ParseMetaClass(type):
+    
+    def __init__(cls, name, bases, dct):
+        super(ParseMetaClass, cls).__init__(name, bases, dct)
+        for v in cls.simple_attrs:
+            setattr(cls, v, property(_gen_func(v)))
+
+class PackageParse(ToStrMixin):
+    
+    __metaclass__ = ParseMetaClass
+    re = package_re
+    simple_attrs = ('category', 'name', 'repository')
+    
+    def __init__(self, parse = None, dct = None):
+        assert parse or dct, 'Shoud set or parse or dct'
+        self.parse_str = parse
+
+        if parse is not None:
+            m = self.re.match(parse)
+            self.gr_dict = {}
+            if m is not None:
+                self.gr_dict = m.groupdict()
+        elif dct is not None:
+            self.gr_dict = dct
+
+    def __unicode__(self):
+        return unicode(self.parse_str)
+
+    @property
+    def re_str(self):
+        return PACKAGE_RE_P
+
+    @property
+    def repository_for_q(self):
+        if self.repository:
+            return self.repository
+        else:
+            return 'gentoo'
+
+class EbuildParse(PackageParse):
+
+    re = ebuild_cpvr_re
+    simple_attrs = ('category', 'name', 'repository', 'version', 'revision')
+
+    @property
+    def re_str(self):
+        return  EBUILD_CPVR_RE_P
+
+    @property
+    def revision_for_q(self):
+        if self.revision:
+            return self.revision
+        else:
+            return ''

diff --git a/gpackages/apps/packages/validators.py b/gpackages/apps/packages/validators.py
new file mode 100644
index 0000000..efe0c00
--- /dev/null
+++ b/gpackages/apps/packages/validators.py
@@ -0,0 +1,8 @@
+from django.core.validators import URLValidator, validate_email 
+from django.core.exceptions import ValidationError
+
+validate_url = URLValidator()
+
+REVISION_RE = r'r\d+'
+VERSION_RE = r'[\w.]+'
+NAME_RE = r'[\w+-]+'

diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index 81bb609..3d239ae 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -6,6 +6,7 @@ from models import CategoryModel, HerdsModel, MaintainerModel, \
                    PackageModel, UseFlagModel
 
 from django.shortcuts import get_object_or_404
+from .utils import EbuildParse, PackageParse
 
 arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
 
@@ -49,6 +50,7 @@ class EbuildsListView(ContextListView):
         select_related('package',
                        'package__virtual_package',
                        'package__virtual_package__category'). \
+                       prefetch_related('package__repository'). \
                        prefetch_keywords(arches)
 
 class EbuildDetailView(ContextView, DetailView):
@@ -61,6 +63,25 @@ class EbuildDetailView(ContextView, DetailView):
                        'package__virtual_package__category'). \
                        prefetch_keywords(arches)
 
+    def get_object(self, queryset = None):
+        pk = self.kwargs.get('pk')
+        if pk is not None:
+            return super(EbuildDetailView, self).get_object(queryset)
+        if queryset is None:
+            queryset = self.get_queryset()
+
+        cpvr = self.kwargs.get('cpvr')
+        eo = EbuildParse(cpvr)
+        category, name = eo.category, eo.name
+        version, revision = eo.version, eo.revision_for_q
+        repository = eo.repository_for_q
+        obj = get_object_or_404(queryset, package__virtual_package__name = name,
+                                          package__virtual_package__category__category = category,
+                                          package__repository__name = repository,
+                                          version = version,
+                                          revision = revision)
+        return obj
+
 class PackagesListsView(MultipleFilterListViewMixin, ContextListView):
     allowed_filter = { 'category':'virtual_package__category__category',
                        'repo':'repository__name',
@@ -112,10 +133,10 @@ class PackageDetailView(ContextView, DetailView):
         if queryset is None:
             queryset = self.get_queryset()
 
-        name, category = self.kwargs.get('name'), self.kwargs.get('category')
-        repository = self.kwargs.get('repository')
-        if repository is None:
-            repository = 'gentoo'
+        cpr = self.kwargs.get('cpr')
+        po = PackageParse(cpr)
+        category, name = po.category, po.name
+        repository = po.repository_for_q
         obj = get_object_or_404(queryset, name = name,
                                           category = category,
                                           repository__name = repository)

diff --git a/gpackages/templates/keywords_table.html b/gpackages/templates/keywords_table.html
index 63c4be1..93339eb 100644
--- a/gpackages/templates/keywords_table.html
+++ b/gpackages/templates/keywords_table.html
@@ -1,4 +1,3 @@
-{% load url from future %}
 {% spaceless %}
 <table class="keywords table table-bordered table-condensed">
     <colgroup>
@@ -19,7 +18,7 @@
     <tbody>
         {% for ebuild in ebuilds %}
         <tr>
-            <td class="ebuild"><a href="{% url 'ebuild' pk=ebuild.pk %}">{{ ebuild.fullversion }}</a></td>
+            <td class="ebuild"><a href="{{ ebuild.get_absolute_url }}">{{ ebuild.fullversion }}</a></td>
             {% for keyword in ebuild.keywords %}
             <td class="{{ keyword.status_class }}">{{ keyword.status_repr }}</td>
             {% endfor %}



             reply	other threads:[~2012-07-02 22:25 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-02 22:25 Slava Bacherikov [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-08-20 13:03 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/templates/ Slava Bacherikov
2012-07-19 23:50 Slava Bacherikov
2012-07-19 23:50 Slava Bacherikov
2012-07-12 22:16 Slava Bacherikov
2012-07-12 22:16 Slava Bacherikov
2012-07-10 23:13 Slava Bacherikov
2012-07-08 19:54 Slava Bacherikov
2012-07-08 19:54 Slava Bacherikov
2012-07-08 19:54 Slava Bacherikov
2012-07-06 23:09 Slava Bacherikov
2012-07-06 23:09 Slava Bacherikov
2012-07-04 22:13 Slava Bacherikov
2012-06-30 21:02 Slava Bacherikov
2012-06-30 21:02 Slava Bacherikov
2012-06-30  0:22 Slava Bacherikov
2012-06-29 19:25 Slava Bacherikov
2012-06-28 23:59 Slava Bacherikov
2012-06-27 22:52 Slava Bacherikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1341252608.f69717f90b90d5a2be3ec2389771e9726ae0beb0.bacher09@gentoo \
    --to=slava@bacherikov.org.ua \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox