Skip to content

Commit e3d9469

Browse files
committed
Reworked add/edit of resources and people who must be there on session requests
- Legacy-Id: 7543
1 parent 73c4f69 commit e3d9469

6 files changed

Lines changed: 73 additions & 78 deletions

File tree

ietf/secr/sreq/forms.py

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,6 @@ def __init__(self,*args,**kwargs):
5353
super(GroupSelectForm, self).__init__(*args,**kwargs)
5454
self.fields['group'].widget.choices = choices
5555

56-
BETHERE_CHOICES = ((False , 'No'), (True , 'Yes'))
57-
# not using the ModelFormset, too complex.
58-
class MustBePresentForm(forms.Form):
59-
from ietf.person.models import Person
60-
61-
#person = forms.ModelChoiceField(queryset= Person.objects.all(), required=False)
62-
person = EmailsField(required=False)
63-
bethere = forms.ChoiceField(required = False, choices = BETHERE_CHOICES)
64-
# something like this is desired to make pre-existing items read-only
65-
#self.fields['person'].widget.attrs['readonly'] = True
66-
67-
68-
MustBePresentFormSet = formset_factory(MustBePresentForm, extra = 1)
69-
7056
class SessionForm(forms.Form):
7157
num_session = forms.ChoiceField(choices=NUM_SESSION_CHOICES)
7258
length_session1 = forms.ChoiceField(choices=LENGTH_SESSION_CHOICES)
@@ -81,7 +67,8 @@ class SessionForm(forms.Form):
8167
wg_selector2 = forms.ChoiceField(choices=WG_CHOICES,required=False)
8268
wg_selector3 = forms.ChoiceField(choices=WG_CHOICES,required=False)
8369
third_session = forms.BooleanField(required=False)
84-
resources = forms.MultipleChoiceField(choices=[(x.pk,x.desc) for x in ResourceAssociation.objects.all()], widget=forms.CheckboxSelectMultiple)
70+
resources = forms.MultipleChoiceField(choices=[(x.pk,x.desc) for x in ResourceAssociation.objects.all()], widget=forms.CheckboxSelectMultiple,required=False)
71+
bethere = EmailsField(label="Must be present", required=False)
8572

8673
def __init__(self, *args, **kwargs):
8774
super(SessionForm, self).__init__(*args, **kwargs)
@@ -103,12 +90,6 @@ def __init__(self, *args, **kwargs):
10390
if self.initial['length_session3'] != '0' and self.initial['length_session3'] != None:
10491
self.fields['third_session'].initial = True
10592

106-
if self.initial and 'resources' in self.initial:
107-
resources = self.initial['resources']
108-
resource_choices = [r.pk for r in resources]
109-
#self.initial['resources'] = resource_choices
110-
self.fields['resources'].initial = resource_choices
111-
11293
def clean_conflict1(self):
11394
conflict = self.cleaned_data['conflict1']
11495
check_conflict(conflict)

ietf/secr/sreq/views.py

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
from ietf.group.models import Group, Role
2020
from ietf.name.models import SessionStatusName, ConstraintName
21+
from ietf.person.models import Email
2122

2223
from forms import *
2324

@@ -52,6 +53,14 @@ def get_initial_session(sessions):
5253
meeting = sessions[0].meeting
5354
group = sessions[0].group
5455
conflicts = group.constraint_source_set.filter(meeting=meeting)
56+
57+
bethere_people = [x.person for x in sessions[0].constraints().filter(name='bethere')]
58+
bethere_email = []
59+
for person in bethere_people:
60+
e = person.email_set.order_by("-active","-time").first()
61+
if e:
62+
bethere_email.append(e)
63+
5564
# even if there are three sessions requested, the old form has 2 in this field
5665
initial['num_session'] = sessions.count() if sessions.count() <= 2 else 2
5766

