Revision 570015d2

b/snf-astakos-app/astakos/im/functions.py
78 78
    application_deny_notify,
79 79
    project_termination_notify, project_suspension_notify)
80 80
from astakos.im.endpoints.qh import (
81
    register_quotas, qh_get_quota)
81
    register_quotas, qh_get_quota, qh_add_quota)
82 82

  
83 83
import astakos.im.messages as astakos_messages
84 84

  
......
526 526
        raise PermissionDenied(m)
527 527

  
528 528
    membership.accept()
529
    qh_sync([membership])
529 530
    logger.info("User %s has been accepted in %s." %
530 531
                (membership.person.log_display, project))
531 532

  
......
585 586
        raise PermissionDenied(m)
586 587

  
587 588
    membership.remove()
589
    qh_sync([membership])
588 590
    logger.info("User %s has been removed from %s." %
589 591
                (membership.person.log_display, project))
590 592

  
......
602 604
        raise PermissionDenied(m)
603 605

  
604 606
    membership.accept()
607
    qh_sync([membership])
605 608
    logger.info("User %s has been enrolled in %s." %
606 609
                (membership.person.log_display, project))
610

  
607 611
    membership_enroll_notify(project, membership.person)
608 612

  
609 613
    return membership
......
638 642
    leave_policy = project.application.member_leave_policy
639 643
    if leave_policy == AUTO_ACCEPT_POLICY:
640 644
        membership.remove()
645
        qh_sync([membership])
641 646
        logger.info("User %s has left %s." %
642 647
                    (membership.person.log_display, project))
643 648
        auto_accepted = True
......
674 679
    if (join_policy == AUTO_ACCEPT_POLICY and
675 680
        not project.violates_members_limit(adding=1)):
676 681
        membership.accept()
682
        qh_sync([membership])
677 683
        logger.info("User %s joined %s." %
678 684
                    (membership.person.log_display, project))
679 685
        auto_accepted = True
......
783 789
                application.id, application.state_display()))
784 790
        raise PermissionDenied(m)
785 791

  
786
    application.approve()
792
    project = application.approve()
793
    qh_sync_projects([project])
787 794
    logger.info("%s has been approved." % (application.log_display))
788 795
    application_approve_notify(application)
789 796

  
......
801 808
    checkAlive(project)
802 809

  
803 810
    project.terminate()
811
    qh_sync_projects([project])
804 812
    logger.info("%s has been terminated." % (project))
813

  
805 814
    project_termination_notify(project)
806 815

  
807 816
def suspend(project_id):
......
809 818
    checkAlive(project)
810 819

  
811 820
    project.suspend()
821
    qh_sync_projects([project])
812 822
    logger.info("%s has been suspended." % (project))
823

  
813 824
    project_suspension_notify(project)
814 825

  
815 826
def resume(project_id):
......
820 831
        raise PermissionDenied(m)
821 832

  
822 833
    project.resume()
834
    qh_sync_projects([project])
823 835
    logger.info("%s has been unsuspended." % (project))
824 836

  
825 837
def get_by_chain_or_404(chain_id):
......
900 912
        return reached, limit
901 913

  
902 914
    return False, limit
915

  
916

  
917
def qh_sync_projects(projects):
918
    memberships = []
919
    append = memberships.append
920
    for project in projects:
921
        ms = project.projectmembership_set.all().select_for_update()
922
        memberships += list(ms)
923

  
924
    qh_sync(memberships)
925

  
926

  
927
def qh_sync(memberships):
928
    sub_quota, add_quota = [], []
929
    for membership in memberships:
930
        pending_application = membership.get_pending_application()
931
        membership.get_diff_quotas(sub_quota, add_quota, pending_application)
932
        if membership.state == membership.REMOVED:
933
            membership.delete()
934
        else:
935
            membership.application = pending_application
936
            membership.save()
937
    qh_add_quota(sub_quota, add_quota)
b/snf-astakos-app/astakos/im/models.py
1757 1757
        self.state = self.APPROVED
1758 1758
        self.response_date = now
1759 1759
        self.save()
1760
        return project
1760 1761

  
1761 1762
    @property
1762 1763
    def member_join_policy_display(self):
......
2270 2271
        self._set_history_item(reason='CANCEL')
2271 2272
        self.delete()
2272 2273

  
2273
    def get_diff_quotas(self, sub_list=None, add_list=None):
2274
    def get_diff_quotas(self, sub_list=None, add_list=None,
2275
                        pending_application=None):
2274 2276
        if sub_list is None:
2275 2277
            sub_list = []
2276 2278

  
......
2291 2293
                               capacity     = grant.member_capacity,
2292 2294
                               ))
2293 2295

  
2294
        pending_application = self.pending_application
2295 2296
        if pending_application is not None:
2296 2297
            new_grants = pending_application.projectresourcegrant_set.all()
2297 2298
            for new_grant in new_grants:
......
2303 2304

  
2304 2305
        return (sub_list, add_list)
2305 2306

  
2307
    def get_pending_application(self):
2308
        project = self.project
2309
        if project.is_deactivated():
2310
            return None
2311
        if self.state not in self.ACTUALLY_ACCEPTED:
2312
            return None
2313
        return project.application
2314

  
2306 2315

  
2307 2316
class Serial(models.Model):
2308 2317
    serial  =   models.AutoField(primary_key=True)

Also available in: Unified diff