Completed
Push — master ( 7774bf...c9899f )
by Andrea
51s
created

federation_charts()   F

Complexity

Conditions 16

Size

Total Lines 88

Duplication

Lines 22
Ratio 25 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 22
loc 88
rs 2
cc 16

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like federation_charts() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
#################################################################
2
# MET v2 Metadate Explorer Tool
3
#
4
# This Software is Open Source. See License: https://github.com/TERENA/met/blob/master/LICENSE.md
5
# Copyright (c) 2012, TERENA All rights reserved.
6
#
7
# This Software is based on MET v1 developed for TERENA by Yaco Sistemas, http://www.yaco.es/
8
# MET v2 was developed for TERENA by Tamim Ziai, DAASI International GmbH, http://www.daasi.de
9
# Current version of MET has been revised for performance improvements by Andrea Biancini,
10
# Consortium GARR, http://www.garr.it
11
#########################################################################################
12
13
import re, time
14
import pytz
15
import operator
16
import simplejson as json
17
from urllib import unquote
18
from datetime import datetime
19
from dateutil import tz
20
21
from django.conf import settings
22
from django.db.models import Count, Q
23
from django.contrib import messages
24
from django.contrib.auth import logout
25
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
26
from django.core.urlresolvers import reverse
27
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseBadRequest
28
from django.shortcuts import render_to_response, get_object_or_404
29
from django.template import RequestContext
30
from django.utils.translation import ugettext_lazy as _
31
from django.utils import timezone
32
33
from chartit import DataPool, Chart
34
35
from datetime import datetime
36
37
from met.metadataparser.decorators import user_can_edit
38
from met.metadataparser.models import Federation, Entity, EntityStat, EntityCategory, Entity_Federations, TOP_LENGTH, FEDERATION_TYPES
39
from met.metadataparser.forms import (FederationForm, EntityForm, EntityCommentForm,
40
                                      EntityProposalForm, ServiceSearchForm, ChartForm, SearchEntitiesForm)
41
42
from met.metadataparser.summary_export import export_summary
43
from met.metadataparser.query_export import export_query_set
44
from met.metadataparser.entity_export import export_entity
45
from met.metadataparser.xmlparser import DESCRIPTOR_TYPES
46
from met.metadataparser.utils import send_mail
47
48
if settings.PROFILE:
49
    from silk.profiling.profiler import silk_profile as profile
50
else:
51
    from met.metadataparser.templatetags.decorators import noop_decorator as profile
52
53
RESCUE_SLASH = re.compile(r"^(http(?:|s):/)([^/])")
54
55
def increment_current_toplength(request):
56
    current_top_length = request.session.get('currentTopLength', TOP_LENGTH)
57
    current_top_length += TOP_LENGTH
58
59
    if current_top_length > Entity.objects.all().count():
60
        current_top_length -= TOP_LENGTH
61
62
    request.session['currentTopLength'] = current_top_length
63
    return HttpResponseRedirect(reverse('most_federated_entities'))
64
    
65
def decrement_current_toplength(request):
66
    current_top_length = request.session.get('currentTopLength', TOP_LENGTH)
67
    current_top_length -= TOP_LENGTH
68
69
    if current_top_length <= 0:
70
        current_top_length = TOP_LENGTH
71
72
    request.session['currentTopLength'] = current_top_length
73
    return HttpResponseRedirect(reverse('most_federated_entities'))
74
75
def _index_export(export, export_format, objects):
76
    counters = (
77
                ('all', {}),
78
                ('IDPSSO', {'types__xmlname': 'IDPSSODescriptor'}),
79
                ('SPSSO', {'types__xmlname': 'SPSSODescriptor'}),
80
               )
81
82
    if not export in ['interfederations', 'federations', 'most_federated_entities']:
83
        return HttpResponseBadRequest('Not valid export query')
84
85
    if export == 'most_federated_entities':
86
        return export_query_set(export_format, objects['most_federated_entities'],
87
                                'most_federated_entities', ('entityid', 'types', 'name', 'federations'))
