Revision 5d996aea snf-quotaholder-app/quotaholder_django/quotaholder_app/callpoint.py

b/snf-quotaholder-app/quotaholder_django/quotaholder_app/callpoint.py
45 45
from django.db.models import Q
46 46
from django.db import transaction, IntegrityError
47 47
from .models import (Holder, Entity, Policy, Holding,
48
                     Commission, Provision, ProvisionLog, now)
48
                     Commission, Provision, ProvisionLog, now,
49
                     db_get_entity, db_get_holding, db_get_policy,
50
                     db_get_commission, db_filter_provision)
49 51

  
50 52

  
51 53
class QuotaholderDjangoDBCallpoint(Callpoint):
......
107 109

  
108 110
        for entity, key, newkey in set_entity_key:
109 111
            try:
110
                e = Entity.objects.get(entity=entity, key=key)
112
                e = db_get_entity(entity=entity, key=key, for_update=True)
111 113
            except Entity.DoesNotExist:
112 114
                append(entity)
113 115
                continue
......
163 165
                import_limit, export_limit  ) in set_limits:
164 166

  
165 167
                try:
166
                    policy = Policy.objects.get(policy=policy)
168
                    policy = db_get_policy(policy=policy, for_update=True)
167 169
                except Policy.DoesNotExist:
168 170
                    Policy.objects.create(  policy=policy,
169 171
                                            quantity=quantity,
......
200 202

  
201 203
    def _set_holding(self, entity, resource, policy, flags):
202 204
        try:
203
            h = Holding.objects.get(entity=entity, resource=resource)
205
            h = db_get_holding(entity=entity, resource=resource,
206
                               for_update=True)
204 207
            h.policy = p
205 208
            h.flags = flags
206 209
            h.save()
......
231 234
                continue
232 235

  
233 236
            try:
234
                h = Holding.objects.get(entity=entity, resource=resource)
237
                h = db_get_holding(entity=entity, resource=resource,
238
                                   for_update=True)
235 239
                h.policy = p
236 240
                h.flags = flags
237 241
                h.save()
......
245 249
                          imported, exported, returned, released,
246 250
                          flags):
247 251
        try:
248
            h = Holding.objects.get(entity=entity, resource=resource)
252
            h = db_get_holding(entity=entity, resource=resource,
253
                               for_update=True)
249 254
        except Holding.DoesNotExist:
250 255
            h = Holding(entity=entity, resource=resource)
251 256

  
......
305 310
                continue
306 311

  
307 312
            try:
308
                h = Holding.objects.get(entity=entity, resource=resource)
313
                h = db_get_holding(entity=entity, resource=resource,
314
                                   for_update=True)
309 315
                h.imported=imported
310 316
                h.importing=imported
311 317
                h.exported=exported
......
341 347

  
342 348
    def _increase_resource(self, entity, resource, amount):
343 349
        try:
344
            h = Holding.objects.get(entity=entity, resource=resource)
350
            h = db_get_holding(entity=entity, resource=resource,
351
                               for_update=True)
345 352
        except Holding.DoesNotExist:
346 353
            h = Holding(entity=entity, resource=resource)
347 354
            p = Policy.objects.create(policy=self._new_policy_name(),
......
356 363

  
357 364
        for idx, (entity, resource, key) in enumerate(release_holding):
358 365
            try:
359
                h = Holding.objects.get(entity=entity, resource=resource)
366
                h = db_get_holding(entity=entity, resource=resource,
367
                                   for_update=True)
360 368
            except Holding.DoesNotExist:
361 369
                append(idx)
362 370
                continue
......
462 470
                )
463 471

  
464 472
                try:
465
                    h = Holding.objects.get(entity=entity, resource=resource)
473
                    h = db_get_holding(entity=entity, resource=resource,
474
                                       for_update=True)
466 475
                    p = h.policy
467 476
                    h.policy = newp
468 477
                    h.flags = flags
......
528 537
                release = 1
529 538

  
530 539
            try:
531
                h = Holding.objects.get(entity=entity, resource=resource)
540
                h = db_get_holding(entity=entity, resource=resource,
541
                                   for_update=True)
532 542
            except Holding.DoesNotExist:
533 543
                m = ("There is not enough quantity "
534 544
                     "to allocate from in %s.%s" % (entity, resource))
......
551 561
                    raise NoQuantityError(m)
552 562

  
553 563
            try:
554
                th = Holding.objects.get(entity=target, resource=resource)
564
                th = db_get_holding(entity=target, resource=resource,
565
                                    for_update=True)
555 566
            except Holding.DoesNotExist:
556 567
                m = ("There is not enough capacity "
557 568
                     "to allocate into in %s.%s" % (target, resource))
......
630 641

  
631 642
        for serial in serials:
632 643
            try:
633
                c = Commission.objects.get(clientkey=clientkey, serial=serial)
644
                c = db_get_commission(clientkey=clientkey, serial=serial,
645
                                      for_update=True)
634 646
            except Commission.DoesNotExist:
635 647
                return
636 648

  
637 649
            t = c.entity
638 650

  
639
            provisions = Provision.objects.filter(serial=serial)
651
            provisions = db_filter_provision(serial=serial, for_update=True)
640 652
            for pv in provisions:
641 653
                try:
642
                    h = Holding.objects.get(entity=pv.entity.entity,
643
                                            resource=pv.resource    )
644
                    th = Holding.objects.get(entity=t, resource=pv.resource)
654
                    h = db_get_holding(entity=pv.entity.entity,
655
                                       resource=pv.resource, for_update=True)
656
                    th = db_get_holding(entity=t, resource=pv.resource,
657
                                        for_update=True)
645 658
                except Holding.DoesNotExist:
646 659
                    m = "Corrupted provision"
647 660
                    raise CorruptedError(m)
......
673 686

  
674 687
        for serial in serials:
675 688
            try:
676
                c = Commission.objects.get(clientkey=clientkey, serial=serial)
689
                c = db_get_commission(clientkey=clientkey, serial=serial,
690
                                      for_update=True)
677 691
            except Commission.DoesNotExist:
678 692
                return
679 693

  
680 694
            t = c.entity
681 695

  
682
            provisions = Provision.objects.filter(serial=serial)
696
            provisions = db_filter_provision(serial=serial, for_update=True)
683 697
            for pv in provisions:
684 698
                try:
685
                    h = Holding.objects.get(entity=pv.entity.entity,
686
                                            resource=pv.resource)
687
                    th = Holding.objects.get(entity=t, resource=pv.resource)
699
                    h = db_get_holding(entity=pv.entity.entity,
700
                                       resource=pv.resource, for_update=True)
701
                    th = db_get_holding(entity=t, resource=pv.resource,
702
                                        for_update=True)
688 703
                except Holding.DoesNotExist:
689 704
                    m = "Corrupted provision"
690 705
                    raise CorruptedError(m)
......
740 755
        append = rejected.append
741 756
        for entity, key in release_entity:
742 757
            try:
743
                e = Entity.objects.get(entity=entity, key=key)
758
                e = db_get_entity(entity=entity, key=key, for_update=True)
744 759
            except Entity.DoesNotExist:
745 760
                append(entity)
746 761
                continue

Also available in: Unified diff