Revision e47fb17a

b/snf-astakos-app/astakos/im/forms.py
52 52
from django.utils.encoding import smart_unicode
53 53
from django.core import validators
54 54
from django.contrib.auth.models import AnonymousUser
55
from django.core.exceptions import PermissionDenied
55 56

  
56 57
from astakos.im.models import (
57 58
    AstakosUser, EmailChange, Invitation,
58 59
    Resource, PendingThirdPartyUser, get_latest_terms, RESOURCE_SEPARATOR,
59
    ProjectApplication)
60
    ProjectApplication, Project)
60 61
from astakos.im.settings import (
61 62
    INVITATIONS_PER_LEVEL, BASEURL, SITENAME, RECAPTCHA_PRIVATE_KEY,
62 63
    RECAPTCHA_ENABLED, DEFAULT_CONTACT_EMAIL, LOGGING_LEVEL,
......
64 65
    MODERATION_ENABLED, PROJECT_MEMBER_JOIN_POLICIES,
65 66
    PROJECT_MEMBER_LEAVE_POLICIES)
66 67
from astakos.im.widgets import DummyWidget, RecaptchaWidget
67
from astakos.im.functions import send_change_email, submit_application
68
from astakos.im.functions import (
69
    send_change_email, submit_application, do_accept_membership_checks)
68 70

  
69 71
from astakos.im.util import reserved_email, get_query, model_to_dict
70 72
from astakos.im import auth_providers
......
102 104
    """
103 105
    Extends the built in UserCreationForm in several ways:
104 106

  
105
    * Adds email, first_name, last_name, recaptcha_challenge_field, recaptcha_response_field field.
107
    * Adds email, first_name, last_name, recaptcha_challenge_field,
108
    * recaptcha_response_field field.
106 109
    * The username field isn't visible and it is assigned a generated id.
107 110
    * User created is not active.
108 111
    """
......
841 844
class AddProjectMembersForm(forms.Form):
842 845
    q = forms.CharField(
843 846
        max_length=800, widget=forms.Textarea, label=_('Add members'),
844
        help_text=_(astakos_messages.ADD_PROJECT_MEMBERS_Q_HELP),
845
        required=True)
847
        help_text=_(astakos_messages.ADD_PROJECT_MEMBERS_Q_HELP), required=True)
846 848

  
849
    def __init__(self, *args, **kwargs):
850
        application_id = kwargs.pop('application_id', None)
851
        if application_id:
852
            self.project = Project.objects.get(application__id=application_id)
853
        self.request_user = kwargs.pop('request_user', None)
854
        super(AddProjectMembersForm, self).__init__(*args, **kwargs)
855
        
847 856
    def clean(self):
857
        try:
858
            do_accept_membership_checks(self.project, self.request_user)
859
        except PermissionDenied, e:
860
            raise forms.ValidationError(e)
861

  
848 862
        q = self.cleaned_data.get('q') or ''
849 863
        users = q.split(',')
850 864
        users = list(u.strip() for u in users if u)
851 865
        db_entries = AstakosUser.objects.filter(email__in=users)
852 866
        unknown = list(set(users) - set(u.email for u in db_entries))
853 867
        if unknown:
854
            raise forms.ValidationError(_(astakos_messages.UNKNOWN_USERS) % ','.join(unknown))
868
            raise forms.ValidationError(
869
                _(astakos_messages.UNKNOWN_USERS) % ','.join(unknown))
855 870
        self.valid_users = db_entries
856 871
        return self.cleaned_data
857 872

  
b/snf-astakos-app/astakos/im/functions.py
444 444
    project_id = get_project_id_of_application_id(project_application_id)
445 445
    return do_accept_membership(project_id, user, request_user)
446 446

  
447
def do_accept_membership(project_id, user, request_user=None):
448
    project = get_project_for_update(project_id)
449

  
447
def do_accept_membership_checks(project, request_user):
450 448
    if request_user and \
451 449
        (not project.application.owner == request_user and \
452 450
            not request_user.is_superuser):
......
462 460
    if project.violates_members_limit(adding=1):
463 461
        raise PermissionDenied(_(astakos_messages.MEMBER_NUMBER_LIMIT_REACHED))
464 462

  
463
def do_accept_membership(
464
        project_id, user, request_user=None, bypass_checks=False):
465
    project = get_project_for_update(project_id)
466

  
467
    if not bypass_checks:
468
        do_accept_membership_checks(project, request_user)
469

  
465 470
    membership = get_membership_for_update(project, user)
466 471
    membership.accept()
467 472
    trigger_sync()
......
487 492
    project_id = get_project_id_of_application_id(project_application_id)
488 493
    return do_reject_membership(project_id, user, request_user)
489 494

  
490
def do_reject_membership(project_id, user, request_user=None):
491
    project = get_project_for_update(project_id)
492

  
495
def do_reject_membership_checks(project, request_user):
493 496
    if request_user and \