88
    else:
89
        return export_summary(export_format, objects[export],
90
                              'entity_set', '%s_summary' % export,
91
                              counters)
92
93
@profile(name='Index page')
94
def index(request):
95
    ff = Federation.objects.all().order_by('name')
96
    federations = []
97
    interfederations = []
98
    for f in ff:
99
        if f.is_interfederation:
100
            interfederations.append(f)
101
        else:
102
            federations.append(f)
103
104
    cc = Entity.objects.values('federations__id', 'types__xmlname').annotate(Count('federations__id'), Count('types__xmlname'))
105
    counts = {}
106
    for curtype in DESCRIPTOR_TYPES:
107
        counts[curtype] = []
108
        for c in cc:
109
            if c['types__xmlname'] == curtype:
110
                counts[curtype].append(c)
111
    counts['All'] = Entity.objects.values('federations__id').annotate(Count('federations__id'))
112
113
    totals = Entity.objects.values('types__xmlname').annotate(Count('types__xmlname'))
114
115
    params = {
116
       'settings': settings,
117
       'interfederations': interfederations,
118
       'federations': federations,
119
       'entity_types': DESCRIPTOR_TYPES,
120
       'federation_path': request.path,
121
       'counts': counts,
122
       'totals': totals,
123
    }
124
125
    export = request.GET.get('export', None)
126
    export_format = request.GET.get('format', None)
127
    if export and export_format:
128
        return _index_export(export, export_format, params)
129
    
130
    return render_to_response('metadataparser/index.html', params, context_instance=RequestContext(request))
131
132
@profile(name='Most Federated Entities page')
133
def most_federated_entities(request):
134
    # Entities with count how many federations belongs to, and sorted by most first
135
    current_top_length = request.session.get('currentTopLength', TOP_LENGTH)
136
    most_federated_entities = Entity.get_most_federated_entities(maxlength=current_top_length, cache_expire=24*60*60)
137
138
    params = {
139
       'settings': settings,
140
       'most_federated_entities': most_federated_entities,
141
    }
142
143
    export = request.GET.get('export', None)
144
    export_format = request.GET.get('format', None)
145
    if export and export_format:
146
        return _index_export(export, export_format, params)
147
    
148
    return render_to_response('metadataparser/most_federated_entities.html', params, context_instance=RequestContext(request))
149
150
def _paginate_fed(ob_entities, page):
151
    paginator = Paginator(ob_entities, 20)
152
153
    try:
154
        ob_entities = paginator.page(page)
155
    except PageNotAnInteger:
156
        ob_entities = paginator.page(1)
157
    except EmptyPage:
158
        ob_entities = paginator.page(paginator.num_pages)
159
160
    adjacent_pages = 5
161
    page_range = [n for n in \
162
                  range(ob_entities.number - adjacent_pages, ob_entities.number + adjacent_pages + 1) \
163
                  if n > 0 and n <= ob_entities.paginator.num_pages]
164
165
    return {
166
        'page_range': page_range,
167
        'cur_page_number': ob_entities.number,
168
        'num_pages': ob_entities.paginator.num_pages,
169
        'num_objects': ob_entities.paginator.count,
170
        'objects': ob_entities.object_list,
171
    }
172
173
@profile(name='Federation view')
174
def federation_view(request, federation_slug=None):
175
    if federation_slug:
176
        request.session['%s_process_done' % federation_slug] = False
177
        request.session['%s_num_entities' % federation_slug] = 0
178
        request.session['%s_cur_entities' % federation_slug] = 0
179
        request.session.save()
180
181
    federation = get_object_or_404(Federation, slug=federation_slug)
182
    if federation.registration_authority:
183
        categories = EntityCategory.objects.all().filter(
184
            Q(category_id__icontains=federation.registration_authority) |
185
            Q(category_id__icontains='http://refeds.org') |
186
            Q(category_id__icontains='http://www.geant.net'))
187
    else:
