From 73f9fe310bc20243c2dfc6b66e71557e3672f855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20A=2E=20S=C3=A1nchez=20L=C3=B3pez?= Date: Fri, 1 Oct 2010 10:17:40 +0000 Subject: [PATCH] Allow the user to select a referenced liaison. Fixes #381 - Legacy-Id: 2538 --- ietf/liaisons/forms.py | 7 ++- ietf/liaisons/urls.py | 1 + ietf/liaisons/views.py | 9 +++ ietf/liaisons/widgets.py | 33 ++++++++++- .../liaisons/liaisondetail_simple_list.html | 32 +++++++++++ static/images/ajax-loader.gif | Bin 0 -> 847 bytes static/js/liaisons.js | 54 ++++++++++++++++++ 7 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 ietf/templates/liaisons/liaisondetail_simple_list.html create mode 100644 static/images/ajax-loader.gif diff --git a/ietf/liaisons/forms.py b/ietf/liaisons/forms.py index 1b480e7df..84091ff49 100644 --- a/ietf/liaisons/forms.py +++ b/ietf/liaisons/forms.py @@ -3,6 +3,7 @@ from email.utils import parseaddr from django import forms from django.conf import settings +from django.db.models import Q from django.forms.util import ErrorList from django.forms.fields import email_re from django.template.loader import render_to_string @@ -12,7 +13,7 @@ from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_l from ietf.liaisons.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval, SDOs from ietf.liaisons.utils import IETFHM from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget, - ShowAttachmentsWidget) + ShowAttachmentsWidget, RelatedLiaisonWidget) class LiaisonForm(forms.ModelForm): @@ -33,11 +34,13 @@ class LiaisonForm(forms.ModelForm): require=['id_attach_title', 'id_attach_file'], required_label='title and file'), required=False) + related_to = forms.ModelChoiceField(LiaisonDetail.objects.all(), label=u'Related Liaison', widget=RelatedLiaisonWidget, required=False) fieldsets = [('From', ('from_field', 'replyto')), ('To', ('organization', 'to_poc')), ('Other email addresses', ('response_contact', 'technical_contact', 'cc1')), ('Purpose', ('purpose', 'purpose_text', 'deadline_date')), + ('References', ('related_to', )), ('Liaison Statement', ('title', 'body', 'attachments')), ('Add attachment', ('attach_title', 'attach_file', 'attach_button')), ] @@ -318,7 +321,7 @@ class EditLiaisonForm(LiaisonForm): model = LiaisonDetail fields = ('from_raw_body', 'to_body', 'to_poc', 'cc1', 'last_modified_date', 'title', 'response_contact', 'technical_contact', 'purpose_text', 'body', - 'deadline_date', 'purpose', 'replyto', ) + 'deadline_date', 'purpose', 'replyto', 'related_to') def __init__(self, *args, **kwargs): super(EditLiaisonForm, self).__init__(*args, **kwargs) diff --git a/ietf/liaisons/urls.py b/ietf/liaisons/urls.py index 7d0f3b24d..a9ddb236b 100644 --- a/ietf/liaisons/urls.py +++ b/ietf/liaisons/urls.py @@ -28,4 +28,5 @@ urlpatterns += patterns('ietf.liaisons.views', url(r'^for_approval/(?P\d+)/$', 'liaison_approval_detail', name='liaison_approval_detail'), url(r'^add/$', 'add_liaison', name='add_liaison'), url(r'^ajax/get_info/$', 'get_info', name='get_info'), + url(r'^ajax/liaison_list/$', 'ajax_liaison_list', name='ajax_liaison_list'), ) diff --git a/ietf/liaisons/views.py b/ietf/liaisons/views.py index ebbead920..c0f25451a 100644 --- a/ietf/liaisons/views.py +++ b/ietf/liaisons/views.py @@ -167,3 +167,12 @@ def liaison_detail(request, object_id): def liaison_edit(request, object_id): liaison = get_object_or_404(LiaisonDetail, pk=object_id) return add_liaison(request, liaison=liaison) + +def ajax_liaison_list(request): + public_liaisons = LiaisonDetail.objects.filter(Q(approval__isnull=True)|Q(approval__approved=True)).order_by("-submitted_date") + + return object_list(request, public_liaisons, + allow_empty=True, + template_name='liaisons/liaisondetail_simple_list.html', + extra_context={} + ) diff --git a/ietf/liaisons/widgets.py b/ietf/liaisons/widgets.py index 22340fd20..2a76be6e2 100644 --- a/ietf/liaisons/widgets.py +++ b/ietf/liaisons/widgets.py @@ -1,6 +1,7 @@ from django.conf import settings +from django.core.urlresolvers import reverse from django.db.models.query import QuerySet -from django.forms.widgets import Select, Widget +from django.forms.widgets import Select, Widget, TextInput from django.utils.safestring import mark_safe @@ -64,3 +65,33 @@ class ShowAttachmentsWidget(Widget): html += u'No files attached' html += u'' return mark_safe(html) + + +class RelatedLiaisonWidget(TextInput): + + def render(self, name, value, attrs=None): + if not value: + value = '' + title = '' + noliaison = 'inline' + deselect = 'none' + else: + from ietf.liaisons.models import LiaisonDetail + liaison = LiaisonDetail.objects.get(pk=value) + title = liaison.title + if not title: + files = liaison.uploads_set.all() + if files: + title = files[0].file_title + else: + title = 'Liaison #%s' % liaison.pk + noliaison = 'none' + deselect = 'inline' + html = u'No liaison selected' % noliaison + html += u'%s' % title + html += u' ' % (name, value) + html += u' ' % reverse('ajax_liaison_list') + html += u' ' + html += ' ' % name + html += '' % (deselect, name) + return mark_safe(html) diff --git a/ietf/templates/liaisons/liaisondetail_simple_list.html b/ietf/templates/liaisons/liaisondetail_simple_list.html new file mode 100644 index 000000000..b74fe9894 --- /dev/null +++ b/ietf/templates/liaisons/liaisondetail_simple_list.html @@ -0,0 +1,32 @@ + + + +{% for liaison in object_list %} + + + + + + +{% endfor %} + +
DateFromToTitle
{{ liaison.submitted_date|date:"Y-m-d" }}{{ liaison.from_body|escape }} +{% if liaison.by_secretariat %} + {% if liaison.submitter_email %} + {{ liaison.submitter_name|escape }} + {% else %} + {{ liaison.submitter_name|escape }} + {% endif %} +{% else %} + {{ liaison.to_body|escape }} +{% endif %} + +{% if liaison.by_secretariat %} + {% for file in liaison.uploads_set.all %} + {{ file.file_title|escape }}
+ {% endfor %} +{% else %} + {{ liaison.title|escape }} +{% endif %} + +
diff --git a/static/images/ajax-loader.gif b/static/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..91db99e3dcde448480ec032c5ac3a05648bf14bd GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`<;O|Nno-vI#$b{mz=aV)34nu9cHwyB0in@n+xo8-a~8XKX#( zvu4k$51%$2zj)=r)3Q118`KikeHQNk&~a8qL-PMmd~L0lZBHDs7eQ93&@cStN{uNeJPpqmKuoUC~CDNtXexm zYwdvp2d^Dv;^>*ukeVSP#B=a~ zf`cHJ&w+*y$${?8Oio*#ZVND-p0{bqWVZD*Xt=Aat;&6vAl3|g72d7x8jzOQ(6|TN)0k3Co zc|z??%b8hfRI+(vH2HbDv054g3DyRMDNKeUM;%r)JIk@H5kHpQ-86?$(dkKoJwxMm zrhOBXU7IYboB|^nl6U7WD&rPXTBz{y(Bg!~gf`w#w`Gz=cO?0i7QEK{oc6x~t2H3M z0b_541COhrz@d{8xv>(*cS?BlTxh$Y!7k9nV#1{GTti1?UUB0cu(i`VAUAy((BOjfYz50rVKh zG6xfeLz|8{DtS)i*f48h0*75*E32o0N{2+RoVWQVUJo7igPpo1&00;(u2LcbOAhN^ rOjyy8aDeHjfMF+x#D?h({d~^m865hCENQGUn%zBWiVW7E'); + related_dialog.dialog('open'); + $.ajax({ + url: url, + type: 'GET', + cache: false, + async: true, + dataType: 'html', + success: function(response){ + related_dialog.html(response); + related_dialog.find('a').click(getRelatedLink); + } + }); + return false; + }; + var initTriggers = function() { organization.change(updateInfo); organization.change(checkOtherSDO); @@ -239,6 +283,8 @@ reply.keyup(updateFrom); purpose.change(updatePurpose); cancel.click(cancelForm); + related_trigger.click(selectRelated); + unrelate_trigger.click(selectNoRelated); }; var updateOnInit = function() { @@ -275,6 +321,14 @@ } } }); + + related_dialog.dialog({ + height: 400, + width: 800, + draggable: true, + modal: true, + autoOpen: false + }); }; var initForm = function() {