Revision 6d583e07 snf-astakos-app/astakos/im/functions.py
b/snf-astakos-app/astakos/im/functions.py | ||
---|---|---|
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 | 34 |
import logging |
35 |
from datetime import datetime |
|
35 | 36 |
|
36 | 37 |
from django.utils.translation import ugettext as _ |
37 | 38 |
from django.core.mail import send_mail, get_connection |
... | ... | |
39 | 40 |
from django.contrib.auth import login as auth_login, logout as auth_logout |
40 | 41 |
from django.core.exceptions import PermissionDenied |
41 | 42 |
from django.db.models import Q |
42 |
from django.http import Http404 |
|
43 | 43 |
|
44 | 44 |
from synnefo_branding.utils import render_to_string |
45 | 45 |
|
... | ... | |
251 | 251 |
POLICIES = [AUTO_ACCEPT_POLICY, MODERATED_POLICY, CLOSED_POLICY] |
252 | 252 |
|
253 | 253 |
|
254 |
def get_project_by_application_id(project_application_id): |
|
255 |
try: |
|
256 |
return Project.objects.get(application__id=project_application_id) |
|
257 |
except Project.DoesNotExist: |
|
258 |
m = (_(astakos_messages.UNKNOWN_PROJECT_APPLICATION_ID) % |
|
259 |
project_application_id) |
|
260 |
raise IOError(m) |
|
261 |
|
|
262 |
|
|
263 | 254 |
def get_related_project_id(application_id): |
264 | 255 |
try: |
265 | 256 |
app = ProjectApplication.objects.get(id=application_id) |
266 |
chain = app.chain |
|
267 |
Project.objects.get(id=chain) |
|
268 |
return chain |
|
269 |
except (ProjectApplication.DoesNotExist, Project.DoesNotExist): |
|
270 |
return None |
|
271 |
|
|
272 |
|
|
273 |
def get_chain_of_application_id(application_id): |
|
274 |
try: |
|
275 |
app = ProjectApplication.objects.get(id=application_id) |
|
276 |
chain = app.chain |
|
277 |
return chain.chain |
|
257 |
return app.chain_id |
|
278 | 258 |
except ProjectApplication.DoesNotExist: |
279 | 259 |
return None |
280 | 260 |
|
... | ... | |
287 | 267 |
raise IOError(m) |
288 | 268 |
|
289 | 269 |
|
290 |
def get_project_by_name(name): |
|
291 |
try: |
|
292 |
return Project.objects.get(name=name) |
|
293 |
except Project.DoesNotExist: |
|
294 |
m = _(astakos_messages.UNKNOWN_PROJECT_ID) % name |
|
295 |
raise IOError(m) |
|
296 |
|
|
297 |
|
|
298 | 270 |
def get_chain_for_update(chain_id): |
299 | 271 |
try: |
300 | 272 |
return Chain.objects.get_for_update(chain=chain_id) |
... | ... | |
646 | 618 |
comments=comments) |
647 | 619 |
|
648 | 620 |
if precursor is None: |
649 |
application.chain = new_chain() |
|
621 |
chain = new_chain() |
|
622 |
application.chain_id = chain.chain |
|
623 |
application.save() |
|
624 |
Project.objects.create(id=chain.chain, application=application) |
|
650 | 625 |
else: |
651 | 626 |
chain = precursor.chain |
652 | 627 |
application.chain = chain |
653 |
objs = ProjectApplication.objects |
|
654 |
pending = objs.filter(chain=chain, state=ProjectApplication.PENDING) |
|
628 |
application.save() |
|
629 |
if chain.application.state != ProjectApplication.APPROVED: |
|
630 |
chain.application = application |
|
631 |
chain.save() |
|
632 |
|
|
633 |
pending = ProjectApplication.objects.filter( |
|
634 |
chain=chain, |
|
635 |
state=ProjectApplication.PENDING).exclude(id=application.id) |
|
655 | 636 |
for app in pending: |
656 | 637 |
app.state = ProjectApplication.REPLACED |
657 | 638 |
app.save() |
658 | 639 |
|
659 |
application.save() |
|
660 | 640 |
if resource_policies is not None: |
661 | 641 |
application.set_resource_policies(resource_policies) |
662 | 642 |
logger.info("User %s submitted %s." % |
... | ... | |
715 | 695 |
|
716 | 696 |
|
717 | 697 |
def check_conflicting_projects(application): |
718 |
try: |
|
719 |
project = get_project_by_id(application.chain) |
|
720 |
except IOError: |
|
721 |
project = None |
|
722 |
|
|
698 |
project = application.chain |
|
723 | 699 |
new_project_name = application.name |
724 | 700 |
try: |
725 | 701 |
q = Q(name=new_project_name) & ~Q(state=Project.TERMINATED) |
... | ... | |
732 | 708 |
except Project.DoesNotExist: |
733 | 709 |
pass |
734 | 710 |
|
735 |
return project |
|
736 |
|
|
737 | 711 |
|
738 | 712 |
def approve_application(app_id, request_user=None, reason=""): |
739 | 713 |
get_chain_of_application_for_update(app_id) |
740 | 714 |
application = get_application(app_id) |
715 |
project = application.chain |
|
741 | 716 |
|
742 | 717 |
checkAllowed(application, request_user, admin_only=True) |
743 | 718 |
|
... | ... | |
746 | 721 |
(application.id, application.state_display())) |
747 | 722 |
raise PermissionDenied(m) |
748 | 723 |
|
749 |
project = check_conflicting_projects(application)
|
|
724 |
check_conflicting_projects(application) |
|
750 | 725 |
|
751 | 726 |
# Pre-lock members and owner together in order to impose an ordering |
752 | 727 |
# on locking users |
753 |
members = members_to_sync(project) if project is not None else []
|
|
728 |
members = members_to_sync(project) |
|
754 | 729 |
uids_to_sync = [member.id for member in members] |
755 | 730 |
owner = application.owner |
756 | 731 |
uids_to_sync.append(owner.id) |
... | ... | |
758 | 733 |
|
759 | 734 |
qh_release_pending_app(owner, locked=True) |
760 | 735 |
application.approve(reason) |
736 |
project.application = application |
|
737 |
project.name = application.name |
|
738 |
project.save() |
|
739 |
if project.is_deactivated(): |
|
740 |
project.resume() |
|
761 | 741 |
qh_sync_locked_users(members) |
762 | 742 |
logger.info("%s has been approved." % (application.log_display)) |
763 | 743 |
application_approve_notify(application) |
... | ... | |
813 | 793 |
logger.info("%s has been unsuspended." % (project)) |
814 | 794 |
|
815 | 795 |
|
816 |
def get_by_chain_or_404(chain_id): |
|
817 |
try: |
|
818 |
project = Project.objects.get(id=chain_id) |
|
819 |
application = project.application |
|
820 |
return project, application |
|
821 |
except: |
|
822 |
application = ProjectApplication.objects.latest_of_chain(chain_id) |
|
823 |
if application is None: |
|
824 |
raise Http404 |
|
825 |
else: |
|
826 |
return None, application |
|
827 |
|
|
828 |
|
|
829 | 796 |
def _partition_by(f, l): |
830 | 797 |
d = {} |
831 | 798 |
for x in l: |
Also available in: Unified diff