1 |
commit: 03f39c1a46149d472797e4adb6654705579c412c |
2 |
Author: Devan Franchini <twitch153 <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Aug 28 00:36:37 2015 +0000 |
4 |
Commit: Devan Franchini <twitch153 <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Aug 28 00:36:40 2015 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/layman.git/commit/?id=03f39c1a |
7 |
|
8 |
Adds multiple owner support to layman overlays |
9 |
|
10 |
layman/db_modules/sqlite_db/sqlite_db.py | 69 ++++++++----- |
11 |
layman/overlays/overlay.py | 164 ++++++++++++++++++------------- |
12 |
2 files changed, 137 insertions(+), 96 deletions(-) |
13 |
|
14 |
diff --git a/layman/db_modules/sqlite_db/sqlite_db.py b/layman/db_modules/sqlite_db/sqlite_db.py |
15 |
index 22ae5f3..a3305a7 100644 |
16 |
--- a/layman/db_modules/sqlite_db/sqlite_db.py |
17 |
+++ b/layman/db_modules/sqlite_db/sqlite_db.py |
18 |
@@ -172,12 +172,21 @@ class DBHandler(object): |
19 |
cursor.execute('''SELECT Owner_Email, Owner_Name FROM |
20 |
Overlay_Owner JOIN Overlay USING (Overlay_ID) JOIN Owner USING |
21 |
(Owner_ID) WHERE Overlay_ID = ?''', (overlay_id,)) |
22 |
- owner_info = cursor.fetchall()[0] |
23 |
- |
24 |
- overlay['owner_email'] = owner_info[0] |
25 |
- |
26 |
- if len(owner_info) > 1: |
27 |
- overlay['owner_name'] = owner_info[1] |
28 |
+ owner_info = cursor.fetchall() |
29 |
+ overlay['owner'] = [] |
30 |
+ |
31 |
+ for _owner in owner_info: |
32 |
+ owner = {} |
33 |
+ if _owner[0]: |
34 |
+ owner['email'] = _owner[0] |
35 |
+ else: |
36 |
+ owner['email'] = None |
37 |
+ if len(_owner) > 1: |
38 |
+ if _owner[1]: |
39 |
+ owner['name'] = _owner[1] |
40 |
+ else: |
41 |
+ owner['name'] = None |
42 |
+ overlay['owner'].append(owner) |
43 |
|
44 |
cursor.execute('''SELECT Description FROM Description JOIN |
45 |
Overlay USING (Overlay_ID) WHERE Overlay_ID = ?''', |
46 |
@@ -225,7 +234,7 @@ class DBHandler(object): |
47 |
''' |
48 |
overlay_id = None |
49 |
owner_id = None |
50 |
- source_ids = [] |
51 |
+ source_id = None |
52 |
cursor = None |
53 |
|
54 |
cursor = connection.cursor() |
55 |
@@ -239,22 +248,37 @@ class DBHandler(object): |
56 |
(overlay.name,)) |
57 |
overlay_id = cursor.fetchone()[0] |
58 |
|
59 |
- cursor.execute('''INSERT INTO Owner ( Owner_Name, Owner_Email ) |
60 |
- VALUES ( ?, ? )''', (overlay.owner_name, overlay.owner_email,)) |
61 |
- connection.commit() |
62 |
+ for owner in overlay.owners: |
63 |
+ _name = owner['name'] |
64 |
+ _email = owner['email'] |
65 |
+ |
66 |
+ cursor.execute('''INSERT INTO Owner ( Owner_Name, Owner_Email ) |
67 |
+ VALUES ( ?, ? )''', (owner['name'], owner['email'],)) |
68 |
+ connection.commit() |
69 |
+ |
70 |
+ if _name != None: |
71 |
+ cursor.execute('''SELECT Owner_ID from Owner WHERE |
72 |
+ Owner_Email = ? AND Owner_Name = ?''', (_email, _name,)) |
73 |
+ else: |
74 |
+ cursor.execute('''SELECT Owner_ID from Owner WHERE |
75 |
+ Owner_Email = ?''', (_email,)) |
76 |
+ owner_id = cursor.fetchone()[0] |
77 |
|
78 |
- cursor.execute('''SELECT Owner_ID from Owner WHERE Owner_Email = ?;''', |
79 |
- (overlay.owner_email,)) |
80 |
- owner_id = cursor.fetchone()[0] |
81 |
+ cursor.execute('''INSERT INTO Overlay_Owner ( Overlay_ID, |
82 |
+ Owner_ID ) VALUES ( ?, ? )''', (overlay_id, owner_id,)) |
83 |
|
84 |
for source in overlay.sources: |
85 |
cursor.execute('''INSERT INTO Source ( Type, Branch, URL ) |
86 |
VALUES ( ?, ?, ? )''', (source.type_key, source.branch, |
87 |
source.src,)) |
88 |
connection.commit() |
89 |
+ |
90 |
cursor.execute('''SELECT Source_ID FROM Source WHERE URL = ?;''', |
91 |
(source.src,)) |
92 |
- source_ids.append(cursor.fetchone()[0]) |
93 |
+ source_id = cursor.fetchone()[0] |
94 |
+ |
95 |
+ cursor.execute('''INSERT INTO Overlay_Source ( Overlay_ID, |
96 |
+ Source_ID ) VALUES ( ?, ? )''', (overlay_id, source_id, )) |
97 |
|
98 |
for description in overlay.descriptions: |
99 |
cursor.execute('''INSERT INTO Description ( Overlay_ID, |
100 |
@@ -264,13 +288,6 @@ class DBHandler(object): |
101 |
cursor.execute('''INSERT INTO Feed ( Overlay_ID, Feed ) VALUES ( ?, |
102 |
? )''', (overlay_id, feed,)) |
103 |
|
104 |
- cursor.execute('''INSERT INTO Overlay_Owner ( Overlay_ID, Owner_ID ) |
105 |
- VALUES ( ?, ? )''', (overlay_id, owner_id,)) |
106 |
- |
107 |
- for source_id in source_ids: |
108 |
- cursor.execute('''INSERT INTO Overlay_Source ( Overlay_ID, |
109 |
- Source_ID ) VALUES ( ?, ? )''', (overlay_id, source_id,)) |
110 |
- |
111 |
connection.commit() |
112 |
|
113 |
|
114 |
@@ -280,7 +297,7 @@ class DBHandler(object): |
115 |
''' |
116 |
cursor = None |
117 |
overlay_id = 0 |
118 |
- owner_id = 0 |
119 |
+ owner_ids = [] |
120 |
source_ids = [] |
121 |
|
122 |
if overlay.name in self.overlays: |
123 |
@@ -295,7 +312,7 @@ class DBHandler(object): |
124 |
|
125 |
cursor.execute('''SELECT Owner_ID FROM Overlay_Owner WHERE |
126 |
Overlay_ID = ?''', (overlay_id,)) |
127 |
- owner_id = cursor.fetchone()[0] |
128 |
+ owner_ids = cursor.fetchall()[0] |
129 |
|
130 |
cursor.execute('''SELECT Source_ID FROM Overlay_Source WHERE |
131 |
Overlay_ID = ?''', (overlay_id,)) |
132 |
@@ -314,8 +331,10 @@ class DBHandler(object): |
133 |
cursor.execute('''DELETE FROM Source WHERE Source_ID = ?''', |
134 |
(source_id,)) |
135 |
|
136 |
- cursor.execute('''DELETE FROM Owner WHERE Owner_ID = ?''', |
137 |
- (owner_id,)) |
138 |
+ for owner_id in owner_ids: |
139 |
+ cursor.execute('''DELETE FROM Owner WHERE Owner_ID = ?''', |
140 |
+ (owner_id,)) |
141 |
+ |
142 |
cursor.execute('''DELETE FROM Overlay WHERE Overlay_ID = ?''', |
143 |
(overlay_id,)) |
144 |
|
145 |
|
146 |
diff --git a/layman/overlays/overlay.py b/layman/overlays/overlay.py |
147 |
index defa4e3..11536d4 100755 |
148 |
--- a/layman/overlays/overlay.py |
149 |
+++ b/layman/overlays/overlay.py |
150 |
@@ -191,23 +191,28 @@ class Overlay(object): |
151 |
|
152 |
self.sources = [create_dict_overlay_source(e) for e in _sources] |
153 |
|
154 |
- if 'owner_name' in overlay: |
155 |
- _owner = overlay['owner_name'] |
156 |
- self.owner_name = encode(_owner) |
157 |
- else: |
158 |
- self.owner_name = None |
159 |
- |
160 |
- if 'owner_email' in overlay: |
161 |
- _email = overlay['owner_email'] |
162 |
- self.owner_email = encode(_email) |
163 |
- else: |
164 |
- self.owner_email = None |
165 |
- msg = 'Overlay from_dict(), "%(name)s" is missing an "owner.email"'\ |
166 |
- ' entry!' % {'name': self.name} |
167 |
- if not ignore: |
168 |
- raise Exception(msg) |
169 |
- elif ignore == 1: |
170 |
- self.output.warn(msg, 4) |
171 |
+ self.owners = [] |
172 |
+ |
173 |
+ if 'owner' in overlay: |
174 |
+ for _owner in overlay['owner']: |
175 |
+ owner = {} |
176 |
+ if 'name' in _owner and _owner['name']: |
177 |
+ owner['name'] = encode(_owner['name']) |
178 |
+ else: |
179 |
+ owner['name'] = None |
180 |
+ |
181 |
+ if 'email' in _owner: |
182 |
+ owner['email'] = encode(_owner['email']) |
183 |
+ else: |
184 |
+ owner['email'] = None |
185 |
+ msg = 'Overlay from_dict(), "%(name)s" is missing an '\ |
186 |
+ '"owner.email" entry!' % {'name': self.name} |
187 |
+ if not ignore: |
188 |
+ raise Exception(msg) |
189 |
+ elif ignore == 1: |
190 |
+ self.output.warn(msg, 4) |
191 |
+ |
192 |
+ self.owners.append(owner) |
193 |
|
194 |
if 'description' in overlay: |
195 |
self.descriptions = [] |
196 |
@@ -313,21 +318,26 @@ class Overlay(object): |
197 |
|
198 |
self.sources = [create_json_overlay_source(e) for e in _sources] |
199 |
|
200 |
- if 'name' in json['owner']: |
201 |
- self.owner_name = encode(json['owner']['name']) |
202 |
- else: |
203 |
- self.owner_name = None |
204 |
+ _owners = json['owner'] |
205 |
+ self.owners = [] |
206 |
|
207 |
- if 'email' in json['owner']: |
208 |
- self.owner_email = encode(json['owner']['email']) |
209 |
- else: |
210 |
- self.owner_email = None |
211 |
- msg = 'Overlay from_json(), "%(name)s" is missing an "owner.email"'\ |
212 |
- 'entry!' % {'name': self.name} |
213 |
- if not ignore: |
214 |
- raise Exception(msg) |
215 |
- elif ignore == 1: |
216 |
- self.output.warn(msg, 4) |
217 |
+ for _owner in _owners: |
218 |
+ owner = {} |
219 |
+ if 'name' in _owner: |
220 |
+ owner['name'] = encode(_owner['name']) |
221 |
+ else: |
222 |
+ owner['name'] = None |
223 |
+ if 'email' in _owner: |
224 |
+ owner['email'] = encode(_owner['email']) |
225 |
+ else: |
226 |
+ owner['email'] = None |
227 |
+ msg = 'Overlay from_json(), "%(name)s" is missing an '\ |
228 |
+ '"owner.email" entry!' % {'name': self.name} |
229 |
+ if not ignore: |
230 |
+ raise Exception(msg) |
231 |
+ elif ignore == 1: |
232 |
+ self.output.warn(msg, 4) |
233 |
+ self.owners.append(owner) |
234 |
|
235 |
if 'description' in json: |
236 |
self.descriptions = [] |
237 |
@@ -441,32 +451,35 @@ class Overlay(object): |
238 |
|
239 |
self.sources = [create_overlay_source(e) for e in _sources] |
240 |
|
241 |
- _owner = xml.find('owner') |
242 |
+ _owners = xml.findall('owner') |
243 |
+ self.owners = [] |
244 |
|
245 |
- if _owner == None: |
246 |
- _email = None |
247 |
- else: |
248 |
- _email = _owner.find('email') |
249 |
+ for _owner in _owners: |
250 |
+ owner = {} |
251 |
|
252 |
- if _owner != None and _email != None: |
253 |
- self.owner_email = encode(strip_text(_email)) |
254 |
+ _email = _owner.find('email') |
255 |
_name = _owner.find('name') |
256 |
+ |
257 |
if _name != None: |
258 |
- self.owner_name = encode(strip_text(_name)) |
259 |
+ owner['name'] = encode(strip_text(_name)) |
260 |
else: |
261 |
- self.owner_name = None |
262 |
- elif 'contact' in xml.attrib: |
263 |
- self.owner_email = encode(xml.attrib['contact']) |
264 |
- self.owner_name = None |
265 |
- else: |
266 |
- self.owner_email = '' |
267 |
- self.owner_name = None |
268 |
- msg = 'Overlay from_xml(), "%(name)s" is mising an '\ |
269 |
- '"owner.email" entry!' % {'name': self.name} |
270 |
- if not ignore: |
271 |
- raise Exception(msg) |
272 |
- elif ignore == 1: |
273 |
- self.output.warn(msg, 4) |
274 |
+ owner['name'] = None |
275 |
+ if _email != None: |
276 |
+ owner['email'] = encode(strip_text(_email)) |
277 |
+ else: |
278 |
+ owner['email'] = None |
279 |
+ msg = 'Overlay from_xml(), "%(name)s" is missing an '\ |
280 |
+ '"owner.email" entry!' % {'name': self.name} |
281 |
+ if not ignore: |
282 |
+ raise Exception(msg) |
283 |
+ elif ignore == 1: |
284 |
+ self.output.warn(msg, 4) |
285 |
+ |
286 |
+ # For backwards compatibility with older Overlay XML formats. |
287 |
+ if not _email and not _name and 'contact' in xml.attrib: |
288 |
+ owner['email'] = encode(xml.attrib['contact']) |
289 |
+ owner['name'] = None |
290 |
+ self.owners.append(owner) |
291 |
|
292 |
_desc = xml.findall('description') |
293 |
if _desc != None: |
294 |
@@ -536,16 +549,27 @@ class Overlay(object): |
295 |
if len(self.sources) == 1: |
296 |
result += '\nSource : ' + self.sources[0].src |
297 |
else: |
298 |
- result += '\nSources:' |
299 |
+ result += '\nSources : ' |
300 |
for i, v in enumerate(self.sources): |
301 |
result += '\n %d. %s' % (i + 1, v.src) |
302 |
result += '\n' |
303 |
|
304 |
- if self.owner_name != None: |
305 |
- result += '\nContact : %s <%s>' \ |
306 |
- % (self.owner_name, self.owner_email) |
307 |
- else: |
308 |
- result += '\nContact : ' + self.owner_email |
309 |
+ if len(self.owners) == 1: |
310 |
+ if 'name' in self.owners[0] and self.owners[0]['name'] != None: |
311 |
+ result += '\nContact : %s <%s>' \ |
312 |
+ % (self.owners[0]['name'], self.owners[0]['email']) |
313 |
+ else: |
314 |
+ result += '\nContact : ' + self.owners[0]['email'] |
315 |
+ else: |
316 |
+ result += '\nContacts: ' |
317 |
+ for i, v in enumerate(self.owners): |
318 |
+ result += '\n %d. ' % (i + 1) |
319 |
+ if 'name' in v and v['name'] != None: |
320 |
+ result += '%s <%s>' % (v['name'], v['email']) |
321 |
+ else: |
322 |
+ result += v['email'] |
323 |
+ result += '\n' |
324 |
+ |
325 |
if len(self.sources) == 1: |
326 |
result += '\nType : ' + self.sources[0].type |
327 |
else: |
328 |
@@ -666,10 +690,7 @@ class Overlay(object): |
329 |
repo['homepage'] = self.homepage |
330 |
if self.irc != None: |
331 |
repo['irc'] = self.irc |
332 |
- repo['owner'] = {} |
333 |
- repo['owner']['email'] = self.owner_email |
334 |
- if self.owner_name != None: |
335 |
- repo['owner']['name'] = self.owner_name |
336 |
+ repo['owner'] = [i for i in self.owners] |
337 |
repo['source'] = [] |
338 |
for i in self.sources: |
339 |
source = {'@type': i.__class__.type_key} |
340 |
@@ -712,15 +733,16 @@ class Overlay(object): |
341 |
irc = ET.Element('irc') |
342 |
irc.text = self.irc |
343 |
repo.append(irc) |
344 |
- owner = ET.Element('owner') |
345 |
- repo.append(owner) |
346 |
- owner_email = ET.Element('email') |
347 |
- owner_email.text = self.owner_email |
348 |
- owner.append(owner_email) |
349 |
- if self.owner_name != None: |
350 |
- owner_name = ET.Element('name') |
351 |
- owner_name.text = self.owner_name |
352 |
- owner.append(owner_name) |
353 |
+ for _owner in self.owners: |
354 |
+ owner = ET.Element('owner') |
355 |
+ owner_email = ET.Element('email') |
356 |
+ owner_email.text = _owner['email'] |
357 |
+ owner.append(owner_email) |
358 |
+ if 'name' in _owner and _owner['name']: |
359 |
+ owner_name = ET.Element('name') |
360 |
+ owner_name.text = _owner['name'] |
361 |
+ owner.append(owner_name) |
362 |
+ repo.append(owner) |
363 |
for i in self.sources: |
364 |
if not i.branch: |
365 |
source = ET.Element('source', type=i.__class__.type_key) |