Skip to content

Commit 82f23da

Browse files
committed
Merge remote-tracking branch 'ietf-tools/main' into feat/postgres
2 parents c5f35e4 + ad553cc commit 82f23da

5 files changed

Lines changed: 37 additions & 116 deletions

File tree

docker/scripts/app-create-dirs.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ for sub in \
88
test/media \
99
test/wiki/ietf \
1010
data/nomcom_keys/public_keys \
11+
/assets/archive/id \
1112
/assets/ietf-ftp \
1213
/assets/ietf-ftp/bofreq \
1314
/assets/ietf-ftp/charter \

ietf/meeting/tests_views.py

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,34 @@ def test_meeting_agenda(self):
315315
self.assertContains(r, session.group.parent.acronym.upper())
316316
self.assertContains(r, slot.location.name)
317317
self.assertContains(r, registration_text)
318+
start_time = slot.time.astimezone(meeting.tz())
319+
end_time = slot.end_time().astimezone(meeting.tz())
320+
self.assertContains(r, '"{}","{}","{}"'.format(
321+
start_time.strftime("%Y-%m-%d"),
322+
start_time.strftime("%H%M"),
323+
end_time.strftime("%H%M"),
324+
))
325+
self.assertContains(r, session.materials.get(type='agenda').uploaded_filename)
326+
self.assertContains(r, session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
327+
self.assertNotContains(r, session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
318328

329+
# CSV, utc
330+
r = self.client.get(urlreverse(
331+
"ietf.meeting.views.agenda_plain",
332+
kwargs=dict(num=meeting.number, ext=".csv", utc="-utc"),
333+
))
334+
self.assertContains(r, session.group.acronym)
335+
self.assertContains(r, session.group.name)
336+
self.assertContains(r, session.group.parent.acronym.upper())
337+
self.assertContains(r, slot.location.name)
338+
self.assertContains(r, registration_text)
339+
start_time = slot.time.astimezone(datetime.timezone.utc)
340+
end_time = slot.end_time().astimezone(datetime.timezone.utc)
341+
self.assertContains(r, '"{}","{}","{}"'.format(
342+
start_time.strftime("%Y-%m-%d"),
343+
start_time.strftime("%H%M"),
344+
end_time.strftime("%H%M"),
345+
))
319346
self.assertContains(r, session.materials.get(type='agenda').uploaded_filename)
320347
self.assertContains(r, session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
321348
self.assertNotContains(r, session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
@@ -5805,35 +5832,6 @@ def test_group_ical(self):
58055832
self.assertContains(r, 'END:VEVENT')
58065833

58075834

5808-
class AjaxTests(TestCase):
5809-
def test_ajax_get_utc(self):
5810-
# test bad queries
5811-
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=badtime&timezone=UTC"
5812-
r = self.client.get(url)
5813-
self.assertEqual(r.status_code, 200)
5814-
data = r.json()
5815-
self.assertEqual(data["error"], True)
5816-
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=25:99&timezone=UTC"
5817-
r = self.client.get(url)
5818-
self.assertEqual(r.status_code, 200)
5819-
data = r.json()
5820-
self.assertEqual(data["error"], True)
5821-
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=10:00am&timezone=UTC"
5822-
r = self.client.get(url)
5823-
self.assertEqual(r.status_code, 200)
5824-
data = r.json()
5825-
self.assertEqual(data["error"], True)
5826-
# test good query
5827-
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=12:00&timezone=America/Los_Angeles"
5828-
r = self.client.get(url)
5829-
self.assertEqual(r.status_code, 200)
5830-
data = r.json()
5831-
self.assertIn('timezone', data)
5832-
self.assertIn('time', data)
5833-
self.assertIn('utc', data)
5834-
self.assertNotIn('error', data)
5835-
self.assertEqual(data['utc'], '20:00')
5836-
58375835
class IphoneAppJsonTests(TestCase):
58385836
def test_iphone_app_json_interim(self):
58395837
make_interim_test_data()

ietf/meeting/urls.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ def get_redirect_url(self, *args, **kwargs):
6969

7070
type_ietf_only_patterns_id_optional = [
7171
url(r'^agenda(?P<utc>-utc)?(?P<ext>\.html)?/?$', views.agenda, name='agenda'),
72-
url(r'^agenda(?P<utc>-utc)?(?P<ext>\.txt)$', views.agenda_plain),
73-
url(r'^agenda(?P<ext>\.csv)$', views.agenda_plain),
72+
url(r'^agenda(?P<utc>-utc)?(?P<ext>\.txt|\.csv)$', views.agenda_plain),
7473
url(r'^agenda/edit$',
7574
RedirectView.as_view(pattern_name='ietf.meeting.views.edit_meeting_schedule', permanent=True),
7675
name='ietf.meeting.views.edit_meeting_schedule'),
@@ -113,7 +112,6 @@ def get_redirect_url(self, *args, **kwargs):
113112
urlpatterns = [
114113
# First patterns which start with unique strings
115114
url(r'^$', views.current_materials),
116-
url(r'^ajax/get-utc/?$', views.ajax_get_utc),
117115
url(r'^interim/announce/?$', views.interim_announce),
118116
url(r'^interim/announce/(?P<number>[A-Za-z0-9._+-]+)/?$', views.interim_send_announcement),
119117
url(r'^interim/skip_announce/(?P<number>[A-Za-z0-9._+-]+)/?$', views.interim_skip_announcement),

ietf/meeting/views.py

Lines changed: 7 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,7 +1550,7 @@ def agenda_plain(request, num=None, name=None, base=None, ext=None, owner=None,
15501550
person = get_person_by_email(owner)
15511551
schedule = get_schedule_by_name(meeting, person, name)
15521552

1553-
if schedule == None:
1553+
if schedule is None:
15541554
base = base.replace("-utc", "")
15551555
return render(request, "meeting/no-"+base+ext, {'meeting':meeting }, content_type=mimetype[ext])
15561556

@@ -1565,7 +1565,7 @@ def agenda_plain(request, num=None, name=None, base=None, ext=None, owner=None,
15651565

15661566
# Done processing for CSV output
15671567
if ext == ".csv":
1568-
return agenda_csv(schedule, filtered_assignments)
1568+
return agenda_csv(schedule, filtered_assignments, utc=utc is not None)
15691569

15701570
filter_organizer = AgendaFilterOrganizer(assignments=filtered_assignments)
15711571

@@ -1804,7 +1804,7 @@ def agenda_extract_slide (item):
18041804
"ext": item.file_extension()
18051805
}
18061806

1807-
def agenda_csv(schedule, filtered_assignments):
1807+
def agenda_csv(schedule, filtered_assignments, utc=False):
18081808
encoding = 'utf-8'
18091809
response = HttpResponse(content_type=f"text/csv; charset={encoding}")
18101810
writer = csv.writer(response, delimiter=str(','), quoting=csv.QUOTE_ALL)
@@ -1830,11 +1830,12 @@ def slides_field(item):
18301830

18311831
write_row(headings)
18321832

1833+
tz = datetime.timezone.utc if utc else schedule.meeting.tz()
18331834
for item in filtered_assignments:
18341835
row = []
1835-
row.append(item.timeslot.time.strftime("%Y-%m-%d"))
1836-
row.append(item.timeslot.time.strftime("%H%M"))
1837-
row.append(item.timeslot.end_time().strftime("%H%M"))
1836+
row.append(item.timeslot.time.astimezone(tz).strftime("%Y-%m-%d"))
1837+
row.append(item.timeslot.time.astimezone(tz).strftime("%H%M"))
1838+
row.append(item.timeslot.end_time().astimezone(tz).strftime("%H%M"))
18381839

18391840
if item.slot_type().slug == "break":
18401841
row.append(item.slot_type().name)
@@ -3029,43 +3030,6 @@ def delete_schedule(request, num, owner, name):
30293030
# -------------------------------------------------
30303031
# Interim Views
30313032
# -------------------------------------------------
3032-
3033-
3034-
def ajax_get_utc(request):
3035-
'''Ajax view that takes arguments time, timezone, date and returns UTC data'''
3036-
time = request.GET.get('time')
3037-
timezone = request.GET.get('timezone')
3038-
date = request.GET.get('date')
3039-
time_re = re.compile(r'^\d{2}:\d{2}$')
3040-
# validate input
3041-
if not time_re.match(time) or not date:
3042-
return HttpResponse(json.dumps({'error': True}),
3043-
content_type='application/json')
3044-
hour, minute = time.split(':')
3045-
if not (int(hour) <= 23 and int(minute) <= 59):
3046-
return HttpResponse(json.dumps({'error': True}),
3047-
content_type='application/json')
3048-
year, month, day = date.split('-')
3049-
dt = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute))
3050-
tz = pytz.timezone(timezone)
3051-
aware_dt = tz.localize(dt, is_dst=None)
3052-
utc_dt = aware_dt.astimezone(pytz.utc)
3053-
utc = utc_dt.strftime('%H:%M')
3054-
# calculate utc day offset
3055-
naive_utc_dt = utc_dt.replace(tzinfo=None)
3056-
utc_day_offset = (naive_utc_dt.date() - dt.date()).days
3057-
html = "<span>{utc} UTC</span>".format(utc=utc)
3058-
if utc_day_offset != 0:
3059-
html = html + '<span class="day-offset"> {0:+d} Day</span>'.format(utc_day_offset)
3060-
context_data = {'timezone': timezone,
3061-
'time': time,
3062-
'utc': utc,
3063-
'utc_day_offset': utc_day_offset,
3064-
'html': html}
3065-
return HttpResponse(json.dumps(context_data),
3066-
content_type='application/json')
3067-
3068-
30693033
def interim_announce(request):
30703034
'''View which shows interim meeting requests awaiting announcement'''
30713035
meetings = data_for_meetings_overview(Meeting.objects.filter(type='interim').order_by('date'), interim_status='scheda')

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

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,14 @@ const interimRequest = (function() {
1818
.on("blur", interimRequest.calculateEndTime);
1919
const timeInput = $('input[name$="-time"]');
2020
timeInput.on("blur", interimRequest.calculateEndTime);
21-
timeInput.on("blur", interimRequest.updateInfo);
2221
$('input[name$="-end_time"]')
23-
.prop('disabled', true)
24-
.on("change", interimRequest.updateInfo);
22+
.prop('disabled', true);
2523
interimRequest.timezone.on("change", interimRequest.timezoneChange);
2624
// init
2725
interimRequest.inPerson.each(interimRequest.toggleLocation);
2826
interimRequest.checkAddButton();
2927
interimRequest.initTimezone();
3028
timeInput.each(interimRequest.calculateEndTime);
31-
timeInput.each(interimRequest.updateInfo);
3229
const remoteParticipations = $('select[id$="-remote_participation"]');
3330
remoteParticipations.on(
3431
'change',
@@ -91,43 +88,6 @@ const interimRequest = (function() {
9188
.removeClass("d-none");
9289
},
9390

94-
updateInfo: function () {
95-
// makes ajax call to server and sets UTC field
96-
const time = $(this)
97-
.val();
98-
if (!time) {
99-
return;
100-
}
101-
const url = "/meeting/ajax/get-utc";
102-
const fieldset = $(this)
103-
.parents(".fieldset");
104-
const date = fieldset.find("input[name$='-date']")
105-
.val();
106-
const timezone = interimRequest.timezone.val();
107-
const name = $(this)
108-
.attr("id") + "_utc";
109-
const utc = fieldset.find("#" + name);
110-
//console.log(name,utc.attr("id"));
111-
$.ajax({
112-
url: url,
113-
type: 'GET',
114-
cache: false,
115-
async: true,
116-
dataType: 'json',
117-
data: {
118-
date: date,
119-
time: time,
120-
timezone: timezone
121-
},
122-
success: function (response) {
123-
if (!response.error && response.html) {
124-
utc.html(response.html);
125-
}
126-
}
127-
});
128-
return false;
129-
},
130-
13191
calculateEndTime: function () {
13292
// gets called when either start_time or duration change
13393
const fieldset = $(this)

0 commit comments

Comments
 (0)