Revision 548938f6

b/snf-astakos-app/astakos/im/quotas.py
116 116
    return lst
117 117

  
118 118

  
119
def _set_user_quota(quotas):
119
def _set_user_quota(quotas, resource=None):
120 120
    q = _level_quota_dict(quotas)
121
    qh.set_quota(q)
121
    qh.set_quota(q, resource=resource)
122 122

  
123 123

  
124 124
SYSTEM = 'system'
......
148 148
    AstakosUserQuota.objects.\
149 149
        filter(resource__name=resource, user__pk__in=userids).\
150 150
        update(capacity=value)
151
    qh_sync_locked_users(users)
151
    qh_sync_locked_users(users, resource=resource)
152 152

  
153 153

  
154 154
def initial_quotas(users, flt=None):
......
179 179
    return min(x+y, units.PRACTICALLY_INFINITE)
180 180

  
181 181

  
182
def astakos_users_quotas(users):
182
def astakos_users_quotas(users, resource=None):
183 183
    users = list(users)
184
    quotas = initial_quotas(users)
184
    flt = Q(resource__name=resource) if resource is not None else Q()
185
    quotas = initial_quotas(users, flt=flt)
185 186

  
186 187
    userids = [user.pk for user in users]
187 188
    ACTUALLY_ACCEPTED = ProjectMembership.ACTUALLY_ACCEPTED
......
196 197
    apps = set(m.project.application_id for m in memberships)
197 198

  
198 199
    objs = ProjectResourceGrant.objects.select_related()
199
    grants = objs.filter(project_application__in=apps)
200
    grants = objs.filter(project_application__in=apps).filter(flt)
200 201

  
201 202
    for membership in memberships:
202 203
        uuid = membership.person.uuid
......
239 240
    return get_users_for_update([user_id])[0]
240 241

  
241 242

  
242
def qh_sync_locked_users(users):
243
    astakos_quotas = astakos_users_quotas(users)
244
    _set_user_quota(astakos_quotas)
243
def qh_sync_locked_users(users, resource=None):
244
    astakos_quotas = astakos_users_quotas(users, resource=resource)
245
    _set_user_quota(astakos_quotas, resource=resource)
245 246

  
246 247

  
247
def qh_sync_users(users):
248
def qh_sync_users(users, resource=None):
248 249
    uids = [user.id for user in users]
249 250
    users = get_users_for_update(uids)
250
    qh_sync_locked_users(users)
251
    qh_sync_locked_users(users, resource=resource)
251 252

  
252 253

  
253 254
def qh_sync_users_diffs(users, sync=True):
......
313 314
            AstakosUserQuota(user=user, resource=resource,
314 315
                             capacity=resource.uplimit))
315 316
    AstakosUserQuota.objects.bulk_create(entries)
316
    qh_sync_users(users)
317
    qh_sync_users(users, resource=resource.name)
b/snf-astakos-app/astakos/quotaholder_app/callpoint.py
75 75
    return quotas
76 76

  
77 77

  
78
def _get_holdings_for_update(holding_keys, delete=False):
78
def _get_holdings_for_update(holding_keys, resource=None, delete=False):
79
    flt = Q(resource=resource) if resource is not None else Q()
79 80
    holders = set(holder for (holder, source, resource) in holding_keys)
80
    objs = Holding.objects.filter(holder__in=holders).order_by('pk')
81
    objs = Holding.objects.filter(flt, holder__in=holders).order_by('pk')
81 82
    hs = objs.select_for_update()
82 83

  
83 84
    keys = set(holding_keys)
......
105 106
            }
106 107

  
107 108

  
108
def set_quota(quotas):
109
def set_quota(quotas, resource=None):
109 110
    holding_keys = [key for (key, limit) in quotas]
110
    holdings = _get_holdings_for_update(holding_keys, delete=True)
111
    holdings = _get_holdings_for_update(
112
        holding_keys, resource=resource, delete=True)
111 113

  
112 114
    new_holdings = {}
113 115
    for key, limit in quotas:
114
        holder, source, resource = key
116
        holder, source, res = key
117
        if resource is not None and resource != res:
118
            continue
115 119
        h = Holding(holder=holder,
116 120
                    source=source,
117
                    resource=resource,
121
                    resource=res,
118 122
                    limit=limit)
119 123
        try:
120 124
            h_old = holdings[key]

Also available in: Unified diff