188
        categories = EntityCategory.objects.all().filter(
189
            Q(category_id__icontains='http://refeds.org') |
190
            Q(category_id__icontains='http://www.geant.net'))
191
192
    ob_entities = Entity.objects.filter(federations__id=federation.id)
193
    entity_type = None
194
    if request.GET and 'entity_type' in request.GET:
195
        entity_type = request.GET['entity_type']
196
        ob_entities = ob_entities.filter(types__xmlname=entity_type)
197
    
198
    entity_category = None
199
    if request.GET and 'entity_category' in request.GET:
200
        entity_category = request.GET['entity_category']
201
202
    ob_entities = ob_entities.prefetch_related('types', 'federations')
203
    pagination = _paginate_fed(ob_entities, request.GET.get('page'))
204
205
    entities = []
206
    for entity in pagination['objects']:
207
        entity.curfed = federation
208
        if entity_category is None or entity_category in [c.category_id for c in entity.entity_categories.all()]:
209
            entities.append({
210
                'entityid': entity.entityid,
211
                'name': entity.name,
212
                'absolute_url': entity.get_absolute_url(),
213
                'types': [unicode(item) for item in entity.types.all()],
214
                'federations': [(unicode(item.name), item.get_absolute_url()) for item in entity.federations.all()],
215
            })
216
217
    if 'format' in request.GET:
218
        return export_query_set(request.GET.get('format'), entities,
219
                                'entities_search_result', ('entityid', 'types', 'federations'))
220
221
    context = RequestContext(request)
222
    user = context.get('user', None)
223
    add_entity = user and user.has_perm('metadataparser.add_federation')
224
    pie_chart = fed_pie_chart(request, federation.id)
225
226
    return render_to_response('metadataparser/federation_view.html',
227
            {'settings': settings,
228
             'federation': federation,
229
             'entity_types': DESCRIPTOR_TYPES,
230
             'entity_type': entity_type or 'All',
231
             'fed_types': dict(FEDERATION_TYPES),
232
             'entities': entities,
233
             'categories': categories,
234
             'show_filters': True,
235
             'add_entity': add_entity,
236
             'lang': request.GET.get('lang', 'en'),
237
             'update_entities': request.GET.get('update', 'false'),
238
             'statcharts': [pie_chart],
239
             'pagination': pagination,
240
            }, context_instance=context)
241
242
243
@user_can_edit(Federation)
244
def federation_edit_post(request, federation, form):
245
    modify = True if federation else False
246
    form.save()
247
248
    if not modify:
249
        form.instance.editor_users.add(request.user)
250
    if 'file' in form.changed_data or 'file_url' in form.changed_data:
251
        form.instance.process_metadata()
252
253
    messages.success(request, _('Federation %s successfully' % 'modified' if modify else 'created'))
254
    return HttpResponseRedirect(form.instance.get_absolute_url() + '?update=true')
255
256
257
@user_can_edit(Federation)
258
def federation_edit(request, federation_slug=None):
259
    federation = get_object_or_404(Federation, slug=federation_slug) if federation_slug else None
260
261
    if request.method == 'POST':
262
        form = FederationForm(request.POST, request.FILES, instance=federation)
263
        if not form.is_valid():
264
            messages.error(request, _('Please correct the errors indicated below'))
265
        else:
266
            return federation_edit_post(request, federation, form)
267
    else:
268
        form = FederationForm(instance=federation)
269
270
    context = RequestContext(request)
271
    user = context.get('user', None)
272
    delete_federation = user and user.has_perm('metadataparser.delete_federation')
273
    return render_to_response('metadataparser/federation_edit.html',
274
                              {'settings': settings, 'form': form, 'delete_federation': delete_federation},
275
                              context_instance=RequestContext(request))
276
277
278
@user_can_edit(Federation)
279
def federation_update_entities(request, federation_slug=None):
280
    federation = get_object_or_404(Federation, slug=federation_slug)
281
    federation.process_metadata_entities(request=request, federation_slug=federation_slug)
282
283
    messages.success(request, _('Federation entities updated succesfully'))
