Reworked add/edit of resources and people who must be there on session requests
- Legacy-Id: 7543
This commit is contained in:
parent
73c4f694ca
commit
e3d946999c
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 /> <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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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 }}
|
||||
|
|
Loading…
Reference in a new issue