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 %}
next 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