Revision b2369828

b/snf-astakos-app/astakos/im/forms.py
885 885
                                                    resource.name)
886 886
                    d = model_to_dict(resource)
887 887
                    if uplimit:
888
                        d.update(dict(resource=prefix, uplimit=uplimit))
888
                        d.update(dict(resource=prefix, uplimit=long(uplimit)))
889 889
                    else:
890 890
                        d.update(dict(resource=prefix, uplimit=None))
891 891
                    append(d)
......
902 902
        return policies
903 903

  
904 904
    def cleaned_resource_policies(self):
905
        return [(d['name'], d['uplimit']) for d in self.resource_policies]
905
        policies = {}
906
        for d in self.resource_policies:
907
            policies[d["name"]] = {
908
                "project_capacity": None,
909
                "member_capacity": d["uplimit"]
910
            }
911

  
912
        return policies
906 913

  
907 914
    def save(self, commit=True):
908 915
        data = dict(self.cleaned_data)
909 916
        is_new = self.instance.id is None
910 917
        data['project_id'] = self.instance.chain.id if not is_new else None
911 918
        data['owner'] = self.user if is_new else self.instance.owner
912
        data['resource_policies'] = self.cleaned_resource_policies()
919
        data['resources'] = self.cleaned_resource_policies()
913 920
        data['request_user'] = self.user
914 921
        submit_application(**data)
915 922

  
b/snf-astakos-app/astakos/im/functions.py
45 45

  
46 46
from synnefo.lib import join_urls
47 47
from astakos.im.models import AstakosUser, Invitation, ProjectMembership, \
48
    ProjectApplication, Project, new_chain
48
    ProjectApplication, Project, new_chain, Resource
49 49
from astakos.im.quotas import qh_sync_user, get_pending_app_quota, \
50 50
    register_pending_apps, qh_sync_project, qh_sync_locked_users, \
51 51
    get_users_for_update, members_to_sync
......
620 620
                       member_leave_policy=None,
621 621
                       limit_on_members_number=None,
622 622
                       comments=None,
623
                       resource_policies=None,
623
                       resources=None,
624 624
                       request_user=None):
625 625

  
626 626
    project = None
......
634 634
            m = _(astakos_messages.NOT_ALLOWED)
635 635
            raise PermissionDenied(m)
636 636

  
637
    policies = validate_resource_policies(resources)
638

  
637 639
    force = request_user.is_project_admin()
638 640
    ok, limit = qh_add_pending_app(owner, project, force)
639 641
    if not ok:
......
672 674
            app.state = ProjectApplication.REPLACED
673 675
            app.save()
674 676

  
675
    if resource_policies is not None:
676
        application.set_resource_policies(resource_policies)
677
    if policies is not None:
678
        set_resource_policies(application, policies)
677 679
    logger.info("User %s submitted %s." %
678 680
                (request_user.log_display, application.log_display))
679 681
    application_submit_notify(application)
680 682
    return application
681 683

  
682 684

  
685
def validate_resource_policies(policies):
686
    if not isinstance(policies, dict):
687
        raise ProjectBadRequest("Malformed resource policies")
688

  
689
    resource_names = policies.keys()
690
    resources = Resource.objects.filter(name__in=resource_names)
691
    resource_d = {}
692
    for resource in resources:
693
        resource_d[resource.name] = resource
694

  
695
    found = resource_d.keys()
696
    nonex = [name for name in resource_names if name not in found]
697
    if nonex:
698
        raise ValueError("Malformed resource policies")
699

  
700
    pols = []
701
    for resource_name, specs in policies.iteritems():
702
        p_capacity = specs.get("project_capacity")
703
        m_capacity = specs.get("member_capacity")
704

  
705
        if p_capacity is not None and not isinstance(p_capacity, (int, long)):
706
            raise ValueError("Malformed resource policies")
707
        if not isinstance(m_capacity, (int, long)):
708
            raise ValueError("Malformed resource policies")
709
        pols.append((resource_d[resource_name], m_capacity, p_capacity))
710
    return pols
711

  
712

  
713
def set_resource_policies(application, policies):
714
    for resource, m_capacity, p_capacity in policies:
715
        g = application.projectresourcegrant_set
716
        g.create(resource=resource,
717
                 member_capacity=m_capacity,
718
                 project_capacity=p_capacity)
719

  
720

  
683 721
def cancel_application(application_id, request_user=None, reason=""):
684 722
    get_project_of_application_for_update(application_id)
685 723
    application = get_application(application_id)
b/snf-astakos-app/astakos/im/models.py
1391 1391
    def state_display(self):
1392 1392
        return self.APPLICATION_STATE_DISPLAY.get(self.state, _('Unknown'))
1393 1393

  
1394
    def add_resource_policy(self, resource, uplimit):
1395
        """Raises ObjectDoesNotExist, IntegrityError"""
1396
        q = self.projectresourcegrant_set
1397
        resource = Resource.objects.get(name=resource)
1398
        q.create(resource=resource, member_capacity=uplimit)
1399

  
1400 1394
    @property
1401 1395
    def grants(self):
1402 1396
        return self.projectresourcegrant_set.values('member_capacity',
......
1406 1400
    def resource_policies(self):
1407 1401
        return [str(rp) for rp in self.projectresourcegrant_set.all()]
1408 1402

  
1409
    def set_resource_policies(self, policies):
1410
        for resource, uplimit in policies:
1411
            self.add_resource_policy(resource, uplimit)
1412

  
1413 1403
    def is_modification(self):
1414 1404
        # if self.state != self.PENDING:
1415 1405
        #     return False

Also available in: Unified diff