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/apps/packages/templatetags/, ...
Date: Fri, 29 Jun 2012 00:00:13
Message-Id: 1340886372.43ce171f72aa969fd1d2d87449789867065ae8f1.bacher09@gentoo
1 commit: 43ce171f72aa969fd1d2d87449789867065ae8f1
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Thu Jun 28 12:26:12 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Thu Jun 28 12:26:12 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=43ce171f
7
8 Add custom prefetch for keywords.
9
10 ---
11 gpackages/apps/packages/managers.py | 51 +++++++++++++++++++++-
12 gpackages/apps/packages/models.py | 11 +++--
13 gpackages/apps/packages/templatetags/packages.py | 2 +-
14 gpackages/apps/packages/views.py | 8 ++-
15 gpackages/templates/ebuilds.html | 2 +-
16 gpackages/templates/packages.html | 2 +-
17 6 files changed, 65 insertions(+), 11 deletions(-)
18
19 diff --git a/gpackages/apps/packages/managers.py b/gpackages/apps/packages/managers.py
20 index 557cd48..012b40d 100644
21 --- a/gpackages/apps/packages/managers.py
22 +++ b/gpackages/apps/packages/managers.py
23 @@ -3,6 +3,7 @@ from package_info.abstract import AbstarctPackage, AbstractEbuild, \
24 AbstractKeywords
25 import packages.models
26 from package_info.generic import get_from_kwargs_and_del
27 +from collections import defaultdict
28
29 def _gen_query_and_manager(MixinClass, QueryClassName, ManagerClassName):
30 QueryClass = type(QueryClassName, (MixinClass, models.query.QuerySet), {})
31 @@ -68,7 +69,7 @@ class KeywordMixin(object):#{{{
32
33
34 class EbuildMixin(object):#{{{
35 -
36 +
37 def get(self, ebuild=None, package = None, *args, **kwargs):
38 if ebuild is not None and isinstance(ebuild, AbstractEbuild):
39 if package is None:
40 @@ -84,6 +85,54 @@ class EbuildMixin(object):#{{{
41 def all_by_numbers(self):
42 return super(EbuildMixin, self).order_by('version', 'revision')
43
44 + def __init__(self, *args, **kwargs):
45 + super(EbuildMixin, self).__init__(*args, **kwargs)
46 + self._arches_set = None
47 + self._cache_keywords = None
48 +
49 + # Maybe use https://github.com/ionelmc/django-prefetch ?
50 + def prefetch_with_keywords(self, arch_list):
51 + arch_set = set(arch_list)
52 + arch_set.add('*')
53 + self._arches_set = arch_set
54 + return self
55 +
56 + def __old_iter__(self):
57 + return super(EbuildMixin, self).__iter__()
58 +
59 + def _clone(self, *args, **kwargs):
60 + c = super(EbuildMixin, self)._clone(*args, **kwargs)
61 + c._arches_set = self._arches_set
62 + return c
63 +
64 + def _prefetch_keywords(self):
65 + arch_set = self._arches_set
66 + pk_keys = [ebuild.pk for ebuild in self.__old_iter__()]
67 + query = packages.models.Keyword.objects.filter(ebuild__in = pk_keys,
68 + arch__name__in = arch_set).select_related('arch')
69 +
70 + cache_query = defaultdict(list)
71 + for keyword in query:
72 + cache_query[keyword.ebuild_id].append(keyword)
73 +
74 + self._cache_keywords = cache_query
75 +
76 + def __iter__(self):
77 + arch_set = self._arches_set
78 + if arch_set is None:
79 + for ebuild in self.__old_iter__():
80 + yield ebuild
81 + else:
82 + if self._cache_keywords is None:
83 + self._prefetch_keywords()
84 +
85 + cache_query = self._cache_keywords
86 +
87 + for ebuild in self.__old_iter__():
88 + ebuild._prefetched_keywords = cache_query[ebuild.pk]
89 + yield ebuild
90 +
91 +
92
93 class HerdsMixin(object):#{{{
94 def filter(self, *args, **kwargs):
95
96 diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
97 index 187088e..caa7156 100644
98 --- a/gpackages/apps/packages/models.py
99 +++ b/gpackages/apps/packages/models.py
100 @@ -312,7 +312,6 @@ class PackageModel(AbstractDateTimeModel):
101 l.extend(ebuild.get_ebuilds_and_keywords(arch_list))
102 return l
103
104 -
105 class Meta:
106 unique_together = ('virtual_package', 'repository')
107 ordering = ('-updated_datetime',)
108 @@ -381,6 +380,7 @@ class EbuildModel(AbstractDateTimeModel):
109 super(EbuildModel, self).__init__(*args, **kwargs)
110 if isinstance(ebuild, AbstractEbuild):
111 self.init_by_ebuild(ebuild)
112 + self._prefetched_keywords = None
113
114 def __unicode__(self):
115 return self.cpv
116 @@ -470,9 +470,12 @@ class EbuildModel(AbstractDateTimeModel):
117
118 return keywords_dict
119
120 - def load_keywords(self, arch_set):
121 - arch_set.add('*')
122 - return self.keyword_set.filter(arch__name__in = arch_set).select_related('arch')
123 + def load_keywords(self, arch_set, flush_cache = False):
124 + if self._prefetched_keywords is None or flush_cache:
125 + arch_set.add('*')
126 + self._prefetched_keywords = self.keyword_set. \
127 + filter(arch__name__in = arch_set).select_related('arch')
128 + return self._prefetched_keywords
129
130 def get_ebuilds_and_keywords(self, arch_list):
131 # Maybe copy object ? !!
132
133 diff --git a/gpackages/apps/packages/templatetags/packages.py b/gpackages/apps/packages/templatetags/packages.py
134 index 45c756d..e381cb0 100644
135 --- a/gpackages/apps/packages/templatetags/packages.py
136 +++ b/gpackages/apps/packages/templatetags/packages.py
137 @@ -11,7 +11,7 @@ def last_updated():
138 return {'last_updated': l.updated_datetime}
139
140 @register.inclusion_tag('keywords_table.html')
141 -def render_keywords_table(obj, *arch_list):
142 +def render_keywords_table(obj, arch_list):
143 ebuilds = obj.get_ebuilds_and_keywords(arch_list)
144 return {'arches': arch_list, 'ebuilds' : ebuilds}
145
146
147 diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
148 index 6f73fdd..16c74e2 100644
149 --- a/gpackages/apps/packages/views.py
150 +++ b/gpackages/apps/packages/views.py
151 @@ -35,18 +35,20 @@ class LicenseGroupsView(ContextListView):
152 context_object_name = 'license_groups'
153
154 class EbuildsListView(ContextListView):
155 + arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
156 paginate_by = 40
157 - extra_context = {'page_name': 'Ebuilds',}
158 + extra_context = {'page_name': 'Ebuilds', 'arches' : arches}
159 template_name = 'ebuilds.html'
160 context_object_name = 'ebuilds'
161 queryset = EbuildModel.objects.all(). \
162 select_related('package',
163 'package__virtual_package',
164 - 'package__virtual_package__category')
165 + 'package__virtual_package__category').prefetch_with_keywords(arches)
166
167 class PackagesListsView(ContextListView):
168 + arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
169 paginate_by = 40
170 - extra_context = {'page_name': 'Packages',}
171 + extra_context = {'page_name': 'Packages', 'arches': arches}
172 template_name = 'packages.html'
173 context_object_name = 'packages'
174 queryset = PackageModel.objects.all(). \
175
176 diff --git a/gpackages/templates/ebuilds.html b/gpackages/templates/ebuilds.html
177 index ef51a43..94e1ecd 100644
178 --- a/gpackages/templates/ebuilds.html
179 +++ b/gpackages/templates/ebuilds.html
180 @@ -9,7 +9,7 @@
181 <span class="package_update_datetime">{{ ebuild.updated_datetime }}</span>
182 </div>
183 <div style="padding-bottom: 10px; margin 10px;">{{ ebuild.description }}</div>
184 - {% render_keywords_table ebuild 'alpha' 'amd64' 'arm' 'hppa' 'ia64' 'ppc' 'ppc64' 'sparc' 'x86' %}
185 + {% render_keywords_table ebuild arches %}
186 </div>
187 {% endfor %}
188 {% include 'paginator.html' %}
189
190 diff --git a/gpackages/templates/packages.html b/gpackages/templates/packages.html
191 index b6600dc..ec6d22a 100644
192 --- a/gpackages/templates/packages.html
193 +++ b/gpackages/templates/packages.html
194 @@ -11,7 +11,7 @@
195 {% if package.description %}
196 <div style="padding-bottom: 10px; margin 10px;">{{ package.description }}</div>
197 {% endif %}
198 - {% render_keywords_table package 'alpha' 'amd64' 'arm' 'hppa' 'ia64' 'ppc' 'ppc64' 'sparc' 'x86' %}
199 + {% render_keywords_table package arches %}
200 </div>
201 {% endfor %}
202 {% include 'paginator.html' %}