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