Skip to content

Commit ac3ba1d

Browse files
Form alert (#2738)
* flash alert messages on create/edit/upload forms
1 parent 0274770 commit ac3ba1d

File tree

76 files changed

+3678
-3311
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+3678
-3311
lines changed

babel/admin.pot

Lines changed: 63 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ msgid ""
99
msgstr ""
1010
"Project-Id-Version: Flask-Admin VERSION\n"
1111
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
12-
"POT-Creation-Date: 2025-12-06 17:54+0100\n"
12+
"POT-Creation-Date: 2025-12-30 13:22+0300\n"
1313
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1414
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1515
"Language-Team: LANGUAGE <[email protected]>\n"
@@ -26,193 +26,193 @@ msgstr ""
2626
msgid "Cli: Invalid command."
2727
msgstr ""
2828

29-
#: ../flask_admin/contrib/fileadmin/__init__.py:414
29+
#: ../flask_admin/contrib/fileadmin/__init__.py:445
3030
msgid "File to upload"
3131
msgstr ""
3232

33-
#: ../flask_admin/contrib/fileadmin/__init__.py:422
33+
#: ../flask_admin/contrib/fileadmin/__init__.py:453
3434
msgid "File required."
3535
msgstr ""
3636

37-
#: ../flask_admin/contrib/fileadmin/__init__.py:427
37+
#: ../flask_admin/contrib/fileadmin/__init__.py:458
3838
msgid "Invalid file type."
3939
msgstr ""
4040

41-
#: ../flask_admin/contrib/fileadmin/__init__.py:440
41+
#: ../flask_admin/contrib/fileadmin/__init__.py:471
4242
msgid "Content"
4343
msgstr ""
4444

45-
#: ../flask_admin/contrib/fileadmin/__init__.py:457
45+
#: ../flask_admin/contrib/fileadmin/__init__.py:488
4646
msgid "Invalid name"
4747
msgstr ""
4848

49-
#: ../flask_admin/contrib/fileadmin/__init__.py:467
49+
#: ../flask_admin/contrib/fileadmin/__init__.py:498
5050
#: ../flask_admin/tests/sqla/test_translation.py:22
5151
msgid "Name"
5252
msgstr ""
5353

54-
#: ../flask_admin/contrib/fileadmin/__init__.py:838
54+
#: ../flask_admin/contrib/fileadmin/__init__.py:871
5555
#, python-format
5656
msgid "File \"%(name)s\" already exists."
5757
msgstr ""
5858

59-
#: ../flask_admin/contrib/fileadmin/__init__.py:885
60-
#: ../flask_admin/contrib/fileadmin/__init__.py:992
61-
#: ../flask_admin/contrib/fileadmin/__init__.py:1068
62-
#: ../flask_admin/contrib/fileadmin/__init__.py:1142
63-
#: ../flask_admin/contrib/fileadmin/__init__.py:1213
64-
#: ../flask_admin/contrib/fileadmin/__init__.py:1284
65-
#: ../flask_admin/model/base.py:2561
59+
#: ../flask_admin/contrib/fileadmin/__init__.py:922
60+
#: ../flask_admin/contrib/fileadmin/__init__.py:1029
61+
#: ../flask_admin/contrib/fileadmin/__init__.py:1107
62+
#: ../flask_admin/contrib/fileadmin/__init__.py:1181
63+
#: ../flask_admin/contrib/fileadmin/__init__.py:1252
64+
#: ../flask_admin/contrib/fileadmin/__init__.py:1323
65+
#: ../flask_admin/model/base.py:2565
6666
msgid "Permission denied."
6767
msgstr ""
6868

69-
#: ../flask_admin/contrib/fileadmin/__init__.py:988
69+
#: ../flask_admin/contrib/fileadmin/__init__.py:1025
7070
msgid "File uploading is disabled."
7171
msgstr ""
7272

73-
#: ../flask_admin/contrib/fileadmin/__init__.py:1001
73+
#: ../flask_admin/contrib/fileadmin/__init__.py:1038
7474
#, python-format
7575
msgid "Successfully saved file: %(name)s"
7676
msgstr ""
7777

78-
#: ../flask_admin/contrib/fileadmin/__init__.py:1010
78+
#: ../flask_admin/contrib/fileadmin/__init__.py:1047
7979
#, python-format
8080
msgid "Failed to save file: %(error)s"
8181
msgstr ""
8282

83-
#: ../flask_admin/contrib/fileadmin/__init__.py:1024
83+
#: ../flask_admin/contrib/fileadmin/__init__.py:1063
8484
#: ../flask_admin/templates/bootstrap4/admin/file/list.html:154
8585
#: ../flask_admin/templates/bootstrap4/admin/file/list.html:156
8686
msgid "Upload File"
8787
msgstr ""
8888

89-
#: ../flask_admin/contrib/fileadmin/__init__.py:1064
89+
#: ../flask_admin/contrib/fileadmin/__init__.py:1103
9090
msgid "Directory creation is disabled."
9191
msgstr ""
9292

93-
#: ../flask_admin/contrib/fileadmin/__init__.py:1085
93+
#: ../flask_admin/contrib/fileadmin/__init__.py:1124
9494
#, python-format
9595
msgid "Successfully created directory: %(directory)s"
9696
msgstr ""
9797

98-
#: ../flask_admin/contrib/fileadmin/__init__.py:1094
98+
#: ../flask_admin/contrib/fileadmin/__init__.py:1133
9999
#, python-format
100100
msgid "Failed to create directory: %(error)s"
101101
msgstr ""
102102

103-
#: ../flask_admin/contrib/fileadmin/__init__.py:1111
103+
#: ../flask_admin/contrib/fileadmin/__init__.py:1150
104104
#: ../flask_admin/templates/bootstrap4/admin/file/list.html:165
105105
#: ../flask_admin/templates/bootstrap4/admin/file/list.html:167
106106
msgid "Create Directory"
107107
msgstr ""
108108

109-
#: ../flask_admin/contrib/fileadmin/__init__.py:1138
109+
#: ../flask_admin/contrib/fileadmin/__init__.py:1177
110110
msgid "Deletion is disabled."
111111
msgstr ""
112112

113-
#: ../flask_admin/contrib/fileadmin/__init__.py:1147
113+
#: ../flask_admin/contrib/fileadmin/__init__.py:1186
114114
msgid "Directory deletion is disabled."
115115
msgstr ""
116116

117-
#: ../flask_admin/contrib/fileadmin/__init__.py:1155
117+
#: ../flask_admin/contrib/fileadmin/__init__.py:1194
118118
#, python-format
119119
msgid "Directory \"%(path)s\" was successfully deleted."
120120
msgstr ""
121121

122-
#: ../flask_admin/contrib/fileadmin/__init__.py:1162
122+
#: ../flask_admin/contrib/fileadmin/__init__.py:1201
123123
#, python-format
124124
msgid "Failed to delete directory: %(error)s"
125125
msgstr ""
126126

127-
#: ../flask_admin/contrib/fileadmin/__init__.py:1173
128-
#: ../flask_admin/contrib/fileadmin/__init__.py:1382
127+
#: ../flask_admin/contrib/fileadmin/__init__.py:1212
128+
#: ../flask_admin/contrib/fileadmin/__init__.py:1421
129129
#, python-format
130130
msgid "File \"%(name)s\" was successfully deleted."
131131
msgstr ""
132132

133-
#: ../flask_admin/contrib/fileadmin/__init__.py:1179
134-
#: ../flask_admin/contrib/fileadmin/__init__.py:1388
133+
#: ../flask_admin/contrib/fileadmin/__init__.py:1218
134+
#: ../flask_admin/contrib/fileadmin/__init__.py:1427
135135
#, python-format
136136
msgid "Failed to delete file: %(name)s"
137137
msgstr ""
138138

139-
#: ../flask_admin/contrib/fileadmin/__init__.py:1209
139+
#: ../flask_admin/contrib/fileadmin/__init__.py:1248
140140
msgid "Renaming is disabled."
141141
msgstr ""
142142

143-
#: ../flask_admin/contrib/fileadmin/__init__.py:1217
143+
#: ../flask_admin/contrib/fileadmin/__init__.py:1256
144144
msgid "Path does not exist."
145145
msgstr ""
146146

147-
#: ../flask_admin/contrib/fileadmin/__init__.py:1230
147+
#: ../flask_admin/contrib/fileadmin/__init__.py:1269
148148
#, python-format
149149
msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\""
150150
msgstr ""
151151

152-
#: ../flask_admin/contrib/fileadmin/__init__.py:1239
152+
#: ../flask_admin/contrib/fileadmin/__init__.py:1278
153153
#, python-format
154154
msgid "Failed to rename: %(error)s"
155155
msgstr ""
156156

157-
#: ../flask_admin/contrib/fileadmin/__init__.py:1262
157+
#: ../flask_admin/contrib/fileadmin/__init__.py:1301
158158
#, python-format
159159
msgid "Rename %(name)s"
160160
msgstr ""
161161

162-
#: ../flask_admin/contrib/fileadmin/__init__.py:1302
162+
#: ../flask_admin/contrib/fileadmin/__init__.py:1341
163163
#, python-format
164164
msgid "Error saving changes to %(name)s."
165165
msgstr ""
166166

167-
#: ../flask_admin/contrib/fileadmin/__init__.py:1308
167+
#: ../flask_admin/contrib/fileadmin/__init__.py:1347
168168
#, python-format
169169
msgid "Changes to %(name)s saved successfully."
170170
msgstr ""
171171

172-
#: ../flask_admin/contrib/fileadmin/__init__.py:1318
172+
#: ../flask_admin/contrib/fileadmin/__init__.py:1357
173173
#, python-format
174174
msgid "Error reading %(name)s."
175175
msgstr ""
176176

177-
#: ../flask_admin/contrib/fileadmin/__init__.py:1322
178-
#: ../flask_admin/contrib/fileadmin/__init__.py:1335
177+
#: ../flask_admin/contrib/fileadmin/__init__.py:1361
178+
#: ../flask_admin/contrib/fileadmin/__init__.py:1374
179179
#, python-format
180180
msgid "Unexpected error while reading from %(name)s"
181181
msgstr ""
182182

183-
#: ../flask_admin/contrib/fileadmin/__init__.py:1330
183+
#: ../flask_admin/contrib/fileadmin/__init__.py:1369
184184
#, python-format
185185
msgid "Cannot edit %(name)s."
186186
msgstr ""
187187

188-
#: ../flask_admin/contrib/fileadmin/__init__.py:1357
188+
#: ../flask_admin/contrib/fileadmin/__init__.py:1396
189189
#, python-format
190190
msgid "Editing %(path)s"
191191
msgstr ""
192192

193-
#: ../flask_admin/contrib/fileadmin/__init__.py:1367
193+
#: ../flask_admin/contrib/fileadmin/__init__.py:1406
194194
#: ../flask_admin/contrib/mongoengine/view.py:727
195195
#: ../flask_admin/contrib/peewee/view.py:606
196196
#: ../flask_admin/contrib/pymongo/view.py:418
197197
#: ../flask_admin/contrib/sqla/view.py:1453
198198
msgid "Delete"
199199
msgstr ""
200200

201-
#: ../flask_admin/contrib/fileadmin/__init__.py:1368
201+
#: ../flask_admin/contrib/fileadmin/__init__.py:1407
202202
msgid "Are you sure you want to delete these files?"
203203
msgstr ""
204204

205-
#: ../flask_admin/contrib/fileadmin/__init__.py:1372
205+
#: ../flask_admin/contrib/fileadmin/__init__.py:1411
206206
msgid "File deletion is disabled."
207207
msgstr ""
208208

209-
#: ../flask_admin/contrib/fileadmin/__init__.py:1394
209+
#: ../flask_admin/contrib/fileadmin/__init__.py:1433
210210
#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17
211211
#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22
212212
msgid "Edit"
213213
msgstr ""
214214

215-
#: ../flask_admin/contrib/fileadmin/s3.py:233
215+
#: ../flask_admin/contrib/fileadmin/s3.py:238
216216
msgid "Cannot operate on non empty directories"
217217
msgstr ""
218218

@@ -314,8 +314,8 @@ msgstr ""
314314
#: ../flask_admin/contrib/mongoengine/view.py:657
315315
#: ../flask_admin/contrib/peewee/view.py:567
316316
#: ../flask_admin/contrib/pymongo/view.py:376
317-
#: ../flask_admin/contrib/sqla/view.py:1402 ../flask_admin/model/base.py:2716
318-
#: ../flask_admin/model/base.py:2723 ../flask_admin/model/base.py:2727
317+
#: ../flask_admin/contrib/sqla/view.py:1402 ../flask_admin/model/base.py:2720
318+
#: ../flask_admin/model/base.py:2727 ../flask_admin/model/base.py:2731
319319
#, python-format
320320
msgid "Failed to update record. %(error)s"
321321
msgstr ""
@@ -338,7 +338,7 @@ msgstr ""
338338
#: ../flask_admin/contrib/mongoengine/view.py:740
339339
#: ../flask_admin/contrib/peewee/view.py:627
340340
#: ../flask_admin/contrib/pymongo/view.py:432
341-
#: ../flask_admin/contrib/sqla/view.py:1477 ../flask_admin/model/base.py:2496
341+
#: ../flask_admin/contrib/sqla/view.py:1477 ../flask_admin/model/base.py:2500
342342
#, python-format
343343
msgid "Record was successfully deleted."
344344
msgid_plural "%(count)s records were successfully deleted."
@@ -418,16 +418,24 @@ msgstr ""
418418
msgid "Record was successfully created."
419419
msgstr ""
420420

421-
#: ../flask_admin/model/base.py:2401 ../flask_admin/model/base.py:2455
422-
#: ../flask_admin/model/base.py:2489 ../flask_admin/model/base.py:2707
421+
#: ../flask_admin/model/base.py:2371
422+
msgid "Failed to create record."
423+
msgstr ""
424+
425+
#: ../flask_admin/model/base.py:2403 ../flask_admin/model/base.py:2459
426+
#: ../flask_admin/model/base.py:2493 ../flask_admin/model/base.py:2711
423427
msgid "Record does not exist."
424428
msgstr ""
425429

426-
#: ../flask_admin/model/base.py:2409 ../flask_admin/model/base.py:2712
430+
#: ../flask_admin/model/base.py:2411 ../flask_admin/model/base.py:2716
427431
msgid "Record was successfully saved."
428432
msgstr ""
429433

430-
#: ../flask_admin/model/base.py:2651
434+
#: ../flask_admin/model/base.py:2424
435+
msgid "Failed to save record."
436+
msgstr ""
437+
438+
#: ../flask_admin/model/base.py:2655
431439
#, python-format
432440
msgid "Export type \"%(type)s\" is not supported."
433441
msgstr ""

examples/bootstrap4/uv.lock

Lines changed: 2 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flask_admin/contrib/fileadmin/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,8 @@ def upload(self, path: str | None = None) -> T_RESPONSE | str:
10491049
),
10501050
"error",
10511051
)
1052+
else:
1053+
helpers.flash_errors(form, message="Failed to upload file: %(error)s")
10521054