494 497
        (not project.application.owner == request_user and \
495 498
            not request_user.is_superuser):
496 499
        raise PermissionDenied(_(astakos_messages.NOT_ALLOWED))
497 500
    if not project.is_alive:
498
        raise PermissionDenied(_(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
501
        raise PermissionDenied(
502
            _(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
503

  
504
def do_reject_membership(
505
        project_id, user, request_user=None, bypass_checks=False):
506
    project = get_project_for_update(project_id)
499 507

  
508
    if not bypass_checks:
509
        do_reject_membership_checks(project, request_user)
510
    
500 511
    membership = get_membership_for_update(project, user)
501 512
    membership.reject()
502 513

  
......
521 532
    project_id = get_project_id_of_application_id(project_application_id)
522 533
    return do_remove_membership(project_id, user, request_user)
523 534

  
524
def do_remove_membership(project_id, user, request_user=None):
525
    project = get_project_for_update(project_id)
526

  
535
def do_remove_membership_checks(project, membership):
527 536
    if request_user and \
528 537
        (not project.application.owner == request_user and \
529 538
            not request_user.is_superuser):
530 539
        raise PermissionDenied(_(astakos_messages.NOT_ALLOWED))
531 540
    if not project.is_alive:
532
        raise PermissionDenied(_(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
541
        raise PermissionDenied(
542
            _(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
543

  
544
def do_remove_membership(
545
        project_id, user, request_user=None, bypass_checks=False):
546
    project = get_project_for_update(project_id)
547

  
548
    if not bypass_checks:
549
        do_remove_membership_checks(project, request_user)
533 550

  
534 551
    leave_policy = project.application.member_leave_policy
535 552
    if leave_policy == CLOSED_POLICY:
......
557 574

  
558 575
def do_enroll_member(project_id, user, request_user=None):
559 576
    membership = create_membership(project_id, user)
560
    return do_accept_membership(project_id, user, request_user)
577
    return do_accept_membership(
578
        project_id, user, request_user, bypass_checks=True)
561 579

  
562 580
def leave_project(project_application_id, user_id):
563 581
    """
......
568 586
    project_id = get_project_id_of_application_id(project_application_id)
569 587
    return do_leave_project(project_id, user_id)
570 588

  
571
def do_leave_project(project_id, user_id):
572
    project = get_project_for_update(project_id)
573

  
589
def do_leave_project_checks(project):
574 590
    if not project.is_alive:
575 591
        m = _(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__
576 592
        raise PermissionDenied(m)
......
579 595
    if leave_policy == CLOSED_POLICY:
580 596
        raise PermissionDenied(_(astakos_messages.MEMBER_LEAVE_POLICY_CLOSED))
581 597

  
598
def do_leave_project(project_id, user_id, bypass_checks=False):
599
    project = get_project_for_update(project_id)
600

  
601
    if not bypass_checks:
602
        do_leave_project_checks(projetc)
603

  
582 604
    membership = get_membership_for_update(project, user_id)
583 605
    if leave_policy == AUTO_ACCEPT_POLICY:
584 606
        membership.remove()
......
597 619
    project_id = get_project_id_of_application_id(project_application_id)
598 620
    return do_join_project(project_id, user_id)
599 621

  
600
def do_join_project(project_id, user_id):
601
    project = get_project_for_update(project_id)
602

  
622
def do_join_project_checks(project):
603 623
    if not project.is_alive:
604 624
        m = _(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__
605 625
        raise PermissionDenied(m)
......
608 628
    if join_policy == CLOSED_POLICY:
609 629
        raise PermissionDenied(_(astakos_messages.MEMBER_JOIN_POLICY_CLOSED))
610 630

  
631
def do_join_project(project_id, user_id, bypass_checks=False):
632
    project = get_project_for_update(project_id)
633

  
634
    if not bypass_checks:
635
        do_join_project_checks(project)
636

  
611 637
    membership = create_membership(project, user_id)
612 638

  
613 639
    if (join_policy == AUTO_ACCEPT_POLICY and
......
617 643
    return membership
618 644

  
619 645
def submit_application(
620
    application, resource_policies, applicant, comments, precursor_application=None):
646
        application, resource_policies, applicant, comments,
647
        precursor_application=None):
621 648

  
622 649
    application.submit(
623 650
        resource_policies, applicant, comments, precursor_application)
b/snf-astakos-app/astakos/im/views.py
1097 1097
def project_detail(request, application_id):
1098 1098
    addmembers_form = AddProjectMembersForm()
1099 1099
    if request.method == 'POST':
1100
        addmembers_form = AddProjectMembersForm(request.POST)
1100
        addmembers_form = AddProjectMembersForm(
1101
            request.POST,
1102
            application_id=int(application_id),
1103
            request_user=request.user)
1101 1104
        if addmembers_form.is_valid():
1102 1105
            try:
1103 1106
                rollback = False

Also available in: Unified diff