6
0

base.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import typing as T
  2. import datetime
  3. from sqlalchemy_serializer import SerializerMixin
  4. from pycs import app
  5. from pycs import db
  6. class ModelSerializer(SerializerMixin):
  7. date_format = '%s' # Unixtimestamp (seconds)
  8. datetime_format = '%d. %b. %Y %H:%M:%S'
  9. time_format = '%H:%M'
  10. class BaseModel(db.Model, ModelSerializer):
  11. __abstract__ = True
  12. id = db.Column(db.Integer, primary_key=True)
  13. serialize_only = ("id",)
  14. @property
  15. def identifier(self) -> int:
  16. app.logger.warning("BaseModel.identifier: REMOVE ME!")
  17. return self.id
  18. def serialize(self) -> dict:
  19. return self.to_dict()
  20. result["identifier"] = result["id"]
  21. return result
  22. def __repr__(self):
  23. attrs = self.serialize()
  24. content = ", ".join([f"{attr}={value}" for attr, value in attrs.items()])
  25. return f"<{self.__class__.__name__}: {content}>"
  26. def remove(self, commit=True) -> None:
  27. """
  28. remove this instance from the database
  29. :return:
  30. """
  31. db.session.delete(self)
  32. if commit:
  33. self.commit()
  34. @classmethod
  35. def new(cls, commit=True, **kwargs):
  36. obj = cls(**kwargs)
  37. db.session.add(obj)
  38. if commit:
  39. obj.commit()
  40. return obj
  41. @classmethod
  42. def get_or_create(cls, **kwargs) -> T.Tuple[T.Any, bool]:
  43. is_new = False
  44. obj = cls.query.filter_by(**kwargs).one_or_none()
  45. if obj is None:
  46. obj = cls.new(commit=False, **kwargs)
  47. is_new = True
  48. return obj, is_new
  49. def commit(self):
  50. db.session.commit()
  51. class NamedBaseModel(BaseModel):
  52. __abstract__ = True
  53. name = db.Column(db.String, nullable=False)
  54. serialize_only = BaseModel.serialize_only + ("name", )
  55. def set_name(self, name: str, commit: bool = True):
  56. self.name = name
  57. if commit:
  58. self.commit()