Merge remote-tracking branch 'ietf-tools/main' into feat/postgres
This commit is contained in:
commit
82f23da2b3
|
@ -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 \
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue