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