Skip to content

Commit 8f8e4df

Browse files
committed
changes for demo
- Legacy-Id: 11121
1 parent 7238fd9 commit 8f8e4df

12 files changed

Lines changed: 195 additions & 230 deletions

File tree

ietf/meeting/forms.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ class InterimRequestForm(forms.Form):
140140
group = GroupModelChoiceField(queryset = Group.objects.filter(type__in=('wg','rg'),state='active').order_by('acronym'))
141141
face_to_face = forms.BooleanField(required=False)
142142
meeting_type = forms.ChoiceField(choices=(("single", "Single"), ("multi-day", "Multi-Day"), ('series','Series')), required=False, initial='single', widget=forms.RadioSelect)
143-
143+
approved = forms.BooleanField(required=False)
144+
144145
def __init__(self, request, *args, **kwargs):
145146
super(InterimRequestForm, self).__init__(*args, **kwargs)
146147
self.user = request.user
@@ -169,16 +170,21 @@ def set_group_options(self):
169170
class InterimSessionForm(forms.Form):
170171
date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label='Date', required=True)
171172
time = forms.TimeField()
172-
utc_time = forms.TimeField()
173+
time_utc = forms.TimeField(required=False)
173174
duration = DurationField()
174-
end_time = forms.TimeField()
175+
end_time = forms.TimeField(required=False)
176+
end_time_utc = forms.TimeField(required=False)
175177
remote_instructions = forms.CharField(max_length=1024,required=False)
176178
agenda = forms.CharField(required=False,widget=forms.Textarea)
177179
agenda_note = forms.CharField(max_length=255,required=False)
178180
city = forms.CharField(max_length=255,required=False)
179181
country = forms.ChoiceField(choices=countries,required=False)
180182
timezone = forms.ChoiceField(choices=timezones)
181183

184+
def __init__(self, *args, **kwargs):
185+
super(InterimSessionForm, self).__init__(*args, **kwargs)
186+
self.fields['timezone'].initial = 'UTC'
187+
182188
def _save_agenda(self, text):
183189
pass
184190

ietf/meeting/tests_js.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,25 @@ def testUnschedule(self):
7373
time.sleep(0.1) # The API that modifies the database runs async
7474
self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),0)
7575

76+
@skipIf(skip_selenium, skip_message)
77+
class InterimRequestTests(StaticLiveServerTestCase):
78+
def setUp(self):
79+
condition_data()
80+
self.driver = webdriver.PhantomJS(service_log_path=settings.TEST_GHOSTDRIVER_LOG_PATH)
81+
self.driver.set_window_size(1024,768)
82+
83+
def absreverse(self,*args,**kwargs):
84+
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
85+
86+
def testInterimRequest(self):
87+
url = self.absreverse('ietf.meeting.views.interim_request')
88+
self.driver.get(url)
89+
element = self.driver.find_element_by_id('id_form-0-date')
90+
self.assertTrue(element)
91+
92+
def testJustSitThere(self):
93+
time.sleep(10000)
94+
7695
# The following are useful debugging tools
7796

7897
# If you add this to a LiveServerTestCase and run just this test, you can browse

ietf/meeting/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858

5959
urlpatterns = [
6060
# TODO - views.material should take num instead of meeting_num so it can move into one of the above lists
61+
url(r'^ajax/get-utc/$', views.ajax_get_utc),
6162
url(r'^(?P<meeting_num>\d+)/materials(?:.html)?/?$', views.materials),
6263
url(r'^requests.html$', RedirectView.as_view(url='/meeting/requests', permanent=True)),
6364
url(r'^(?P<num>\d+)/requests.html$', RedirectView.as_view(url='/meeting/%(num)s/requests', permanent=True)),
@@ -71,4 +72,3 @@
7172
url(r'^$', views.current_materials),
7273
]
7374

74-

ietf/meeting/views.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from collections import OrderedDict, Counter
1010
import csv
1111
import json
12+
import pytz
1213

1314
import debug # pyflakes:ignore
1415

@@ -890,6 +891,23 @@ def sort_key(session):
890891
'type_counter': type_counter,
891892
})
892893