10531055
if self.upload_modal and request.args.get("modal"):
10541056
template = self.upload_modal_template

flask_admin/model/base.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
from flask_admin.form import BaseForm
6969
from flask_admin.form import FormOpts
7070
from flask_admin.form import rules
71-
from flask_admin.helpers import flash_errors
71+
from flask_admin.helpers import flash_errors, is_form_submitted
7272
from flask_admin.helpers import get_form_data
7373
from flask_admin.helpers import get_redirect_target
7474
from flask_admin.helpers import validate_form_on_submit
@@ -2343,6 +2343,7 @@ def create_view(self) -> T_RESPONSE | str:
23432343
return redirect(return_url)
23442344

23452345
form = self.create_form()
2346+
23462347
if not hasattr(form, "_validated_ruleset") or not form._validated_ruleset:
23472348
self._validate_form_instance(ruleset=self._form_create_rules, form=form)
23482349

@@ -2367,6 +2368,9 @@ def create_view(self) -> T_RESPONSE | str:
23672368
model = t.cast(T_ORM_MODEL, model)
23682369
# save button
23692370
return redirect(self.get_save_return_url(model, is_created=True))
2371+
else:
2372+
if is_form_submitted():
2373+
flash(gettext("Failed to create record."), "danger")
23702374

23712375
form_opts = FormOpts(
23722376
widget_args=self.form_widget_args, form_rules=self._form_create_rules
@@ -2418,6 +2422,9 @@ def edit_view(self) -> T_RESPONSE | str:
24182422
else:
24192423
# save button
24202424
return redirect(self.get_save_return_url(model, is_created=False))
2425+
else:
2426+
if is_form_submitted():
2427+
flash(gettext("Failed to save record."), "danger")
24212428

24222429
if request.method == "GET" or form.errors:
24232430
self.on_form_prefill(form, id)

0 commit comments

Comments
 (0)