check and fix sql part for the env
Showing
7 changed files
with
82 additions
and
34 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