Revision 0da5e49a

b/snf-astakos-app/astakos/im/management/commands/astakos-quota.py
80 80
        else:
81 81
            log = self.run(sync)
82 82

  
83
        qh_l, qh_c, astakos_i, diff_q, info = log
83
        qh_limits, qh_quotas, astakos_i, diff_q, info = log
84 84

  
85 85
        if list_only:
86
            self.list_quotas(qh_l, qh_c, astakos_i, info)
86
            self.list_quotas(qh_quotas, astakos_i, info)
87 87
        else:
88 88
            if verify:
89
                self.print_verify(qh_l, diff_q)
89
                self.print_verify(qh_limits, diff_q)
90 90
            if sync:
91 91
                self.print_sync(diff_q)
92 92

  
......
125 125
            logger.exception(e)
126 126
            raise CommandError("Syncing failed.")
127 127

  
128
    def list_quotas(self, qh_limits, qh_counters, astakos_initial, info):
129
        labels = ('uuid', 'email', 'resource', 'initial', 'total', 'usage')
130
        columns = (36, 30, 24, 12, 12, 12)
128
    def list_quotas(self, qh_quotas, astakos_initial, info):
129
        labels = ('uuid', 'email', 'source', 'resource', 'initial', 'total', 'usage')
130
        columns = (36, 30, 20, 24, 12, 12, 12)
131 131

  
132 132
        line = ' '.join(l.rjust(w) for l, w in zip(labels, columns))
133 133
        self.stdout.write(line + '\n')
134 134
        sep = '-' * len(line)
135 135
        self.stdout.write(sep + '\n')
136 136

  
137
        for holder, resources in qh_limits.iteritems():
138
            h_counters = qh_counters[holder]
137
        for holder, holder_quotas in qh_quotas.iteritems():
139 138
            h_initial = astakos_initial[holder]
140 139
            email = info[holder]
141
            for resource, limits in resources.iteritems():
142
                initial = str(h_initial[resource])
143
                capacity = str(limits)
144
                used = str(h_counters[resource])
145

  
146
                fields = holder, email, resource, initial, capacity, used
147
                output = []
148
                for field, width in zip(fields, columns):
149
                    s = field.rjust(width)
150
                    output.append(s)
151

  
152
                line = ' '.join(output)
153
                self.stdout.write(line + '\n')
140
            for source, source_quotas in holder_quotas.iteritems():
141
                s_initial = h_initial[source]
142
                for resource, values in source_quotas.iteritems():
143
                    initial = str(s_initial[resource])
144
                    capacity = str(values['limit'])
145
                    used = str(values['used'])
146

  
147
                    fields = holder, email, source, resource, initial, capacity, used
148
                    output = []
149
                    for field, width in zip(fields, columns):
150
                        s = field.rjust(width)
151
                        output.append(s)
152

  
153
                    line = ' '.join(output)
154
                    self.stdout.write(line + '\n')
154 155

  
155 156
    def print_sync(self, diff_quotas):
156 157
        size = len(diff_quotas)
b/snf-astakos-app/astakos/im/models.py
84 84
from synnefo.lib.db.intdecimalfield import intDecimalField
85 85
from synnefo.util.text import uenc, udec
86 86

  
87
from astakos.im.quotas import get_users_quotas_and_limits, set_user_quota
88

  
87 89
logger = logging.getLogger(__name__)
88 90

  
89 91
DEFAULT_CONTENT_TYPE = None
......
774 776
            raise ValueError("could not compute quotas")
775 777

  
776 778

  
779
SYSTEM = 'system'
780

  
777 781
def initial_quotas(users):
778 782
    initial = {}
779 783
    default_quotas = get_default_quota()
780 784

  
781 785
    for user in users:
782 786
        uuid = user.uuid
783
        initial[uuid] = dict(default_quotas)
787
        source_quota = {SYSTEM: dict(default_quotas)}
788
        initial[uuid] = source_quota
784 789

  
785 790
    objs = AstakosUserQuota.objects.select_related()
786 791
    orig_quotas = objs.filter(user__in=users)
......
794 799
    return initial
795 800

  
796 801

  
802
def get_grant_source(grant):
803
    return SYSTEM
804

  
805

  
797 806
def users_quotas(users, initial=None):
798 807
    if initial is None:
799 808
        quotas = initial_quotas(users)
800 809
    else:
801 810
        quotas = copy.deepcopy(initial)
802 811

  
803
    objs = ProjectMembership.objects.select_related('application', 'person')
804
    memberships = objs.filter(person__in=users)
812
    ACTUALLY_ACCEPTED = ProjectMembership.ACTUALLY_ACCEPTED
813
    objs = ProjectMembership.objects.select_related('project', 'person')
814
    memberships = objs.filter(person__in=users,
815
                              state__in=ACTUALLY_ACCEPTED,
816
                              project__state=Project.APPROVED)
817

  
818
    project_ids = set(m.project_id for m in memberships)
819
    objs = ProjectApplication.objects.select_related('project')
820
    apps = objs.filter(project__in=project_ids)
821

  
822
    project_dict = {}
823
    for app in apps:
824
        project_dict[app.project] = app
805 825

  
806
    apps = set(m.application for m in memberships if m.application is not None)
807 826
    objs = ProjectResourceGrant.objects.select_related()
808 827
    grants = objs.filter(project_application__in=apps)
809 828

  
......
811 830
        uuid = membership.person.uuid
812 831
        userquotas = quotas.get(uuid, {})
813 832

  
814
        application = membership.application
815
        if application is None:
816
            continue
833
        application = project_dict[membership.project]
817 834

  
818 835
        for grant in grants:
819 836
            if grant.project_application_id != application.id:
820 837
                continue
838

  
839
            source = get_grant_source(grant)
840
            source_quotas = userquotas.get(source, {})
841

  
821 842
            resource = grant.resource.full_name()
822
            prev = userquotas.get(resource, 0)
843
            prev = source_quotas.get(resource, 0)
823 844
            new = prev + grant.member_capacity
824
            userquotas[resource] = new
845
            source_quotas[resource] = new
846
            userquotas[source] = source_quotas
825 847
        quotas[uuid] = userquotas
826 848

  
827 849
    return quotas
......
2305 2327
        for user in users:
2306 2328
            info[user.uuid] = user.email
2307 2329

  
2308
        resources = get_resource_names()
2309
        qh_limits, qh_counters = qh_get_quotas(users, resources)
2330
        qh_quotas, qh_limits = get_users_quotas_and_limits(users)
2310 2331
        astakos_initial = initial_quotas(users)
2311 2332
        astakos_quotas = users_quotas(users)
2312 2333

  
......
2317 2338
                diff_quotas[holder] = dict(local)
2318 2339

  
2319 2340
        if sync:
2320
            r = send_quotas(diff_quotas)
2341
            r = set_user_quota(diff_quotas)
2321 2342

  
2322
        return (qh_limits, qh_counters,
2343
        return (qh_limits, qh_quotas,
2323 2344
                astakos_initial, diff_quotas, info)
2324 2345

  
2325 2346
    return _sync_users(users, sync)

Also available in: Unified diff