1 |
commit: 565c26d136ad4d149b0f069172b7d07011d594b3 |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Sun Jun 3 13:16:35 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Sun Jun 3 13:16:35 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=565c26d1 |
7 |
|
8 |
Add herds and maintainers to scanning. |
9 |
|
10 |
--- |
11 |
.../packages/management/commands/scanpackages.py | 78 ++++++++++++++- |
12 |
gpackages/apps/packages/models.py | 104 ++++++++++---------- |
13 |
2 files changed, 129 insertions(+), 53 deletions(-) |
14 |
|
15 |
diff --git a/gpackages/apps/packages/management/commands/scanpackages.py b/gpackages/apps/packages/management/commands/scanpackages.py |
16 |
index 2968d65..b3adb97 100644 |
17 |
--- a/gpackages/apps/packages/management/commands/scanpackages.py |
18 |
+++ b/gpackages/apps/packages/management/commands/scanpackages.py |
19 |
@@ -1,6 +1,8 @@ |
20 |
from django.core.management.base import BaseCommand, CommandError |
21 |
from packages import models |
22 |
+from collections import defaultdict |
23 |
import porttree |
24 |
+import herds |
25 |
|
26 |
import datetime |
27 |
import logging |
28 |
@@ -77,6 +79,67 @@ def _get_items(items_list, Model, field_name, cache_var): |
29 |
return items_objects |
30 |
|
31 |
|
32 |
+def scan_maintainers(maintainers_dict): |
33 |
+ existend_maintainers = models.MaintainerModel.objects.all() |
34 |
+ mo_dict = {} |
35 |
+ to_del = [] |
36 |
+ for maintainer_object in existend_maintainers: |
37 |
+ if maintainer_object in maintainers_dict: |
38 |
+ # to update ? |
39 |
+ mo_dict[maintainer_object.email] = maintainer_object |
40 |
+ else: |
41 |
+ to_del.append(maintainer_object.pk) |
42 |
+ |
43 |
+ to_create = [] |
44 |
+ for maintainer in maintainers_dict.iterkeys(): |
45 |
+ if maintainer.email not in mo_dict: |
46 |
+ to_create.append(maintainer) |
47 |
+ |
48 |
+ mobjects = _create_objects(models.MaintainerModel, 'maintainer', to_create) |
49 |
+ _update_cache_by_queryset(mo_dict, mobjects, 'email') |
50 |
+ |
51 |
+ return mo_dict |
52 |
+ |
53 |
+ |
54 |
+def scan_herds(): |
55 |
+ existent_herds = models.HerdsModel.objects.all() |
56 |
+ herds_object = herds.Herds() |
57 |
+ herds_dict = herds_object.get_herds_indict() |
58 |
+ maintainers_dict = herds_object.get_maintainers_with_hers() |
59 |
+ ho_dict = {} |
60 |
+ to_del = [] |
61 |
+ for herd_object in existent_herds: |
62 |
+ if herd_object.name not in herds_dict: |
63 |
+ to_del.append(herd_object.pk) |
64 |
+ else: |
65 |
+ # to update ? |
66 |
+ ho_dict[herd_object.name] = herd_object |
67 |
+ |
68 |
+ models.HerdsModel.objects.filter(pk__in = to_del).delete() |
69 |
+ |
70 |
+ to_create = [] |
71 |
+ for herd in herds_dict.itervalues(): |
72 |
+ if herd.name not in ho_dict: |
73 |
+ to_create.append(herd) |
74 |
+ |
75 |
+ cobjects = _create_objects(models.HerdsModel, 'herd', to_create) |
76 |
+ _update_cache_by_queryset(ho_dict, cobjects, 'name') |
77 |
+ |
78 |
+ mo_dict = scan_maintainers(maintainers_dict) |
79 |
+ #Gen data for relate with herds |
80 |
+ res = defaultdict(list) |
81 |
+ for mainteiner, herds_names in maintainers_dict.iteritems(): |
82 |
+ for herd in herds_names: |
83 |
+ res[herd].append(mo_dict[mainteiner.email]) |
84 |
+ |
85 |
+ for herd_name, herd_object in ho_dict.iteritems(): |
86 |
+ herd_object.maintainers.clear() |
87 |
+ herd_object.maintainers.add(*res[herd_name]) |
88 |
+ |
89 |
+ return ho_dict, mo_dict |
90 |
+ |
91 |
+ |
92 |
+ |
93 |
class Command(BaseCommand): |
94 |
args = '' |
95 |
help = 'Will scan package tree and update info about it in database' |
96 |
@@ -116,17 +179,28 @@ class Command(BaseCommand): |
97 |
def get_homepages_objects(ebuild): |
98 |
homepages = ebuild.homepages |
99 |
return _get_items(homepages, models.HomepageModel, 'url', homepages_cache) |
100 |
+ |
101 |
|
102 |
st = datetime.datetime.now() |
103 |
+ herds_cache, maintainers_cache = scan_herds() |
104 |
+ def get_herds_objects(package): |
105 |
+ herds = package.metadata.herds() |
106 |
+ herds_objects = [] |
107 |
+ for herd in herds: |
108 |
+ if herd in herds_cache: |
109 |
+ herds_objects.append(herds_cache[herd]) |
110 |
+ |
111 |
+ return herds_objects |
112 |
# Load homepages to cache |
113 |
- for homepage in models.HomepageModel.objects.all(): |
114 |
- homepages_cache[homepage.url] = homepage |
115 |
+ #for homepage in models.HomepageModel.objects.all(): |
116 |
+ #homepages_cache[homepage.url] = homepage |
117 |
|
118 |
for category in self.porttree.iter_categories(): |
119 |
category_object, categor_created = models.CategoryModel.objects.get_or_create(category = category) |
120 |
for package in category.iter_packages(): |
121 |
print package |
122 |
package_object, package_created = models.PackageModel.objects.get_or_create(package = package, category = category_object) |
123 |
+ package_object.herds.add(*get_herds_objects(package)) |
124 |
for ebuild in package.iter_ebuilds(): |
125 |
ebuild_object = models.EbuildModel() |
126 |
ebuild_object.init_by_ebuild(ebuild) |
127 |
|
128 |
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py |
129 |
index 2ad8faa..d3ff5f6 100644 |
130 |
--- a/gpackages/apps/packages/models.py |
131 |
+++ b/gpackages/apps/packages/models.py |
132 |
@@ -42,6 +42,57 @@ class CategoryModel(models.Model): |
133 |
def __unicode__(self): |
134 |
return self.category |
135 |
|
136 |
+class MaintainerModel(models.Model): |
137 |
+ |
138 |
+ def __init__(self, *args, **kwargs): |
139 |
+ #TODO: Bad code, maybe use some libraries for overload methods |
140 |
+ maintainer = None |
141 |
+ if 'maintainer' in kwargs: |
142 |
+ maintainer = kwargs['maintainer'] |
143 |
+ del kwargs['maintainer'] |
144 |
+ super(MaintainerModel, self).__init__(*args, **kwargs) |
145 |
+ if maintainer is not None: |
146 |
+ self.init_by_maintainer(maintainer) |
147 |
+ |
148 |
+ name = models.CharField(max_length = 255, blank = True, null = True) |
149 |
+ email = models.EmailField(unique = True) |
150 |
+ role = models.TextField(blank = True, null = True) |
151 |
+ |
152 |
+ objects = managers.MaintainerManager() |
153 |
+ |
154 |
+ def init_by_maintainer(self, maintainer): |
155 |
+ self.name = maintainer.name |
156 |
+ self.email = maintainer.email |
157 |
+ self.role = maintainer.role |
158 |
+ |
159 |
+ def __unicode__(self): |
160 |
+ return ':'.join((unicode(self.name), self.email)) |
161 |
+ |
162 |
+class HerdsModel(models.Model): |
163 |
+ |
164 |
+ def __init__(self, *args, **kwargs): |
165 |
+ herd = None |
166 |
+ if 'herd' in kwargs: |
167 |
+ herd = kwargs['herd'] |
168 |
+ del kwargs['herd'] |
169 |
+ super(HerdsModel, self).__init__(*args, **kwargs) |
170 |
+ if herd is not None: |
171 |
+ self.init_by_herd(herd) |
172 |
+ |
173 |
+ name = models.CharField(unique = True, max_length = 150) |
174 |
+ email = models.EmailField() |
175 |
+ description = models.TextField(blank = True, null = True) |
176 |
+ maintainers = models.ManyToManyField(MaintainerModel, blank = True) |
177 |
+ |
178 |
+ objects = managers.HerdsManager() |
179 |
+ |
180 |
+ def init_by_herd(self, herd): |
181 |
+ self.name = herd.name |
182 |
+ self.email = herd.email |
183 |
+ self.description = herd.description |
184 |
+ |
185 |
+ def __unicode__(self): |
186 |
+ return self.name |
187 |
|
188 |
class PackageModel(models.Model): |
189 |
def __init__(self, *args, **kwargs): |
190 |
@@ -69,6 +120,8 @@ class PackageModel(models.Model): |
191 |
changelog_mtime = models.DateTimeField(blank = True, null = True) |
192 |
manifest_mtime = models.DateTimeField(blank = True, null = True) |
193 |
mtime = models.DateTimeField(blank = True, null = True) |
194 |
+ |
195 |
+ herds = models.ManyToManyField(HerdsModel, blank = True) |
196 |
# Different versions can have different licenses, or homepages. |
197 |
|
198 |
objects = managers.PackageManager() |
199 |
@@ -220,54 +273,3 @@ class Keyword(models.Model): |
200 |
unique_together = ('ebuild', 'arch') |
201 |
|
202 |
|
203 |
-class MaintainerModel(models.Model): |
204 |
- |
205 |
- def __init__(self, *args, **kwargs): |
206 |
- #TODO: Bad code, maybe use some libraries for overload methods |
207 |
- maintainer = None |
208 |
- if 'maintainer' in kwargs: |
209 |
- maintainer = kwargs['maintainer'] |
210 |
- del kwargs['maintainer'] |
211 |
- super(MaintainerModel, self).__init__(*args, **kwargs) |
212 |
- if maintainer is not None: |
213 |
- self.init_by_maintainer(maintainer) |
214 |
- |
215 |
- name = models.CharField(max_length = 255, blank = True, null = True) |
216 |
- email = models.EmailField(unique = True) |
217 |
- role = models.TextField(blank = True, null = True) |
218 |
- |
219 |
- objects = managers.MaintainerManager() |
220 |
- |
221 |
- def init_by_maintainer(self, maintainer): |
222 |
- self.name = maintainer.name |
223 |
- self.email = maintainer.email |
224 |
- self.role = maintainer.role |
225 |
- |
226 |
- def __unicode__(self): |
227 |
- return ':'.join((unicode(self.name), self.email)) |
228 |
- |
229 |
-class HerdsModel(models.Model): |
230 |
- |
231 |
- def __init__(self, *args, **kwargs): |
232 |
- herd = None |
233 |
- if 'herd' in kwargs: |
234 |
- herd = kwargs['herd'] |
235 |
- del kwargs['herd'] |
236 |
- super(HerdsModel, self).__init__(*args, **kwargs) |
237 |
- if herd is not None: |
238 |
- self.init_by_herd(herd) |
239 |
- |
240 |
- name = models.CharField(unique = True, max_length = 150) |
241 |
- email = models.EmailField() |
242 |
- description = models.TextField(blank = True, null = True) |
243 |
- maintainers = models.ManyToManyField(MaintainerModel, blank = True) |
244 |
- |
245 |
- objects = managers.HerdsManager() |
246 |
- |
247 |
- def init_by_herd(self, herd): |
248 |
- self.name = herd.name |
249 |
- self.email = herd.email |
250 |
- self.description = herd.description |
251 |
- |
252 |
- def __unicode__(self): |
253 |
- return self.name |