models.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # -*- coding: utf-8 -*-
  2. from decimal import Decimal
  3. import json
  4. from . import db
  5. from sqlalchemy.types import TypeDecorator, VARCHAR
  6. from sqlalchemy.ext.mutable import MutableDict
  7. class fakefloat(float):
  8. def __init__(self, value):
  9. self._value = value
  10. def __repr__(self):
  11. return str(self._value)
  12. def defaultencode(o):
  13. if isinstance(o, Decimal):
  14. # Subclass float with custom repr?
  15. return fakefloat(o)
  16. raise TypeError(repr(o) + " is not JSON serializable")
  17. class JSONEncodedDict(TypeDecorator):
  18. "Represents an immutable structure as a json-encoded string."
  19. impl = VARCHAR
  20. def process_bind_param(self, value, dialect):
  21. if value is not None:
  22. value = json.dumps(value, default=defaultencode)
  23. return value
  24. def process_result_value(self, value, dialect):
  25. if value is not None:
  26. value = json.loads(value)
  27. return value
  28. class ISP(db.Model):
  29. id = db.Column(db.Integer, primary_key=True)
  30. name = db.Column(db.String, nullable=False, index=True, unique=True)
  31. shortname = db.Column(db.String(12), index=True, unique=True)
  32. is_ffdn_member = db.Column(db.Boolean, default=False)
  33. is_disabled = db.Column(db.Boolean, default=False) # True = ISP will not appear
  34. url = db.Column(db.String)
  35. last_update_success = db.Column(db.DateTime)
  36. last_update_attempt = db.Column(db.DateTime)
  37. is_updatable = db.Column(db.Boolean, default=True) # set to False to disable JSON-URL updates
  38. tech_email = db.Column(db.String)
  39. cache_info = db.Column(db.Text)
  40. json = db.Column(MutableDict.as_mutable(JSONEncodedDict))
  41. def __init__(self, *args, **kwargs):
  42. super(ISP, self).__init__(*args, **kwargs)
  43. self.json={}
  44. def __repr__(self):
  45. return '<ISP %r>' % (self.shortname if self.shortname else self.name,)