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/management/commands/
Date: Sun, 03 Jun 2012 13:19:46
Message-Id: 1338729395.565c26d136ad4d149b0f069172b7d07011d594b3.bacher09@gentoo
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