284
    return HttpResponse("Done. All entities updated.", content_type='text/plain')
285
286
287
def entityupdate_progress(request, federation_slug=None):
288
    data = { 'done': False }
289
    if federation_slug:
290
        data = { 'done': request.session.get('%s_process_done' % federation_slug, False),
291
                 'tot': request.session.get('%s_num_entities' % federation_slug, 0),
292
                 'num': request.session.get('%s_cur_entities' % federation_slug, 0) }
293
294
    return HttpResponse(json.dumps(data), content_type='application/javascript')
295
296
297
@user_can_edit(Federation, True)
298
def federation_delete(request, federation_slug):
299
    federation = get_object_or_404(Federation, slug=federation_slug)
300
301
    for entity in federation.entity_set.all():
302
        if len(entity.federations.all()) == 1:
303
            entity.delete()
304
305
    messages.success(request,
306
                     _(u"%(federation)s federation was deleted successfully"
307
                     % {'federation': unicode(federation)}))
308
    federation.delete()
309
    return HttpResponseRedirect(reverse('index'))
310
311
312
@profile(name='Index charts')
313
def federation_charts(request, federation_slug=None):
314
    if federation_slug is None:
315
        federation = None
316
    else:
317
        federation = get_object_or_404(Federation, slug=federation_slug)
318
319
    if request.method == 'POST':
320
        form = ChartForm(request.POST, request.FILES, instance=federation)
321
322
        if form.is_valid():
323
            stats_config_dict = getattr(settings, "STATS")
324
            service_terms = stats_config_dict['statistics']['entity_by_type']['terms']
325
            protocol_terms = stats_config_dict['statistics']['entity_by_protocol']['terms']
326
            
327
            protocols = stats_config_dict['protocols']
328
329
            from_time = datetime.fromordinal(form.cleaned_data['fromDate'].toordinal())
330
            if timezone.is_naive(from_time):
331
                from_time = pytz.utc.localize(from_time)
332
            to_time = datetime.fromordinal(form.cleaned_data['toDate'].toordinal() + 1)
333
            if timezone.is_naive(to_time):
334
                to_time = pytz.utc.localize(to_time)
335
336
            service_stats = EntityStat.objects.filter(  federation=federation \
337
                                              , feature__in = service_terms \
338
                                              , time__gte = from_time \
339
                                              , time__lte = to_time).order_by("time")
340
341
            protocol_stats = EntityStat.objects.filter(  federation=federation \
342
                                              , feature__in = protocol_terms \
343
                                              , time__gte = from_time \
344
                                              , time__lte = to_time).order_by("time")
345
346
            s_chart = []
347
348 View Code Duplication
            if len(service_stats) > 0:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
349
                cur_data = service_stats[0].time.strftime('%d/%m/%y')
350
                cur_stat = { 'date': cur_data }
351
                for s in service_stats:
352
                    if s.time.strftime('%d/%m/%y') != cur_data:
353
                        s_chart.append(cur_stat)
354
                        cur_data = s.time.strftime('%d/%m/%y')
355
                        cur_stat = { 'date': cur_data }
356
                    
357
                    cur_stat[s.feature] = s.value
358
                s_chart.append(cur_stat)
359
360
            p_chart = []
361 View Code Duplication
            if len(protocol_stats) > 0:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
362
                cur_data = protocol_stats[0].time.strftime('%d/%m/%y')
363
                cur_stat = { 'date': cur_data }
364
                for p in protocol_stats:
365
                    if p.time.strftime('%d/%m/%y') != cur_data:
366
                        p_chart.append(cur_stat)
367
                        cur_data = p.time.strftime('%d/%m/%y')
368
                        cur_stat = { 'date': cur_data }
369
370
                    cur_stat[p.feature] = p.value
371
                p_chart.append(cur_stat)
372
373
            p_chart_axis_max = 0
374
            for p in p_chart:
375
               newval = p['sp_shib1'] + p['idp_shib1']
376
               if newval > p_chart_axis_max: p_chart_axis_max = newval
