Passed
Push — master ( e9e603...c36ccf )
by dai
04:57
created

school_api.client.SchoolClient.ping()   A

Complexity

Conditions 3

Size

Total Lines 10
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nop 1
dl 0
loc 10
rs 9.95
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
from __future__ import absolute_import, unicode_literals
3
4
import requests
5
6
from school_api.client.api.place_schedule import PlaceSchedule
7
from school_api.client.api.schedule import Schedule
8
from school_api.client.api.score import Score
9
from school_api.client.api.user_info import UserlInfo
10
from school_api.client.base import BaseUserClient
11
from school_api.client.utils import UserType, error_handle, ApiPermissions, get_time_list
12
from school_api.config import URL_PATH_LIST, CLASS_TIME
13
from school_api.session.memorystorage import MemoryStorage
14
from school_api.utils import to_text, ObjectDict
15
16
17
class SchoolClient(object):
18
    ''' 学校实例 '''
19
20
    def __init__(self, url, name=None, code=None, use_ex_handle=True, exist_verify=True, lan_url=None, proxies=None,
21
                 priority_proxy=False, timeout=10, login_url_path=None, url_path_list=None,
22
                 class_time_list=None, session=None):
23
        school = {
24
            'code': code,
25
            'lan_url': lan_url,
26
            'proxies': proxies,
27
            'timeout': timeout,
28
            'name': to_text(name),
29
            'exist_verify': exist_verify,
30
            'use_ex_handle': use_ex_handle,
31
            'priority_proxy': priority_proxy,
32
            'login_url': login_url_path or "/default2.aspx",
33
            'url_path_list': url_path_list or URL_PATH_LIST,
34
            'time_list': get_time_list(class_time_list or CLASS_TIME)
35
        }
36
        self.base_url = url.split('/default')[0] if url[-4:] == 'aspx' else url
37
        self.session = session or MemoryStorage()
38
        self.school = ObjectDict(school)
39
40
    def user_login(self, account, password, use_cookie_login=True, **kwargs):
41
        ''' 用户登录入口
42
        进行首次绑定操作时,请将 use_cookie_login 设置为False,避免其他用户进行会话登录
43
        :param account:  用户账号
44
        :param password: 用户密码
45
        :param user_type: 0.学生 1.教师 2.部门
46
        :param use_cookie_login: 是否使用会话登陆
47
        :param requests模块参数
48
        return 用户实例
49
        '''
50
        use_cookie_login = kwargs.pop("use_login_cookie", use_cookie_login)  # 兼容低版本
51
        user_type = kwargs.pop('user_type', UserType.STUDENT)
52
        user = UserClient(self, account, password, user_type)
53
        user = user.user_login(use_cookie_login, **kwargs)
54
        return user
55
56
    def ping(self):
57
        # 检查是否可访问
58
        try:
59
            requests.head(self.base_url, timeout=5)
60
        except requests.exceptions.RequestException:
61
            try:
62
                requests.head(self.base_url, timeout=5)
63
            except requests.exceptions.RequestException:
64
                return False
65
        return True
66
67
68
class UserClient(BaseUserClient):
69
    ''' 用户实例 '''
70
71
    score = Score()
72
    info = UserlInfo()
73
    schedule = Schedule()
74
    place_schedule = PlaceSchedule()
75
76
    @error_handle
77
    def user_login(self, use_cookie_login, **kwargs):
78
        ''' 登录:通过SchoolClient类调用 '''
79
        login_session = None
80
        if use_cookie_login:
81
            login_session = self.session_management()
82
83
        if login_session is None:
84
            self.login.get_login(self.school, **kwargs)
85
            self.save_login_session()
86
            login_session = self
87
88
        return login_session
89
90
    @error_handle
91
    def get_schedule(self, *args, **kwargs):
92
        return self.schedule.get_schedule(*args, **kwargs)
93
94
    @error_handle
95
    @ApiPermissions([UserType.STUDENT, UserType.TEACHER])
96
    def get_info(self, **kwargs):
97
        return self.info.get_info(**kwargs)
98
99
    @error_handle
100
    @ApiPermissions([UserType.STUDENT])
101
    def get_score(self, *args, **kwargs):
102
        return self.score.get_score(*args, **kwargs)
103
104
    @error_handle
105
    @ApiPermissions([UserType.DEPT])
106
    def get_place_schedule(self, *args, **kwargs):
107
        return self.place_schedule.get_schedule(*args, **kwargs)
108