1 |
commit: b19a891069ed4b9bfa909e00501c47443e3710ff |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Tue May 29 17:37:48 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Tue May 29 17:37:48 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=b19a8910 |
7 |
|
8 |
Extend manager. |
9 |
|
10 |
--- |
11 |
gpackages/apps/packages/managers.py | 40 ++++++++++++++++++++++++++++++++++- |
12 |
1 files changed, 39 insertions(+), 1 deletions(-) |
13 |
|
14 |
diff --git a/gpackages/apps/packages/managers.py b/gpackages/apps/packages/managers.py |
15 |
index a9b514b..6e69007 100644 |
16 |
--- a/gpackages/apps/packages/managers.py |
17 |
+++ b/gpackages/apps/packages/managers.py |
18 |
@@ -1,4 +1,4 @@ |
19 |
-from django.db import models |
20 |
+from django.db import models, connections, router, transaction, IntegrityError |
21 |
from porttree import Category, Package, Ebuild, Keyword |
22 |
import packages.models |
23 |
|
24 |
@@ -46,6 +46,44 @@ KeywordQuerySet, KeywordManager = _gen_query_and_manager(KeywordMixin, |
25 |
'KeywordManager') |
26 |
|
27 |
class EbuildMixin(object): |
28 |
+ def create(self, **kwargs): |
29 |
+ if 'ebuild' in kwargs: |
30 |
+ obj = self.model(**kwargs) |
31 |
+ else: |
32 |
+ obj = super(EbuildMixin, self).create(**kwargs) |
33 |
+ return obj |
34 |
+ |
35 |
+ def get_or_create(self, **kwargs): |
36 |
+ assert kwargs, \ |
37 |
+ 'get_or_create() must be passed at least one keyword argument' |
38 |
+ defaults = kwargs.pop('defaults', {}) |
39 |
+ lookup = kwargs.copy() |
40 |
+ for f in self.model._meta.fields: |
41 |
+ if f.attname in lookup: |
42 |
+ lookup[f.name] = lookup.pop(f.attname) |
43 |
+ try: |
44 |
+ self._for_write = True |
45 |
+ return self.get(**lookup), False |
46 |
+ except self.model.DoesNotExist: |
47 |
+ try: |
48 |
+ params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) |
49 |
+ params.update(defaults) |
50 |
+ obj = self.model(**params) |
51 |
+ if 'ebuild' not in kwargs: |
52 |
+ obj.save(force_insert=True, using=self.db) |
53 |
+ sid = transaction.savepoint(using=self.db) |
54 |
+ transaction.savepoint_commit(sid, using=self.db) |
55 |
+ return obj, True |
56 |
+ except IntegrityError as e: |
57 |
+ transaction.savepoint_rollback(sid, using=self.db) |
58 |
+ exc_info = sys.exc_info() |
59 |
+ try: |
60 |
+ return self.get(**lookup), False |
61 |
+ except self.model.DoesNotExist: |
62 |
+ # Re-raise the IntegrityError with its original traceback. |
63 |
+ raise exc_info[1], None, exc_info[2] |
64 |
+ |
65 |
+ |
66 |
def get(self, ebuild=None, *args, **kwargs): |
67 |
if ebuild is not None and isinstance(ebuild, Ebuild): |
68 |
try: |