Revision 01ac12d5 snf-astakos-app/astakos/im/views.py

b/snf-astakos-app/astakos/im/views.py
38 38
from urllib import quote
39 39
from functools import wraps
40 40

  
41
from django.core.mail import send_mail
42
from django.http import HttpResponse, HttpResponseBadRequest
43
from django.shortcuts import redirect
44
from django.template.loader import render_to_string
45
from django.utils.translation import ugettext as _
46
from django.core.urlresolvers import reverse
47
from django.contrib.auth.decorators import login_required
48 41
from django.contrib import messages
49
from django.db import transaction
50
from django.utils.http import urlencode
51
from django.http import HttpResponseRedirect, HttpResponseBadRequest
52
from django.db.utils import IntegrityError
42
from django.contrib.auth.decorators import login_required
53 43
from django.contrib.auth.views import password_change
54 44
from django.core.exceptions import ValidationError
45
from django.core.mail import send_mail
46
from django.core.urlresolvers import reverse
47
from django.db import transaction
55 48
from django.db.models import Q
56
from django.forms.models import inlineformset_factory
57
from django.forms.models import inlineformset_factory
49
from django.db.utils import IntegrityError
50
from django.forms.fields import URLField
51
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, \
52
    HttpResponseRedirect, HttpResponseBadRequest
53
from django.shortcuts import redirect
54
from django.template.loader import render_to_string
55
from django.utils.http import urlencode
56
from django.utils.translation import ugettext as _
58 57
from django.views.generic.create_update import *
59 58
from django.views.generic.list_detail import *
60 59

  
......
588 587
                                                          extra_context))
589 588

  
590 589
@signed_terms_required
590
@login_required
591 591
def group_add(request):
592 592
    return create_object(request,
593
                            form_class=get_astakos_group_creation_form(request),
594
                            login_required = True,
595
                            post_save_redirect = '/im/group/%(id)s/')
593
                         form_class=get_astakos_group_creation_form(request),
594
                         post_save_redirect = '/im/group/%(id)s/')
596 595

  
597 596
@signed_terms_required
598 597
@login_required
599 598
def group_list(request):
600
    relation = get_query(request).get('relation', 'member')
601
    if relation == 'member':
602
        list = AstakosGroup.objects.filter(membership__person=request.user)
603
    else:
604
        list = AstakosGroup.objects.filter(owner__id=request.user.id)
599
    list = AstakosGroup.objects.filter(membership__person=request.user)
605 600
    return object_list(request, queryset=list)
606 601

  
607 602
@signed_terms_required
......
611 606
        group = AstakosGroup.objects.select_related().get(id=group_id)
612 607
    except AstakosGroup.DoesNotExist:
613 608
        return HttpResponseBadRequest(_('Invalid group.'))
614
    members = map(lambda m:{m.person.realname:m.is_approved}, group.membership_set.all())
615 609
    return object_detail(request,
616
                            AstakosGroup.objects.all(),
617
                            object_id=group_id,
618
                            extra_context = {'quota':group.get_policies(),
619
                                             'members':members,
620
                                             'form':get_astakos_group_policy_creation_form(group),
621
                                             'more_policies':group.has_undefined_policies()})
610
                         AstakosGroup.objects.all(),
611
                         object_id=group_id,
612
                         extra_context = {'form':get_astakos_group_policy_creation_form(group),
613
                                          'quota':group.policies,
614
                                          'more_policies':group.has_undefined_policies})
622 615

  
623 616
@signed_terms_required
624 617
@login_required
......
627 620
    return object_list(request, queryset=list)
628 621

  
629 622
@signed_terms_required
623
@login_required
630 624
def group_policies_add(request, group_id):
631 625
    try:
632 626
        group = AstakosGroup.objects.select_related().get(id=group_id)
633 627
    except AstakosGroup.DoesNotExist:
634 628
        return HttpResponseBadRequest(_('Invalid group.'))
635 629
    return create_object(request,
636
                            form_class=get_astakos_group_policy_creation_form(group),
637
                            login_required=True,
638
                            template_name = 'im/astakosgroup_detail.html',
639
                            post_save_redirect = reverse('group_detail', kwargs=dict(group_id=group_id)),
640
                            extra_context = {'group':group,
641
                                             'quota':group.get_policies(),
642
                                             'more_policies':group.has_undefined_policies()})
