Merge remote-tracking branch 'ietf-tools/main' into feat/postgres

This commit is contained in:
Robert Sparks 2023-02-28 16:25:46 -06:00
commit 82f23da2b3
No known key found for this signature in database
GPG key ID: 6E2A6A5775F91318
5 changed files with 37 additions and 116 deletions

View file

@ -8,6 +8,7 @@ for sub in \
test/media \
test/wiki/ietf \
data/nomcom_keys/public_keys \
/assets/archive/id \
/assets/ietf-ftp \
/assets/ietf-ftp/bofreq \
/assets/ietf-ftp/charter \

View file

@ -315,7 +315,34 @@ class MeetingTests(BaseMeetingTestCase):
self.assertContains(r, session.group.parent.acronym.upper())
self.assertContains(r, slot.location.name)
self.assertContains(r, registration_text)
start_time = slot.time.astimezone(meeting.tz())
end_time = slot.end_time().astimezone(meeting.tz())
self.assertContains(r, '"{}","{}","{}"'.format(
start_time.strftime("%Y-%m-%d"),
start_time.strftime("%H%M"),
end_time.strftime("%H%M"),
))
self.assertContains(r, session.materials.get(type='agenda').uploaded_filename)
self.assertContains(r, session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
self.assertNotContains(r, session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
# CSV, utc
r = self.client.get(urlreverse(
"ietf.meeting.views.agenda_plain",
kwargs=dict(num=meeting.number, ext=".csv", utc="-utc"),
))
self.assertContains(r, session.group.acronym)
self.assertContains(r, session.group.name)
self.assertContains(r, session.group.parent.acronym.upper())
self.assertContains(r, slot.location.name)
self.assertContains(r, registration_text)
start_time = slot.time.astimezone(datetime.timezone.utc)
end_time = slot.end_time().astimezone(datetime.timezone.utc)
self.assertContains(r, '"{}","{}","{}"'.format(
start_time.strftime("%Y-%m-%d"),
start_time.strftime("%H%M"),
end_time.strftime("%H%M"),
))
self.assertContains(r, session.materials.get(type='agenda').uploaded_filename)
self.assertContains(r, session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
self.assertNotContains(r, session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().uploaded_filename)
@ -5805,35 +5832,6 @@ class InterimTests(TestCase):
self.assertContains(r, 'END:VEVENT')
class AjaxTests(TestCase):
def test_ajax_get_utc(self):
# test bad queries
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=badtime&timezone=UTC"
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertEqual(data["error"], True)
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=25:99&timezone=UTC"
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertEqual(data["error"], True)
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=10:00am&timezone=UTC"
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertEqual(data["error"], True)
# test good query
url = urlreverse('ietf.meeting.views.ajax_get_utc') + "?date=2016-1-1&time=12:00&timezone=America/Los_Angeles"
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertIn('timezone', data)
self.assertIn('time', data)
self.assertIn('utc', data)
self.assertNotIn('error', data)
self.assertEqual(data['utc'], '20:00')
class IphoneAppJsonTests(TestCase):
def test_iphone_app_json_interim(self):
make_interim_test_data()

View file

@ -69,8 +69,7 @@ type_interim_patterns = [
type_ietf_only_patterns_id_optional = [
url(r'^agenda(?P<utc>-utc)?(?P<ext>\.html)?/?$', views.agenda, name='agenda'),
url(r'^agenda(?P<utc>-utc)?(?P<ext>\.txt)$', views.agenda_plain),
url(r'^agenda(?P<ext>\.csv)$', views.agenda_plain),
url(r'^agenda(?P<utc>-utc)?(?P<ext>\.txt|\.csv)$', views.agenda_plain),
url(r'^agenda/edit$',
RedirectView.as_view(pattern_name='ietf.meeting.views.edit_meeting_schedule', permanent=True),
name='ietf.meeting.views.edit_meeting_schedule'),
@ -113,7 +112,6 @@ type_ietf_only_patterns_id_optional = [
urlpatterns = [
# First patterns which start with unique strings
url(r'^$', views.current_materials),
url(r'^ajax/get-utc/?$', views.ajax_get_utc),
url(r'^interim/announce/?$', views.interim_announce),
url(r'^interim/announce/(?P<number>[A-Za-z0-9._+-]+)/?$', views.interim_send_announcement),
url(r'^interim/skip_announce/(?P<number>[A-Za-z0-9._+-]+)/?$', views.interim_skip_announcement),

View file

@ -1550,7 +1550,7 @@ def agenda_plain(request, num=None, name=None, base=None, ext=None, owner=None,
person = get_person_by_email(owner)
schedule = get_schedule_by_name(meeting, person, name)
if schedule == None:
if schedule is None:
base = base.replace("-utc", "")
return render(request, "meeting/no-"+base+ext, {'meeting':meeting }, content_type=mimetype[ext])
@ -1565,7 +1565,7 @@ def agenda_plain(request, num=None, name=None, base=None, ext=None, owner=None,
# Done processing for CSV output
if ext == ".csv":
return agenda_csv(schedule, filtered_assignments)
return agenda_csv(schedule, filtered_assignments, utc=utc is not None)
filter_organizer = AgendaFilterOrganizer(assignments=filtered_assignments)
@ -1804,7 +1804,7 @@ def agenda_extract_slide (item):
"ext": item.file_extension()
}
def agenda_csv(schedule, filtered_assignments):
def agenda_csv(schedule, filtered_assignments, utc=False):
encoding = 'utf-8'
response = HttpResponse(content_type=f"text/csv; charset={encoding}")
writer = csv.writer(response, delimiter=str(','), quoting=csv.QUOTE_ALL)
@ -1830,11 +1830,12 @@ def agenda_csv(schedule, filtered_assignments):
write_row(headings)
tz = datetime.timezone.utc if utc else schedule.meeting.tz()
for item in filtered_assignments:
row = []
row.append(item.timeslot.time.strftime("%Y-%m-%d"))
row.append(item.timeslot.time.strftime("%H%M"))
row.append(item.timeslot.end_time().strftime("%H%M"))
row.append(item.timeslot.time.astimezone(tz).strftime("%Y-%m-%d"))
row.append(item.timeslot.time.astimezone(tz).strftime("%H%M"))
row.append(item.timeslot.end_time().astimezone(tz).strftime("%H%M"))
if item.slot_type().slug == "break":
row.append(item.slot_type().name)
@ -3029,43 +3030,6 @@ def delete_schedule(request, num, owner, name):
# -------------------------------------------------
# Interim Views
# -------------------------------------------------
def ajax_get_utc(request):
'''Ajax view that takes arguments time, timezone, date and returns UTC data'''
time = request.GET.get('time')
timezone = request.GET.get('timezone')
date = request.GET.get('date')
time_re = re.compile(r'^\d{2}:\d{2}$')
# validate input
if not time_re.match(time) or not date:
return HttpResponse(json.dumps({'error': True}),
content_type='application/json')
hour, minute = time.split(':')
if not (int(hour) <= 23 and int(minute) <= 59):
return HttpResponse(json.dumps({'error': True}),
content_type='application/json')
year, month, day = date.split('-')
dt = datetime.datetime(int(year), int(month), int(day), int(hour), int(minute))
tz = pytz.timezone(timezone)
aware_dt = tz.localize(dt, is_dst=None)
utc_dt = aware_dt.astimezone(pytz.utc)
utc = utc_dt.strftime('%H:%M')
# calculate utc day offset
naive_utc_dt = utc_dt.replace(tzinfo=None)
utc_day_offset = (naive_utc_dt.date() - dt.date()).days
html = "<span>{utc} UTC</span>".format(utc=utc)
if utc_day_offset != 0:
html = html + '<span class="day-offset"> {0:+d} Day</span>'.format(utc_day_offset)
context_data = {'timezone': timezone,
'time': time,
'utc': utc,
'utc_day_offset': utc_day_offset,
'html': html}
return HttpResponse(json.dumps(context_data),
content_type='application/json')
def interim_announce(request):
'''View which shows interim meeting requests awaiting announcement'''
meetings = data_for_meetings_overview(Meeting.objects.filter(type='interim').order_by('date'), interim_status='scheda')

View file

@ -18,17 +18,14 @@ const interimRequest = (function() {
.on("blur", interimRequest.calculateEndTime);
const timeInput = $('input[name$="-time"]');
timeInput.on("blur", interimRequest.calculateEndTime);
timeInput.on("blur", interimRequest.updateInfo);
$('input[name$="-end_time"]')
.prop('disabled', true)
.on("change", interimRequest.updateInfo);
.prop('disabled', true);
interimRequest.timezone.on("change", interimRequest.timezoneChange);
// init
interimRequest.inPerson.each(interimRequest.toggleLocation);
interimRequest.checkAddButton();
interimRequest.initTimezone();
timeInput.each(interimRequest.calculateEndTime);
timeInput.each(interimRequest.updateInfo);
const remoteParticipations = $('select[id$="-remote_participation"]');
remoteParticipations.on(
'change',
@ -91,43 +88,6 @@ const interimRequest = (function() {
.removeClass("d-none");
},
updateInfo: function () {
// makes ajax call to server and sets UTC field
const time = $(this)
.val();
if (!time) {
return;
}
const url = "/meeting/ajax/get-utc";
const fieldset = $(this)
.parents(".fieldset");
const date = fieldset.find("input[name$='-date']")
.val();
const timezone = interimRequest.timezone.val();
const name = $(this)
.attr("id") + "_utc";
const utc = fieldset.find("#" + name);
//console.log(name,utc.attr("id"));
$.ajax({
url: url,
type: 'GET',
cache: false,
async: true,
dataType: 'json',
data: {
date: date,
time: time,
timezone: timezone
},
success: function (response) {
if (!response.error && response.html) {
utc.html(response.html);
}
}
});
return false;
},
calculateEndTime: function () {
// gets called when either start_time or duration change
const fieldset = $(this)