Reworked add/edit of resources and people who must be there on session requests

- Legacy-Id: 7543
This commit is contained in:
Robert Sparks 2014-03-25 22:29:58 +00:00
parent 73c4f694ca
commit e3d946999c
6 changed files with 73 additions and 78 deletions

View file

@ -53,20 +53,6 @@ class GroupSelectForm(forms.Form):
super(GroupSelectForm, self).__init__(*args,**kwargs)
self.fields['group'].widget.choices = choices
BETHERE_CHOICES = ((False , 'No'), (True , 'Yes'))
# not using the ModelFormset, too complex.
class MustBePresentForm(forms.Form):
from ietf.person.models import Person
#person = forms.ModelChoiceField(queryset= Person.objects.all(), required=False)
person = EmailsField(required=False)
bethere = forms.ChoiceField(required = False, choices = BETHERE_CHOICES)
# something like this is desired to make pre-existing items read-only
#self.fields['person'].widget.attrs['readonly'] = True
MustBePresentFormSet = formset_factory(MustBePresentForm, extra = 1)
class SessionForm(forms.Form):
num_session = forms.ChoiceField(choices=NUM_SESSION_CHOICES)
length_session1 = forms.ChoiceField(choices=LENGTH_SESSION_CHOICES)
@ -81,7 +67,8 @@ class SessionForm(forms.Form):
wg_selector2 = forms.ChoiceField(choices=WG_CHOICES,required=False)
wg_selector3 = forms.ChoiceField(choices=WG_CHOICES,required=False)
third_session = forms.BooleanField(required=False)
resources = forms.MultipleChoiceField(choices=[(x.pk,x.desc) for x in ResourceAssociation.objects.all()], widget=forms.CheckboxSelectMultiple)
resources = forms.MultipleChoiceField(choices=[(x.pk,x.desc) for x in ResourceAssociation.objects.all()], widget=forms.CheckboxSelectMultiple,required=False)
bethere = EmailsField(label="Must be present", required=False)
def __init__(self, *args, **kwargs):
super(SessionForm, self).__init__(*args, **kwargs)
@ -103,12 +90,6 @@ class SessionForm(forms.Form):
if self.initial['length_session3'] != '0' and self.initial['length_session3'] != None:
self.fields['third_session'].initial = True
if self.initial and 'resources' in self.initial:
resources = self.initial['resources']
resource_choices = [r.pk for r in resources]
#self.initial['resources'] = resource_choices
self.fields['resources'].initial = resource_choices
def clean_conflict1(self):
conflict = self.cleaned_data['conflict1']
check_conflict(conflict)

View file

