Skip to content

Commit b0798f6

Browse files
committed
修复timefield的字段错误
1 parent 82d0a2b commit b0798f6

File tree

8 files changed

+35
-16
lines changed

8 files changed

+35
-16
lines changed

fast_tmp/amis/formitem.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class FormItemEnum(str, Enum):
7373
input_image = "input-image"
7474
input_file = "input-file"
7575
picker = "picker"
76+
input_time = "input-time"
7677

7778

7879
class FormItem(AbstractControl):

fast_tmp/amis/frame.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class Dialog(BaseModel):
1717

1818
# 参考 https://baidu.gitee.io/amis/docs/components/dialog?page=1
1919

20+
2021
# 抽屉
2122
class Drawer(BaseModel):
2223
title: str

fast_tmp/site/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from fast_tmp.amis.forms import FilterModel, Form
1616
from fast_tmp.amis.frame import Dialog
1717
from fast_tmp.amis.page import Page
18-
from fast_tmp.exceptions import FieldsError, NotFoundError, PermError
18+
from fast_tmp.exceptions import FieldsError, NotFoundError, PermError, TmpValueError
1919
from fast_tmp.models import Permission
2020
from fast_tmp.responses import ListDataWithPage
2121
from fast_tmp.site.base import ModelFilter, ModelSession, PageRouter
@@ -220,6 +220,8 @@ async def update(self, request: Request, pk: str, data: Dict[str, Any]) -> Model
220220
await control.set_value(request, obj, data[field_name])
221221
except ValidationError as e:
222222
err_fields[field_name] = str(e)
223+
except TmpValueError as e:
224+
err_fields[field_name] = str(e)
223225
if err_fields:
224226
raise FieldsError(err_fields)
225227
await obj.save()
@@ -241,6 +243,8 @@ async def patch(self, request: Request, pk: str, data: Dict[str, Any]) -> Model:
241243
await control.set_value(request, obj, data[field_name])
242244
except ValidationError as e:
243245
err_fields[field_name] = str(e)
246+
except TmpValueError as e:
247+
err_fields[field_name] = str(e)
244248
if err_fields:
245249
raise FieldsError(err_fields)
246250
await obj.save()
@@ -257,6 +261,8 @@ async def create(self, request: Request, data: Dict[str, Any]) -> Model:
257261
cors.append(cor)
258262
except ValidationError as e:
259263
field_errors[field_name] = str(e)
264+
except TmpValueError as e:
265+
field_errors[field_name] = str(e)
260266
if field_errors:
261267
raise FieldsError(field_errors)
262268

fast_tmp/site/field.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,11 @@ def get_column_inline(self, request: Request) -> Column:
158158
return self._column_inline
159159

160160
def amis_2_orm(self, value: Any) -> Any:
161-
if (value == "None" or not value) and self._field.null: # type: ignore
162-
return None
161+
if value == "None" or not value: # type: ignore
162+
if self._field.null:
163+
return None
164+
else:
165+
raise TmpValueError(f"{self.label} 不能为 {value}")
163166
return datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
164167

165168
def orm_2_amis(self, value: datetime.datetime) -> Any:
@@ -184,8 +187,11 @@ def get_column_inline(self, request: Request) -> Column:
184187
return self._column_inline
185188

186189
def amis_2_orm(self, value: Any) -> Any:
187-
if (value == "None" or not value) and self._field.null: # type: ignore
188-
return None
190+
if value == "None" or not value: # type: ignore
191+
if self._field.null:
192+
return None
193+
else:
194+
raise TmpValueError(f"{self.label} 不能为 {value}")
189195
year, month, day = value.split("-")
190196
return datetime.date(int(year), int(month), int(day))
191197

@@ -196,7 +202,7 @@ def orm_2_amis(self, value: datetime.date) -> Any:
196202

197203

198204
class TimeControl(BaseAdminControl):
199-
_control_type = FormItemEnum.time
205+
_control_type = FormItemEnum.input_time
200206

