Guest User

Untitled

a guest
Jan 18th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.58 KB | None | 0 0
  1. import datetime
  2. import uuid
  3.  
  4. from marshmallow_sqlalchemy import ModelSchema
  5. from sqlalchemy import Table, Column, ForeignKey, Integer, String, Text, DateTime, Float
  6. from sqlalchemy import create_engine, text, func
  7.  
  8. from sqlalchemy.orm import Session, relationship, backref, joinedload_all, sessionmaker
  9. from sqlalchemy.ext.mutable import MutableDict
  10. from sqlalchemy.ext.declarative import declarative_base
  11. from sqlalchemy.dialects.postgresql import HSTORE, ARRAY, UUID
  12.  
  13. engine = create_engine('postgresql://vladislav@localhost:5432/postgres')
  14. Session = sessionmaker(bind=engine)
  15.  
  16. session = Session()
  17.  
  18. print(session)
  19.  
  20. Base = declarative_base()
  21.  
  22. class Service(object):
  23.  
  24. def fields(self):
  25. return self.__table__.columns.keys()
  26.  
  27. def to_dict(self, skip=[]):
  28. return {k: getattr(self, k) for k in self.fields() if k not in skip}
  29.  
  30. serialize_model = to_dict
  31.  
  32. @staticmethod
  33. def jsonify(o):
  34. if isinstance(o, (datetime.datetime, datetime.date, datetime.timedelta, uuid.UUID)):
  35. return str(o)
  36. if hasattr(o, 'serialize_model'):
  37. return o.to_dict()
  38.  
  39. def __repr__(self):
  40. fields = ','.join(["{}='{}'".format(k, v) for (k, v) in self.to_dict().items()])
  41. return "{}({})".format(self.__class__.__name__, fields)
  42.  
  43.  
  44. user_role = Table('user_role', Base.metadata,
  45. Column('user_id', ForeignKey('users.id'), primary_key=True),
  46. Column('role_id', ForeignKey('roles.id'), primary_key=True)
  47. )
  48.  
  49. class User(Base, Service):
  50. __tablename__ = 'users'
  51.  
  52. id = Column('id', UUID(as_uuid=True), primary_key=True, server_default=text("uuid_generate_v4()"))
  53. username = Column('username', String(128), nullable=False, unique=True)
  54. password = Column('password', String(128), nullable=False)
  55. registered_at = Column('registered_at', DateTime(), default=func.now())
  56. last_login_at = Column('last_login_at', DateTime())
  57.  
  58. reports = relationship('UserReport', back_populates='owner')
  59. incidents = relationship('Incident', primaryjoin='User.id==foreign(Incident.user_id)')
  60. roles = relationship('Role', back_populates='users', secondary=user_role)
  61.  
  62.  
  63.  
  64. class Role(Base, Service):
  65. __tablename__ = 'roles'
  66.  
  67. id = Column('id', Integer, primary_key=True)
  68. name = Column('name', String(128), nullable=False, unique=True)
  69.  
  70. users = relationship('User', back_populates='roles', secondary=user_role)
  71. permissions = relationship('Permission', back_populates='roles')
  72.  
  73.  
  74. class Permission(Base, Service):
  75. __tablename__ = 'permissions'
  76.  
  77. id = Column('id', Integer, primary_key=True)
  78. role_id = Column('role_id', Integer, ForeignKey('roles.id'))
  79. action = Column('action', String(64), nullable=False)
  80. resource = Column('resource', String(128), nullable=False)
  81.  
  82. roles = relationship('Role', back_populates='permissions')
  83.  
  84.  
  85. class UserReport(Base, Service):
  86. __tablename__ = 'user_reports'
  87.  
  88. id = Column('id', Integer, primary_key=True)
  89. kind = Column('kind', String(64), nullable=False)
  90. name = Column('name', String(128), nullable=False)
  91. parameters = Column('parameters', MutableDict.as_mutable(HSTORE))
  92. user_id = Column('user_id', UUID(as_uuid=True), ForeignKey('users.id'))
  93. created_at = Column('created_at', DateTime(), default=func.now())
  94.  
  95. owner = relationship('User', back_populates='reports')
  96.  
  97.  
  98. class Person(Base, Service):
  99. __tablename__ = 'people'
  100.  
  101. id = Column('id', Integer, primary_key=True)
  102. indent = Column('indent', ARRAY(String(128)), server_default=text('array[]::varchar(128)[]'))
  103. data = Column('data', MutableDict.as_mutable(HSTORE))
  104.  
  105. wabsessions = relationship('WABSession', back_populates='person')
  106. proxies = relationship('PersonProxy', back_populates='person')
  107. timeframes = relationship('TimeFrame', back_populates='person')
  108.  
  109.  
  110. class PersonProxy(Base, Service):
  111. __tablename__ = 'person_rights'
  112.  
  113. person_id = Column('person_id', Integer, ForeignKey('people.id'), primary_key=True)
  114. proxy_id = Column('proxy_id', Integer, ForeignKey('proxygw.id'), primary_key=True)
  115. rights = Column('rights', ARRAY(String(128)), server_default=text('array[]::varchar(128)[]'))
  116.  
  117. person = relationship('Person', back_populates='proxies')
  118. proxy = relationship('ProxyGW', back_populates='people')
  119.  
  120.  
  121. class ProxyGW(Base, Service):
  122. __tablename__ = 'proxygw'
  123.  
  124. id = Column('id', Integer, primary_key=True)
  125. indent = Column('indent', String(128), nullable=False)
  126. addr = Column('addr', String(256))
  127. token = Column('token', String(128))
  128. username = Column('username', String(32))
  129. password = Column('password', String(32))
  130. data = Column('data', MutableDict.as_mutable(HSTORE), server_default=text("hstore('')"), nullable=False)
  131.  
  132. people = relationship('PersonProxy', back_populates='proxy')
  133. timeframes = relationship('TimeFrame', back_populates='proxy')
  134.  
  135.  
  136. class TimeFrame(Base, Service):
  137. __tablename__ = 'timeframes'
  138.  
  139. id = Column('id', Integer, primary_key=True)
  140. start = Column('start', DateTime(), nullable=False)
  141. stop = Column('stop', DateTime(), nullable=False)
  142. person_id = Column('person_id', Integer, ForeignKey('people.id'))
  143. proxy_id = Column('proxy_id', Integer, ForeignKey('proxygw.id'))
  144.  
  145. person = relationship('Person', back_populates='timeframes')
  146. proxy = relationship('ProxyGW', back_populates='timeframes')
  147.  
  148.  
  149. class WABSession(Base, Service):
  150. __tablename__ = 'wabsessions'
  151.  
  152. id = Column('id', Integer, primary_key=True)
  153. session_start = Column('session_start', DateTime(), nullable=False)
  154. session_stop = Column('session_stop', DateTime(), nullable=False)
  155. wab_addr = Column('wab_addr', String(512), nullable=False)
  156. session_id = Column('session_id', String(128), nullable=False)
  157. client_ip = Column('client_ip', String(16), nullable=False)
  158. target_ip = Column('target_ip', String(16), nullable=False)
  159. user = Column('user', String(512), nullable=False)
  160. device = Column('device', String(512), nullable=False)
  161. service = Column('service', String(16), nullable=False)
  162. account = Column('account', String(512), nullable=False)
  163. person_id = Column('person_id', Integer, ForeignKey('people.id'))
  164.  
  165. person = relationship('Person', back_populates='wabsessions')
  166. events = relationship('Event', back_populates='wabsession')
  167. incidents = relationship('Incident', back_populates='wabsession')
  168.  
  169.  
  170. event_term = Table('event_term', Base.metadata,
  171. Column('event_id', ForeignKey('events.id'), primary_key=True),
  172. Column('term_id', ForeignKey('terms.id'), primary_key=True)
  173. )
  174.  
  175.  
  176. class Event(Base, Service):
  177. __tablename__ = 'events'
  178.  
  179. id = Column('id', Integer, primary_key=True)
  180. wabsession_id = Column('wabsession_id', Integer, ForeignKey('wabsessions.id'))
  181. recorded_at = Column('recorded_at', DateTime())
  182. event_type = Column('event_type', String(512), nullable=False)
  183. event_data = Column('event_data', MutableDict.as_mutable(HSTORE))
  184.  
  185. wabsession = relationship('WABSession', back_populates='events')
  186. terms = relationship('Term', back_populates='events', secondary=event_term)
  187. incident = relationship('Incident', back_populates='event')
  188.  
  189.  
  190. class Term(Base, Service):
  191. __tablename__ = 'terms'
  192.  
  193. id = Column('id', Integer, primary_key=True)
  194. value = Column('value', String(256), nullable=False)
  195.  
  196. events = relationship('Event', secondary=event_term, back_populates='terms')
  197.  
  198.  
  199. class Incident(Base, Service):
  200. __tablename__ = 'incidents'
  201.  
  202. id = Column('id', Integer, primary_key=True)
  203. indent = Column('indent', String(128))
  204. kind = Column('kind', String(256), nullable=False)
  205. score = Column('score', Float, nullable=False)
  206. data = Column('data', String(256))
  207. severity = Column('severity', String(32))
  208. # enum LOW, MIDDLE, HIGH, CRITICAL
  209. state = Column('state', String(32), default='NEW')
  210. # enum NEW, OPEN, CLOSED, REOPENED
  211. wabsession_id = Column('wabsession_id', Integer, ForeignKey('wabsessions.id'))
  212. event_id = Column('event_id', Integer, ForeignKey('events.id'))
  213. user_id = Column('user_id', UUID(as_uuid=True))
  214.  
  215. wabsession = relationship('WABSession', back_populates='incidents')
  216. event = relationship('Event', back_populates='incident')
  217. owner = relationship('User', primaryjoin='foreign(Incident.user_id)==User.id')
  218.  
  219.  
  220. class ColorList(Base, Service):
  221. __tablename__ = 'color_lists'
  222.  
  223. id = Column('id', Integer, primary_key=True)
  224. name = Column('name', String(128), nullable=False)
  225. factor = Column('factor', Float, nullable=False)
  226.  
  227. items = relationship('ColorListItem', back_populates='list')
  228.  
  229.  
  230. class ColorListItem(Base, Service):
  231. __tablename__ = 'color_list_items'
  232.  
  233. id = Column('id', Integer, primary_key=True)
  234. pattern = Column('pattern', String(256), nullable=False)
  235. list_id = Column('list_id', Integer, ForeignKey('color_lists.id'))
  236.  
  237. list = relationship('ColorList', back_populates='items')
  238.  
  239.  
  240. class TermSchema(ModelSchema):
  241. class Meta:
  242. model = Term
  243. sqla_session = session
  244.  
  245.  
  246. term_schema = TermSchema(Term)
  247.  
  248.  
  249. result = term_schema.validate({'id': 100, 'value': 'qwerty'})
  250. print(result)
Add Comment
Please, Sign In to add comment