@ -18,6 +18,7 @@ from ietf.meeting.helpers import get_meeting
from ietf.group.models import Group, Role
from ietf.name.models import SessionStatusName, ConstraintName
from ietf.person.models import Email
from forms import *
@ -52,6 +53,14 @@ def get_initial_session(sessions):
meeting = sessions[0].meeting
group = sessions[0].group
conflicts = group.constraint_source_set.filter(meeting=meeting)
bethere_people = [x.person for x in sessions[0].constraints().filter(name='bethere')]
bethere_email = []
for person in bethere_people:
e = person.email_set.order_by("-active","-time").first()
if e:
bethere_email.append(e)
# even if there are three sessions requested, the old form has 2 in this field
initial['num_session'] = sessions.count() if sessions.count() <= 2 else 2
@ -69,6 +78,7 @@ def get_initial_session(sessions):
initial['conflict3'] = ' '.join([ c.target.acronym for c in conflicts.filter(name__slug='conflic3') ])
initial['comments'] = sessions[0].comments
initial['resources'] = sessions[0].resources.all()
initial['bethere'] = bethere_email
return initial
def get_lock_message():
@ -238,6 +248,10 @@ def confirm(request, acronym):
if not querydict:
raise Http404
form = querydict.copy()
if 'resources' in form:
form['resources'] = [ ResourceAssociation.objects.get(pk=pk) for pk in form['resources'].split(',')]
if 'bethere' in form:
form['bethere'] = [Email.objects.get(address=addr) for addr in form['bethere'].split(',')]
meeting = get_meeting()
group = get_object_or_404(Group,acronym=acronym)
login = request.user.person
@ -271,12 +285,19 @@ def confirm(request, acronym):
comments=form['comments'],
status=SessionStatusName.objects.get(slug=slug))
session_save(new_session)
if 'resources' in form:
new_session.resources = form['resources']
# write constraint records
save_conflicts(group,meeting,form['conflict1'],'conflict')
save_conflicts(group,meeting,form['conflict2'],'conflic2')
save_conflicts(group,meeting,form['conflict3'],'conflic3')
if 'bethere' in form:
bethere_cn = ConstraintName.objects.get(slug='bethere')
for email in form['bethere']:
Constraint.objects.create(name=bethere_cn,source=group,person=email.person,meeting=new_session.meeting)
# deprecated in new schema
# log activity
#add_session_activity(group,'New session was requested',meeting,user)
@ -301,6 +322,7 @@ def confirm(request, acronym):
RequestContext(request, {}),
)
#Begin dead code
def make_essential_person(pk, person, required):
essential_person = dict()
essential_person["person"] = person.email_set.all()[0].pk
@ -339,6 +361,23 @@ def make_bepresent_formset(group, session, default=True):
formset = MustBePresentFormSet(initial=list_of_essential_people)
return formset
# end dead code
#Move this into make_initial
def add_essential_people(group,initial):
# This will be easier when the form uses Person instead of Email
people = set()
if 'bethere' in initial:
people.update(initial['bethere'])
for role in group.role_set.filter(name='chair'):
e = role.person.email_set.order_by("-active","-time").first()
if e:
people.add(e)
e = group.ad.email_set.order_by("-active","-time").first()
if e:
people.add(e)
initial['bethere'] = list(people)
@check_permissions
def edit(request, acronym):
@ -360,6 +399,9 @@ def edit_mtg(request, num, acronym):
sessions = Session.objects.filter(meeting=meeting,group=group).order_by('id')
sessions_count = sessions.count()
initial = get_initial_session(sessions)
if 'resources' in initial:
initial['resources'] = [x.pk for x in initial['resources']]
session_conflicts = session_conflicts_as_string(group, meeting)
login = request.user.person
@ -373,8 +415,7 @@ def edit_mtg(request, num, acronym):
return redirect('sessions_view', acronym=acronym)
form = SessionForm(request.POST,initial=initial)
bepresent_formset = MustBePresentFormSet(request.POST)
if form.is_valid() or bepresent_formset.is_valid():
if form.is_valid():
if form.has_changed():
# might be cleaner to simply delete and rewrite all records (but maintain submitter?)
# adjust duration or add sessions
@ -449,6 +490,12 @@ def edit_mtg(request, num, acronym):
for a in new_resource_ids]
session.resources = new_resources
if 'bethere' in form.changed_data and set(form.cleaned_data['bethere'])!=set(initial['bethere']):
session.constraints().filter(name='bethere').delete()
bethere_cn = ConstraintName.objects.get(slug='bethere')
for email in form.cleaned_data['bethere']:
Constraint.objects.create(name=bethere_cn,source=group,person=email.person,meeting=session.meeting)
# deprecated
# log activity
#add_session_activity(group,'Session Request was updated',meeting,user)
@ -456,29 +503,6 @@ def edit_mtg(request, num, acronym):
# send notification
send_notification(group,meeting,login,form.cleaned_data,'update')
for bepresent in bepresent_formset.forms:
if bepresent.is_valid() and 'person' in bepresent.cleaned_data:
persons_cleaned = bepresent.cleaned_data['person']
if(len(persons_cleaned) == 0):
continue
person = bepresent.cleaned_data['person'][0].person
if 'bethere' in bepresent.changed_data and bepresent.cleaned_data['bethere']=='True':
#print "Maybe adding bethere constraint for %s" % (person)
if session.people_constraints.filter(person = person).count()==0:
# need to create new constraint.
#print " yes"
nc = session.people_constraints.create(person = person,
meeting = meeting,
name_id = 'bethere',
source = session.group)
nc.save()
else:
#print "Maybe deleting bethere constraint for %s" % (person)
if session.people_constraints.filter(person = person).count() > 0:
#print " yes"
session.people_constraints.filter(person = person).delete()
# nuke any cache that might be lingering around.
from ietf.meeting.helpers import session_constraint_expire
session_constraint_expire(session)
@ -489,13 +513,10 @@ def edit_mtg(request, num, acronym):
else:
form = SessionForm(initial=initial)
bepresent_formset = make_bepresent_formset(group, session, False)
return render_to_response('sreq/edit.html', {
'meeting': meeting,
'form': form,
'group': group,
'bepresent_formset' : bepresent_formset,
'session_conflicts': session_conflicts},
RequestContext(request, {}),
)
@ -600,10 +621,15 @@ def new(request, acronym):
return redirect('sessions_new', acronym=acronym)
initial = get_initial_session(previous_sessions)
add_essential_people(group,initial)
if 'resources' in initial:
initial['resources'] = [x.pk for x in initial['resources']]
form = SessionForm(initial=initial)
else:
form = SessionForm()
initial={}
add_essential_people(group,initial)
form = SessionForm(initial=initial)
return render_to_response('sreq/new.html', {
'meeting': meeting,

View file

@ -14,7 +14,8 @@
Length of Third Session: {{ form.length_session3.errors }}{{ form.length_session3 }}</td></tr>
{% endif %}
<tr class="bg1"><td>Number of Attendees:<span class="required">*</span></td><td>{{ form.attendees.errors }}{{ form.attendees }}</td></tr>
<tr class="bg2"><td>Conflicts to Avoid:</td>
<tr class="bg2"><td>People who must be present:</td><td>{{ form.bethere.errors }}{{ form.bethere }}</td></tr>
<tr class="bg1"><td>Conflicts to Avoid:</td>
<td>
<table>
<tr>
@ -50,27 +51,10 @@
</table>
</td>
</tr>
<tr class="bg1"><td>People who need to be present:</td>
<td>
{{ bepresent_formset.management_form }}
<table style="width: 100%;">
<tr>
<th style="width: 70%;">Person</th>
<th>Must be present?</th>
</tr>
{% for essential_person_form in bepresent_formset.forms %}
<tr class="{% cycle 'bg3' 'bg2'%}">
<td>{{ essential_person_form.person }}</td>
<td>{{ essential_person_form.bethere }}</td>
</tr>
{% endfor %}
</table>
</td>
</tr>
<tr class="bg2"><td>Resources requested:</td>
<td>
{{ form.resources }}
</td>
<td>
{{ form.resources }}
</td>
</tr>
<tr class="bg1">
<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 @@
{% include "includes/buttons_save_cancel.html" %}
</form>
{% block content_end %}
<script type="text/javascript" src="/js/lib/jquery.tokeninput.js"></script>
<script type="text/javascript" src="/js/tokenized-field.js"></script>
{% endblock %}

View file

@ -28,9 +28,12 @@
</tr>
<tr class="row2">
<td>Resources requested:</td>
<td>{% if session.resources %}<ul>{% for resource in session.resources %}<li>{{ resource.desc }}{% endfor %}</ul>{% else %}<i>None so far</i>{% endif %}</td>
<td>{% if session.resources %}<ul>{% for resource in session.resources %}<li>{{ resource.desc }}</li>{% endfor %}</ul>{% else %}<i>None so far</i>{% endif %}</td>
</tr>
<tr class="row1">
<td>People who must be present:</td>
<td>{% if session.bethere %}<ul>{% for email in session.bethere %}<li>{{ email.person }}</li>{% endfor %}</ul>{% else %}<i>None</i>{% endif %}</td>
{% autoescape off %}
<tr class="row1"><td>Special Requests:</td><td>{{ session.comments }}</td></tr>
<tr class="row2"><td>Special Requests:</td><td>{{ session.comments }}</td></tr>
{% endautoescape %}
</table>

View file

@ -5,6 +5,9 @@
{% block extrahead %}{{ block.super }}
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/utils.js"></script>
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/sessions.js"></script>
<script type="text/javascript" src="/js/lib/jquery.tokeninput.js"></script>
<script type="text/javascript" src="/js/tokenized-field.js"></script>
<link rel="stylesheet" type="text/css" href="/css/token-input.css"></link>
{% endblock %}
{% block breadcrumbs %}{{ block.super }}
@ -17,7 +20,6 @@
<a href="http://www.ietf.org/wg/request-tool-instructions.html" target="_blank">Instructions</a>
{% endblock %}
{% block content %}
<div class="module interim-container">

View file

@ -5,6 +5,9 @@
{% block extrahead %}{{ block.super }}
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/utils.js"></script>
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/sessions.js"></script>
<script type="text/javascript" src="/js/lib/jquery.tokeninput.js"></script>
<script type="text/javascript" src="/js/tokenized-field.js"></script>
<link rel="stylesheet" type="text/css" href="/css/token-input.css"></link>
{% endblock %}
{% block breadcrumbs %}{{ block.super }}