PageRenderTime 57ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/demisauce/demisauce/model/config.py

https://github.com/araddon/demisauce
Python | 120 lines | 105 code | 11 blank | 4 comment | 17 complexity | e8f71589b786374cb2625d1551935d55 MD5 | raw file
  1. import logging, json
  2. from sqlalchemy import Column, MetaData, ForeignKey, Table, \
  3. func, UniqueConstraint
  4. from sqlalchemy import Integer, String as DBString, DateTime, Boolean, \
  5. Text as DBText
  6. from sqlalchemy import engine, orm
  7. from sqlalchemy.orm import mapper, relation, class_mapper, synonym, dynamic_loader
  8. from sqlalchemy.sql import and_, text
  9. from datetime import datetime
  10. import formencode
  11. import random, hashlib, string
  12. from wtforms import Form, BooleanField, TextField, TextAreaField, \
  13. PasswordField, SelectField, SelectMultipleField, HiddenField, \
  14. IntegerField, validators
  15. from wtforms.validators import ValidationError
  16. from tornado import escape
  17. from tornado.options import options
  18. from demisauce import model
  19. from demisauce.model import meta
  20. from demisauce.model import ModelBase, SerializationMixin
  21. from datetime import datetime
  22. log = logging.getLogger("demisauce")
  23. configattribute_table = Table('configattribute', meta.metadata,
  24. Column('id', Integer, primary_key=True),
  25. Column('object_id', Integer,default=0),
  26. Column('object_type', DBString(30)),
  27. Column('name', DBString(80)),
  28. Column("value", DBString(1000)),
  29. Column('category', DBString(30)),
  30. Column('event_type', DBString(30)),
  31. Column('encoding', DBString(10),default="str"),
  32. Column("created", DateTime,default=datetime.now),
  33. Column("requires", DBString(1000)),
  34. )
  35. class ConfigAttribute(ModelBase,SerializationMixin):
  36. _allowed_api_keys = ['name','value','encoding','category','requires','object_type','event_type','object_id']
  37. _readonly_keys = ['id','created','datetime_created']
  38. schema = configattribute_table
  39. class ConfigMixin(object):
  40. """"""
  41. def get_attributes(self,category=None):
  42. pass
  43. def get_attribute(self,name):
  44. """Returns the ConfigAttribute object for given name"""
  45. for attribute in self.settings:
  46. if attribute.name == name:
  47. if attribute.encoding == 'json' and isinstance(attribute.value,(str,unicode)):
  48. attribute.value = json.loads(attribute.value)
  49. return attribute
  50. return None
  51. def get_val(self,name):
  52. attr = self.get_attribute(name)
  53. if attr:
  54. return attr.value
  55. return None
  56. def has_attribute(self,name):
  57. """Returns True/False if it has given key attribute"""
  58. for attribute in self.settings:
  59. if attribute.name == name:
  60. return True
  61. return False
  62. def has_attribute_value(self,name,value):
  63. """Returns True/False if it has given key/value pair attribute"""
  64. for attribute in self.settings:
  65. if attribute.name == name and value == attribute.value:
  66. return True
  67. return False
  68. def add_attribute(self,name,value,object_type=None,category="segment",encoding='str',requires=None,event_type=None):
  69. """Add or Update attribute """
  70. attr = self.get_attribute(name)
  71. if isinstance(value,(dict,list)) or encoding == 'json':
  72. value = json.dumps(value)
  73. encoding = 'json'
  74. if attr:
  75. attr.encoding = encoding
  76. attr.value = value
  77. attr.event_type = event_type
  78. attr.category = category
  79. attr.requires = requires
  80. return attr
  81. else:
  82. cls_name = str(self.__class__)
  83. cls_name = cls_name[cls_name.rfind('.')+1:cls_name.rfind('\'')].lower()
  84. attr = ConfigAttribute(object_type=cls_name,event_type=event_type,
  85. name=name,value=value,category=category,encoding=encoding,requires=requires)
  86. if self._is_cache:
  87. attr.object_id = self.id
  88. meta.DBSession().commit(attr)
  89. else:
  90. if self.id > 0:
  91. attr.object_id = self.id
  92. self.settings.append(attr)
  93. return attr
  94. return None
  95. def config_keyable(cls,name="settings"):
  96. """Object - List Mixin/Mutator"""
  97. mapper = class_mapper(cls)
  98. table = mapper.local_table
  99. cls_name = str(cls)
  100. cls_name = cls_name[cls_name.rfind('.')+1:cls_name.rfind('\'')].lower()
  101. mapper.add_property(name, dynamic_loader(ConfigAttribute,
  102. primaryjoin=and_(table.c.id==configattribute_table.c.object_id,configattribute_table.c.object_type==cls_name),
  103. foreign_keys=[configattribute_table.c.object_id],
  104. backref='%s' % table.name))
  105. # initialize some stuff
  106. def on_new(self):
  107. self.object_type = cls_name
  108. setattr(cls, "on_new", on_new)