@@ -69,6 +78,7 @@ def get_initial_session(sessions):
6978
initial['conflict3'] = ' '.join([ c.target.acronym for c in conflicts.filter(name__slug='conflic3') ])
7079
initial['comments'] = sessions[0].comments
7180
initial['resources'] = sessions[0].resources.all()
81+
initial['bethere'] = bethere_email
7282
return initial
7383

7484
def get_lock_message():
@@ -238,6 +248,10 @@ def confirm(request, acronym):
238248
if not querydict:
239249
raise Http404
240250
form = querydict.copy()
251+
if 'resources' in form:
252+
form['resources'] = [ ResourceAssociation.objects.get(pk=pk) for pk in form['resources'].split(',')]
253+
if 'bethere' in form:
254+
form['bethere'] = [Email.objects.get(address=addr) for addr in form['bethere'].split(',')]
241255
meeting = get_meeting()
242256
group = get_object_or_404(Group,acronym=acronym)
243257
login = request.user.person
@@ -271,12 +285,19 @@ def confirm(request, acronym):
271285
comments=form['comments'],
272286
status=SessionStatusName.objects.get(slug=slug))
273287
session_save(new_session)
288+
if 'resources' in form:
289+
new_session.resources = form['resources']
274290

275291
# write constraint records
276292
save_conflicts(group,meeting,form['conflict1'],'conflict')
277293
save_conflicts(group,meeting,form['conflict2'],'conflic2')
278294
save_conflicts(group,meeting,form['conflict3'],'conflic3')
279295

296+
if 'bethere' in form:
297+
bethere_cn = ConstraintName.objects.get(slug='bethere')
298+
for email in form['bethere']:
299+
Constraint.objects.create(name=bethere_cn,source=group,person=email.person,meeting=new_session.meeting)
300+
280301
# deprecated in new schema
281302
# log activity
282303
#add_session_activity(group,'New session was requested',meeting,user)
@@ -301,6 +322,7 @@ def confirm(request, acronym):
301322
RequestContext(request, {}),
302323
)
303324

325+
#Begin dead code
304326
def make_essential_person(pk, person, required):
305327
essential_person = dict()
306328
essential_person["person"] = person.email_set.all()[0].pk
@@ -339,6 +361,23 @@ def make_bepresent_formset(group, session, default=True):
339361

340362
formset = MustBePresentFormSet(initial=list_of_essential_people)
341363
return formset
364+
# end dead code
365+
366+
#Move this into make_initial
367+
def add_essential_people(group,initial):
368+
# This will be easier when the form uses Person instead of Email
369+
people = set()
370+
if 'bethere' in initial:
371+
people.update(initial['bethere'])
372+
for role in group.role_set.filter(name='chair'):
373+
e = role.person.email_set.order_by("-active","-time").first()
374+
if e:
375+
people.add(e)
376+
e = group.ad.email_set.order_by("-active","-time").first()
377+
if e:
378+
people.add(e)
379+
initial['bethere'] = list(people)
380+
342381

343382
@check_permissions
344383
def edit(request, acronym):
@@ -360,6 +399,9 @@ def edit_mtg(request, num, acronym):
360399
sessions = Session.objects.filter(meeting=meeting,group=group).order_by('id')
361400
sessions_count = sessions.count()
362401
initial = get_initial_session(sessions)
402+
if 'resources' in initial:
403+
initial['resources'] = [x.pk for x in initial['resources']]
404+
363405
session_conflicts = session_conflicts_as_string(group, meeting)
364406
login = request.user.person
365407

@@ -373,8 +415,7 @@ def edit_mtg(request, num, acronym):
373415
return redirect('sessions_view', acronym=acronym)
374416

375417
form = SessionForm(request.POST,initial=initial)
376-
bepresent_formset = MustBePresentFormSet(request.POST)
377-
if form.is_valid() or bepresent_formset.is_valid():
418+
if form.is_valid():
378419
if form.has_changed():
379420
# might be cleaner to simply delete and rewrite all records (but maintain submitter?)
380421
# adjust duration or add sessions
@@ -449,36 +490,19 @@ def edit_mtg(request, num, acronym):
449490
for a in new_resource_ids]
450491
session.resources = new_resources
451492