894+
# -------------------------------------------------
895+
# Interim Views
896+
# -------------------------------------------------
897+
898+
def ajax_get_utc(request):
899+
'''Ajax view that takes arguments time and timezone and returns UTC'''
900+
time = request.GET.get('time')
901+
timezone = request.GET.get('timezone')
902+
hour,minute = time.split(':')
903+
dt = datetime.datetime(2016,1,1,int(hour),int(minute))
904+
tz = pytz.timezone(timezone)
905+
aware_dt = tz.localize(dt, is_dst=None)
906+
utc_dt = aware_dt.astimezone(pytz.utc)
907+
utc = utc_dt.strftime('%H:%M')
908+
context_data = {'timezone':timezone,'time':time,'utc':utc}
909+
return HttpResponse(json.dumps(context_data),content_type='application/json')
910+
893911
@role_required('Area Director','Secretariat','IRTF Chair','WG Chair')
894912
def interim_request(request):
895913
'''View for requesting an interim meeting'''
@@ -917,15 +935,15 @@ def interim_request(request):
917935
else:
918936
assert False, (form.errors, formset.errors)
919937
else:
920-
form = InterimRequestForm(request=request,initial={'meeting_type':'single'})
938+
form = InterimRequestForm(request=request,initial={'meeting_type':'single','timezone':'UTC'})
921939
formset = SessionFormset()
922940

923941
return render(request, "meeting/interim_request.html", {"form":form, "formset":formset})
924942

925943
def ical_upcoming(request):
926944
'''ICAL upcoming meetings'''
927945
today = datetime.datetime.today()
928-
meetings = Meeting.objects.filter(date__gt=today)
946+
meetings = Meeting.objects.filter(date__gt=today)
929947

930948
return render(request, "meeting/upcoming.ics", {
931949
"meetings": meetings,

ietf/static/ietf/js/meeting-interim-request.js

Lines changed: 113 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,16 @@ var interimRequest = {
99
// bind functions
1010
$('.select2-field').select2();
1111
$('#add_session').click(interimRequest.addSession);
12+
$('.btn-delete').click(interimRequest.deleteSession);
1213
$('#id_face_to_face').change(interimRequest.toggleLocation);
1314
$('input[name="meeting_type"]').change(interimRequest.checkAddButton);
14-
// init
15+
$('input[name$="-duration"]').blur(interimRequest.calculateEndTime);
16+
$('input[name$="-time"]').blur(interimRequest.calculateEndTime);
17+
//$('input[name$="-time"]').blur(interimRequest.setUTC);
18+
$('input[name$="-time"]').blur(interimRequest.updateInfo);
19+
$('input[name$="-end_time"]').change(interimRequest.updateInfo);
20+
$('select[name$="-timezone"]').change(interimRequest.timezoneChange);
21+
// init
1522
interimRequest.faceToFace.each(interimRequest.toggleLocation);
1623
interimRequest.checkAddButton();
1724
},
@@ -46,19 +53,69 @@ var interimRequest = {
4653
setupSelect2Field($(this));
4754
});
4855

49-
if(interimRequest.faceToFace.prop('checked')){
56+
//if(interimRequest.faceToFace.prop('checked')){
5057
var first_session = $(".fieldset:first");
5158
el.find("input[name$='city']").val(first_session.find("input[name$='city']").val());
5259
el.find("select[name$='country']").val(first_session.find("select[name$='country']").val());
5360
el.find("select[name$='timezone']").val(first_session.find("select[name$='timezone']").val());
54-
}
61+
//}
5562

5663
if(meeting_type == 'multi-day'){
5764
el.find(".location").prop('disabled', true);
5865
}
66+
67+
$('.btn-delete').removeClass("hidden");
68+
},
5969

70+
updateInfo : function() {
71+
//var url = liaisonForm.form.data("ajaxInfoUrl");
72+
//alert('called update');
73+
var url = "/meeting/ajax/get-utc";
74+
var fieldset = $(this).parents(".fieldset");
75+
var time = $(this).val();
76+
var timezone_field = fieldset.find('[name$="timezone"]');
77+
var timezone = timezone_field.val();
78+
var name = $(this).attr("id") + "_utc";
79+
var utc = fieldset.find("#" + name);
80+
$.ajax({
81+
url: url,
82+
type: 'GET',
83+
cache: false,
84+
async: true,
85+
dataType: 'json',
86+
data: {time: time,
87+
timezone: timezone},
88+
success: function(response){
89+
if (!response.error) {
90+
utc.val(response.utc + " UTC");
91+
}
92+
}
93+
});
94+
return false;
6095
},
6196

