Revision 792c2f3b snf-astakos-app/astakos/im/views.py

b/snf-astakos-app/astakos/im/views.py
57 57
                                                get_model_and_form_class)
58 58
from django.views.generic.list_detail import object_list
59 59
from django.core.xheaders import populate_xheaders
60
from django.core.exceptions import ValidationError, PermissionDenied
60 61

  
61 62
from django.template.loader import render_to_string
62 63
from django.views.decorators.http import require_http_methods
......
64 65

  
65 66
from astakos.im.models import (AstakosUser, ApprovalTerms, AstakosGroup,
66 67
                               EmailChange, GroupKind, Membership,
67
                               RESOURCE_SEPARATOR)
68
                               RESOURCE_SEPARATOR, AstakosUserAuthProvider)
68 69
from astakos.im.util import get_context, prepare_response, get_query, restrict_next
69 70
from astakos.im.forms import (LoginForm, InvitationForm, ProfileForm,
70 71
                              FeedbackForm, SignApprovalTermsForm,
......
87 88
from astakos.im.api.callpoint import AstakosCallpoint
88 89

  
89 90
import astakos.im.messages as astakos_messages
91
from astakos.im import settings
92
from astakos.im import auth_providers
90 93

  
91 94
logger = logging.getLogger(__name__)
92 95

  
......
109 112
    response = HttpResponse(html, status=status)
110 113
    return response
111 114

  
115
def requires_auth_provider(provider_id, **perms):
116
    """
117
    """
118
    def decorator(func, *args, **kwargs):
119
        @wraps(func)
120
        def wrapper(request, *args, **kwargs):
121
            provider = auth_providers.get_provider(provider_id)
122

  
123
            if not provider or not provider.is_active():
124
                raise PermissionDenied
125

  
126
            if provider:
127
                for pkey, value in perms.iteritems():
128
                    attr = 'is_available_for_%s' % pkey.lower()
129
                    if getattr(provider, attr)() != value:
130
                        raise PermissionDenied
131
            return func(request, *args)
132
        return wrapper
133
    return decorator
134

  
112 135

  
113 136
def requires_anonymous(func):
114 137
    """
......
169 192
    template_name = login_template_name
170 193
    if request.user.is_authenticated():
171 194
        return HttpResponseRedirect(reverse('astakos.im.views.edit_profile'))
172
    
195

  
173 196
    return render_response(
174 197
        template_name,
175 198
        login_form = LoginForm(request=request),
......
319 342
            except ValueError, ve:
320 343
                messages.success(request, ve)
321 344
    elif request.method == "GET":
322
        if not request.user.is_verified:
323
            request.user.is_verified = True
324
            request.user.save()
345
        request.user.is_verified = True
346
        request.user.save()
347

  
348
    # existing providers
349
    user_providers = request.user.get_active_auth_providers()
350

  
351
    # providers that user can add
352
    user_available_providers = request.user.get_available_auth_providers()
353

  
325 354
    return render_response(template_name,
326 355
                           profile_form = form,
356
                           user_providers = user_providers,
357
                           user_available_providers = user_available_providers,
327 358
                           context_instance = get_context(request,
328 359
                                                          extra_context))
329 360

  
......
370 401
        return HttpResponseRedirect(reverse('edit_profile'))
371 402

  
372 403
    provider = get_query(request).get('provider', 'local')
404
    if not auth_providers.get_provider(provider).is_available_for_create():
405
        raise PermissionDenied
406

  
373 407
    id = get_query(request).get('id')
374 408
    try:
375 409
        instance = AstakosUser.objects.get(id=id) if id else None
......
390 424
                result = backend.handle_activation(user)
391 425
                status = messages.SUCCESS
392 426
                message = result.message
393
                user.save()
427

  
428
                form.store_user(user, request)
429

  
394 430
                if 'additional_email' in form.cleaned_data:
395 431
                    additional_email = form.cleaned_data['additional_email']
396 432
                    if additional_email != user.email:
......
406 442
                    transaction.commit()
407 443
                    return response
408 444
                messages.add_message(request, status, message)
445
                transaction.commit()
409 446
                return render_response(
410 447
                    on_success,
411 448
                    context_instance=get_context(
......
655 692

  
656 693

  
657 694
def send_activation(request, user_id, template_name='im/login.html', extra_context=None):
695

  
696
    if settings.MODERATION_ENABLED:
697
        raise PermissionDenied
698

  
658 699
    extra_context = extra_context or {}
659 700
    try:
660 701
        u = AstakosUser.objects.get(id=user_id)
......
677 718
    )
678 719

  
679 720
class ResourcePresentation():
680
    
721

  
681 722
    def __init__(self, data):
682 723
        self.data = data
683
        
724

  
684 725
    def update_from_result(self, result):
685 726
        if result.is_success:
686 727
            for r in result.data:
687 728
                rname = '%s%s%s' % (r.get('service'), RESOURCE_SEPARATOR, r.get('name'))
688 729
                if not rname in self.data['resources']:
689 730
                    self.data['resources'][rname] = {}
690
                    
731

  
691 732
                self.data['resources'][rname].update(r)
692 733
                self.data['resources'][rname]['id'] = rname
693 734
                group = r.get('group')
694 735
                if not group in self.data['groups']:
695 736
                    self.data['groups'][group] = {}
696
                    
737

  
697 738
                self.data['groups'][r.get('group')].update({'name': r.get('group')})
698
    
739

  
699 740
    def test(self, quota_dict):
700 741
        for k, v in quota_dict.iteritems():
701 742
            rname = k
702 743
            value = v
703 744
            if not rname in self.data['resources']:
704 745
                self.data['resources'][rname] = {}
705
                    
706
 
746

  
747

  
707 748
            self.data['resources'][rname]['value'] = value
708
            
709
    
749

  
750

  
710 751
    def update_from_result_report(self, result):
711 752
        if result.is_success:
712 753
            for r in result.data:
713 754
                rname = r.get('name')
714 755
                if not rname in self.data['resources']:
715 756
                    self.data['resources'][rname] = {}
716
                    
757

  
717 758
                self.data['resources'][rname].update(r)
718 759
                self.data['resources'][rname]['id'] = rname
719 760
                group = r.get('group')
720 761
                if not group in self.data['groups']:
721 762
                    self.data['groups'][group] = {}
722
                    
763

  
723 764
                self.data['groups'][r.get('group')].update({'name': r.get('group')})
724
                
765

  
725 766
    def get_group_resources(self, group):
726 767
        return dict(filter(lambda t: t[1].get('group') == group, self.data['resources'].iteritems()))
727
    
768

  
728 769
    def get_groups_resources(self):
729 770
        for g in self.data['groups']:
730 771
            yield g, self.get_group_resources(g)
731
    
772

  
732 773
    def get_quota(self, group_quotas):
733 774
        for r, v in group_quotas.iteritems():
734 775
            rname = str(r)
735 776
            quota = self.data['resources'].get(rname)
736 777
            quota['value'] = v
737 778
            yield quota
738
    
739
    
779

  
780

  
740 781
    def get_policies(self, policies_data):
741 782
        for policy in policies_data:
742 783
            rname = '%s%s%s' % (policy.get('service'), RESOURCE_SEPARATOR, policy.get('resource'))
743 784
            policy.update(self.data['resources'].get(rname))
744 785
            yield policy
745
        
786

  
746 787
    def __repr__(self):
747 788
        return self.data.__repr__()
748
                
789

  
749 790
    def __iter__(self, *args, **kwargs):
750 791
        return self.data.__iter__(*args, **kwargs)
751
    
792

  
752 793
    def __getitem__(self, *args, **kwargs):
753 794
        return self.data.__getitem__(*args, **kwargs)
754
    
795

  
755 796
    def get(self, *args, **kwargs):
756 797
        return self.data.get(*args, **kwargs)
757
        
758
        
798

  
799

  
759 800

  
760 801
@require_http_methods(["GET", "POST"])
761 802
@signed_terms_required
762 803
@login_required
763 804
def group_add(request, kind_name='default'):
764
    
805

  
765 806
    result = callpoint.list_resources()
766 807
    resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
767 808
    resource_catalog.update_from_result(result)
768
    
809

  
769 810
    if not result.is_success:
770 811
        messages.error(
771 812
            request,
772 813
            'Unable to retrieve system resources: %s' % result.reason
773 814
    )
774
    
815

  
775 816
    try:
776 817
        kind = GroupKind.objects.get(name=kind_name)
777 818
    except:
778 819
        return HttpResponseBadRequest(_(astakos_messages.GROUPKIND_UNKNOWN))
779
    
780
    
820

  
821

  
781 822

  
782 823
    post_save_redirect = '/im/group/%(id)s/'
783 824
    context_processors = None
......
785 826
        model=None,
786 827
        form_class=AstakosGroupCreationForm
787 828
    )
788
    
829

  
789 830
    if request.method == 'POST':
790 831
        form = form_class(request.POST, request.FILES)
791 832
        if form.is_valid():
......
796 837
                policies = resource_catalog.get_policies(form.policies()),
797 838
                resource_catalog= resource_catalog,
798 839
            )
799
         
840

  
800 841
    else:
801 842
        now = datetime.now()
802 843
        data = {
......
806 847
            data['is_selected_%s' % group] = False
807 848
            for resource in resources:
808 849
                data['%s_uplimit' % resource] = ''
809
        
850

  
810 851
        form = form_class(data)
811 852

  
812 853
    # Create the template, context, response
......
839 880
            msg = _(astakos_messages.OBJECT_CREATED) %\
840 881
                {"verbose_name": model._meta.verbose_name}
841 882
            messages.success(request, msg, fail_silently=True)
842
            
883

  
843 884
            # send notification
844 885
            try:
845 886
                send_group_creation_notification(
......
857 898
        else:
858 899
            d = {"verbose_name": model._meta.verbose_name,
859 900
                 "reason":result.reason}
860
            msg = _(astakos_messages.OBJECT_CREATED_FAILED) % d 
901
            msg = _(astakos_messages.OBJECT_CREATED_FAILED) % d
861 902
            messages.error(request, msg, fail_silently=True)
862 903
    return render_response(
863 904
        template='im/astakosgroup_form_summary.html',
......
895 936
            im_astakosuser_owner.astakosgroup_id = im_astakosgroup.group_ptr_id)
896 937
        LEFT JOIN auth_user as owner ON (
897 938
            im_astakosuser_owner.astakosuser_id = owner.id)
898
        WHERE im_membership.person_id = %s 
939
        WHERE im_membership.person_id = %s
899 940
        """ % (DB_REPLACE_GROUP_SCHEME, request.user.id, request.user.id)
900
       
941

  
901 942
    if sorting:
902
        query = query+" ORDER BY %s ASC" %sorting    
943
        query = query+" ORDER BY %s ASC" %sorting
903 944
    else:
904
        query = query+" ORDER BY groupname ASC"     
945
        query = query+" ORDER BY groupname ASC"
905 946
    q = AstakosGroup.objects.raw(query)
906 947

  
907
       
908
       
948

  
949

  
909 950
    # Create the template, context, response
910 951
    template_name = "%s/%s_list.html" % (
911 952
        q.model._meta.app_label,
......
987 1028
        form = MembersSortForm({'sort_by': sorting})
988 1029
        if form.is_valid():
989 1030
            sorting = form.cleaned_data.get('sort_by')
990
    
1031

  
991 1032
    else:
992 1033
        form = MembersSortForm({'sort_by': 'person_first_name'})
993
    
1034

  
994 1035
    result = callpoint.list_resources()
995 1036
    resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
996 1037
    resource_catalog.update_from_result(result)
997 1038

  
998
    
1039

  
999 1040
    if not result.is_success:
1000 1041
        messages.error(
1001 1042
            request,
1002 1043
            'Unable to retrieve system resources: %s' % result.reason
1003 1044
    )
1004
    
1045

  
1005 1046
    extra_context = {'update_form': update_form,
1006 1047
                     'addmembers_form': addmembers_form,
1007 1048
                     'page': request.GET.get('page', 1),
......
1062 1103
                        SELECT id FROM im_astakosuser_owner
1063 1104
                        WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1064 1105
                        AND astakosuser_id = %s)
1065
                        THEN 1 ELSE 0 END""" % request.user.id, 
1106
                        THEN 1 ELSE 0 END""" % request.user.id,
1066 1107
                    })