201207
def get_formitem(self, request: Request, codenames: Iterable[str]) -> FormItem:
202208
if not self._control:
@@ -238,6 +244,7 @@ def get_formitem(self, request: Request, codenames: Iterable[str]) -> FormItem:
238244
if not self._control:
239245
super().get_formitem(request, codenames)
240246
self._control.validations = "isJson"
247+
self._control.value = "{}" # fixme jsonfield不能为空
241248
return self._control
242249

243250
def get_column_inline(self, request: Request) -> Column:

tests/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class DecModel(ModelAdmin):
7171

7272
class IntEnumAdmin(ModelAdmin):
7373
model = IntEnumField
74-
list_display = ("e1", "e2")
74+
list_display = ("int_enum_1", "int_enum_2", "bool_1", "bool_2")
7575
create_fields = list_display
7676
update_fields = list_display
7777
inline = list_display

tests/test_example/test_example/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ class FieldTesting(Model):
156156
money = fields.DecimalField(max_digits=10, decimal_places=2, null=True)
157157
height = fields.FloatField(null=True)
158158
married = fields.BooleanField(default=False)
159-
gender = fields.CharEnumField(Gender)
160-
degree = fields.IntEnumField(Degree, default=Degree.unknow)
159+
gender = fields.CharEnumField(Gender, description="gender")
160+
degree = fields.IntEnumField(Degree, default=Degree.unknow, description="degree")
161161
game_length = fields.BigIntField(default=0) # 游戏时长,按秒计算
162162
avator = fields.BinaryField(null=True) # 头像
163163
config = fields.JSONField(null=True)
@@ -173,7 +173,7 @@ class FieldTesting(Model):
173173
height_inline = fields.FloatField(null=True)
174174
married_inline = fields.BooleanField(null=True, default=False)
175175
gender_inline = fields.CharEnumField(Gender, null=True)
176-
degree_inline = fields.IntEnumField(Degree, null=True)
176+
degree_inline = fields.IntEnumField(Degree, null=True, description="degree")
177177
game_length_inline = fields.BigIntField(null=True, default=0) # 游戏时长,按秒计算
178178
avator_inline = fields.BinaryField(null=True) # 头像
179179
config_inline = fields.JSONField(null=True)

tests/test_field.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ async def test_intenum(self):
3535
data = response.json()
3636
assert data["status"] == 0
3737
# 测试写入数据
38-
role_data = {"e2": "two"}
38+
role_data = {"int_enum_2": "two", "bool_2": "False"}
3939
response = await self.client.post("/admin/intenumfield/create", json=role_data)
4040
assert response.status_code == 200
4141
data = response.json()
@@ -46,9 +46,11 @@ async def test_intenum(self):
4646
data = response.json()
4747
assert data["status"] == 0
4848
assert data["data"]["total"] == 1
49-
self.assertEqual(data["data"]["items"][0]["e1"], None)
50-
assert data["data"]["items"][0]["e2"] == "two"
51-
role_data = {"e2": "three"}
49+
self.assertEqual(data["data"]["items"][0]["int_enum_1"], None)
50+
assert data["data"]["items"][0]["int_enum_2"] == "two"
51+
assert data["data"]["items"][0]["bool_2"] == "False"
52+
assert data["data"]["items"][0]["bool_1"] == "None"
53+
role_data = {"int_enum_2": "three", "bool_1": "xx"}
5254
response = await self.client.post("/admin/intenumfield/create", json=role_data)
5355
assert response.status_code == 200
5456
data = response.json()

tests/testmodels.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,5 +177,7 @@ class I1(IntEnum):
177177

178178

179179
class IntEnumField(Model):
180-
e1 = fields.IntEnumField(I1, null=True)
181-
e2 = fields.IntEnumField(I1, default=I1.one)
180+
int_enum_1 = fields.IntEnumField(I1, null=True)
181+
int_enum_2 = fields.IntEnumField(I1, default=I1.one)
182+
bool_1 = fields.BooleanField(null=True)
183+
bool_2 = fields.BooleanField(default=True)

0 commit comments

Comments
 (0)