Skip to content

Commit 3149540

Browse files
committed
adding sqla stuff
1 parent 0ef3770 commit 3149540

4 files changed

Lines changed: 117 additions & 2 deletions

File tree

tkp_utils/sqla/__init__.py

Whitespace-only changes.

tkp_utils/sqla/fixtures.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import sys
2+
from sqlalchemy import create_engine
3+
from sqlalchemy.orm import sessionmaker
4+
from .models import Base, User, APIKey
5+
6+
7+
def main(sql_url, application_name="TKP_UTILS", user_class=User, apikey_class=APIKey):
8+
'''Create dummy notebook data for sqlalchemy'''
9+
engine = create_engine(sql_url, echo=False)
10+
Base.metadata.create_all(engine)
11+
sm = sessionmaker(bind=engine)
12+
13+
session = sm()
14+
admin = User(username='admin',
15+
password='admin',
16+
email='test@test.com',
17+
admin=True)
18+
try:
19+
session.add(admin)
20+
session.commit()
21+
session.refresh(admin)
22+
print('added admin: {}'.format(admin))
23+
key = APIKey(user=admin)
24+
session.add(key)
25+
session.commit()
26+
session.refresh(key)
27+
print('added apikey: {}'.format(key))
28+
with open("keys.sh", "w") as fp:
29+
fp.write("#!/bin/bash\n")
30+
fp.write("export TKP_UTILS={}\n".format(key.key))
31+
fp.write("export TKP_UTILS={}\n".format(key.secret))
32+
except BaseException:
33+
session.rollback()
34+
admin = session.query(User).filter_by(username='test').first()
35+
print('admin exists: {}'.format(admin))
36+
37+
38+
if __name__ == '__main__':
39+
if len(sys.argv) < 2:
40+
print("args: <sql_url>")
41+
else:
42+
main(sys.argv[1])

tkp_utils/sqla/models.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import pandas as pd
2+
import six
3+
import secrets
4+
import ujson
5+
import validators
6+
from datetime import datetime, timedelta
7+
from sqlalchemy import Column, Integer, String, Boolean, DateTime, JSON, ForeignKey
8+
from sqlalchemy.ext.hybrid import hybrid_property
9+
from sqlalchemy.orm import relationship
10+
from sqlalchemy.ext.declarative import declarative_base
11+
12+
TOKEN_WIDTH = 64
13+
Base = declarative_base()
14+
15+
16+
class User(Base):
17+
__tablename__ = 'users'
18+
id = Column(Integer, primary_key=True)
19+
username = Column(String(100), nullable=False, unique=True)
20+
password = Column(String(100), nullable=False)
21+
22+
_email = Column("email", String, nullable=False, unique=True)
23+
24+
apikeys = relationship('APIKey', back_populates='client')
25+
admin = Column(Boolean, default=False)
26+
27+
@hybrid_property
28+
def email(self):
29+
return self._email
30+
31+
@email.setter
32+
def email(self, email):
33+
# TODO validate
34+
self._email = email
35+
36+
def __repr__(self):
37+
return "<User(id='{}', username='{}')>".format(self.id, self.username)
38+
39+
def to_dict(self):
40+
ret = {}
41+
for item in ("id", "username", "email"):
42+
ret[item] = getattr(self, item)
43+
return ret
44+
45+
def from_dict(self, d):
46+
raise NotImplementedError()
47+
48+
49+
class APIKey(Base):
50+
__tablename__ = 'apikeys'
51+
id = Column(Integer, primary_key=True)
52+
user_id = Column(Integer, ForeignKey('users.id', ondelete='cascade'))
53+
user = relationship('User', back_populates='apikeys')
54+
key = Column(String(100), nullable=False, default=lambda: secrets.token_urlsafe(TOKEN_WIDTH))
55+
secret = Column(String(100), nullable=False, default=lambda: secrets.token_urlsafe(TOKEN_WIDTH))
56+
57+
@staticmethod
58+
def generateKey():
59+
return {'key': secrets.token_urlsafe(TOKEN_WIDTH),
60+
'secret': secrets.token_urlsafe(TOKEN_WIDTH)}
61+
62+
def __repr__(self):
63+
return "<Key(id='{}', key='{}', secret='***')>".format(self.id, self.key)
64+
65+
def to_dict(self):
66+
ret = {}
67+
for item in ("id", "user_id", "key", "secret"):
68+
ret[item] = getattr(self, item)
69+
return ret
70+
71+
def from_dict(self, d):
72+
raise NotImplementedError()

tkp_utils/tornado/handlers/base.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from concurrent.futures import ThreadPoolExecutor
66
from contextlib import contextmanager
77
from jinja2 import Environment, FileSystemLoader, TemplateNotFound
8+
from ...sqla.models import User, APIKey
89
from ...web import parse_body
910

1011

@@ -145,8 +146,8 @@ def render_template(self, template, **kwargs):
145146

146147
def initialize(self,
147148
sessionmaker=None,
148-
UserSQLClass=None,
149-
APIKeySQLClass=None,
149+
UserSQLClass=User,
150+
APIKeySQLClass=APIKey,
150151
user_id_field='id',
151152
apikey_id_field='id',
152153
user_apikeys_field='apikeys',

0 commit comments

Comments
 (0)