377
               newval = p['sp_saml1'] + p['idp_saml1']
378
               if newval > p_chart_axis_max: p_chart_axis_max = newval
379
               newval = p['sp_saml2'] + p['idp_saml2']
380
               if newval > p_chart_axis_max: p_chart_axis_max = newval
381
382
            return render_to_response('metadataparser/federation_chart.html',
383
                                      {'form': form,
384
                                       'statcharts': True, 
385
                                       's_chart': s_chart,
386
                                       'p_chart': p_chart,
387
                                       'p_chart_axis_max': p_chart_axis_max,
388
                                      },
389
                                      context_instance=RequestContext(request))
390
391
        else:
392
            messages.error(request, _('Please correct the errors indicated'
393
                                      ' below'))
394
    else:
395
        form = ChartForm(instance=federation)
396
397
    return render_to_response('metadataparser/federation_chart.html',
398
                              {'settings': settings, 'form': form},
399
                              context_instance=RequestContext(request))
400
401
402
def stats_chart(stats_config_dict, request, stats, entity, protocols=None):
403
    terms = stats_config_dict['statistics'][entity]['terms']
404
    title = stats_config_dict['statistics'][entity]['title']
405
    x_title = stats_config_dict['statistics'][entity]['x_title']
406
    y_title = stats_config_dict['statistics'][entity]['y_title']
407
    chart_type = 'column'
408
    stacking = True
409
    term_names = stats_config_dict['feature_names']
410
    time_format = stats_config_dict['time_format']
411
    statdata = _create_statdata('bar', stats, terms, term_names)
412
413
    series_options = []
414
    for stack in range(len(protocols) if protocols else 1):
415
        for term in terms:
416
            if not protocols or term.endswith(protocols[stack]):
417
                series_options += \
418
                  [{'options':{
419
                      'type': chart_type,
420
                      'stacking': stacking,
421
                      'stack': stack,
422
                    },
423
                    'terms':{
424
                      'time_%s' %term: [{term_names[term]: {'stack': stack, }}],
425
                    }}]
426
427
    chart_options = _get_chart_options('bar', title, x_title, y_title)
428
429
    return Chart(
430
        datasource = statdata,
431
        series_options = series_options,
432
        chart_options = chart_options, 
433
        x_sortf_mapf_mts=(None, lambda i: datetime.fromtimestamp(time.mktime(i.replace(tzinfo=tz.gettz('UTC')).astimezone(tz.tzlocal()).timetuple())).strftime(time_format), False)
434
    )
435
436
437
438
def _create_statdata(chart_type, stats, terms=None, term_names=None):
439
    if chart_type == 'bar':
440
        statdata = DataPool(
441
           series=[{'options': {
442
                       'source': stats.filter(feature=term)},
443
                       'legend_by': 'feature',
444
                       'terms': [{'time_%s' %term :'time'}, 
445
                                 {term_names[term] : 'value', 'name': 'feature'}]
446
                    } for term in terms]
447
        )
448
    elif chart_type == 'pie':
449
        statdata = DataPool(
450
           series=[{'options': { 'source': stats },
451
                    'legend_by': 'feature',
452
                    'terms': ['feature', 'value'],
453
                  }]
454
        )
455
    else:
456
        statdata = None
457
458
    return statdata
459
460
def _get_chart_options(chart_type, title=None, x_title=None, y_title=None):
461
    if chart_type == 'bar':
462
        chart_options = {'title': { 'text': title },
463
           'xAxis': {
464
                'title': { 'text': x_title },
465
                'labels': {
466
                   'rotation': -45,
467
                   'align': 'right'
468
                },
469
                'max': 10,
470
            },
471
           'yAxis': {
472
                'title': { 'text': y_title },
473
                'minorTickInterval': 'auto'
474
            },
475
           'credits': { 'enabled': False },
476
           'scrollbar': { 'enabled': True },
477
           'zoomType': 'xy',
478
        }
479
    elif chart_type == 'pie':
480
        chart_options = {
481
            'title': { 'text': ' ' },
482
            'credits': { 'enabled': False }
483
        }
