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