From d921161847d71503f55fe25068521f1ee6fa3522 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Mon, 29 Jan 2024 09:50:55 +0100 Subject: [PATCH] Remove jquery, selectize and bootstrap js from conference frontend This was used for the call for papers form handling of multiple speakers at this point, and caused issues with skins that didn't realize this and thus didn't include them. Replace it with a native js version, which instead of doing autocomplete just adds a button for "Add speaker" to add secondary speakers. This shows a browser popup asking for the email address of an existing profile. In practice I think this actually makes it more clear to the user what's going on than the previous autocomplete version, just not as pretty. It was also used for tags, which being a much shorter list, could just be replaced with a set of checkboxes. Tags was also something most conferences didn't use, and it only showed up if explicitly enabled on the conference (non-default). --- postgresqleu/confreg/forms.py | 10 +- postgresqleu/confreg/templatetags/dictutil.py | 2 +- postgresqleu/confreg/views.py | 36 +------ postgresqleu/urls.py | 1 - .../forms/widgets/speaker_select.html | 9 ++ postgresqleu/util/widgets.py | 9 ++ template.jinja/base.html | 3 - template.jinja/confreg/callforpapersform.html | 100 +++++++++++------- 8 files changed, 90 insertions(+), 80 deletions(-) create mode 100644 postgresqleu/util/templates/forms/widgets/speaker_select.html diff --git a/postgresqleu/confreg/forms.py b/postgresqleu/confreg/forms.py index 6952b859..cec0d7af 100644 --- a/postgresqleu/confreg/forms.py +++ b/postgresqleu/confreg/forms.py @@ -6,6 +6,7 @@ from django.contrib.auth.models import User from django.utils.safestring import mark_safe from django.utils.html import escape from django.utils import timezone +import django.db.models from postgresqleu.confsponsor.models import ScannedAttendee from .models import Conference @@ -19,6 +20,7 @@ from .regtypes import validate_special_reg_type from .twitter import get_all_conference_social_media from postgresqleu.util.fields import UserModelChoiceField from postgresqleu.util.widgets import EmailTextWidget, MonospaceTextarea +from postgresqleu.util.widgets import CallForPapersSpeakersWidget from postgresqleu.util.db import exec_to_list from postgresqleu.util.magic import magicdb from postgresqleu.util.backendlookups import GeneralAccountLookup @@ -534,15 +536,17 @@ class CallForPapersForm(forms.ModelForm): if 'data' in kwargs and 'speaker' in kwargs['data']: vals.extend([int(x) for x in kwargs['data'].getlist('speaker')]) - self.fields['speaker'].queryset = Speaker.objects.defer('photo', 'photo512').filter(pk__in=vals) - self.fields['speaker'].label_from_instance = lambda x: "{0} <{1}>".format(x.fullname, x.email) + self.fields['speaker'].widget = CallForPapersSpeakersWidget() + self.fields['speaker'].queryset = Speaker.objects.defer('photo', 'photo512').filter(pk__in=vals).annotate( + iscurrent=django.db.models.Case(django.db.models.When(pk=currentspeaker.pk, then=True), output_field=django.db.models.BooleanField()) + ).order_by('iscurrent', 'fullname') self.fields['speaker'].required = True - self.fields['speaker'].help_text = "Type the beginning of a speakers email address to add more speakers" if not self.instance.conference.skill_levels: del self.fields['skill_level'] if self.instance.conference.callforpaperstags: + self.fields['tags'].widget = forms.CheckboxSelectMultiple() self.fields['tags'].queryset = ConferenceSessionTag.objects.filter(conference=self.instance.conference) self.fields['tags'].label_from_instance = lambda x: x.tag self.fields['tags'].required = False diff --git a/postgresqleu/confreg/templatetags/dictutil.py b/postgresqleu/confreg/templatetags/dictutil.py index 4360c096..9f3e5c7d 100644 --- a/postgresqleu/confreg/templatetags/dictutil.py +++ b/postgresqleu/confreg/templatetags/dictutil.py @@ -17,4 +17,4 @@ def arrayelement(value, key): def join_dictkeys(list_to_join, attrname, separator=', '): if not list_to_join: return '' - return separator.join(item[attrname] for item in list_to_join) + return separator.join(str(item[attrname]) for item in list_to_join) diff --git a/postgresqleu/confreg/views.py b/postgresqleu/confreg/views.py index 452859b8..10cc69bb 100644 --- a/postgresqleu/confreg/views.py +++ b/postgresqleu/confreg/views.py @@ -1742,7 +1742,7 @@ def callforpapers(request, confname): try: speaker = Speaker.objects.get(user=request.user) - sessions = ConferenceSession.objects.filter(conference=conference, speaker=speaker).order_by('title') + sessions = ConferenceSession.objects.filter(conference=conference, speaker=speaker).order_by('status', 'title') other_submissions = ConferenceSession.objects.filter(speaker=speaker).exclude(conference=conference).exists() except Speaker.DoesNotExist: other_submissions = False @@ -1916,39 +1916,13 @@ def public_speaker_lookup(request, confname): raise Http404("No query") conference = get_conference_or_404(confname) - speaker = get_object_or_404(Speaker, user=request.user) - - # This is a lookup for speakers that's public. To avoid harvesting, we allow - # only *prefix* matching of email addresses, and you have to type at least 6 characters - # before you get anything. - prefix = request.GET['query'].lower() - if len(prefix) > 5: - vals = [{ - 'id': s.id, - 'value': "{0} <{1}>".format(s.fullname, s.email), - } for s in Speaker.objects.filter(user__email__startswith=prefix).exclude(fullname='')] - else: - vals = [] - return HttpResponse(json.dumps({ - 'values': vals, - }), content_type='application/json') - - -@login_required -def public_tags_lookup(request, confname): if 'query' not in request.GET: - raise Http404("No query") - - conference = get_conference_or_404(confname) - speaker = get_object_or_404(Speaker, user=request.user) + raise Http404("Query missing") + speaker = get_object_or_404(Speaker, user__email=request.GET.get('query', '').lower()) - prefix = request.GET['query'] - vals = [{ - 'id': t.id, - 'value': t.tag, - } for t in ConferenceSessionTag.objects.filter(conference=conference)] return HttpResponse(json.dumps({ - 'values': vals, + 'id': speaker.id, + 'name': speaker.fullname, }), content_type='application/json') diff --git a/postgresqleu/urls.py b/postgresqleu/urls.py index c8ea0acc..0d30f2a1 100644 --- a/postgresqleu/urls.py +++ b/postgresqleu/urls.py @@ -142,7 +142,6 @@ urlpatterns.extend([ url(r'^events/([^/]+)/callforpapers/(\d+)/delslides/(\d+)/$', postgresqleu.confreg.views.callforpapers_delslides), url(r'^events/([^/]+)/callforpapers/(\d+)/speakerconfirm/$', postgresqleu.confreg.views.callforpapers_confirm), url(r'^events/([^/]+)/callforpapers/lookups/speakers/$', postgresqleu.confreg.views.public_speaker_lookup), - url(r'^events/([^/]+)/callforpapers/lookups/tags/$', postgresqleu.confreg.views.public_tags_lookup), url(r'^events/callforpapers/$', postgresqleu.confreg.views.callforpaperslist), url(r'^events/([^/]+)/register/confirm/$', postgresqleu.confreg.views.confirmreg), url(r'^events/([^/]+)/register/policy/$', postgresqleu.confreg.views.regconfirmpolicy), diff --git a/postgresqleu/util/templates/forms/widgets/speaker_select.html b/postgresqleu/util/templates/forms/widgets/speaker_select.html new file mode 100644 index 00000000..94a51041 --- /dev/null +++ b/postgresqleu/util/templates/forms/widgets/speaker_select.html @@ -0,0 +1,9 @@ + + + diff --git a/postgresqleu/util/widgets.py b/postgresqleu/util/widgets.py index 146cd458..8a330204 100644 --- a/postgresqleu/util/widgets.py +++ b/postgresqleu/util/widgets.py @@ -168,3 +168,12 @@ class SelectSetValueWidget(forms.Select): context = super().get_context(name, value, attrs) context['setmap'] = self.setvalues return context + + +class CallForPapersSpeakersWidget(forms.SelectMultiple): + template_name = 'forms/widgets/speaker_select.html' + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context['widget']['options'] = list(self.options(name, context['widget']['value'], attrs)) + return context diff --git a/template.jinja/base.html b/template.jinja/base.html index 394580ee..06d6b918 100644 --- a/template.jinja/base.html +++ b/template.jinja/base.html @@ -43,9 +43,6 @@ - - {{ asset("js", "jquery3") }} - {{ asset("js", "bootstrap4") }} {%block pagescript%}{%endblock%} diff --git a/template.jinja/confreg/callforpapersform.html b/template.jinja/confreg/callforpapersform.html index c47cef1a..41fe0d6b 100644 --- a/template.jinja/confreg/callforpapersform.html +++ b/template.jinja/confreg/callforpapersform.html @@ -1,44 +1,67 @@ {%extends "base.html" %} {%block title%}Call for Papers - {{conference}}{%endblock%} {%block pagescript%} -{{asset("css", "selectize")}} -{{asset("js", "selectize")}} - - {%endblock%} @@ -47,11 +70,6 @@ $(function() { tr.err { background-color: #ffb6b6; } - -/* Hide the speaker field for non-javascript sessions */ -tr#tr_speaker { - display:none; -} {%endblock%} -- 2.39.5