484
    else:
485
        chart_options = None
486
487
    return chart_options
488
489
def fed_pie_chart(request, federation_id):
490
    stats_config_dict = getattr(settings, "STATS")
491
    terms = stats_config_dict['statistics']['entity_by_type']['terms']
492
    stats = EntityStat.objects.filter(federation=federation_id, \
493
                                      feature__in=terms).order_by('-time')[0:len(terms)]
494
    statdata = _create_statdata('pie', stats)
495
    series_options = \
496
        [{'options': { 'type': 'pie', 'stacking': False, 'size': '70%' },
497
          'terms':{ 'feature': [ 'value' ] }}]
498
    chart_options = _get_chart_options('pie')
499
500
    return Chart(
501
        datasource = statdata,
502
        series_options = series_options,
503
        chart_options = chart_options,
504
    )
505
506
507
508
@profile(name='Entity view')
509
def entity_view(request, entityid):
510
    entityid = unquote(entityid)
511
    entityid = RESCUE_SLASH.sub("\\1/\\2", entityid)
512
513
    entity = get_object_or_404(Entity, entityid=entityid)
514
515
    if 'federation' in request.GET:
516
        federation = get_object_or_404(Federation, slug=request.GET.get('federation'))
517
        entity.curfed = federation
518
    else:
519
        federation = entity.federations.all()[0]
520
        entity.curfed = federation
521
522
    if 'format' in request.GET:
523
        return export_entity(request.GET.get('format'), entity)
524
525
    if 'viewxml' in request.GET:
526
        serialized = entity.xml
527
        response = HttpResponse(serialized, content_type='application/xml')
528
        return response
529
530
    return render_to_response('metadataparser/entity_view.html',
531
            {'settings': settings,
532
             'entity': entity,
533
             'lang': request.GET.get('lang', 'en') 
534
            }, context_instance=RequestContext(request))
535
536
537
@user_can_edit(Entity)
538
def entity_edit_post(request, form, federation, entity):
539
    form.save()
540
    if federation and not federation in form.instance.federations.all():
541
        form.instance.federations.add(federation)
542
        form.instance.save()
543
544
    if entity:
545
        messages.success(request, _('Entity modified successfully'))
546
    else:
547
        messages.success(request, _('Entity created successfully'))
548
549
    return HttpResponseRedirect(form.instance.get_absolute_url())
550
551
552
553
@user_can_edit(Entity)
554
def entity_edit(request, federation_slug=None, entity_id=None):
555
    entity = None
556
    federation = None
557
    if federation_slug:
558
        federation = get_object_or_404(Federation, slug=federation_slug)
559
        if entity_id:
560
            entity = get_object_or_404(Entity, id=entity_id,
561
                                       federations__id=federation.id)
562
    if entity_id and not federation_slug:
563
        entity = get_object_or_404(Entity, id=entity_id)
564
565
    if request.method == 'POST':
566
        form = EntityForm(request.POST, request.FILES, instance=entity)
567
        if form.is_valid():
568
            return entity_edit_post(request, form, federation, entity)
569
        else:
570
            messages.error(request, _('Please correct the errors indicated below'))
571
    else:
572
        form = EntityForm(instance=entity)
573
574
    return render_to_response('metadataparser/entity_edit.html',
575
                              {'settings': settings,
576
                               'form': form,
577
                               'federation': federation},
578
                              context_instance=RequestContext(request))
579
580
581
@user_can_edit(Entity, True)
582
def entity_delete(request, entity_id):
583
    entity = get_object_or_404(Entity, id=entity_id)
584
    messages.success(request,
585
                     _(u"%(entity)s entity was deleted successfully"
586
                     % {'entity': unicode(entity)}))
587
    entity.delete()
588
    return HttpResponseRedirect(reverse('index'))
589
590
591
def entity_comment(request, federation_slug=None, entity_id=None):
592
    entity = None
593
    federation = None
594
    if federation_slug:
