Improved Typescript Interface generation, enabled it for events
This commit is contained in:
parent
b8db07b741
commit
ba0c76a727
|
@ -28,10 +28,9 @@ class UtcDateTime(TypeDecorator):
|
|||
def process_bind_param(self, value, dialect):
|
||||
if value is not None:
|
||||
if not isinstance(value, datetime.datetime):
|
||||
raise TypeError('expected datetime.datetime, not ' +
|
||||
repr(value))
|
||||
raise TypeError("expected datetime.datetime, not " + repr(value))
|
||||
elif value.tzinfo is None:
|
||||
raise ValueError('naive datetime is disallowed')
|
||||
raise ValueError("naive datetime is disallowed")
|
||||
return value.astimezone(datetime.timezone.utc)
|
||||
|
||||
def process_result_value(self, value, dialect):
|
||||
|
|
|
@ -1,65 +1,74 @@
|
|||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from . import ModelSerializeMixin
|
||||
from .user import User
|
||||
from ..database import db
|
||||
|
||||
|
||||
class Event(db.Model, ModelSerializeMixin):
|
||||
"""Model for an Event"""
|
||||
__tablename__ = "event"
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
begin = db.Column(db.DateTime, nullable=False)
|
||||
end = db.Column(db.DateTime)
|
||||
description = db.Column(db.String(240))
|
||||
kind = db.relationship("EventKind")
|
||||
slots = db.relationship("EventSlot", back_populates="event", cascade="all, delete")
|
||||
# notices = db.relationship("EventNotice", back_populates="event")
|
||||
|
||||
_kind_id = db.Column(db.Integer, db.ForeignKey("event_kind.id", ondelete="CASCADE"), nullable=False)
|
||||
|
||||
|
||||
class EventKind(db.Model, ModelSerializeMixin):
|
||||
"""Model for an EventKind"""
|
||||
__tablename__ = "event_kind"
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(30), nullable=False, unique=True)
|
||||
|
||||
|
||||
class EventSlot(db.Model, ModelSerializeMixin):
|
||||
"""Model for an EventSlot"""
|
||||
|
||||
__tablename__ = "event_slot"
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
start = db.Column(db.DateTime)
|
||||
end = db.Column(db.DateTime)
|
||||
slots = db.relationship("JobSlot", back_populates="event_slot")
|
||||
id: int = db.Column(db.Integer, primary_key=True)
|
||||
start: datetime = db.Column(db.DateTime)
|
||||
end: Optional[datetime] = db.Column(db.DateTime)
|
||||
slots: [any] = db.relationship("JobSlot", back_populates="_event_slot")
|
||||
|
||||
_event_id = db.Column(db.Integer, db.ForeignKey("event.id"), nullable=False)
|
||||
_event = db.relationship("Event", back_populates="slots")
|
||||
_event_id = db.Column("event_id", db.Integer, db.ForeignKey("event.id"), nullable=False)
|
||||
_event = db.relationship("Event", back_populates="_slots")
|
||||
|
||||
|
||||
class JobSlot(db.Model, ModelSerializeMixin):
|
||||
__tablename__ = "job_slot"
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
needed_persons = db.Column(db.Numeric(precision=4, scale=2))
|
||||
kind = db.relationship("JobKind")
|
||||
jobs = db.relationship("Job", back_populates="slot")
|
||||
class EventKind(db.Model, ModelSerializeMixin):
|
||||
"""Model for an EventKind"""
|
||||
|
||||
_event_slot_id = db.Column(db.Integer, db.ForeignKey("event_slot.id"))
|
||||
_event_slot = db.relationship("EventSlot", back_populates="slots")
|
||||
_kind_id = db.Column(db.Integer, db.ForeignKey("job_kind.id"))
|
||||
__tablename__ = "event_kind"
|
||||
name: str = db.Column(db.String(30), nullable=False, unique=True)
|
||||
|
||||
_id: int = db.Column("id", db.Integer, primary_key=True)
|
||||
|
||||
|
||||
class Event(db.Model, ModelSerializeMixin):
|
||||
"""Model for an Event"""
|
||||
|
||||
__tablename__ = "event"
|
||||
id: int = db.Column(db.Integer, primary_key=True)
|
||||
begin: datetime = db.Column(db.DateTime, nullable=False)
|
||||
end: datetime = db.Column(db.DateTime)
|
||||
description: str = db.Column(db.String(240))
|
||||
kind: EventKind = db.relationship("EventKind")
|
||||
# notices = db.relationship("EventNotice", back_populates="event")
|
||||
|
||||
_kind_id = db.Column("kind_id", db.Integer, db.ForeignKey("event_kind.id", ondelete="CASCADE"), nullable=False)
|
||||
_slots: [EventSlot] = db.relationship("EventSlot", back_populates="_event", cascade="all, delete")
|
||||
|
||||
|
||||
class Job(db.Model, ModelSerializeMixin):
|
||||
__tablename__ = "job"
|
||||
user = db.relationship("User")
|
||||
value = db.Column(db.Numeric(precision=3, scale=2))
|
||||
_user: User = db.relationship("User")
|
||||
# user: str = column_property(_user.userid)
|
||||
value: float = db.Column(db.Numeric(precision=3, scale=2))
|
||||
|
||||
_user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
|
||||
_slot_id = db.Column(db.Integer, db.ForeignKey("job_slot.id"))
|
||||
_id = db.Column("id", db.Integer, primary_key=True)
|
||||
_user_id = db.Column("user_id", db.Integer, db.ForeignKey("user.id"))
|
||||
_slot_id = db.Column("slot_id", db.Integer, db.ForeignKey("job_slot.id"))
|
||||
_slot = db.relationship("JobSlot")
|
||||
_id = db.Column(db.Integer, primary_key=True)
|
||||
|
||||
|
||||
class JobKind(db.Model, ModelSerializeMixin):
|
||||
__tablename__ = "job_kind"
|
||||
name = db.Column(db.String(30), nullable=False, unique=True)
|
||||
name: str = db.Column(db.String(30), nullable=False, unique=True)
|
||||
|
||||
_id = db.Column(db.Integer, primary_key=True)
|
||||
_id = db.Column("id", db.Integer, primary_key=True)
|
||||
|
||||
|
||||
class JobSlot(db.Model, ModelSerializeMixin):
|
||||
__tablename__ = "job_slot"
|
||||
id: int = db.Column(db.Integer, primary_key=True)
|
||||
needed_persons: float = db.Column(db.Numeric(precision=4, scale=2))
|
||||
kind: JobKind = db.relationship("JobKind")
|
||||
jobs: [Job] = db.relationship("Job", back_populates="_slot")
|
||||
|
||||
_event_slot_id = db.Column("event_slot_id", db.Integer, db.ForeignKey("event_slot.id"))
|
||||
_event_slot = db.relationship("EventSlot", back_populates="slots")
|
||||
_kind_id = db.Column("kind_id", db.Integer, db.ForeignKey("job_kind.id"))
|
||||
|
|
|
@ -92,12 +92,8 @@ class User(db.Model, ModelSerializeMixin):
|
|||
def get_permissions(self):
|
||||
return ["user"] + [permission.name for role in self.roles for permission in role.permissions]
|
||||
|
||||
def has_permissions(self, permissions):
|
||||
for role in self.roles:
|
||||
for permission in role.permissions:
|
||||
if permission.name in permissions:
|
||||
return True
|
||||
return False
|
||||
def has_permission(self, permission):
|
||||
return permission in self.get_permissions()
|
||||
|
||||
|
||||
class _UserAttribute(db.Model, ModelSerializeMixin):
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
#!/usr/bin/python3
|
||||
import inspect
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
|
||||
import bjoern
|
||||
import sqlalchemy
|
||||
from sqlalchemy.orm import RelationshipProperty, ColumnProperty
|
||||
import typing
|
||||
|
||||
|
||||
def install(arguments):
|
||||
|
@ -36,12 +33,16 @@ def export(arguments):
|
|||
|
||||
def pytype(cls):
|
||||
if isinstance(cls, list):
|
||||
return "Array<{}>".format(pytype(cls[0]))
|
||||
mapper = {"str": "string", "int": "number", "datetime": "Date"}
|
||||
if cls.__name__ in mapper:
|
||||
return mapper[cls.__name__]
|
||||
else:
|
||||
return cls.__name__
|
||||
return "", "Array<{}>".format(pytype(cls[0])[1])
|
||||
#if typing.get_origin(cls) is typing.Optional:
|
||||
# return "?", pytype(typing.get_args(cls)[1])
|
||||
mapper = {"str": "string", "int": "number", "float": "number", "datetime": "Date"}
|
||||
if hasattr(cls, "__name__"):
|
||||
if cls.__name__ in mapper:
|
||||
return "", mapper[cls.__name__]
|
||||
else:
|
||||
return "", cls.__name__
|
||||
return "?", "any"
|
||||
|
||||
def walker(mod):
|
||||
if inspect.ismodule(mod[1]) and mod[1].__name__.startswith(models.__name__) and mod[1].__name__ not in known:
|
||||
|
@ -58,7 +59,7 @@ def export(arguments):
|
|||
d = {param: pytype(ptype) for param, ptype in mod[1].__annotations__.items() if not param.startswith("_")}
|
||||
if len(d) == 1:
|
||||
key, value = d.popitem()
|
||||
classes[mod[0]] = value
|
||||
classes[mod[0]] = value[1]
|
||||
else:
|
||||
classes[mod[0]] = d
|
||||
|
||||
|
@ -68,14 +69,16 @@ def export(arguments):
|
|||
with app.app_context():
|
||||
walker(("models", models))
|
||||
with open(arguments.file, "w") as file:
|
||||
file.write("declare namespace FG {\n")
|
||||
for cls, params in classes.items():
|
||||
if isinstance(params, str):
|
||||
file.write("type {} = {};\n".format(cls, params))
|
||||
file.write("\ttype {} = {};\n".format(cls, params))
|
||||
else:
|
||||
file.write("interface {} {{\n".format(cls))
|
||||
file.write("\tinterface {} {{\n".format(cls))
|
||||
for name in params:
|
||||
file.write(" {}: {};\n".format(name, params[name]))
|
||||
file.write("}\n")
|
||||
file.write("\t\t{}{}: {};\n".format(name, *params[name]))
|
||||
file.write("\t}\n")
|
||||
file.write("}\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
Loading…
Reference in New Issue