Coverage for src / lexigram / admin / forms / fields / _registry.py: 86%

35 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-13 22:14 +0800

1from __future__ import annotations 

2 

3from typing import Any 

4 

5from lexigram.admin.forms.fields._advanced import ( 

6 ColorField, 

7 KeyValueField, 

8 MarkdownField, 

9 RichTextField, 

10 TagsField, 

11) 

12from lexigram.admin.forms.fields._base import FieldType 

13from lexigram.admin.forms.fields._text import ( 

14 BooleanField, 

15 DateField, 

16 IntegerField, 

17 SelectField, 

18 TextAreaField, 

19 TextField, 

20) 

21 

22 

23class FieldRegistry: 

24 """Registry for form field types and their corresponding UI widgets.""" 

25 

26 _registry: dict[FieldType, Any] = {} 

27 _custom_widgets: dict[str, Any] = {} 

28 

29 @classmethod 

30 def register(cls, field_type: FieldType, widget: Any) -> None: 

31 cls._registry[field_type] = widget 

32 

33 @classmethod 

34 def register_custom(cls, name: str, widget: Any) -> None: 

35 cls._custom_widgets[name] = widget 

36 

37 @classmethod 

38 def get_widget( 

39 cls, 

40 field_type: FieldType, 

41 custom_name: str | None = None, 

42 ) -> Any: 

43 if custom_name and custom_name in cls._custom_widgets: 

44 return cls._custom_widgets[custom_name] 

45 return cls._registry.get(field_type) 

46 

47 @classmethod 

48 def has_type(cls, field_type: FieldType) -> bool: 

49 return field_type in cls._registry 

50 

51 

52FieldRegistry.register(FieldType.TEXT, TextField) 

53FieldRegistry.register(FieldType.NUMBER, IntegerField) 

54FieldRegistry.register(FieldType.EMAIL, TextField) 

55FieldRegistry.register(FieldType.PASSWORD, TextField) 

56FieldRegistry.register(FieldType.CHECKBOX, BooleanField) 

57FieldRegistry.register(FieldType.SELECT, SelectField) 

58FieldRegistry.register(FieldType.DATE, DateField) 

59FieldRegistry.register(FieldType.TEXTAREA, TextAreaField) 

60FieldRegistry.register(FieldType.RICH_TEXT, RichTextField) 

61FieldRegistry.register(FieldType.MARKDOWN, MarkdownField) 

62FieldRegistry.register(FieldType.COLOR, ColorField) 

63FieldRegistry.register(FieldType.TAGS, TagsField) 

64FieldRegistry.register(FieldType.KEY_VALUE, KeyValueField)