Merge branch 'datetime-hell2' into 'master'

core: create TzAwareDateTimeField to replace forms.DateTimeField

Follow up of !267. I read about Gitlab's slash and merge just after I did my own kind by resetting back to the original commit and creating one commit manually. Sublime merge helps but I still need more practice. :)

What was the right way to group every commit under one?

See merge request ae/Sith!270
This commit is contained in:
Skia 2021-09-29 13:53:12 +00:00
commit 007157e2e8
7 changed files with 54 additions and 86 deletions

View File

@ -34,6 +34,7 @@ from club.models import Mailing, MailingSubscription, Club, Membership
from core.models import User from core.models import User
from core.views.forms import SelectDate, SelectDateTime from core.views.forms import SelectDate, SelectDateTime
from counter.models import Counter from counter.models import Counter
from core.views.forms import TzAwareDateTimeField
class ClubEditForm(forms.ModelForm): class ClubEditForm(forms.ModelForm):
@ -158,18 +159,9 @@ class MailingForm(forms.Form):
class SellingsForm(forms.Form): class SellingsForm(forms.Form):
begin_date = forms.DateTimeField( begin_date = TzAwareDateTimeField(label=_("Begin date"), required=False)
input_formats=["%Y-%m-%d %H:%M:%S"], end_date = TzAwareDateTimeField(label=_("End date"), required=False)
label=_("Begin date"),
required=False,
widget=SelectDateTime,
)
end_date = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
required=False,
widget=SelectDateTime,
)
counters = forms.ModelMultipleChoiceField( counters = forms.ModelMultipleChoiceField(
Counter.objects.order_by("name").all(), label=_("Counter"), required=False Counter.objects.order_by("name").all(), label=_("Counter"), required=False
) )

View File

@ -36,8 +36,8 @@
<div class="name">{{ poster.name }}</div> <div class="name">{{ poster.name }}</div>
<div class="image"><img src="{{ poster.file.url }}"></img></div> <div class="image"><img src="{{ poster.file.url }}"></img></div>
<div class="dates"> <div class="dates">
<div class="begin">{{ poster.date_begin | date("d/M/Y H:m") }}</div> <div class="begin">{{ poster.date_begin | localtime | date("d/M/Y H:m") }}</div>
<div class="end">{{ poster.date_end | date("d/M/Y H:m") }}</div> <div class="end">{{ poster.date_end | localtime | date("d/M/Y H:m") }}</div>
</div> </div>
{% if app == "com" %} {% if app == "com" %}
<a class="edit" href="{{ url(app + ":poster_edit", poster.id) }}">{% trans %}Edit{% endtrans %}</a> <a class="edit" href="{{ url(app + ":poster_edit", poster.id) }}">{% trans %}Edit{% endtrans %}</a>

View File

@ -52,6 +52,7 @@ from core.views import (
from core.views.forms import SelectDateTime, MarkdownInput from core.views.forms import SelectDateTime, MarkdownInput
from core.models import Notification, RealGroup, User from core.models import Notification, RealGroup, User
from club.models import Club, Mailing from club.models import Club, Mailing
from core.views.forms import TzAwareDateTimeField
# Sith object # Sith object
@ -73,19 +74,12 @@ class PosterForm(forms.ModelForm):
] ]
widgets = {"screens": forms.CheckboxSelectMultiple} widgets = {"screens": forms.CheckboxSelectMultiple}
date_begin = forms.DateTimeField( date_begin = TzAwareDateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("Start date"), label=_("Start date"),
widget=SelectDateTime,
required=True, required=True,
initial=timezone.now().strftime("%Y-%m-%d %H:%M:%S"), initial=timezone.now().strftime("%Y-%m-%d %H:%M:%S"),
) )
date_end = forms.DateTimeField( date_end = TzAwareDateTimeField(label=_("End date"), required=False)
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
widget=SelectDateTime,
required=False,
)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user", None) self.user = kwargs.pop("user", None)
@ -199,24 +193,10 @@ class NewsForm(forms.ModelForm):
"content": MarkdownInput, "content": MarkdownInput,
} }
start_date = forms.DateTimeField( start_date = TzAwareDateTimeField(label=_("Start date"), required=False)
input_formats=["%Y-%m-%d %H:%M:%S"], end_date = TzAwareDateTimeField(label=_("End date"), required=False)
label=_("Start date"), until = TzAwareDateTimeField(label=_("Until"), required=False)
widget=SelectDateTime,
required=False,
)
end_date = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
widget=SelectDateTime,
required=False,
)
until = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("Until"),
widget=SelectDateTime,
required=False,
)
automoderation = forms.BooleanField(label=_("Automoderation"), required=False) automoderation = forms.BooleanField(label=_("Automoderation"), required=False)
def clean(self): def clean(self):

View File

