6
0

base.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. @property
  14. def identifier(self) -> int:
  15. app.logger.warning("BaseModel.identifier: REMOVE ME!")
  16. return self.id
  17. def serialize(self) -> dict:
  18. return self.to_dict()
  19. result["identifier"] = result["id"]
  20. return result
  21. def __repr__(self):
  22. attrs = self.serialize()
  23. content = ", ".join([f"{attr}={value}" for attr, value in attrs.items()])
  24. return f"<{self.__class__.__name__}: {content}>"
  25. def remove(self, commit=True) -> None:
  26. """
  27. remove this instance from the database
  28. :return:
  29. """
  30. db.session.delete(self)
  31. if commit:
  32. self.commit()
  33. @classmethod
  34. def new(cls, commit=False, **kwargs):
  35. obj = cls(**kwargs)
  36. db.session.add(obj)
  37. if commit:
  38. db.session.commit()
  39. return obj
  40. @classmethod
  41. def get_or_create(cls, **kwargs) -> T.Tuple[T.Any, bool]:
  42. is_new = False
  43. obj = cls.query.filter_by(**kwargs).one_or_none()
  44. if obj is None:
  45. obj = cls.new(commit=False, **kwargs)
  46. is_new = True
  47. return obj, is_new
  48. def commit(self):
  49. db.session.commit()
  50. class NamedBaseModel(BaseModel):
  51. __abstract__ = True
  52. name = db.Column(db.String, nullable=False)
  53. def set_name(self, name: str):
  54. self.name = name
  55. self.commit()