595
        federation = get_object_or_404(Federation, slug=federation_slug)
596
        if entity_id:
597
            entity = get_object_or_404(Entity, id=entity_id,
598
                                       federations__id=federation.id)
599
    if entity_id and not federation_slug:
600
        entity = get_object_or_404(Entity, id=entity_id)
601
602
    if request.method == 'POST':
603
        form = EntityCommentForm(request.POST, request.FILES, instance=entity)
604
        if form.is_valid():
605
            mail_config = getattr(settings, "MAIL_CONFIG")
606
            try:
607
                subject = mail_config['comment_subject'] %entity
608
                send_mail(form.data['email'], subject, form.data['comment'])
609
                messages.success(request, _('Comment posted successfully'))
610
            except Exception, errorMessage:
611
                messages.error(request, _('Comment could not be posted successfully: %s' %errorMessage))
612
613
            return HttpResponseRedirect(form.instance.get_absolute_url())
614
615
        else:
616
            messages.error(request, _('Please correct the errors indicated'
617
                                      ' below'))
618
    else:
619
        form = EntityCommentForm(instance=entity)
620
621
    return render_to_response('metadataparser/entity_comment.html',
622
                              {'settings': settings,
623
                               'form': form,
624
                              },
625
                              context_instance=RequestContext(request))
626
627
628
def entity_proposal(request, federation_slug=None, entity_id=None):
629
    entity = None
630
    federation = None
631
    if federation_slug:
632
        federation = get_object_or_404(Federation, slug=federation_slug)
633
        if entity_id:
634
            entity = get_object_or_404(Entity, id=entity_id,
635
                                       federations__id=federation.id)
636
    if entity_id and not federation_slug:
637
        entity = get_object_or_404(Entity, id=entity_id)
638
639
    if request.method == 'POST':
640
        form = EntityProposalForm(request.POST, request.FILES, instance=entity)
641
     
642
        if form.is_valid():
643
            mail_config = getattr(settings, "MAIL_CONFIG")
644
            try:
645
                subject = mail_config['proposal_subject'] %entity
646
                my_dict = dict(form.data.iterlists())
647
                body = mail_config['proposal_body'] % (entity, ', '.join(my_dict['federations']), form.data['comment'])
648
                send_mail(form.data['email'], subject, body)
649
                messages.success(request, _('Proposal posted successfully'))
650
            except Exception, errorMessage:
651
                messages.error(request, _('Proposal could not be posted successfully: %s' %errorMessage))
652
653
            return HttpResponseRedirect(form.instance.get_absolute_url())
654
655
        else:
656
            messages.error(request, _('Please correct the errors indicated'
657
                                      ' below'))
658
    else:
659
        form = EntityProposalForm(instance=entity)
660
661
    return render_to_response('metadataparser/entity_proposal.html',
662
                              {'settings': settings,
663
                               'form': form,
664
                              },
665
                              context_instance=RequestContext(request))
666
667
def search_service(request):
668
    filters = {}
669
    objects = []
670
671
    if 'entityid' in request.GET:
672
        form = ServiceSearchForm(request.GET)
673
        if form.is_valid():
674
            entityid = form.cleaned_data['entityid']
675
            entityid = entityid.strip()
676
            filters['entityid__icontains'] = entityid
677
    else:
678
        form = ServiceSearchForm()
679
    entity_type = request.GET.get('entity_type', None)
680
681
    if entity_type:
682
        filters['entity_type'] = entity_type
683
684
    if filters:
685
        objects = Entity.objects.filter(**filters)
686
687
    if objects and 'format' in request.GET.keys():
688
        entities = []
689
        for entity in objects:
690
            entities.append({
691
                'entityid': entity.entityid,
692
                'name': entity.name,
693
                'absolute_url': entity.get_absolute_url(),
694
                'types': [unicode(item) for item in entity.types.all()],
695
                'federations': [(unicode(item.name), item.get_absolute_url()) for item in entity.federations.all()],
696
            })
697
698
        return export_query_set(request.GET.get('format'), entities,
699
                                'entities_search_result', ('entityid', 'types', 'federations'))
