Completed
Pull Request — master (#16)
by Andrea
01:04
created

federation_view()   F

Complexity

Conditions 11

Size

Total Lines 67

Duplication

Lines 0
Ratio 0 %

Importance

Changes 9
Bugs 0 Features 0
Metric Value
cc 11
c 9
b 0
f 0
dl 0
loc 67
rs 3.75

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