ashb commented on a change in pull request #8902:
URL: https://github.com/apache/airflow/pull/8902#discussion_r427276653
##########
File path: airflow/www/forms.py
##########
@@ -17,25 +17,66 @@
# under the License.
import json
+from datetime import datetime as dt
from operator import itemgetter
+import pendulum
from flask_appbuilder.fieldwidgets import (
BS3PasswordFieldWidget, BS3TextAreaFieldWidget, BS3TextFieldWidget,
Select2Widget,
)
from flask_appbuilder.forms import DynamicForm
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
-from wtforms import validators
+from wtforms import validators, widgets
from wtforms.fields import (
- BooleanField, DateTimeField, IntegerField, PasswordField, SelectField,
StringField, TextAreaField,
+ BooleanField, DateTimeField, Field, IntegerField, PasswordField,
SelectField, StringField, TextAreaField,
)
+from airflow.configuration import conf
from airflow.models import Connection
from airflow.utils import timezone
from airflow.www.validators import ValidJson
from airflow.www.widgets import AirflowDateTimePickerWidget
+class DateTimeWithTimezoneField(Field):
+ """
+ A text field which stores a `datetime.datetime` matching a format.
+ """
+ widget = widgets.TextInput()
+
+ def __init__(self, label=None, validators=None, format='%Y-%m-%d
%H:%M:%S%Z', **kwargs):
+ super(DateTimeWithTimezoneField, self).__init__(label, validators,
**kwargs)
+ self.format = format
+
+ def _value(self):
+ if self.raw_data:
+ return ' '.join(self.raw_data)
+ else:
+ return self.data and self.data.strftime(self.format) or ''
+
+ def process_formdata(self, valuelist):
+ if valuelist:
+ date_str = ' '.join(valuelist)
+ try:
+ # Check if the datetime string is in the format without
timezone, if so convert it to the
+ # default timezone
+ if len(date_str) == 19:
+ parsed_datetime = dt.strptime(date_str, '%Y-%m-%d
%H:%M:%S')
+ defualt_timezone = pendulum.timezone('UTC')
+ tz = conf.get("core", "default_timezone")
+ if tz == "system":
+ defualt_timezone = pendulum.local_timezone()
+ else:
+ defualt_timezone = pendulum.timezone(tz)
+ self.data = defualt_timezone.convert(parsed_datetime)
+ else:
+ self.data = pendulum.parse(date_str)
+ except ValueError:
+ self.data = None
+ raise ValueError(self.gettext('Not a valid datetime value'))
+
+
class DateTimeForm(FlaskForm):
# Date filter form needed for task views
execution_date = DateTimeField(
Review comment:
```suggestion
execution_date = DateTimeWithTimezoneField(
```
And a few other places in this file too, no?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]