database.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.utils.database
  4. ~~~~~~~~~~~~~~~~~~~~~~
  5. Some database helpers such as a CRUD mixin.
  6. :copyright: (c) 2015 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import pytz
  10. from flaskbb.extensions import db
  11. class CRUDMixin(object):
  12. def __repr__(self):
  13. return "<{}>".format(self.__class__.__name__)
  14. @classmethod
  15. def create(cls, **kwargs):
  16. instance = cls(**kwargs)
  17. return instance.save()
  18. def save(self):
  19. """Saves the object to the database."""
  20. db.session.add(self)
  21. db.session.commit()
  22. return self
  23. def delete(self):
  24. """Delete the object from the database."""
  25. db.session.delete(self)
  26. db.session.commit()
  27. return self
  28. class UTCDateTime(db.TypeDecorator):
  29. impl = db.DateTime
  30. def process_bind_param(self, value, dialect):
  31. """Way into the database."""
  32. if value is not None:
  33. # store naive datetime for sqlite and mysql
  34. if dialect.name in ("sqlite", "mysql"):
  35. return value.replace(tzinfo=None)
  36. return value.astimezone(pytz.UTC)
  37. def process_result_value(self, value, dialect):
  38. """Way out of the database."""
  39. # convert naive datetime to non naive datetime
  40. if dialect.name in ("sqlite", "mysql") and value is not None:
  41. return value.replace(tzinfo=pytz.UTC)
  42. # other dialects are already non-naive
  43. return value