Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/templates/
Date: Mon, 02 Jul 2012 22:25:44
Message-Id: 1341252608.f69717f90b90d5a2be3ec2389771e9726ae0beb0.bacher09@gentoo
1 commit: f69717f90b90d5a2be3ec2389771e9726ae0beb0
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Mon Jul 2 18:10:08 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Mon Jul 2 18:10:08 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=f69717f9
7
8 More cool links
9
10 ---
11 gpackages/apps/packages/models.py | 53 ++++++++++++++---
12 gpackages/apps/packages/urls.py | 3 +-
13 gpackages/apps/packages/utils.py | 96 +++++++++++++++++++++++++++++++
14 gpackages/apps/packages/validators.py | 8 +++
15 gpackages/apps/packages/views.py | 29 ++++++++-
16 gpackages/templates/keywords_table.html | 3 +-
17 6 files changed, 176 insertions(+), 16 deletions(-)
18
19 diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
20 index 29a2d64..624afc0 100644
21 --- a/gpackages/apps/packages/models.py
22 +++ b/gpackages/apps/packages/models.py
23 @@ -6,11 +6,8 @@ from package_info.generic import get_from_kwargs_and_del
24 from package_info.repo_info import REPOS_TYPE
25 # relative
26 from .keywords import KeywordRepr
27 -
28 -from django.core.validators import URLValidator, validate_email
29 -from django.core.exceptions import ValidationError
30 -
31 -validate_url = URLValidator()
32 +from utils import get_link
33 +from .validators import validate_url, validate_email
34
35
36 class AbstractDateTimeModel(models.Model):
37 @@ -228,10 +225,17 @@ class VirtualPackageModel(models.Model):
38
39 objects = managers.VirtualPackageManager()
40
41 + #forum_template = /
42 + #"http://forums.gentoo.org/search.php?search_terms=all&show_results=topics&search_keywords=%s&mode=results"
43 +
44 @property
45 def cp(self):
46 return "%s/%s" % (unicode(self.category), self.name)
47
48 + @property
49 + def forum_link(self):
50 + return self.forum_template % self.name
51 +
52 def __unicode__(self):
53 return unicode(self.cp)
54
55 @@ -273,6 +277,16 @@ class PackageModel(AbstractDateTimeModel):
56 def cp(self):
57 return self.virtual_package.cp
58
59 + @property
60 + def cpr(self):
61 + return '%s::%s' % (self.cp, self.repository.name)
62 +
63 + def cp_or_cpr(self):
64 + if self.repository.name == 'gentoo':
65 + return self.cp
66 + else:
67 + return self.cpr
68 +
69 def init_by_package(self, package, category = None, virtual_package = None):
70 #self.name = package.name
71 self.update_info(package)
72 @@ -324,10 +338,7 @@ class PackageModel(AbstractDateTimeModel):
73 @models.permalink
74 def get_absolute_url(self):
75 # It coold been in many repositories
76 - kwargs = { 'category': self.virtual_package.category.category,
77 - 'name': self.virtual_package.name }
78 - if self.repository.name != 'gentoo':
79 - kwargs['repository'] = self.repository.name
80 + kwargs = { 'cpr': self.cp_or_cpr() }
81 return ('package',(), kwargs )
82
83 class Meta:
84 @@ -460,10 +471,24 @@ class EbuildModel(AbstractDateTimeModel):
85 return self.package.cp
86
87 @property
88 + def cpr(self):
89 + return self.package.cpr
90 +
91 + @property
92 def cpv(self):
93 return '%s-%s' % (self.package, self.fullversion)
94
95 @property
96 + def cpvr(self):
97 + return '%s::%s' % (self.cpv, self.package.repository.name)
98 +
99 + def cpv_or_cpvr(self):
100 + if self.package.repository.name == 'gentoo':
101 + return self.cpv
102 + else:
103 + return self.cpvr
104 +
105 + @property
106 def fullversion(self):
107 return '%s%s' % (self.version, ('-'+ self.revision if self.revision else ''))
108
109 @@ -503,6 +528,16 @@ class EbuildModel(AbstractDateTimeModel):
110 self.keywords = self.get_keywords(arch_list)
111 return (self, )
112
113 + @models.permalink
114 + def get_absolute_url_by_pk(self):
115 + return ('ebuild',(), {'pk': self.pk})
116 +
117 + @models.permalink
118 + def get_absolute_url(self):
119 + # It coold been in many repositories
120 + kwargs = { 'cpvr': self.cpv_or_cpvr() }
121 + return ('ebuild',(), kwargs )
122 +
123 class Meta:
124 unique_together = ('package', 'version', 'revision')
125 ordering = ('-updated_datetime',)
126
127 diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py
128 index 4d47a08..1eb23ef 100644
129 --- a/gpackages/apps/packages/urls.py
130 +++ b/gpackages/apps/packages/urls.py
131 @@ -13,10 +13,11 @@ urlpatterns = patterns('',
132 url(r'^license-groups/$', LicenseGroupsView.as_view(), name = 'license_groups'),
133 url(r'^$', EbuildsListView.as_view(), name = 'ebuilds'),
134 url(r'^ebuild/(?P<pk>\d+)/$', EbuildDetailView.as_view(), name = 'ebuild'),
135 + url(r'^ebuild/(?P<cpvr>[^/]+/[^/]+)/$', EbuildDetailView.as_view(), name = 'ebuild'),
136 url(r'^packages/{0}$'.format(PackagesListsView.get_url_part()), PackagesListsView.as_view(), name = 'packages'),
137
138 # In Future I will write my onw URL Resolver !!!
139 #url(r'^package/(?:(?P<pk>\d+)|(?P<category>[^/]+)/(?P<name>[^/]+))/$', PackageDetailView.as_view(), name = 'package'),
140 url(r'^package/(?P<pk>\d+)/$', PackageDetailView.as_view(), name = 'package'),
141 - url(r'^package/(?P<category>[^/]+)/(?P<name>[^/:]+)(?:::(?P<repository>[^/]+))?/$', PackageDetailView.as_view(), name = 'package'),
142 + url(r'^package/(?P<cpr>[^/]+/[^/]+)/$', PackageDetailView.as_view(), name = 'package'),
143 )
144
145 diff --git a/gpackages/apps/packages/utils.py b/gpackages/apps/packages/utils.py
146 new file mode 100644
147 index 0000000..fc2bd8d
148 --- /dev/null
149 +++ b/gpackages/apps/packages/utils.py
150 @@ -0,0 +1,96 @@
151 +import re
152 +from .validators import REVISION_RE, VERSION_RE, NAME_RE
153 +from package_info.generic import ToStrMixin
154 +
155 +def gen_args(args):
156 + t = '%s=%s'
157 + l = (t % arg for arg in args)
158 + return '&'.join(l)
159 +
160 +def get_link(host, script, args):
161 + return 'http://%(host)s/%(script)s?%(args)' % {'host': host,
162 + 'script': script,
163 + 'args': get_args(args)}
164 +
165 +BASE_PACKAGE_RE_P = r'(?P<category>[^/]+)/(?P<name>%(name)s)' % \
166 + {'name' : NAME_RE}
167 +
168 +REPOSITORY_RE_P = r'(?:::(?P<repository>\w+))?'
169 +
170 +PACKAGE_RE_P = r'%(base)s%(repository)s' % {'base' : BASE_PACKAGE_RE_P,
171 + 'repository' : REPOSITORY_RE_P}
172 +
173 +PACKAGE_RE = r'^%s$' % PACKAGE_RE_P
174 +
175 +VERSIONS_RE_P = r'-(?P<version>%(version)s)(?:-(?P<revision>%(revision)s))?' % \
176 + { 'version' : VERSION_RE,
177 + 'revision': REVISION_RE
178 + }
179 +EBUILD_CPVR_RE_P = r'%(base)s%(versions)s%(repository)s' % {
180 + 'base': BASE_PACKAGE_RE_P,
181 + 'versions': VERSIONS_RE_P,
182 + 'repository': REPOSITORY_RE_P
183 + }
184 +
185 +EBUILD_CPVR_RE = r'^%s$' % EBUILD_CPVR_RE_P
186 +
187 +ebuild_cpvr_re = re.compile(EBUILD_CPVR_RE)
188 +package_re = re.compile(PACKAGE_RE)
189 +
190 +def _gen_func(name):
191 + return lambda self: self.gr_dict.get(name)
192 +
193 +class ParseMetaClass(type):
194 +
195 + def __init__(cls, name, bases, dct):
196 + super(ParseMetaClass, cls).__init__(name, bases, dct)
197 + for v in cls.simple_attrs:
198 + setattr(cls, v, property(_gen_func(v)))
199 +
200 +class PackageParse(ToStrMixin):
201 +
202 + __metaclass__ = ParseMetaClass
203 + re = package_re
204 + simple_attrs = ('category', 'name', 'repository')
205 +
206 + def __init__(self, parse = None, dct = None):
207 + assert parse or dct, 'Shoud set or parse or dct'
208 + self.parse_str = parse
209 +
210 + if parse is not None:
211 + m = self.re.match(parse)
212 + self.gr_dict = {}
213 + if m is not None:
214 + self.gr_dict = m.groupdict()
215 + elif dct is not None:
216 + self.gr_dict = dct
217 +
218 + def __unicode__(self):
219 + return unicode(self.parse_str)
220 +
221 + @property
222 + def re_str(self):
223 + return PACKAGE_RE_P
224 +
225 + @property
226 + def repository_for_q(self):
227 + if self.repository:
228 + return self.repository
229 + else:
230 + return 'gentoo'
231 +
232 +class EbuildParse(PackageParse):
233 +
234 + re = ebuild_cpvr_re
235 + simple_attrs = ('category', 'name', 'repository', 'version', 'revision')
236 +
237 + @property
238 + def re_str(self):
239 + return EBUILD_CPVR_RE_P
240 +
241 + @property
242 + def revision_for_q(self):
243 + if self.revision:
244 + return self.revision
245 + else:
246 + return ''
247
248 diff --git a/gpackages/apps/packages/validators.py b/gpackages/apps/packages/validators.py
249 new file mode 100644
250 index 0000000..efe0c00
251 --- /dev/null
252 +++ b/gpackages/apps/packages/validators.py
253 @@ -0,0 +1,8 @@
254 +from django.core.validators import URLValidator, validate_email
255 +from django.core.exceptions import ValidationError
256 +
257 +validate_url = URLValidator()
258 +
259 +REVISION_RE = r'r\d+'
260 +VERSION_RE = r'[\w.]+'
261 +NAME_RE = r'[\w+-]+'
262
263 diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
264 index 81bb609..3d239ae 100644
265 --- a/gpackages/apps/packages/views.py
266 +++ b/gpackages/apps/packages/views.py
267 @@ -6,6 +6,7 @@ from models import CategoryModel, HerdsModel, MaintainerModel, \
268 PackageModel, UseFlagModel
269
270 from django.shortcuts import get_object_or_404
271 +from .utils import EbuildParse, PackageParse
272
273 arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
274
275 @@ -49,6 +50,7 @@ class EbuildsListView(ContextListView):
276 select_related('package',
277 'package__virtual_package',
278 'package__virtual_package__category'). \
279 + prefetch_related('package__repository'). \
280 prefetch_keywords(arches)
281
282 class EbuildDetailView(ContextView, DetailView):
283 @@ -61,6 +63,25 @@ class EbuildDetailView(ContextView, DetailView):
284 'package__virtual_package__category'). \
285 prefetch_keywords(arches)
286
287 + def get_object(self, queryset = None):
288 + pk = self.kwargs.get('pk')
289 + if pk is not None:
290 + return super(EbuildDetailView, self).get_object(queryset)
291 + if queryset is None:
292 + queryset = self.get_queryset()
293 +
294 + cpvr = self.kwargs.get('cpvr')
295 + eo = EbuildParse(cpvr)
296 + category, name = eo.category, eo.name
297 + version, revision = eo.version, eo.revision_for_q
298 + repository = eo.repository_for_q
299 + obj = get_object_or_404(queryset, package__virtual_package__name = name,
300 + package__virtual_package__category__category = category,
301 + package__repository__name = repository,
302 + version = version,
303 + revision = revision)
304 + return obj
305 +
306 class PackagesListsView(MultipleFilterListViewMixin, ContextListView):
307 allowed_filter = { 'category':'virtual_package__category__category',
308 'repo':'repository__name',
309 @@ -112,10 +133,10 @@ class PackageDetailView(ContextView, DetailView):
310 if queryset is None:
311 queryset = self.get_queryset()
312
313 - name, category = self.kwargs.get('name'), self.kwargs.get('category')
314 - repository = self.kwargs.get('repository')
315 - if repository is None:
316 - repository = 'gentoo'
317 + cpr = self.kwargs.get('cpr')
318 + po = PackageParse(cpr)
319 + category, name = po.category, po.name
320 + repository = po.repository_for_q
321 obj = get_object_or_404(queryset, name = name,
322 category = category,
323 repository__name = repository)
324
325 diff --git a/gpackages/templates/keywords_table.html b/gpackages/templates/keywords_table.html
326 index 63c4be1..93339eb 100644
327 --- a/gpackages/templates/keywords_table.html
328 +++ b/gpackages/templates/keywords_table.html
329 @@ -1,4 +1,3 @@
330 -{% load url from future %}
331 {% spaceless %}
332 <table class="keywords table table-bordered table-condensed">
333 <colgroup>
334 @@ -19,7 +18,7 @@
335 <tbody>
336 {% for ebuild in ebuilds %}
337 <tr>
338 - <td class="ebuild"><a href="{% url 'ebuild' pk=ebuild.pk %}">{{ ebuild.fullversion }}</a></td>
339 + <td class="ebuild"><a href="{{ ebuild.get_absolute_url }}">{{ ebuild.fullversion }}</a></td>
340 {% for keyword in ebuild.keywords %}
341 <td class="{{ keyword.status_class }}">{{ keyword.status_repr }}</td>
342 {% endfor %}