@ -42,6 +42,10 @@ from django.utils.translation import ugettext
from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget
from ajax_select.fields import AutoCompleteSelectField from ajax_select.fields import AutoCompleteSelectField
from ajax_select import make_ajax_field from ajax_select import make_ajax_field
from django.utils.dateparse import parse_datetime
from django.utils import timezone
import datetime
from django.forms.utils import to_current_timezone
import re import re
@ -392,3 +396,26 @@ class GiftForm(forms.ModelForm):
id=user_id id=user_id
) )
self.fields["user"].widget = forms.HiddenInput() self.fields["user"].widget = forms.HiddenInput()
class TzAwareDateTimeField(forms.DateTimeField):
def __init__(
self, input_formats=["%Y-%m-%d %H:%M:%S"], widget=SelectDateTime, **kwargs
):
super().__init__(input_formats=input_formats, widget=widget, **kwargs)
def prepare_value(self, value):
# the db value is a datetime as a string in UTC
if isinstance(value, str):
# convert it into a naive datetime (no timezone attached)
value = parse_datetime(value)
# attach it to the UTC timezone (so that to_current_timezone()
# converts it to the local timezone)
value = timezone.make_aware(value, timezone.utc)
if isinstance(value, datetime.datetime):
value = to_current_timezone(value)
# otherwise it is formatted according to locale (in french)
value = str(value)
return value

View File

@ -70,6 +70,7 @@ from counter.models import (
Permanency, Permanency,
) )
from accounting.models import CurrencyField from accounting.models import CurrencyField
from core.views.forms import TzAwareDateTimeField
class CounterAdminMixin(View): class CounterAdminMixin(View):
@ -1584,18 +1585,8 @@ class CashSummaryEditView(CounterAdminTabsMixin, CounterAdminMixin, UpdateView):
class CashSummaryFormBase(forms.Form): class CashSummaryFormBase(forms.Form):
begin_date = forms.DateTimeField( begin_date = TzAwareDateTimeField(label=_("Begin date"), required=False)
input_formats=["%Y-%m-%d %H:%M:%S"], end_date = TzAwareDateTimeField(label=_("End date"), required=False)
label=_("Begin date"),
required=False,
widget=SelectDateTime,
)
end_date = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
required=False,
widget=SelectDateTime,
)
class CashSummaryListView(CounterAdminTabsMixin, CounterAdminMixin, ListView): class CashSummaryListView(CounterAdminTabsMixin, CounterAdminMixin, ListView):

View File

@ -14,6 +14,7 @@ from core.views import CanViewMixin, CanEditMixin, CanCreateMixin
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from core.views.forms import SelectDateTime, MarkdownInput from core.views.forms import SelectDateTime, MarkdownInput
from election.models import Election, Role, Candidature, ElectionList, Vote from election.models import Election, Role, Candidature, ElectionList, Vote
from core.views.forms import TzAwareDateTimeField
from ajax_select.fields import AutoCompleteSelectField from ajax_select.fields import AutoCompleteSelectField
from ajax_select import make_ajax_field from ajax_select import make_ajax_field
@ -167,30 +168,12 @@ class ElectionForm(forms.ModelForm):
label=_("candidature groups"), label=_("candidature groups"),
) )
start_date = forms.DateTimeField( start_date = TzAwareDateTimeField(label=_("Start date"), required=True)
input_formats=["%Y-%m-%d %H:%M:%S"], end_date = TzAwareDateTimeField(label=_("End date"), required=True)
label=_("Start date"), start_candidature = TzAwareDateTimeField(
widget=SelectDateTime, label=_("Start candidature"), required=True
required=True,
)
end_date = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
widget=SelectDateTime,
required=True,
)
start_candidature = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("Start candidature"),
widget=SelectDateTime,
required=True,
)
end_candidature = forms.DateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End candidature"),
widget=SelectDateTime,
required=True,
) )
end_candidature = TzAwareDateTimeField(label=_("End candidature"), required=True)
# Display elections # Display elections

View File

@ -36,22 +36,17 @@ from subscription.models import Subscription
from core.views.forms import SelectDateTime from core.views.forms import SelectDateTime
from core.models import User from core.models import User
from core.views.forms import SelectDate from core.views.forms import SelectDate
from core.views.forms import TzAwareDateTimeField
class SelectionDateForm(forms.Form): class SelectionDateForm(forms.Form):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(SelectionDateForm, self).__init__(*args, **kwargs) super(SelectionDateForm, self).__init__(*args, **kwargs)
self.fields["start_date"] = forms.DateTimeField( self.fields["start_date"] = TzAwareDateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"], label=_("Start date"), required=True
label=_("Start date"),
widget=SelectDateTime,
required=True,
) )
self.fields["end_date"] = forms.DateTimeField( self.fields["end_date"] = TzAwareDateTimeField(
input_formats=["%Y-%m-%d %H:%M:%S"], label=_("End date"), required=True
label=_("End date"),
widget=SelectDateTime,
required=True,
) )