corrected generator bug and models
This commit is contained in:
@@ -40,7 +40,7 @@ DJANGO_TYPES: dict[Any, str] = {
|
||||
"list": "models.JSONField(default=list, blank=True)",
|
||||
"text": "models.TextField(blank=True, default='')",
|
||||
"bigint": "models.BigIntegerField({opts})",
|
||||
"enum": "models.CharField(max_length=20, choices=Status.choices{opts})",
|
||||
"enum": "models.CharField(max_length=20, choices={enum_name}.choices{opts})",
|
||||
}
|
||||
|
||||
DJANGO_SPECIAL: dict[str, str] = {
|
||||
@@ -69,9 +69,11 @@ TS_RESOLVERS: dict[Any, Callable[[Any], str]] = {
|
||||
"UUID": lambda _: "string",
|
||||
"datetime": lambda _: "string",
|
||||
"dict": lambda _: "Record<string, unknown>",
|
||||
"list": lambda base: f"{TS_RESOLVERS.get(get_args(base)[0], lambda _: 'string')(None)}[]"
|
||||
if get_args(base)
|
||||
else "string[]",
|
||||
"list": lambda base: (
|
||||
f"{TS_RESOLVERS.get(get_args(base)[0], lambda _: 'string')(None)}[]"
|
||||
if get_args(base)
|
||||
else "string[]"
|
||||
),
|
||||
"enum": lambda base: base.__name__,
|
||||
}
|
||||
|
||||
@@ -80,9 +82,11 @@ PROTO_RESOLVERS: dict[Any, Callable[[Any], str]] = {
|
||||
int: lambda _: "int32",
|
||||
float: lambda _: "float",
|
||||
bool: lambda _: "bool",
|
||||
"list": lambda base: f"repeated {PROTO_RESOLVERS.get(get_args(base)[0], lambda _: 'string')(None)}"
|
||||
if get_args(base)
|
||||
else "repeated string",
|
||||
"list": lambda base: (
|
||||
f"repeated {PROTO_RESOLVERS.get(get_args(base)[0], lambda _: 'string')(None)}"
|
||||
if get_args(base)
|
||||
else "repeated string"
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
@@ -172,13 +176,14 @@ def resolve_django_type(name: str, type_hint: Any, default: Any) -> str:
|
||||
|
||||
# Enum
|
||||
if isinstance(base, type) and issubclass(base, Enum):
|
||||
enum_name = base.__name__
|
||||
extra = []
|
||||
if optional:
|
||||
extra.append("null=True, blank=True")
|
||||
if default is not dc.MISSING and isinstance(default, Enum):
|
||||
extra.append(f"default=Status.{default.name}")
|
||||
extra.append(f"default={enum_name}.{default.name}")
|
||||
return DJANGO_TYPES["enum"].format(
|
||||
opts=", " + ", ".join(extra) if extra else ""
|
||||
enum_name=enum_name, opts=", " + ", ".join(extra) if extra else ""
|
||||
)
|
||||
|
||||
# Text fields
|
||||
@@ -216,6 +221,15 @@ def resolve_django_type(name: str, type_hint: Any, default: Any) -> str:
|
||||
return DJANGO_TYPES[str].format(max_length=255, opts=", " + opts if opts else "")
|
||||
|
||||
|
||||
def generate_django_enum(enum_cls: type) -> list[str]:
|
||||
"""Generate Django TextChoices enum."""
|
||||
lines = [f"class {enum_cls.__name__}(models.TextChoices):"]
|
||||
for member in enum_cls:
|
||||
label = member.name.replace("_", " ").title()
|
||||
lines.append(f' {member.name} = "{member.value}", "{label}"')
|
||||
return lines
|
||||
|
||||
|
||||
def generate_django_model(cls: type) -> list[str]:
|
||||
"""Generate Django model lines from dataclass."""
|
||||
lines = [
|
||||
@@ -227,17 +241,6 @@ def generate_django_model(cls: type) -> list[str]:
|
||||
hints = get_type_hints(cls)
|
||||
fields = {f.name: f for f in dc.fields(cls)}
|
||||
|
||||
# Add Status inner class for enum fields
|
||||
for type_hint in hints.values():
|
||||
base, _ = unwrap_optional(type_hint)
|
||||
if isinstance(base, type) and issubclass(base, Enum):
|
||||
lines.append(" class Status(models.TextChoices):")
|
||||
for member in base:
|
||||
label = member.name.replace("_", " ").title()
|
||||
lines.append(f' {member.name} = "{member.value}", "{label}"')
|
||||
lines.append("")
|
||||
break
|
||||
|
||||
# Fields
|
||||
for name, type_hint in hints.items():
|
||||
if name.startswith("_"):
|
||||
@@ -283,7 +286,13 @@ def generate_django() -> str:
|
||||
"",
|
||||
]
|
||||
|
||||
# Generate enums first
|
||||
body = []
|
||||
for enum_cls in ENUMS:
|
||||
body.extend(generate_django_enum(enum_cls))
|
||||
body.extend(["", ""])
|
||||
|
||||
# Generate models
|
||||
for cls in DATACLASSES:
|
||||
body.extend(generate_django_model(cls))
|
||||
body.extend(["", ""])
|
||||
|
||||
Reference in New Issue
Block a user