97+
98+
calculateEndTime : function() {
99+
// gets called when either start_time or duration change
100+
var fieldset = $(this).parents(".fieldset");
101+
var start_time = fieldset.find("input[name$='-time']");
102+
var end_time = fieldset.find("input[name$='-end_time']");
103+
var duration = fieldset.find("input[name$='-duration']");
104+
if(!start_time.val() || !duration.val()){
105+
return;
106+
}
107+
var start_values = start_time.val().split(":");
108+
var duration_values = duration.val().split(":");
109+
var d = new Date(2000,1,1,start_values[0],start_values[1]);
110+
var d1 = new Date(d.getTime() + (duration_values[0]*60*60*1000));
111+
var d2 = new Date(d1.getTime() + (duration_values[1]*60*1000));
112+
end_time.val(interimRequest.get_formatted_time(d2));
113+
end_time.trigger('change');
114+
//interimRequest.updateInfo(end_time);
115+
//alert( d2 );
116+
//alert( end_time.attr("id") );
117+
},
118+
62119
checkAddButton : function() {
63120
var meeting_type = $('input[name="meeting_type"]:checked').val();
64121
if(meeting_type == 'single'){
@@ -68,6 +125,59 @@ var interimRequest = {
68125
}
69126
},
70127

128+
get_formatted_time : function (d) {
129+
// returns time from Date object as HH:MM
130+
var minutes = d.getMinutes().toString();
131+
var hours = d.getHours().toString();
132+
return interimRequest.pad(hours) + ":" + interimRequest.pad(minutes);
133+
},
134+
135+
deleteSession : function() {
136+
var fieldset = $(this).parents(".fieldset");
137+
fieldset.remove();
138+
var totalField = $('#id_form-TOTAL_FORMS');
139+
var total = +totalField.val();
140+
--total;
141+
totalField.val(total);
142+
if(total == 2){
143+
$(".btn-delete").addClass("hidden");
144+
}
145+
},
146+
147+
get_formatted_utc_time : function (d) {
148+
// returns time from Date object as HH:MM
149+
var minutes = d.getUTCMinutes().toString();
150+
var hours = d.getUTCHours().toString();
151+
return interimRequest.pad(hours) + ":" + interimRequest.pad(minutes);
152+
},
153+
154+
pad : function(str) {
155+
// zero pads string 00
156+
if(str.length == 1){
157+
str = "0" + str;
158+
}
159+
return str;
160+
},
161+
162+
setUTC : function() {
163+
var fieldset = $(this).parents(".fieldset");
164+
var values = $(this).val().split(":");
165+
var name = $(this).attr("id") + "_utc";
166+
var utc = fieldset.find("#" + name);
167+
var d = new Date(2000,1,1,values[0],values[1]);
168+
utc.val(interimRequest.get_formatted_utc_time(d) + " UTC");
169+
//alert(utc.attr("id"));
170+
},
171+
172+
timezoneChange : function() {
173+
//alert("tz change");
174+
var fieldset = $(this).parents(".fieldset");
175+
var start_time = fieldset.find("input[name$='-time']");
176+
var end_time = fieldset.find("input[name$='-end_time']");
177+
start_time.trigger('blur');
178+
end_time.trigger('change');
179+
},
180+
71181
toggleLocation : function() {
72182
if(this.checked){
73183
$(".location").prop('disabled', false);

ietf/templates/meeting/interim_request.html

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@ <h1>Interim Meeting Request</h1>
2323
<div class="form-group form-inline">
2424
<div class="col-md-offset-2">
2525

26-
<div class="col-md-3">
26+
<div class="col-md-2">
2727
<!-- <div class="checkbox"> -->
2828
<label class="checkbox-inline">{% render_field form.face_to_face %}<strong>Face to Face</strong></label>
2929
<!-- </div> -->
3030
</div>
3131

32+
<div class="col-md-2">
33+
<!-- <div class="checkbox"> -->
34+
<label class="checkbox-inline">{% render_field form.approved %}<strong>Approved</strong></label>
35+
<!-- </div> -->
36+
</div>
3237

3338
<!-- <div id="meeting-type-options"> -->
3439
<div class="col-md-2 radio-inline"><strong>Meeting Type:</strong></div>
@@ -42,9 +47,10 @@ <h1>Interim Meeting Request</h1>
4247
<input type="radio" value="series" name="meeting_type">Series
4348
</label>
4449
<!-- </div> -->
45-
46-
</div>
4750

51+
52+
</div>
53+
4854
</div>
4955

5056
{{ formset.management_form }}
@@ -55,28 +61,33 @@ <h1>Interim Meeting Request</h1>
5561
<div class="col-md-10 form-inline">
5662
{% render_field form.city class="form-control location" placeholder="City" %}
5763
{% render_field form.country class="form-control location" %}
58-
{% render_field form.timezone class="form-control location" %}
64+
{% render_field form.timezone class="form-control" %}
5965
</div>
6066
</div>
6167

6268
<div class="form-group">
63-
<label for="session" class="col-md-2 control-label">Session</label>
64-
<div class="">
65-
<div class="form-inline">
66-
<div class="col-md-9">
67-
{% render_field form.date class="form-control" %}
68-
<div>
69-
{% render_field form.time class="form-control time-field" placeholder="time" %}
70-
<p class="help-block">Time</p>
71-
</div>
72-
{% render_field form.utc_time class="form-control time-field computed" disabled="disabled" placeholder="UTC time" %}
73-
{% render_field form.duration class="form-control time-field" placeholder="duration" %}
74-
{% render_field form.end_time class="form-control time-field computed" placeholder="end time" disabled="disabled" %}
75-
</div>
76-
</div>
69+
<label for="id_date" class="col-md-2 control-label">Date</label>
70+
<div class="col-md-2">{% render_field form.date class="form-control" %}</div>
71+
</div>
72+
73+
<div class="form-group">
74+
<label for="id_time" class="col-md-2 control-label">Start Time</label>
75+
<div class="col-md-3 form-inline">
76+
{% render_field form.time class="form-control time-field" placeholder="HH:MM" %}
77+
{% render_field form.time_utc class="form-control time-field computed" disabled="disabled" placeholder="UTC" %}
78+
</div>
79+
<label for="id_end_time" class="col-md-2 control-label">End Time</label>
80+
<div class="col-md-4 form-inline">
81+
{% render_field form.end_time class="form-control time-field computed" placeholder="HH:MM" disabled="disabled" %}
82+
{% render_field form.end_time_utc class="form-control time-field computed" disabled="disabled" placeholder="UTC" %}
7783
</div>
7884
</div>
7985

86+
<div class="form-group">
87+
<label for="id_duration" class="col-md-2 control-label">Duration</label>
88+
<div class="col-md-2">{% render_field form.duration class="form-control time-field" placeholder="HH:MM" %}</div>
89+
</div>
90+
8091
<div class="form-group">
8192
<label for="id_remote_instructions" class="col-md-2 control-label">Remote Instructions</label>
8293
<div class="col-md-10">{% render_field form.remote_instructions class="form-control" placeholder="ie. Webex address" %}</div>
@@ -91,6 +102,7 @@ <h1>Interim Meeting Request</h1>
91102
<label for="agenda_note" class="col-md-2 control-label">Agenda Note</label>
92103
<div class="col-md-10">{% render_field form.agenda_note class="form-control" placeholder="Note" %}</div>
93104
</div>
105+
<button name="id_form-{{ forloop.counter0 }}-delete-button" type="button" class="btn btn-default hidden btn-delete">Delete</button>
94106
</div> <!-- fieldset -->
95107
{% endfor %}
96108

@@ -103,7 +115,7 @@ <h1>Interim Meeting Request</h1>
103115
<div class="form-group"
104116
{% buttons %}
105117
<button type="submit" class="btn btn-primary">Submit</button>
106-
<a class="btn btn-default pull-right" href="{% url "ietf.meeting.views.upcoming" %}">Back</a>
118+
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upcoming' %}">Back</a>
107119
{% endbuttons %}
108120
</div>
109121

test/.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
/*.pyc
2-
/sql_setup.sql
1+
/data

test/data/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/*

0 commit comments

Comments
 (0)