check and fix sql part for the env
Showing
7 changed files
with
83 additions
and
35 deletions
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | 2 | ||
| 3 | from flask_restful import Resource, reqparse | ||
| 4 | from flask import request | ||
| 5 | |||
| 6 | from server.services.user import user_service | ||
| 7 | from server.utils.api_response import ok | ||
| 8 | |||
| 3 | 9 | ||
| 4 | from flask_restful import Resource | 10 | from flask_restful import Resource |
| 5 | 11 | ||
| ... | @@ -11,4 +17,8 @@ class UserResource(Resource): | ... | @@ -11,4 +17,8 @@ class UserResource(Resource): |
| 11 | 17 | ||
| 12 | class UserListResource(Resource): | 18 | class UserListResource(Resource): |
| 13 | def get(self): | 19 | def get(self): |
| 14 | return [] | 20 | parse = reqparse.RequestParser() |
| 21 | parse.add_argument('name', type=str, location='args', required=False) | ||
| 22 | parse.add_argument('role', type=str, location='args', required=False) | ||
| 23 | args = parse.parse_args() | ||
| 24 | return ok(data=user_service.get_user_list(args)) | ... | ... |
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | from server.app import web_api | ||
| 5 | from server.database import db_adapter | ||
| 6 | from flask_restful import Resource | 4 | from flask_restful import Resource |
| 7 | 5 | ||
| 6 | from server.api.resources import user | ||
| 7 | from server.app import web_api | ||
| 8 | |||
| 8 | 9 | ||
| 9 | class TestResource(Resource): | 10 | class TestResource(Resource): |
| 10 | def get(self): | 11 | def get(self): |
| 11 | return "server started" | 12 | return "server started" |
| 12 | 13 | ||
| 13 | 14 | ||
| 14 | class HostResource(Resource): | ||
| 15 | def get(self): | ||
| 16 | return "passed" | ||
| 17 | |||
| 18 | |||
| 19 | def init_routes(): | 15 | def init_routes(): |
| 20 | web_api.add_resource(TestResource, "/api/test") | 16 | web_api.add_resource(TestResource, "/api/test") |
| 21 | web_api.add_resource(HostResource, "/api/users") | 17 | web_api.add_resource(user.UserListResource, "/api/users") |
| 18 | web_api.add_resource(user.UserResource, "/api/user") | ... | ... |
| ... | @@ -4,10 +4,11 @@ | ... | @@ -4,10 +4,11 @@ |
| 4 | from sqlalchemy import create_engine | 4 | from sqlalchemy import create_engine |
| 5 | from sqlalchemy.orm import scoped_session, sessionmaker | 5 | from sqlalchemy.orm import scoped_session, sessionmaker |
| 6 | from sqlalchemy.ext.declarative import declarative_base | 6 | from sqlalchemy.ext.declarative import declarative_base |
| 7 | from db_adapters import SQLAlchemyAdapter | ||
| 8 | 7 | ||
| 8 | from db_adapters import SQLAlchemyAdapter | ||
| 9 | from server.utils import get_config | ||
| 9 | 10 | ||
| 10 | engine = create_engine('mysql://root:123456@localhost/sunnycloud', | 11 | engine = create_engine(get_config('mysql_connection'), |
| 11 | convert_unicode=True, | 12 | convert_unicode=True, |
| 12 | pool_size=50, | 13 | pool_size=50, |
| 13 | max_overflow=100, | 14 | max_overflow=100, | ... | ... |
| ... | @@ -6,7 +6,11 @@ from . import Base, db_adapter | ... | @@ -6,7 +6,11 @@ from . import Base, db_adapter |
| 6 | from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Text, TypeDecorator | 6 | from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Text, TypeDecorator |
| 7 | from sqlalchemy.orm import relation, backref | 7 | from sqlalchemy.orm import relation, backref |
| 8 | 8 | ||
| 9 | from datetime import datetime | ||
| 10 | |||
| 9 | from server.utils import get_now | 11 | from server.utils import get_now |
| 12 | from pytz import utc | ||
| 13 | from dateutil import parser | ||
| 10 | 14 | ||
| 11 | 15 | ||
| 12 | def relationship(*arg, **kw): | 16 | def relationship(*arg, **kw): |
| ... | @@ -15,11 +19,15 @@ def relationship(*arg, **kw): | ... | @@ -15,11 +19,15 @@ def relationship(*arg, **kw): |
| 15 | return ret | 19 | return ret |
| 16 | 20 | ||
| 17 | 21 | ||
| 22 | def date_serializer(date): | ||
| 23 | return long((date - datetime(1970, 1, 1)).total_seconds() * 1000) | ||
| 24 | |||
| 25 | |||
| 18 | def to_dic(inst, cls): | 26 | def to_dic(inst, cls): |
| 19 | # add your coversions for things like datetime's | 27 | # add your coversions for things like datetime's |
| 20 | # and what-not that aren't serializable. | 28 | # and what-not that aren't serializable. |
| 21 | convert = dict() | 29 | convert = dict() |
| 22 | # convert[TZDateTime] = date_serializer | 30 | convert[TZDateTime] = date_serializer |
| 23 | 31 | ||
| 24 | d = dict() | 32 | d = dict() |
| 25 | for c in cls.__table__.columns: | 33 | for c in cls.__table__.columns: |
| ... | @@ -39,6 +47,33 @@ def to_json(inst, cls): | ... | @@ -39,6 +47,33 @@ def to_json(inst, cls): |
| 39 | return json.dumps(to_dic(inst, cls)) | 47 | return json.dumps(to_dic(inst, cls)) |
| 40 | 48 | ||
| 41 | 49 | ||
| 50 | class TZDateTime(TypeDecorator): | ||
| 51 | """ | ||
| 52 | usage: remove datetime's tzinfo | ||
| 53 | To set all datetime datas are the naive datetime (tzinfo=None) | ||
| 54 | in the whole environment | ||
| 55 | """ | ||
| 56 | impl = DateTime | ||
| 57 | |||
| 58 | def process_bind_param(self, value, dialect): | ||
| 59 | if value is not None: | ||
| 60 | if isinstance(value, basestring) or isinstance(value, str): | ||
| 61 | value = parser.parse(value) | ||
| 62 | if isinstance(value, datetime): | ||
| 63 | if value.tzinfo is not None: | ||
| 64 | value = value.astimezone(utc) | ||
| 65 | value.replace(tzinfo=None) | ||
| 66 | return value | ||
| 67 | |||
| 68 | def process_result_value(self, value, dialect): | ||
| 69 | if value is not None: | ||
| 70 | if isinstance(value, datetime): | ||
| 71 | if value.tzinfo is not None: | ||
| 72 | value = value.astimezone(utc) | ||
| 73 | value.replace(tzinfo=None) | ||
| 74 | return value | ||
| 75 | |||
| 76 | |||
| 42 | class DBBase(Base): | 77 | class DBBase(Base): |
| 43 | """ | 78 | """ |
| 44 | DB model base class, providing basic functions | 79 | DB model base class, providing basic functions |
| ... | @@ -66,8 +101,8 @@ class User(DBBase): | ... | @@ -66,8 +101,8 @@ class User(DBBase): |
| 66 | password = Column(String(128)) | 101 | password = Column(String(128)) |
| 67 | role = Column(String(16)) | 102 | role = Column(String(16)) |
| 68 | status = Column(String(32)) | 103 | status = Column(String(32)) |
| 69 | create_time = Column(DateTime, default=get_now()) | 104 | create_time = Column(TZDateTime, default=get_now()) |
| 70 | last_login_time = Column(DateTime, default=get_now()) | 105 | last_login_time = Column(TZDateTime, default=get_now()) |
| 71 | 106 | ||
| 72 | def __init__(self, **kwargs): | 107 | def __init__(self, **kwargs): |
| 73 | super(User, self).__init__(**kwargs) | 108 | super(User, self).__init__(**kwargs) |
| ... | @@ -82,8 +117,8 @@ class UserToken(DBBase): | ... | @@ -82,8 +117,8 @@ class UserToken(DBBase): |
| 82 | user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE')) | 117 | user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE')) |
| 83 | user = relationship('User', backref=backref('tokens', lazy='dynamic')) | 118 | user = relationship('User', backref=backref('tokens', lazy='dynamic')) |
| 84 | 119 | ||
| 85 | create_time = Column(DateTime, default=get_now()) | 120 | create_time = Column(TZDateTime, default=get_now()) |
| 86 | expire_time = Column(DateTime, nullable=False) | 121 | expire_time = Column(TZDateTime, nullable=False) |
| 87 | 122 | ||
| 88 | def __init__(self, **kwargs): | 123 | def __init__(self, **kwargs): |
| 89 | super(UserToken, self).__init__(**kwargs) | 124 | super(UserToken, self).__init__(**kwargs) | ... | ... |
| ... | @@ -35,15 +35,19 @@ class UserService(object): | ... | @@ -35,15 +35,19 @@ class UserService(object): |
| 35 | return db_adapter.get_first_object_by(User, d=id) | 35 | return db_adapter.get_first_object_by(User, d=id) |
| 36 | 36 | ||
| 37 | def get_user_list(self, filter_json): | 37 | def get_user_list(self, filter_json): |
| 38 | sql_condition = 1 == 1 | 38 | conditions = [1 == 1] |
| 39 | for condition in filter_json: | 39 | |
| 40 | if condition == 'begin_time': | 40 | if 'begin_time' in filter_json: |
| 41 | sql_condition = sql_condition, User.condition > filter_json['begin_time'] | 41 | conditions.append(User.create_time > filter_json['begin_time']) |
| 42 | elif condition == 'end_time': | 42 | if 'end_time' in filter_json: |
| 43 | sql_condition = sql_condition, User.condition < filter_json['end_time'] | 43 | conditions.append(User.create_time > filter_json['end_time']) |
| 44 | else: | 44 | if 'role' in filter_json: |
| 45 | sql_condition = sql_condition, User.condition == filter_json['condition'] | 45 | conditions.append(User.role == filter_json['role']) |
| 46 | return db_adapter.get_all_objects(User, sql_condition) | 46 | if 'name' in filter_json: |
| 47 | conditions.append(User.name.like("%" + filter_json['name'] + "%")) | ||
| 48 | |||
| 49 | user_list = db_adapter.get_all_objects(User, *conditions) | ||
| 50 | return map(lambda x: x.dic(), user_list) | ||
| 47 | 51 | ||
| 48 | # --------------- helper private functions ---------------------# | 52 | # --------------- helper private functions ---------------------# |
| 49 | 53 | ||
| ... | @@ -56,3 +60,6 @@ class UserService(object): | ... | @@ -56,3 +60,6 @@ class UserService(object): |
| 56 | issue_date=token_issue_date) | 60 | issue_date=token_issue_date) |
| 57 | user_token.save() | 61 | user_token.save() |
| 58 | return user_token | 62 | return user_token |
| 63 | |||
| 64 | |||
| 65 | user_service = UserService() | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -2,8 +2,8 @@ | ... | @@ -2,8 +2,8 @@ |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | from server.database import Base, engine | 4 | from server.database import Base, engine |
| 5 | from server.database.models import Host | ||
| 6 | from server.database import db_adapter | 5 | from server.database import db_adapter |
| 6 | from server.database.models import User, UserToken | ||
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | def setup_db(): | 9 | def setup_db(): |
| ... | @@ -15,12 +15,10 @@ def setup_db(): | ... | @@ -15,12 +15,10 @@ def setup_db(): |
| 15 | Base.metadata.create_all(bind=engine) | 15 | Base.metadata.create_all(bind=engine) |
| 16 | 16 | ||
| 17 | # init REQUIRED db data. | 17 | # init REQUIRED db data. |
| 18 | db_adapter.add_object_kwargs(Host, | 18 | db_adapter.add_object_kwargs(User, |
| 19 | id='1', | 19 | id=1, |
| 20 | hostname='test1', | 20 | name='super_admin', |
| 21 | public_ip='10.0.2.15', | 21 | password='123456', |
| 22 | private_ip='127.0.0.1', | 22 | role='admin' |
| 23 | mem='32G', | ||
| 24 | cores=16 | ||
| 25 | ) | 23 | ) |
| 26 | setup_db() | 24 | setup_db() |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or sign in to post a comment