From ef07664dee220ab249d38c5c0bbbb50c23fbddd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Sun, 9 Aug 2020 16:10:28 +0200 Subject: [PATCH] Maintenance update * Upgrade to django 3.1 * Upgrade dependencies * Remove django-bower * Add favicon * Fix bugs from unit tests --- .gitmodules | 6 +- accounts/urls.py | 2 +- cfp/decorators.py | 4 +- cfp/migrations/0027_auto_20200809_1530.py | 28 +++++++ cfp/models.py | 8 +- cfp/templates/cfp/admin/homepage.html | 2 +- cfp/urls.py | 4 +- cfp/views.py | 4 +- components | 1 - node_modules | 1 + package.json | 26 ++++++ ponyconf/context_processors.py | 8 -- ponyconf/settings.py | 74 ++---------------- .../{js => ponyconf}/markdown-preview.js | 0 .../static/{css => ponyconf}/ponyconf.css | 0 ponyconf/static/{js => ponyconf}/ponyconf.js | 0 ponyconf/static/ponyconf/ponyconf.png | Bin 0 -> 30201 bytes ponyconf/templates/_base.html | 6 +- requirements.in | 5 +- requirements.txt | 39 ++++----- 20 files changed, 99 insertions(+), 119 deletions(-) create mode 100644 cfp/migrations/0027_auto_20200809_1530.py delete mode 160000 components create mode 160000 node_modules create mode 100644 package.json delete mode 100644 ponyconf/context_processors.py rename ponyconf/static/{js => ponyconf}/markdown-preview.js (100%) rename ponyconf/static/{css => ponyconf}/ponyconf.css (100%) rename ponyconf/static/{js => ponyconf}/ponyconf.js (100%) create mode 100644 ponyconf/static/ponyconf/ponyconf.png diff --git a/.gitmodules b/.gitmodules index 3922ef2..d578b97 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "components"] - path = components - url = git://github.com/toulibre/ponyconf-components +[submodule "node_modules"] + path = node_modules + url = ./node_modules diff --git a/accounts/urls.py b/accounts/urls.py index 750b1dc..2e14185 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -7,6 +7,6 @@ from . import views urlpatterns = [ path('profile/', views.profile, name='profile'), path('accounts/login/', views.EmailLoginView.as_view(), {'extra_context': {'buttons': [views.RESET_PASSWORD_BUTTON]}}, name='login'), - path('logout/', auth_views.logout, {'next_page': settings.LOGOUT_REDIRECT_URL}, name='logout'), + path('logout/', auth_views.LogoutView.as_view(), {'next_page': settings.LOGOUT_REDIRECT_URL}, name='logout'), path('', include('django.contrib.auth.urls')), ] diff --git a/cfp/decorators.py b/cfp/decorators.py index 312814f..92d635e 100644 --- a/cfp/decorators.py +++ b/cfp/decorators.py @@ -12,7 +12,7 @@ from cfp.models import Participant, Volunteer def speaker_required(view_func): def wrapped_view(request, **kwargs): - speaker_token = kwargs.pop('speaker_token') + speaker_token = kwargs.pop('speaker_token', None) if speaker_token: try: speaker_token = UUID(speaker_token) @@ -30,7 +30,7 @@ def speaker_required(view_func): def volunteer_required(view_func): def wrapped_view(request, **kwargs): - volunteer_token = kwargs.pop('volunteer_token') + volunteer_token = kwargs.pop('volunteer_token', None) if volunteer_token: try: volunteer_token = UUID(volunteer_token) diff --git a/cfp/migrations/0027_auto_20200809_1530.py b/cfp/migrations/0027_auto_20200809_1530.py new file mode 100644 index 0000000..fd744bb --- /dev/null +++ b/cfp/migrations/0027_auto_20200809_1530.py @@ -0,0 +1,28 @@ +# Generated by Django 3.1 on 2020-08-09 13:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cfp', '0026_conference_end_date'), + ] + + operations = [ + migrations.AlterField( + model_name='talk', + name='accepted', + field=models.BooleanField(default=None, null=True), + ), + migrations.AlterField( + model_name='talk', + name='confirmed', + field=models.BooleanField(default=None, null=True), + ), + migrations.AlterField( + model_name='talk', + name='video_licence', + field=models.CharField(choices=[('CC-Zero CC-BY', 'CC-Zero CC-BY'), ('CC-BY-SA', 'CC-BY-SA'), ('CC-BY-ND', 'CC-BY-ND'), ('CC-BY-NC', 'CC-BY-NC'), ('CC-BY-NC-SA', 'CC-BY-NC-SA'), ('CC-BY-NC-ND', 'CC-BY-NC-ND')], default='CC-BY-SA', max_length=32, verbose_name='Video licence'), + ), + ] diff --git a/cfp/models.py b/cfp/models.py index 3a18b7f..d233574 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -167,8 +167,6 @@ class Track(PonyConfModel): slug = AutoSlugField(populate_from='name') description = models.TextField(blank=True, verbose_name=_('Description')) - #managers = models.ManyToManyField(User, blank=True, verbose_name=_('Managers')) - class Meta: unique_together = ('site', 'name') ordering = ['name'] @@ -347,10 +345,10 @@ class Talk(PonyConfModel): category = models.ForeignKey(TalkCategory, verbose_name=_('Talk Category'), on_delete=models.PROTECT) videotaped = models.BooleanField(_("I'm ok to be recorded on video"), default=True) video_licence = models.CharField(choices=LICENCES, default='CC-BY-SA', - max_length=10, verbose_name=_("Video licence")) + max_length=32, verbose_name=_("Video licence")) sound = models.BooleanField(_("I need sound"), default=False) - accepted = models.NullBooleanField(default=None) - confirmed = models.NullBooleanField(default=None) + accepted = models.BooleanField(null=True, default=None) + confirmed = models.BooleanField(null=True, default=None) start_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Beginning date and time')) duration = models.PositiveIntegerField(default=0, verbose_name=_('Duration (min)')) room = models.ForeignKey(Room, blank=True, null=True, default=None, on_delete=models.SET_NULL) diff --git a/cfp/templates/cfp/admin/homepage.html b/cfp/templates/cfp/admin/homepage.html index ecbc882..248b14e 100644 --- a/cfp/templates/cfp/admin/homepage.html +++ b/cfp/templates/cfp/admin/homepage.html @@ -45,7 +45,7 @@ var markdown_preview_url = "{% url 'markdown-preview' %}"; - + {% endblock %} {% block css %} diff --git a/cfp/urls.py b/cfp/urls.py index 5a89e06..64ff36e 100644 --- a/cfp/urls.py +++ b/cfp/urls.py @@ -1,4 +1,4 @@ -from django.urls import path, re_path, register_converter +from django.urls import path, re_path, register_converter, include from . import views, converters @@ -60,7 +60,7 @@ urlpatterns = [ path('staff/volunteers/email/preview/', views.volunteer_email_preview, name='volunteer-email-preview'), path('staff/add-user/', views.create_user, name='create-user'), re_path(r'^staff/schedule/((?P[\w]+)/)?$', views.staff_schedule, name='staff-schedule'), - path('staff/select2/', views.Select2View.as_view(), name='django_select2-json'), + path('staff/select2/', include('django_select2.urls')), path('admin/', views.admin, name='admin'), path('admin/conference/', views.conference_edit, name='conference-edit'), path('admin/homepage/', views.homepage_edit, name='homepage-edit'), diff --git a/cfp/views.py b/cfp/views.py index f227080..cb78971 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -1299,7 +1299,7 @@ def schedule(request, program_format, pending, template, staff, cache=None): raise Http404(_("Format '%s' not available" % program_format)) -def public_schedule(request, program_format): +def public_schedule(request, program_format=None): if not request.conference.schedule_available and not is_staff(request, request.user): raise PermissionDenied if request.conference.schedule_redirection_url and program_format is None: @@ -1309,7 +1309,7 @@ def public_schedule(request, program_format): @staff_required -def staff_schedule(request, program_format): +def staff_schedule(request, program_format=None): return schedule(request, program_format=program_format, pending=True, template='cfp/staff/schedule.html', staff=True, cache=False) diff --git a/components b/components deleted file mode 160000 index fe849d7..0000000 --- a/components +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fe849d749c0b9d382f3134d8344ee72637432a7c diff --git a/node_modules b/node_modules new file mode 160000 index 0000000..9634617 --- /dev/null +++ b/node_modules @@ -0,0 +1 @@ +Subproject commit 9634617237843dfd0eae718b74c42666d28a38c0 diff --git a/package.json b/package.json new file mode 100644 index 0000000..97b8709 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "ponyconf", + "version": "1.0.0", + "description": "Organise your conferences", + "main": "index.js", + "directories": { + "doc": "doc" + }, + "dependencies": { + "jquery": "^3.5.1" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/PonyConf/PonyConf.git" + }, + "author": "Élie Bouttier and contributors", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/PonyConf/PonyConf/issues" + }, + "homepage": "https://github.com/PonyConf/PonyConf#readme" +} diff --git a/ponyconf/context_processors.py b/ponyconf/context_processors.py deleted file mode 100644 index 2f480be..0000000 --- a/ponyconf/context_processors.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.contrib.sites.shortcuts import get_current_site - - -def site(request): - - return { - 'site': get_current_site(request), - } diff --git a/ponyconf/settings.py b/ponyconf/settings.py index 8fd694c..505142e 100644 --- a/ponyconf/settings.py +++ b/ponyconf/settings.py @@ -1,13 +1,5 @@ """ Django settings for ponyconf project. - -Generated by 'django-admin startproject' using Django 1.9.6. - -For more information on this file, see -https://docs.djangoproject.com/en/1.9/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.9/ref/settings/ """ from django.utils.translation import ugettext_lazy as _ @@ -17,10 +9,6 @@ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ - # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'm2d03t^m)!nsborq5a1#e!#m)wjl&-%tu4ew@fxf1_b_t*@36r' @@ -33,7 +21,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ - # the post_migrate creating the first site should be call at first + # the post_migrate creating the first site should be called at first 'django.contrib.sites', # our apps @@ -41,11 +29,8 @@ INSTALLED_APPS = [ 'accounts', 'cfp', 'mailing', - #'planning', - #'volunteers', - # external apps - 'djangobower', + # third-party apps 'bootstrap3', 'django_select2', 'crispy_forms', @@ -152,71 +137,22 @@ LOCALE_PATHS = [ MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.9/howto/static-files/ - STATIC_URL = '/static/' -STATICFILES_FINDERS = [ - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'djangobower.finders.BowerFinder', +STATICFILES_DIRS = [ + ('jquery', os.path.join(BASE_DIR, 'node_modules/jquery/dist/')), ] -BOWER_COMPONENTS_ROOT = os.path.join(BASE_DIR, 'components') -BOWER_INSTALLED_APPS = ( - 'bootstrap', - 'jquery#2', - 'jquery-ui', - 'jquery-cookie', - 'select2', - 'eonasdan-bootstrap-datetimepicker', - 'moment', -) - LOGIN_REDIRECT_URL = 'home' SITE_ID = 1 -BOOTSTRAP3 = { - - # The URL to the jQuery JavaScript file - # If not set, "build-in" CDN is used (maxcdn) - # 'jquery_url': '//code.jquery.com/jquery.min.js', - 'jquery_url': STATIC_URL + 'jquery/dist/jquery.js', - - # The Bootstrap base URL - # If not set, "build-in" CDN is used (maxcdn) - # 'base_url': '//netdna.bootstrapcdn.com/bootstrap/3.2.0/', - 'base_url': STATIC_URL + 'bootstrap/dist/', - - # The complete URL to the Bootstrap CSS file - # (None means derive it from base_url) - 'css_url': None, - - # The complete URL to the Bootstrap CSS file - # (None means no theme) - 'theme_url': None, - - # The complete URL to the Bootstrap JavaScript file - # (None means derive it from base_url) - 'javascript_url': None, -} - -SELECT2_JS = 'select2/dist/js/select2.min.js' -SELECT2_CSS = 'select2/dist/css/select2.min.css' -SELECT2_I18N_PATH = 'select2/dist/js/i18n' - AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', 'ponyconf.backends.EmailBackend', ] LOGOUT_REDIRECT_URL = 'home' -CRISPY_TEMPLATE_PACK='bootstrap3' - -# django-registration -ACCOUNT_ACTIVATION_DAYS = 7 -INCLUDE_REGISTER_URL = True +CRISPY_TEMPLATE_PACK = 'bootstrap3' CACHES = { 'default': { diff --git a/ponyconf/static/js/markdown-preview.js b/ponyconf/static/ponyconf/markdown-preview.js similarity index 100% rename from ponyconf/static/js/markdown-preview.js rename to ponyconf/static/ponyconf/markdown-preview.js diff --git a/ponyconf/static/css/ponyconf.css b/ponyconf/static/ponyconf/ponyconf.css similarity index 100% rename from ponyconf/static/css/ponyconf.css rename to ponyconf/static/ponyconf/ponyconf.css diff --git a/ponyconf/static/js/ponyconf.js b/ponyconf/static/ponyconf/ponyconf.js similarity index 100% rename from ponyconf/static/js/ponyconf.js rename to ponyconf/static/ponyconf/ponyconf.js diff --git a/ponyconf/static/ponyconf/ponyconf.png b/ponyconf/static/ponyconf/ponyconf.png new file mode 100644 index 0000000000000000000000000000000000000000..796991339934eb6b7437090ea108b405aad489a4 GIT binary patch literal 30201 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 literal 0 HcmV?d00001 diff --git a/ponyconf/templates/_base.html b/ponyconf/templates/_base.html index bc80aaf..28cbdeb 100644 --- a/ponyconf/templates/_base.html +++ b/ponyconf/templates/_base.html @@ -6,12 +6,12 @@ - {% comment %}{% endcomment %} + {% block title %}{{ conference.name }}{% endblock %} {% bootstrap_css %} - + {% block css %}{% endblock %} {% block js %}{% endblock %} @@ -32,7 +32,7 @@ {% bootstrap_javascript %} - + {% block js_end %}{% endblock %} diff --git a/requirements.in b/requirements.in index b5f7fed..1e44517 100644 --- a/requirements.in +++ b/requirements.in @@ -1,9 +1,8 @@ -django<3 +django django-bootstrap3 -django-bower django-crispy-forms -django-select2<6 +django-select2 django-colorful django-autoslug diff --git a/requirements.txt b/requirements.txt index 696b5e8..c78917b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,25 +4,26 @@ # # pip-compile # -bleach==3.1.0 -chardet==3.0.4 -django-appconf==1.0.3 # via django-select2 -django-autoslug==1.9.6 -django-bootstrap3==11.1.0 -django-bower==5.2.0 -django-colorful==1.3 -django-crispy-forms==1.8.0 -django-select2==5.11.1 -django==2.2.8 -icalendar==4.0.3 -jinja2==2.10.3 -markdown==3.1.1 +asgiref==3.2.10 # via django +bleach==3.1.5 # via -r requirements.in +chardet==3.0.4 # via -r requirements.in +django-appconf==1.0.4 # via django-select2 +django-autoslug==1.9.8 # via -r requirements.in +django-bootstrap3==14.1.0 # via -r requirements.in +django-colorful==1.3 # via -r requirements.in +django-crispy-forms==1.9.2 # via -r requirements.in +django-select2==7.4.2 # via -r requirements.in +django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-select2 +icalendar==4.0.6 # via -r requirements.in +importlib-metadata==1.7.0 # via django-bootstrap3, markdown +jinja2==2.11.2 # via -r requirements.in +markdown==3.2.2 # via -r requirements.in markupsafe==1.1.1 # via jinja2 +packaging==20.4 # via bleach +pyparsing==2.4.7 # via packaging python-dateutil==2.8.1 # via icalendar -pytz==2019.3 # via django, icalendar -six==1.13.0 # via bleach, django-appconf, django-bower, python-dateutil -sqlparse==0.3.0 # via django +pytz==2020.1 # via django, icalendar +six==1.15.0 # via bleach, packaging, python-dateutil +sqlparse==0.3.1 # via django webencodings==0.5.1 # via bleach - -# The following packages are considered to be unsafe in a requirements file: -# setuptools +zipp==3.1.0 # via importlib-metadata