diff --git a/Makefile b/Makefile index 5c5b10e..e13c5cd 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ all: cleanup migrate testserver venv: $(VENV_PATH)/bin/activate $(VENV_PATH)/bin/activate: - @test -d $(VENV_PATH) || python3 -m venv --clear $(VENV_PATH) + @test -d $(VENV_PATH) || python3 -m venv --clear --system-site-packages $(VENV_PATH) dev-requirements: venv ${DEV_REQUIREMENTS} ${PYTHON} -m pip install -qU pip diff --git a/requirements/base.txt b/requirements/base.txt index 0295012..b84f395 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ beautifulsoup4 -django < 3.0 +django < 4.0 django-appconf django-ckeditor django-contrib-comments @@ -13,7 +13,7 @@ icalendar openpyxl markdown pillow -psycopg2-binary +# psycopg2-binary<2.9 PyJWT pytz requests diff --git a/src/content/feeds.py b/src/content/feeds.py index 1323c5a..87a884d 100644 --- a/src/content/feeds.py +++ b/src/content/feeds.py @@ -3,7 +3,7 @@ import django_comments as comments from django.conf import settings from django.contrib.syndication.views import Feed from django.utils.feedgenerator import Rss201rev2Feed -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from content.models import Article diff --git a/src/content/forms.py b/src/content/forms.py index f2b3883..764b1d0 100644 --- a/src/content/forms.py +++ b/src/content/forms.py @@ -5,7 +5,7 @@ Created on 04.10.2011 """ from django import forms from django.template.defaultfilters import slugify -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from . import models diff --git a/src/content/models.py b/src/content/models.py index 3dec6e1..f6b9eb1 100644 --- a/src/content/models.py +++ b/src/content/models.py @@ -8,7 +8,7 @@ from django.template.defaultfilters import slugify from django.urls import reverse from django.utils import timezone from django.utils.safestring import mark_safe -from django.utils.translation import get_language, ugettext as _ +from django.utils.translation import get_language, gettext as _ from utils import STATUS_CHOICES, STATUS_WAITING, STATUS_PUBLISHED, CLEANER diff --git a/src/content/views.py b/src/content/views.py index 4d118e5..01ac00f 100644 --- a/src/content/views.py +++ b/src/content/views.py @@ -5,7 +5,7 @@ from csp.decorators import csp_update from django.conf import settings from django.contrib.auth.mixins import PermissionRequiredMixin from django.http import HttpResponse, Http404 -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from . import models, forms diff --git a/src/events/forms.py b/src/events/forms.py index a28cb01..c46e9cc 100644 --- a/src/events/forms.py +++ b/src/events/forms.py @@ -1,27 +1,42 @@ """Django Forms to administrate the event content on the frontend.""" from django import forms from django.contrib.auth import get_user_model -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from . import models +class ClearableMultipleFileInput(forms.widgets.ClearableFileInput): + allow_multiple_selected = True + accept = "image/jpg" + + +class MultipleFileField(forms.FileField): + def __init__(self, *args, **kwargs): + kwargs.setdefault("widget", ClearableMultipleFileInput()) + super().__init__(*args, **kwargs) + + def clean(self, data, initial=None): + single_file_clean = super().clean + if isinstance(data, (list, tuple)): + result = [single_file_clean(d, initial) for d in data] + else: + result = single_file_clean(data, initial) + return result + + class PhotoUploadForm(forms.Form): - """Form to upload multiple photos to a single event.""" + """Form to upload multiple photos to a single event. + TODO: Check multiple upload + """ error_css_class = 'error' required_css_class = 'required' photographer = forms.ModelChoiceField(get_user_model().objects.all(), required=True, ) event = forms.ModelChoiceField(models.Event.objects.all(), required=True, ) - upload = forms.FileField( + upload = MultipleFileField( label=_('Images'), required=True, - widget=forms.widgets.ClearableFileInput( - attrs={ - 'multiple': 'multiple', - 'accept': "image/gif,image/png,image/jpeg" - } - ) ) diff --git a/src/events/mixins.py b/src/events/mixins.py index 8a1f838..be2d124 100644 --- a/src/events/mixins.py +++ b/src/events/mixins.py @@ -2,7 +2,7 @@ from django.db.models import Q from django.http import Http404 from django.shortcuts import get_object_or_404 -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from . import models diff --git a/src/events/models.py b/src/events/models.py index 8e78596..c7e691c 100644 --- a/src/events/models.py +++ b/src/events/models.py @@ -9,7 +9,7 @@ from django.db.models import Q from django.template.defaultfilters import slugify from django.urls import reverse from django.utils.timezone import now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from easy_thumbnails.fields import ThumbnailerImageField from utils import COUNTRIES, OverwriteStorage diff --git a/src/events/views.py b/src/events/views.py index 062d3d0..d9cfbcf 100644 --- a/src/events/views.py +++ b/src/events/views.py @@ -9,7 +9,7 @@ from django.http import Http404 from django.http import HttpResponse from django.shortcuts import redirect, get_object_or_404 from django.utils import timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from extra_views import InlineFormSetView from icalendar import Calendar, Event diff --git a/src/mahjong_ranking/admin.py b/src/mahjong_ranking/admin.py index 1deb307..45035a5 100644 --- a/src/mahjong_ranking/admin.py +++ b/src/mahjong_ranking/admin.py @@ -1,7 +1,7 @@ """ Adds management of the mahong ranking system to the admin interface. """ from django.contrib import admin -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from . import models, set_dirty diff --git a/src/mahjong_ranking/forms.py b/src/mahjong_ranking/forms.py index 4cca680..ab2c243 100644 --- a/src/mahjong_ranking/forms.py +++ b/src/mahjong_ranking/forms.py @@ -7,7 +7,7 @@ Created on 04.10.2011 """ from django import forms from django.contrib.auth import get_user_model -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from events.models import Event from . import models diff --git a/src/mahjong_ranking/models.py b/src/mahjong_ranking/models.py index 47fa9c9..e3260b1 100644 --- a/src/mahjong_ranking/models.py +++ b/src/mahjong_ranking/models.py @@ -12,7 +12,7 @@ from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils import timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from events.models import Event from . import DAN_RANKS_DICT, LOGGER, set_dirty diff --git a/src/mahjong_ranking/views.py b/src/mahjong_ranking/views.py index 14f92c9..073036b 100644 --- a/src/mahjong_ranking/views.py +++ b/src/mahjong_ranking/views.py @@ -8,7 +8,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin, \ PermissionRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from events.mixins import EventDetailMixin diff --git a/src/maistar_ranking/admin.py b/src/maistar_ranking/admin.py index e68e0f0..0ce6869 100644 --- a/src/maistar_ranking/admin.py +++ b/src/maistar_ranking/admin.py @@ -1,6 +1,6 @@ """ Admin Interface to manipulate the maistar ranking """ from django.contrib import admin -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from . import forms, models diff --git a/src/maistar_ranking/forms.py b/src/maistar_ranking/forms.py index 02c4c95..5fc71fa 100644 --- a/src/maistar_ranking/forms.py +++ b/src/maistar_ranking/forms.py @@ -1,7 +1,7 @@ """Django Forms to add and edit Mai-Star games.""" from django import forms -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from . import models diff --git a/src/maistar_ranking/models.py b/src/maistar_ranking/models.py index 60cbbd8..5b5a87f 100644 --- a/src/maistar_ranking/models.py +++ b/src/maistar_ranking/models.py @@ -6,7 +6,7 @@ from django.db import models from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from events.models import Event from . import settings, managers diff --git a/src/membership/admin.py b/src/membership/admin.py index 3137735..e8a3b9d 100644 --- a/src/membership/admin.py +++ b/src/membership/admin.py @@ -4,7 +4,7 @@ from django.contrib import admin, messages from django.contrib.auth.admin import UserAdmin, GroupAdmin from django.contrib.auth.models import Group from django.core.exceptions import PermissionDenied -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from easy_thumbnails import fields, widgets from membership.models import Membership, ActivationRequest diff --git a/src/membership/forms.py b/src/membership/forms.py index fec4a2e..dcedca3 100644 --- a/src/membership/forms.py +++ b/src/membership/forms.py @@ -9,7 +9,7 @@ from django import forms from django.conf import settings from django.contrib import auth from django.contrib.sites.models import Site -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from utils.massmailer import MassMailer from . import models from content.models import Page diff --git a/src/membership/models.py b/src/membership/models.py index e0f9762..3d3fc98 100644 --- a/src/membership/models.py +++ b/src/membership/models.py @@ -10,7 +10,7 @@ from django.contrib.auth.models import AbstractUser from django.db import models from django.urls import reverse from django.utils import timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from easy_thumbnails.fields import ThumbnailerImageField from utils import OverwriteStorage diff --git a/src/membership/views.py b/src/membership/views.py index 09db9b8..2590cf1 100644 --- a/src/membership/views.py +++ b/src/membership/views.py @@ -10,7 +10,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse from django.http import Http404 from django.utils.decorators import method_decorator -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from mahjong_ranking.models import KyuDanRanking, SeasonRanking diff --git a/src/utils/__init__.py b/src/utils/__init__.py index fb5dc5e..8e3c464 100644 --- a/src/utils/__init__.py +++ b/src/utils/__init__.py @@ -4,7 +4,7 @@ Created on 28.09.2011 @author: christian """ from django.core.files.storage import FileSystemStorage -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from .countries import COUNTRIES from .html_cleaner import HtmlCleaner diff --git a/src/utils/countries.py b/src/utils/countries.py index d00667c..b5c4b79 100644 --- a/src/utils/countries.py +++ b/src/utils/countries.py @@ -1,5 +1,5 @@ """A list of all approved countries on planet earth, i18n enabled.""" -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ COUNTRIES = ( ('GB', _('United Kingdom')),