493+
if 'bethere' in form.changed_data and set(form.cleaned_data['bethere'])!=set(initial['bethere']):
494+
session.constraints().filter(name='bethere').delete()
495+
bethere_cn = ConstraintName.objects.get(slug='bethere')
496+
for email in form.cleaned_data['bethere']:
497+
Constraint.objects.create(name=bethere_cn,source=group,person=email.person,meeting=session.meeting)
498+
452499
# deprecated
453500
# log activity
454501
#add_session_activity(group,'Session Request was updated',meeting,user)
455502

456503
# send notification
457504
send_notification(group,meeting,login,form.cleaned_data,'update')
458505

459-
for bepresent in bepresent_formset.forms:
460-
if bepresent.is_valid() and 'person' in bepresent.cleaned_data:
461-
persons_cleaned = bepresent.cleaned_data['person']
462-
if(len(persons_cleaned) == 0):
463-
continue
464-
465-
person = bepresent.cleaned_data['person'][0].person
466-
if 'bethere' in bepresent.changed_data and bepresent.cleaned_data['bethere']=='True':
467-
#print "Maybe adding bethere constraint for %s" % (person)
468-
if session.people_constraints.filter(person = person).count()==0:
469-
# need to create new constraint.
470-
#print " yes"
471-
nc = session.people_constraints.create(person = person,
472-
meeting = meeting,
473-
name_id = 'bethere',
474-
source = session.group)
475-
nc.save()
476-
else:
477-
#print "Maybe deleting bethere constraint for %s" % (person)
478-
if session.people_constraints.filter(person = person).count() > 0:
479-
#print " yes"
480-
session.people_constraints.filter(person = person).delete()
481-
482506
# nuke any cache that might be lingering around.
483507
from ietf.meeting.helpers import session_constraint_expire
484508
session_constraint_expire(session)
@@ -489,13 +513,10 @@ def edit_mtg(request, num, acronym):
489513
else:
490514
form = SessionForm(initial=initial)
491515

492-
bepresent_formset = make_bepresent_formset(group, session, False)
493-
494516
return render_to_response('sreq/edit.html', {
495517
'meeting': meeting,
496518
'form': form,
497519
'group': group,
498-
'bepresent_formset' : bepresent_formset,
499520
'session_conflicts': session_conflicts},
500521
RequestContext(request, {}),
501522
)
@@ -600,10 +621,15 @@ def new(request, acronym):
600621
return redirect('sessions_new', acronym=acronym)
601622

602623
initial = get_initial_session(previous_sessions)
624+
add_essential_people(group,initial)
625+
if 'resources' in initial:
626+
initial['resources'] = [x.pk for x in initial['resources']]
603627
form = SessionForm(initial=initial)
604628

605629
else:
606-
form = SessionForm()
630+
initial={}
631+
add_essential_people(group,initial)
632+
form = SessionForm(initial=initial)
607633