700
701
    entities = []
702
    for entity in objects:
703
        entities.append({
704
            'entityid': entity.entityid,
705
            'name': entity.name,
706
            'absolute_url': entity.get_absolute_url(),
707
            'types': [unicode(item) for item in entity.types.all()],
708
            'federations': [(unicode(item.name), item.get_absolute_url()) for item in entity.federations.all()],
709
        })
710
711
    return render_to_response('metadataparser/service_search.html',
712
        {'settings': settings,
713
         'searchform': form,
714
         'object_list': entities,
715
         'show_filters': False,
716
        }, context_instance=RequestContext(request))
717
718
def met_logout(request):
719
    logout(request)
720
    return HttpResponseRedirect(request.GET.get("next", "/"))
721
722
723
@profile(name='Search entities')
724
def search_entities(request):
725
    if request.method == 'POST':
726
        form = SearchEntitiesForm(request.POST)
727
728
        if form.is_valid():
729
            filters = {}
730
            args = ()
731
732
            entity_type = form.cleaned_data['entity_type']
733
            if entity_type and entity_type != 'All':
734
                filters['types__name'] = entity_type
735
736
            federations = form.cleaned_data['federations']
737
            if federations and not 'All' in federations:
738
                q_list = [Q(federations__id=f) for f in federations]
739
                args = (reduce(operator.or_, q_list),)
740
741
            entity_id = form.cleaned_data['entityid']
742
            if entity_id and entity_id != '':
743
                filters['entityid__icontains'] = entity_id
744
745
            ob_entities = Entity.objects.all()
746
            if args:
747
                ob_entities = ob_entities.filter(*args)
748
            if filters:
749
                ob_entities = ob_entities.filter(**filters)
750
751
            entity_category = form.cleaned_data['entity_category']
752
            if entity_category and entity_category != 'All':
753
                eid_list = []
754
755
                for entity in ob_entities.all():
756
                    feds = Entity_Federations.objects.filter(entity=entity)
757
758
                    if federations and not 'All' in federations:
759
                        ec_list = [Q(federation__id=f) for f in federations]
760
                        ec_args = (reduce(operator.or_, ec_list),)
761
                        feds = feds.filter(*ec_args)
762
763
                    feds.prefetch_related('entity_categories')
764
                    feds = feds.filter(entity_categories__category_id=entity_category)
765
                    eid_list.extend([ Q(entityid=f.entity.entityid) for f in feds])
766
767
                eid_args = (reduce(operator.or_, eid_list),)
768
                ob_entities = ob_entities.filter(*eid_args)
769
770
            ob_entities = ob_entities.prefetch_related('types', 'federations')
771
            pagination = _paginate_fed(ob_entities, form.cleaned_data['page'])
772
773
            entities = []
774
            for entity in pagination['objects']:
775
                entities.append({
776
                    'entityid': entity.entityid,
777
                    'name': entity.name,
778
                    'absolute_url': entity.get_absolute_url(),
779
                    'types': [unicode(item) for item in entity.types.all()],
780
                    'federations': [(unicode(item.name), item.get_absolute_url()) for item in entity.federations.all()],
781
                })
782
783
            export_format = form.cleaned_data['export_format']
784
            if export_format:
785
                return export_query_set(export_format, entities,
786
                                        'entities_search_result', ('entityid', 'types', 'federations'))
787
788
            return render_to_response('metadataparser/search_entities.html',
789
                                      {'settings': settings,
790
                                       'form': form,
791
                                       'object_list': entities,
792
                                       'show_filters': False,
793
                                       'pagination': pagination,
794
                                      }, context_instance=RequestContext(request))
795
796
        else:
797
            messages.error(request, _('Please correct the errors indicated'
798
                                      ' below'))
799
    else:
800
        form = SearchEntitiesForm()
801
802
    return render_to_response('metadataparser/search_entities.html',
803
                              {'form': form},
804
                              context_instance=RequestContext(request))
805
806
807