1067 1108
        if sorting:
1068 1109
            # TODO check sorting value
......
1118 1159
        q = q.order_by(sorting)
1119 1160
    else:
1120 1161
        q = q.order_by("groupname")
1121
        
1162

  
1122 1163
    return object_list(
1123 1164
        request,
1124 1165
        q,
......
1238 1279
        if max_value > 0 :
1239 1280
            entry['ratio'] = (curr_value / max_value) * 100
1240 1281
        else:
1241
            entry['ratio'] = 0 
1282
            entry['ratio'] = 0
1242 1283
        if entry['ratio'] < 66:
1243 1284
            entry['load_class'] = 'yellow'
1244 1285
        if entry['ratio'] < 33:
......
1258 1299
        messages.error(request, result.reason)
1259 1300
    resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1260 1301
    resource_catalog.update_from_result_report(result)
1261
    
1262 1302

  
1263
    
1303

  
1304

  
1264 1305
    return render_response('im/resource_list.html',
1265 1306
                           data=data,
1266 1307
                           context_instance=get_context(request),
......
1333 1374
    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
1334 1375

  
1335 1376
    return data
1336
     
1337
     
1377

  
1378

  
1338 1379
#@require_http_methods(["GET"])
1339 1380
@require_http_methods(["POST", "GET"])
1340 1381
@signed_terms_required
......
1365 1406
                           timeline_body=timeline_body)
1366 1407
    return data
1367 1408

  
1409

  
1368 1410
# TODO: action only on POST and user should confirm the removal
1369 1411
@require_http_methods(["GET", "POST"])
1370 1412
@login_required
......
1381 1423
    else:
1382 1424
        raise PermissionDenied
1383 1425

  
1426

  
1384 1427
def how_it_works(request):
1385 1428
    return render_response(
1386 1429
        template='im/how_it_works.html',
1387
        context_instance=get_context(request),)
1430
        context_instance=get_context(request),)
1431
    

Also available in: Unified diff