608634
return render_to_response('sreq/new.html', {
609635
'meeting': meeting,

ietf/secr/templates/includes/sessions_request_form.html

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
Length of Third Session: {{ form.length_session3.errors }}{{ form.length_session3 }}</td></tr>
1515
{% endif %}
1616
<tr class="bg1"><td>Number of Attendees:<span class="required">*</span></td><td>{{ form.attendees.errors }}{{ form.attendees }}</td></tr>
17-
<tr class="bg2"><td>Conflicts to Avoid:</td>
17+
<tr class="bg2"><td>People who must be present:</td><td>{{ form.bethere.errors }}{{ form.bethere }}</td></tr>
18+
<tr class="bg1"><td>Conflicts to Avoid:</td>
1819
<td>
1920
<table>
2021
<tr>
@@ -50,27 +51,10 @@
5051
</table>
5152
</td>
5253
</tr>
53-
<tr class="bg1"><td>People who need to be present:</td>
54-
<td>
55-
{{ bepresent_formset.management_form }}
56-
<table style="width: 100%;">
57-
<tr>
58-
<th style="width: 70%;">Person</th>
59-
<th>Must be present?</th>
60-
</tr>
61-
{% for essential_person_form in bepresent_formset.forms %}
62-
<tr class="{% cycle 'bg3' 'bg2'%}">
63-
<td>{{ essential_person_form.person }}</td>
64-
<td>{{ essential_person_form.bethere }}</td>
65-
</tr>
66-
{% endfor %}
67-
</table>
68-
</td>
69-
</tr>
7054
<tr class="bg2"><td>Resources requested:</td>
71-
<td>
72-
{{ form.resources }}
73-
</td>
55+
<td>
56+
{{ form.resources }}
57+
</td>
7458
</tr>
7559
<tr class="bg1">
7660
<td valign="top">Special Requests:<br />&nbsp;<br />i.e. Meetecho, WebEx (please state which, and the reason needed), restrictions on meeting times / days, etc.</td>
@@ -81,7 +65,3 @@
8165
{% include "includes/buttons_save_cancel.html" %}
8266

8367
</form>
84-
{% block content_end %}
85-
<script type="text/javascript" src="/js/lib/jquery.tokeninput.js"></script>
86-
<script type="text/javascript" src="/js/tokenized-field.js"></script>
87-
{% endblock %}

ietf/secr/templates/includes/sessions_request_view.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@
2828
</tr>
2929
<tr class="row2">
3030
<td>Resources requested:</td>
31-
<td>{% if session.resources %}<ul>{% for resource in session.resources %}<li>{{ resource.desc }}{% endfor %}</ul>{% else %}<i>None so far</i>{% endif %}</td>
31+
<td>{% if session.resources %}<ul>{% for resource in session.resources %}<li>{{ resource.desc }}</li>{% endfor %}</ul>{% else %}<i>None so far</i>{% endif %}</td>
3232
</tr>
33+
<tr class="row1">
34+
<td>People who must be present:</td>
35+
<td>{% if session.bethere %}<ul>{% for email in session.bethere %}<li>{{ email.person }}</li>{% endfor %}</ul>{% else %}<i>None</i>{% endif %}</td>
3336
{% autoescape off %}
34-
<tr class="row1"><td>Special Requests:</td><td>{{ session.comments }}</td></tr>
37+
<tr class="row2"><td>Special Requests:</td><td>{{ session.comments }}</td></tr>
3538
{% endautoescape %}
3639
</table>

ietf/secr/templates/sreq/edit.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
{% block extrahead %}{{ block.super }}
66
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/utils.js"></script>
77
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/sessions.js"></script>
8+
<script type="text/javascript" src="/js/lib/jquery.tokeninput.js"></script>
9+
<script type="text/javascript" src="/js/tokenized-field.js"></script>
10+
<link rel="stylesheet" type="text/css" href="/css/token-input.css"></link>
811
{% endblock %}
912

1013
{% block breadcrumbs %}{{ block.super }}
@@ -17,7 +20,6 @@
1720
<a href="http://www.ietf.org/wg/request-tool-instructions.html" target="_blank">Instructions</a>
1821
{% endblock %}
1922

20-
2123
{% block content %}
2224

2325
<div class="module interim-container">

ietf/secr/templates/sreq/new.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
{% block extrahead %}{{ block.super }}
66
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/utils.js"></script>
77
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/sessions.js"></script>
8+
<script type="text/javascript" src="/js/lib/jquery.tokeninput.js"></script>
9+
<script type="text/javascript" src="/js/tokenized-field.js"></script>
10+
<link rel="stylesheet" type="text/css" href="/css/token-input.css"></link>
811
{% endblock %}
912

1013
{% block breadcrumbs %}{{ block.super }}

0 commit comments

Comments
 (0)