41
41
from airflow .providers_manager import ProvidersManager
42
42
from airflow .utils import timezone
43
43
from airflow .utils .types import DagRunType
44
- from airflow .www .validators import ValidKey
44
+ from airflow .www .validators import ReadOnly , ValidKey
45
45
from airflow .www .widgets import (
46
46
AirflowDateTimePickerROWidget ,
47
47
AirflowDateTimePickerWidget ,
@@ -121,38 +121,54 @@ class DateTimeWithNumRunsForm(FlaskForm):
121
121
class DagRunEditForm (DynamicForm ):
122
122
"""Form for editing DAG Run.
123
123
124
- We don't actually want to allow editing , so everything is read-only here.
124
+ Only note field is editable , so everything else is read-only here.
125
125
"""
126
126
127
- dag_id = StringField (lazy_gettext ("Dag Id" ), widget = BS3TextFieldROWidget ())
128
- start_date = DateTimeWithTimezoneField (lazy_gettext ("Start Date" ), widget = AirflowDateTimePickerROWidget ())
129
- end_date = DateTimeWithTimezoneField (lazy_gettext ("End Date" ), widget = AirflowDateTimePickerROWidget ())
130
- run_id = StringField (lazy_gettext ("Run Id" ), widget = BS3TextFieldROWidget ())
131
- state = StringField (lazy_gettext ("State" ), widget = BS3TextFieldROWidget ())
127
+ dag_id = StringField (lazy_gettext ("Dag Id" ), validators = [ReadOnly ()], widget = BS3TextFieldROWidget ())
128
+ start_date = DateTimeWithTimezoneField (
129
+ lazy_gettext ("Start Date" ), validators = [ReadOnly ()], widget = AirflowDateTimePickerROWidget ()
130
+ )
131
+ end_date = DateTimeWithTimezoneField (
132
+ lazy_gettext ("End Date" ), validators = [ReadOnly ()], widget = AirflowDateTimePickerROWidget ()
133
+ )
134
+ run_id = StringField (lazy_gettext ("Run Id" ), validators = [ReadOnly ()], widget = BS3TextFieldROWidget ())
135
+ state = StringField (lazy_gettext ("State" ), validators = [ReadOnly ()], widget = BS3TextFieldROWidget ())
132
136
execution_date = DateTimeWithTimezoneField (
133
137
lazy_gettext ("Logical Date" ),
138
+ validators = [ReadOnly ()],
134
139
widget = AirflowDateTimePickerROWidget (),
135
140
)
136
- conf = TextAreaField (lazy_gettext ("Conf" ), widget = BS3TextAreaROWidget ())
141
+ conf = TextAreaField (lazy_gettext ("Conf" ), validators = [ ReadOnly ()], widget = BS3TextAreaROWidget ())
137
142
note = TextAreaField (lazy_gettext ("User Note" ), widget = BS3TextAreaFieldWidget ())
138
143
139
144
def populate_obj (self , item ):
140
- """Populates the attributes of the passed obj with data from the form's fields."""
141
- super ().populate_obj (item )
145
+ """Populates the attributes of the passed obj with data from the form's not-read-only fields."""
146
+ for name , field in self ._fields .items ():
147
+ if not field .flags .readonly :
148
+ field .populate_obj (item , name )
142
149
item .run_type = DagRunType .from_run_id (item .run_id )
143
150
if item .conf :
144
151
item .conf = json .loads (item .conf )
145
152
146
153
147
154
class TaskInstanceEditForm (DynamicForm ):
148
- """Form for editing TaskInstance."""
155
+ """Form for editing TaskInstance.
149
156
150
- dag_id = StringField (lazy_gettext ("Dag Id" ), validators = [InputRequired ()], widget = BS3TextFieldROWidget ())
157
+ Only note and state fields are editable, so everything else is read-only here.
158
+ """
159
+
160
+ dag_id = StringField (
161
+ lazy_gettext ("Dag Id" ), validators = [InputRequired (), ReadOnly ()], widget = BS3TextFieldROWidget ()
162
+ )
151
163
task_id = StringField (
152
- lazy_gettext ("Task Id" ), validators = [InputRequired ()], widget = BS3TextFieldROWidget ()
164
+ lazy_gettext ("Task Id" ), validators = [InputRequired (), ReadOnly ()], widget = BS3TextFieldROWidget ()
165
+ )
166
+ start_date = DateTimeWithTimezoneField (
167
+ lazy_gettext ("Start Date" ), validators = [ReadOnly ()], widget = AirflowDateTimePickerROWidget ()
168
+ )
169
+ end_date = DateTimeWithTimezoneField (
170
+ lazy_gettext ("End Date" ), validators = [ReadOnly ()], widget = AirflowDateTimePickerROWidget ()
153
171
)
154
- start_date = DateTimeWithTimezoneField (lazy_gettext ("Start Date" ), widget = AirflowDateTimePickerROWidget ())
155
- end_date = DateTimeWithTimezoneField (lazy_gettext ("End Date" ), widget = AirflowDateTimePickerROWidget ())
156
172
state = SelectField (
157
173
lazy_gettext ("State" ),
158
174
choices = (
@@ -167,10 +183,16 @@ class TaskInstanceEditForm(DynamicForm):
167
183
execution_date = DateTimeWithTimezoneField (
168
184
lazy_gettext ("Logical Date" ),
169
185
widget = AirflowDateTimePickerROWidget (),
170
- validators = [InputRequired ()],
186
+ validators = [InputRequired (), ReadOnly () ],
171
187
)
172
188
note = TextAreaField (lazy_gettext ("User Note" ), widget = BS3TextAreaFieldWidget ())
173
189
190
+ def populate_obj (self , item ):
191
+ """Populates the attributes of the passed obj with data from the form's not-read-only fields."""
192
+ for name , field in self ._fields .items ():
193
+ if not field .flags .readonly :
194
+ field .populate_obj (item , name )
195
+
174
196
175
197
@cache
176
198
def create_connection_form_class () -> type [DynamicForm ]:
0 commit comments