630
                         form_class=get_astakos_group_policy_creation_form(group),
631
                         template_name = 'im/astakosgroup_detail.html',
632
                         post_save_redirect = reverse('group_detail', kwargs=dict(group_id=group_id)),
633
                         extra_context = {'group':group,
634
                                          'quota':group.policies,
635
                                          'more_policies':group.has_undefined_policies})
643 636
@signed_terms_required
644 637
@login_required
645 638
def group_approval_request(request, group_id):
646 639
    return HttpResponse()
640

  
641
@signed_terms_required
642
@login_required
643
def group_search(request, queryset=EmptyQuerySet(), extra_context={}, **kwargs):
644
    join_forms = {}
645
    if request.method == 'GET':
646
        form = AstakosGroupSearchForm()
647
    else:
648
        form = AstakosGroupSearchForm(get_query(request))
649
        if form.is_valid():
650
            q = form.cleaned_data['q'].strip()
651
            q = URLField().to_python(q)
652
            queryset = AstakosGroup.objects.select_related().filter(name=q)
653
            f = MembershipCreationForm
654
            for g in queryset:
655
                join_forms[g.name] = f(dict(group=g,
656
                                            person=request.user,
657
                                            date_requested=datetime.now().strftime("%d/%m/%Y")))
658
    return object_list(request,
659
                        queryset,
660
                        template_name='im/astakosgroup_list.html',
661
                        extra_context=dict(form=form, is_search=True, join_forms=join_forms))
662

  
663
@signed_terms_required
664
@login_required
665
def group_join(request, group_id):
666
    return create_object(request,
667
                         model=Membership,
668
                         template_name='im/astakosgroup_list.html',
669
                         post_save_redirect = reverse('group_detail', kwargs=dict(group_id=group_id)))
670

  
671
@signed_terms_required
672
@login_required
673
def group_leave(request, group_id):
674
    try:
675
        m = Membership.objects.select_related().get(group__id=group_id, person=request.user)
676
    except Membership.DoesNotExist:
677
        return HttpResponseBadRequest(_('Invalid membership.'))
678
    if request.user in m.group.owner.all():
679
        return HttpResponseForbidden(_('Owner can not leave the group.'))
680
    return delete_object(request,
681
                         model=Membership,
682
                         object_id = m.id,
683
                         template_name='im/astakosgroup_list.html',
684
                         post_delete_redirect = reverse('group_detail', kwargs=dict(group_id=group_id)))
685

  
686
def handle_membership():
687
    def decorator(func):
688
        @wraps(func)
689
        def wrapper(request, membership_id):
690
            try:
691
                m = Membership.objects.select_related().get(id=membership_id)
692
            except Membership.DoesNotExist:
693
                return HttpResponseBadRequest(_('Invalid membership.'))
694
            else:
695
                if request.user not in m.group.owner.all():
696
                    return HttpResponseForbidden(_('User is not a group owner.'))
697
                func(request, m)
698
                return render_response(template='im/astakosgroup_detail.html',
699
                                       context_instance=get_context(request),
700
                                       object=m.group,
701
                                       quota=m.group.policies,
702
                                       more_policies=m.group.has_undefined_policies)
703
        return wrapper
704
    return decorator
705

  
706
@signed_terms_required
707
@login_required
708
@handle_membership()
709
def approve_member(request, membership):
710
    try:
711
        membership.approve()
712
        realname = membership.person.realname
713
        msg = _('%s has been successfully joined the group.' % realname)
714
        messages.success(request, msg)
715
    except BaseException, e:
716
        logger.exception(e)
717
        msg = _('Something went wrong during %s\'s approval.' % realname)
718
        messages.error(request, msg)
647 719
    
720
@signed_terms_required
721
@login_required
722
@handle_membership()
723
def disapprove_member(request, membership):
724
    try:
725
        membership.disapprove()
726
        realname = membership.person.realname
727
        msg = _('%s has been successfully removed from the group.' % realname)
728
        messages.success(request, msg)
729
    except BaseException, e:
730
        logger.exception(e)
731
        msg = _('Something went wrong during %s\'s disapproval.' % realname)
732
        messages.error(request, msg)

Also available in: Unified diff