a3ee277d by 胡边

check and fix sql part for the env

......@@ -3,4 +3,4 @@
from server.app import web_app
if __name__ == "__main__":
web_app.run(host='0.0.0.0', port=7788)
web_app.run(host='0.0.0.0', port=7788, debug=True)
......
# -*- coding: utf-8 -*-
from flask_restful import Resource, reqparse
from flask import request
from server.services.user import user_service
from server.utils.api_response import ok
from flask_restful import Resource
......@@ -11,4 +17,8 @@ class UserResource(Resource):
class UserListResource(Resource):
def get(self):
return []
parse = reqparse.RequestParser()
parse.add_argument('name', type=str, location='args', required=False)
parse.add_argument('role', type=str, location='args', required=False)
args = parse.parse_args()
return ok(data=user_service.get_user_list(args))
......
# -*- coding: utf-8 -*-
from server.app import web_api
from server.database import db_adapter
from flask_restful import Resource
from server.api.resources import user
from server.app import web_api
class TestResource(Resource):
def get(self):
return "server started"
class HostResource(Resource):
def get(self):
return "passed"
def init_routes():
web_api.add_resource(TestResource, "/api/test")
web_api.add_resource(HostResource, "/api/users")
web_api.add_resource(user.UserListResource, "/api/users")
web_api.add_resource(user.UserResource, "/api/user")
......
......@@ -4,10 +4,11 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from db_adapters import SQLAlchemyAdapter
from db_adapters import SQLAlchemyAdapter
from server.utils import get_config
engine = create_engine('mysql://root:123456@localhost/sunnycloud',
engine = create_engine(get_config('mysql_connection'),
convert_unicode=True,
pool_size=50,
max_overflow=100,
......
......@@ -6,7 +6,11 @@ from . import Base, db_adapter
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Text, TypeDecorator
from sqlalchemy.orm import relation, backref
from datetime import datetime
from server.utils import get_now
from pytz import utc
from dateutil import parser
def relationship(*arg, **kw):
......@@ -15,11 +19,15 @@ def relationship(*arg, **kw):
return ret
def date_serializer(date):
return long((date - datetime(1970, 1, 1)).total_seconds() * 1000)
def to_dic(inst, cls):
# add your coversions for things like datetime's
# and what-not that aren't serializable.
convert = dict()
# convert[TZDateTime] = date_serializer
convert[TZDateTime] = date_serializer
d = dict()
for c in cls.__table__.columns:
......@@ -39,6 +47,33 @@ def to_json(inst, cls):
return json.dumps(to_dic(inst, cls))
class TZDateTime(TypeDecorator):
"""
usage: remove datetime's tzinfo
To set all datetime datas are the naive datetime (tzinfo=None)
in the whole environment
"""
impl = DateTime
def process_bind_param(self, value, dialect):
if value is not None:
if isinstance(value, basestring) or isinstance(value, str):
value = parser.parse(value)
if isinstance(value, datetime):
if value.tzinfo is not None:
value = value.astimezone(utc)
value.replace(tzinfo=None)
return value
def process_result_value(self, value, dialect):
if value is not None:
if isinstance(value, datetime):
if value.tzinfo is not None:
value = value.astimezone(utc)
value.replace(tzinfo=None)
return value
class DBBase(Base):
"""
DB model base class, providing basic functions
......@@ -66,8 +101,8 @@ class User(DBBase):
password = Column(String(128))
role = Column(String(16))
status = Column(String(32))
create_time = Column(DateTime, default=get_now())
last_login_time = Column(DateTime, default=get_now())
create_time = Column(TZDateTime, default=get_now())
last_login_time = Column(TZDateTime, default=get_now())
def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
......@@ -82,8 +117,8 @@ class UserToken(DBBase):
user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE'))
user = relationship('User', backref=backref('tokens', lazy='dynamic'))
create_time = Column(DateTime, default=get_now())
expire_time = Column(DateTime, nullable=False)
create_time = Column(TZDateTime, default=get_now())
expire_time = Column(TZDateTime, nullable=False)
def __init__(self, **kwargs):
super(UserToken, self).__init__(**kwargs)
......
......@@ -35,15 +35,19 @@ class UserService(object):
return db_adapter.get_first_object_by(User, d=id)
def get_user_list(self, filter_json):
sql_condition = 1 == 1
for condition in filter_json:
if condition == 'begin_time':
sql_condition = sql_condition, User.condition > filter_json['begin_time']
elif condition == 'end_time':
sql_condition = sql_condition, User.condition < filter_json['end_time']
else:
sql_condition = sql_condition, User.condition == filter_json['condition']
return db_adapter.get_all_objects(User, sql_condition)
conditions = [1 == 1]
if 'begin_time' in filter_json:
conditions.append(User.create_time > filter_json['begin_time'])
if 'end_time' in filter_json:
conditions.append(User.create_time > filter_json['end_time'])
if 'role' in filter_json:
conditions.append(User.role == filter_json['role'])
if 'name' in filter_json:
conditions.append(User.name.like("%" + filter_json['name'] + "%"))
user_list = db_adapter.get_all_objects(User, *conditions)
return map(lambda x: x.dic(), user_list)
# --------------- helper private functions ---------------------#
......@@ -56,3 +60,6 @@ class UserService(object):
issue_date=token_issue_date)
user_token.save()
return user_token
user_service = UserService()
\ No newline at end of file
......
......@@ -2,8 +2,8 @@
from server.database import Base, engine
from server.database.models import Host
from server.database import db_adapter
from server.database.models import User, UserToken
def setup_db():
......@@ -15,12 +15,10 @@ def setup_db():
Base.metadata.create_all(bind=engine)
# init REQUIRED db data.
db_adapter.add_object_kwargs(Host,
id='1',
hostname='test1',
public_ip='10.0.2.15',
private_ip='127.0.0.1',
mem='32G',
cores=16
db_adapter.add_object_kwargs(User,
id=1,
name='super_admin',
password='123456',
role='admin'
)
setup_db()
setup_db()
\ No newline at end of file
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!