|
4 | 4 | from django import forms |
5 | 5 | from django.conf import settings |
6 | 6 | from django.forms.util import ErrorList |
| 7 | +from django.db.models import Q |
| 8 | +from django.forms.widgets import RadioFieldRenderer |
7 | 9 | from django.core.validators import validate_email, ValidationError |
8 | 10 | from django.template.loader import render_to_string |
| 11 | +from django.utils.html import format_html |
| 12 | +from django.utils.encoding import force_text |
| 13 | +from django.utils.safestring import mark_safe |
| 14 | + |
9 | 15 |
|
10 | 16 | from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_liaison, |
11 | 17 | get_person_for_user, is_secretariat, is_sdo_liaison_manager) |
12 | 18 | from ietf.liaisons.utils import IETFHM |
13 | 19 | from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget, |
14 | 20 | ShowAttachmentsWidget, RelatedLiaisonWidget) |
15 | | -from ietf.liaisons.models import LiaisonStatement, LiaisonStatementPurposeName |
| 21 | +from ietf.liaisons.models import LiaisonStatement, LiaisonStatementPurposeName, LiaisonStatementEvent |
16 | 22 | from ietf.group.models import Group, Role |
17 | 23 | from ietf.person.models import Person, Email |
18 | 24 | from ietf.doc.models import Document |
@@ -468,3 +474,63 @@ def liaison_form_factory(request, **kwargs): |
468 | 474 | return IncomingLiaisonForm(user, **kwargs) |
469 | 475 | return None |
470 | 476 |
|
| 477 | + |
| 478 | +class RadioRenderer(RadioFieldRenderer): |
| 479 | + |
| 480 | + def render(self): |
| 481 | + output = [] |
| 482 | + for widget in self: |
| 483 | + output.append(format_html(force_text(widget))) |
| 484 | + return mark_safe('\n'.join(output)) |
| 485 | + |
| 486 | + |
| 487 | +class SearchLiaisonForm(forms.Form): |
| 488 | + |
| 489 | + text = forms.CharField(required=False) |
| 490 | + scope = forms.ChoiceField(choices=(("all", "All text fields"), ("title", "Title field")), required=False, initial='title', widget=forms.RadioSelect(renderer=RadioRenderer)) |
| 491 | + source = forms.CharField(required=False) |
| 492 | + destination = forms.CharField(required=False) |
| 493 | + start_date = forms.DateField(required=False, help_text="Format: YYYY-MM-DD") |
| 494 | + end_date = forms.DateField(required=False, help_text="Format: YYYY-MM-DD") |
| 495 | + |
| 496 | + def get_results(self): |
| 497 | + results = LiaisonStatement.objects.filter(state__slug='approved').extra( |
| 498 | + select={ |
| 499 | + '_submitted': 'SELECT time FROM liaisons_liaisonstatementevent WHERE liaisons_liaisonstatement.id = liaisons_liaisonstatementevent.statement_id AND liaisons_liaisonstatementevent.type_id = "submit"', |
| 500 | + 'from_concat': 'SELECT GROUP_CONCAT(name SEPARATOR ", ") FROM group_group JOIN liaisons_liaisonstatement_from_groups WHERE liaisons_liaisonstatement.id = liaisons_liaisonstatement_from_groups.liaisonstatement_id AND liaisons_liaisonstatement_from_groups.group_id = group_group.id', |
| 501 | + 'to_concat': 'SELECT GROUP_CONCAT(name SEPARATOR ", ") FROM group_group JOIN liaisons_liaisonstatement_to_groups WHERE liaisons_liaisonstatement.id = liaisons_liaisonstatement_to_groups.liaisonstatement_id AND liaisons_liaisonstatement_to_groups.group_id = group_group.id', |
| 502 | + }) |
| 503 | + if self.is_bound: |
| 504 | + query = self.cleaned_data.get('text') |
| 505 | + if query: |
| 506 | + if self.cleaned_data.get('scope') == 'title': |
| 507 | + q = Q(title__icontains=query) |
| 508 | + else: |
| 509 | + q = (Q(title__icontains=query) | Q(other_identifiers__icontains=query) | Q(body__icontains=query) | Q(attachments__title__icontains=query) | |
| 510 | + Q(response_contacts__icontains=query) | Q(technical_contacts__icontains=query) | Q(action_holder_contacts__icontains=query) | |
| 511 | + Q(cc_contacts=query)) |
| 512 | + results = results.filter(q) |
| 513 | + source = self.cleaned_data.get('source') |
| 514 | + if source: |
| 515 | + results = results.filter(Q(from_groups__name__icontains=source) | Q(from_groups__acronym__iexact=source) | Q(from_name__icontains=source)) |
| 516 | + destination = self.cleaned_data.get('destination') |
| 517 | + if destination: |
| 518 | + results = results.filter(Q(to_groups__name__icontains=destination) | Q(to_groups__acronym__iexact=destination) | Q(to_name__icontains=destination)) |
| 519 | + start_date = self.cleaned_data.get('start_date') |
| 520 | + end_date = self.cleaned_data.get('end_date') |
| 521 | + events = None |
| 522 | + if start_date: |
| 523 | + events = LiaisonStatementEvent.objects.filter(type='submit', time__gte=start_date) |
| 524 | + if end_date: |
| 525 | + events = events.filter(time__lte=end_date) |
| 526 | + elif end_date: |
| 527 | + events = LiaisonStatementEvent.objects.filter(type='submit', time__lte=end_date) |
| 528 | + if events: |
| 529 | + results = results.filter(liaisonstatementevent__in=events) |
| 530 | + |
| 531 | + |
| 532 | + destination = self.cleaned_data.get('destination') |
| 533 | + if destination: |
| 534 | + results = results.filter(Q(to_groups__name__icontains=destination) | Q(to_groups__acronym__iexact=destination) | Q(to_name__icontains=destination)) |
| 535 | + results = results.distinct().order_by('title') |
| 536 | + return results |
0 commit comments