Revision ea1e5d9f snf-quotaholder-app/quotaholder_django/quotaholder_app/managers.py
b/snf-quotaholder-app/quotaholder_django/quotaholder_app/managers.py | ||
---|---|---|
1 |
# Copyright 2012 GRNET S.A. All rights reserved. |
|
1 |
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
|
|
2 | 2 |
# |
3 | 3 |
# Redistribution and use in source and binary forms, with or without |
4 | 4 |
# modification, are permitted provided that the following conditions |
... | ... | |
45 | 45 |
transactions that abort due to deadlocks. |
46 | 46 |
|
47 | 47 |
Example: |
48 |
networks = Network.objects.select_for_update().filter(public=True)
|
|
48 |
networks = Network.objects.filter(public=True).select_for_update()
|
|
49 | 49 |
|
50 | 50 |
""" |
51 | 51 |
|
52 |
def __init__(self, *args, **kwargs): |
|
53 |
super(ForUpdateManager, self).__init__(*args, **kwargs) |
|
54 |
self._select_for_update = False |
|
55 |
|
|
56 |
def filter(self, *args, **kwargs): |
|
57 |
query = self.get_query_set().filter(*args, **kwargs) |
|
58 |
if self._select_for_update: |
|
59 |
self._select_for_update = False |
|
60 |
return for_update(query) |
|
61 |
else: |
|
62 |
return query |
|
63 |
|
|
64 |
def get(self, *args, **kwargs): |
|
65 |
if not self._select_for_update: |
|
66 |
return self.get_query_set().get(*args, **kwargs) |
|
52 |
def get_query_set(self): |
|
53 |
return ForUpdateQuerySet(self.model, using=self._db) |
|
67 | 54 |
|
68 |
query = self.filter(*args, **kwargs) |
|
55 |
def get_for_update(self, *args, **kwargs): |
|
56 |
query = for_update(self.filter(*args, **kwargs)) |
|
69 | 57 |
query = list(query) |
70 | 58 |
num = len(query) |
71 | 59 |
if num == 1: |
... | ... | |
80 | 68 |
"Lookup parameters were %s" % |
81 | 69 |
(self.model._meta.object_name, num, kwargs)) |
82 | 70 |
|
83 |
def select_for_update(self, *args, **kwargs): |
|
84 |
self._select_for_update = True |
|
85 |
return self |
|
71 |
|
|
72 |
class ForUpdateQuerySet(QuerySet): |
|
73 |
|
|
74 |
def select_for_update(self): |
|
75 |
return for_update(self) |
|
86 | 76 |
|
87 | 77 |
|
88 | 78 |
def for_update(query): |
... | ... | |
95 | 85 |
sql, params = query.query.get_compiler(query.db).as_sql() |
96 | 86 |
return query.model._default_manager.raw(sql.rstrip() + ' FOR UPDATE', |
97 | 87 |
params) |
98 |
|
|
99 |
|
|
100 |
class ProtectedDeleteManager(ForUpdateManager): |
|
101 |
""" Manager for protecting Backend deletion. |
|
102 |
|
|
103 |
Call Backend delete() method in order to prevent deletion |
|
104 |
of Backends that host non-deleted VirtualMachines. |
|
105 |
|
|
106 |
""" |
|
107 |
|
|
108 |
def get_query_set(self): |
|
109 |
return BackendQuerySet(self.model, using=self._db) |
|
110 |
|
|
111 |
|
|
112 |
class BackendQuerySet(QuerySet): |
|
113 |
def delete(self): |
|
114 |
for backend in self._clone(): |
|
115 |
backend.delete() |
Also available in: Unified diff