Пример #1
0
def upload_doc(username, file_url, file_name, course_id,course_schedule_id,room_id,is_view):
    """
    Upload file as courseware into classroom
    :param username:
    :param file_url: courseware file url
    :param file_name: courseware file display name
    :return: uuid refer to uploaded courseware from provider
    """
    with session_scope(db) as session:
        r = requests.post(
                current_app.config['EP_LOCATION'] + current_app.config[
                    'EP_LIVE_PATH'] + '/uploadFileUrl',
                data=json.dumps({
                    'filename': file_name,
                    'roomId': room_id,
                    'fileUrl': file_url,
                    'username': username
                }), headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        if r.json()['code'] == 0:
            cw = Courseware(
                    ware_name=file_name,
                    ware_desc=file_name,
                    ware_url=file_url,
                    ware_uid=r.json()['uuid'],
                    checked_result=CoursewareCheckResultEnum.BEFORE_CHECK,
                    course_id=course_id,
                    course_schedule_id = course_schedule_id,
                    room_id = room_id,
                    is_view = is_view
            )
            session.add(cw)
    return r.json()['uuid']
Пример #2
0
 def process(self):
     """ Data is saved into the database """
     with session_scope() as session:
         self._event_data_session(session)
         self._venues_data_session(session)
         self._attractions_data_session(session)
         session.commit()
Пример #3
0
def student_logo():
    """
    swagger-doc: 'schedule'
    required: []
    req:

    res:
      url:
        description: ''
        type: 'string'
    """
    student_id = getattr(g, current_app.config['CUR_USER'])['id']

    url = 'images/logo.png'

    domain_address = 'http://www.vipustutor.com/'

    with session_scope(db) as session:

        student = session.query(Student).filter_by(id=student_id).one_or_none()

        if student is not None  and student.channel_id is not None:
            channel = session.query(Channel).filter_by(id=student.channel_id).one_or_none()
            if channel is not None :
                if channel.logo_url is not None:
                    url = channel.logo_url
                if channel.domain_address is not None:
                    domain_address = channel.domain_address

    return jsonify({'url':url,'domain_address':domain_address })
Пример #4
0
def remove_doc(username, room_id, ware_uid):
    """
    Remove attached course ware from room
    :param username:
    :param room_id: class room created for lecture
    :param ware_uid: previously uploaded course ware uid returned by provider
    :return: None
    """
    with session_scope(db) as session:
        cw = session.query(Courseware).filter(
                Courseware.ware_uid == ware_uid).one_or_none()
        if cw:
            r = requests.post(
                    current_app.config['EP_LOCATION'] + current_app.config[
                        'EP_LIVE_PATH'] + '/removeDocument',
                    data=json.dumps({
                        'documentId': ware_uid,
                        'roomId': room_id,
                        'username': username
                    }), headers={'Content-type': 'application/json'})
            current_app.logger.debug(r.text)
            if r.json()['code'] == 0:
                if cw.room_id:
                    temp = eval(cw.room_id)
                    temp.remove(room_id)
                    cw.room_id = str(temp)
                session.merge(cw)
            else:
                raise RuntimeError('calling removeDocument failed')
        else:
            raise RuntimeError(
                    'can not find course ware, according to ware_uid')
Пример #5
0
def preview_doc(username, ware_uid):
    """
    Get course ware preview url
    :param username:
    :param ware_uid:
    :return: url
    """
    with session_scope(db) as session:
        cw = session.query(Courseware).filter(
                Courseware.ware_uid == ware_uid).one_or_none()
        if cw:
            r = requests.post(
                    current_app.config['EP_LOCATION'] + current_app.config[
                        'EP_LIVE_PATH'] + '/previewDocUrl',
                    data=json.dumps({
                        'documentId': ware_uid,
                        'username': username
                    }), headers={'Content-type': 'application/json'})
            current_app.logger.debug(r.text)
            if r.json()['code'] == 0:
                return r.json()['url']
            else:
                raise RuntimeError('calling previewDocUrl failed')
        else:
            raise RuntimeError(
                    'can not find course ware, according to ware_uid')
Пример #6
0
def delete_room(username, room_id):
    """
    Delete living teaching room.
    :param username: user account name
    :param room_id: room id returned by provider after doing room creation
    :return: None if delete succ
    """
    current_app.logger.debug(room_id)
    with session_scope(db) as session:
        course_classroom = session.query(CourseClassroom).filter(
                CourseClassroom.room_id == room_id).one_or_none()
        if not course_classroom:
            raise RuntimeError('CourseClassroom of room_id passed in not found')
        r = requests.post(
                current_app.config['EP_LOCATION'] + current_app.config[
                    'EP_LIVE_PATH'] + '/deleteRoom',
                data=json.dumps({
                    'roomId': room_id,
                    'userName': username
                }), headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        if r.json()['code'] == 0:
            course_classroom.state = ClassroomStateEnum.DELETED
            session.merge(course_classroom)
        else:
            raise RuntimeError(r.json()['message'])
Пример #7
0
def do_query(params, generate_sql):
    current_app.logger.debug(params)
    with session_scope(db) as session:
        columns, sql = generate_sql(params)
        current_app.logger.debug(sql)
        result = session.execute(sql, params)
        # default page_no to 1
        page_no = 1
        if params['page_no']:
            page_no = params['page_no']
        # default page_limit to 10 records per page
        page_limit = 10
        if params['page_limit']:
            page_limit = params['page_limit']
        # calculate offset
        offset = (page_no - 1) * page_limit
        rows = result.fetchall()
        row_count = len(rows)
        total_pages = row_count // page_limit
        if row_count % page_limit != 0:
            total_pages = total_pages + 1
        final_result = {
            'objects': [],
            'num_results': row_count,
            'page': page_no,
            'total_pages': total_pages
        }
        for index, row in enumerate(rows):
            current_app.logger.debug('row ' + str(index) + ' = ' + str(row))
            if (offset + page_limit) > index >= offset:
                final_result['objects'].append(
                    dict((c, v) for c, v in zip(columns, row)))
        return final_result
Пример #8
0
def upload_courseware():
    """
    swagger-doc: 'schedule'
    required: []
    req:
      course_schedule_id:
        description: '课节id'
        type: 'string'
      start:
        description: '开始时间'
        type: 'string'
      end:
        description: '结束时间'
        type: 'string'
    res:
      verify_code:
        description: 'id'
        type: ''
    """
    course_schedule_id = request.json['course_schedule_id']
    start = request.json['start'].replace('T', ' ').replace('Z', '')
    end = request.json['end'].replace('T', ' ').replace('Z', '')

    with session_scope(db) as session:

        courseSchedule = session.query(CourseSchedule).filter_by(id=course_schedule_id).one_or_none()

        courseclassroom = session.query(CourseClassroom).filter_by(course_schedule_id=course_schedule_id).one_or_none()

        if courseSchedule is None or courseclassroom is None:
            return jsonify({
                "error": "not found course_schedule: {0}".format(
                    course_schedule_id)
            }), 500

        setattr(courseSchedule,'start',start)
        setattr(courseSchedule,'end',end)
        session.add(courseSchedule)
        session.flush()

        live_service.edit_room(getattr(g, current_app.config['CUR_USER'])['username'],courseclassroom.room_id,courseclassroom.room_title,
                               getTimeDiff(start,end),request.json['start'],request.json['end'],0,'en')

        studyschedules = session.query(StudySchedule).filter_by(course_schedule_id=course_schedule_id).all()

        if studyschedules is None or len(studyschedules)<1:
            return jsonify({
                "error": "not found Course_Class_room: {0}".format(
                    course_schedule_id)
            }), 500

        for studyschedule in studyschedules:

            setattr(studyschedule,'actual_start',start)
            setattr(studyschedule,'actual_end',end)
            session.add(studyschedule)
            session.flush()

    return jsonify({'id':courseSchedule.id })
Пример #9
0
def register_account(data):
    username = data.get('username')
    password = data.get('password')
    age = data.get('age')
    with session_scope() as db_session:
        user = User(username=username, password=password, age=age)
        db_session.add(user)
        db_session.commit()

        return {'username': user.username}
Пример #10
0
def resetpassword():
    """
    swagger-doc: 'do resetpassword with verify code sent by email or sms'
    required: ['username', 'password', 'verify_code']
    req:
      username:
        description: 'login user name'
        type: 'string'
      password:
        description: 'login user password'
        type: 'string'
      verify_code:
        description: 'code sent by calling email verify or sms verify'
        type: 'string'
    res:
      message:
        description: 'success message for reset password'
        type: 'string'
    """
    current_app.logger.debug(request.json)
    user_name = request.json['username']
    verify_code = request.json['verify_code']
    password = request.json['password']
    oldpassword = ''
    mobile = ''
    check_target = redis_store.get('VC:' + user_name)
    if check_target:
        check_target = check_target.decode('utf8')
    else:
        check_target = 'None'
    current_app.logger.debug(verify_code + ' ' + check_target + ' ' +
                             str(verify_code != check_target))
    if verify_code != check_target:
        return jsonify({'message': 'verify code check failed'}), 401
    with session_scope(db) as session:
        # check existing username in all 3 tables
        for table_checked in user_source.values():
            row1 = session.query(table_checked).filter(
                table_checked.username == user_name).one_or_none()
            current_app.logger.debug("table_checked.__name__ " +
                                     str(table_checked.__name__))
            if row1:
                # update password
                current_app.logger.debug('password: '******'new password: '******'en')

                return jsonify({'message': 'reset password succ!'})

    return jsonify({'message': user_name + ' not found!'}), 401
Пример #11
0
def create_room(username, course_schedule_id, title, length=60,
                room_type=ClassroomTypeEnum.ONE_VS_ONE,
                start_time=datetime.now().isoformat()[:-3] + 'Z', user_type=0,
                lang='en'):
    """
    Create living teaching room for teach and students.
    :param username: user account name
    :param course_schedule_id: course schedule id
    :param title: room title displayed
    :param length: lecture room services time duration
    :param room_type: 1: 1V1, 2:1VMany, 3:Public-lecture
    :param start_time: room available time
    :param user_type: preserved for future use
    :param lang: user preferred lang
    :return: room created by third-party provider
    """
    r = requests.post(
            current_app.config['EP_LOCATION'] + current_app.config[
                'EP_LIVE_PATH'] + '/createRoom',
            data=json.dumps({
                'title': title,
                'startTime': start_time,
                'length': length,
                'menNum': ClassroomTypeEnum[room_type].value,
                'userName': username,
                'lang': lang,
                'userType': user_type,
            }), headers={'Content-type': 'application/json'})
    current_app.logger.debug(r.text)
    j = r.json()['room']
    with session_scope(db) as session:
        if r.json()['code'] == 0:
            # succ, insert CourseClassroom record
            duration_start = datetime.strptime(j['startTime'],
                                               '%Y-%m-%dT%H:%M:%S.%fZ')
            duration_end = datetime.strptime(j['endTime'],
                                             '%Y-%m-%dT%H:%M:%S.%fZ')
            course_classroom = CourseClassroom(
                    provider=1,
                    course_schedule_id=course_schedule_id,
                    video_ready=1,
                    updated_by=username,
                    room_type=room_type,
                    state=ClassroomStateEnum.CREATED,
                    host_code=j['hostCode'],
                    room_id=j['roomId'],
                    room_title=title,
                    duration_start=duration_start,
                    duration_end=duration_end)
            session.add(course_classroom)
            return r.json()['room']
        else:
            raise RuntimeError(r.json()['message'])
Пример #12
0
def edit_course_schedule_type():
    """
    swagger-doc: 'schedule'
    required: []
    req:
      course_schedule_id:
        description: '课节id'
        type: 'string'
      type:
        description: '类型'
        type: 'string'
    res:
      verify_code:
        description: 'id'
        type: ''
    """
    course_schedule_id = request.json['course_schedule_id']
    type = request.json['type']

    with session_scope(db) as session:

        courseSchedule = session.query(CourseSchedule).filter_by(id=course_schedule_id).one_or_none()

        if courseSchedule is None :
            return jsonify({
                "error": "not found course_schedule: {0}".format(
                    course_schedule_id)
            }), 500

        setattr(courseSchedule,'schedule_type',type)
        session.add(courseSchedule)
        session.flush()

        studyschedules = session.query(StudySchedule).filter_by(course_schedule_id=course_schedule_id).all()

        if studyschedules is None or len(studyschedules)<1:
            return jsonify({
                "error": "not found Course_Class_room: {0}".format(
                    course_schedule_id)
            }), 500

        for studyschedule in studyschedules:

            setattr(studyschedule,'schedule_type',type)
            session.add(studyschedule)
            session.flush()

    return jsonify({'id':courseSchedule.id })
Пример #13
0
def enter_room(username, room_id, nick_name,
               role_in_classroom=ClassroomRoleEnum.ASSISTANT,
               device_type=ClassroomDeviceEnum.PC):
    """
    Get url for classroom by provide nick_name, role and device_type
    :param username:
    :param room_id: class room created before
    :param nick_name: name displayed in class room
    :param role_in_classroom: ClassroomRoleEnum
    :param device_type: ClassroomDeviceEnum
    :return: url for class room
    """
    current_app.logger.debug(room_id)
    with session_scope(db) as session:
        # course_classroom = session.query(CourseClassroom).filter(
        #         CourseClassroom.room_id == room_id).one_or_none()
        # if not course_classroom:
        #     raise RuntimeError('CourseClassroom of room_id passed in not found')
        r = requests.post(
                current_app.config['EP_LOCATION'] + current_app.config[
                    'EP_LIVE_PATH'] + '/getRoomEnterUrl',
                data=json.dumps({
                    'roomId': room_id,
                    'userName': username,
                    'nickname': nick_name,
                    'userRole': ClassroomRoleEnum[role_in_classroom].value - 1,
                    'deviceType': ClassroomDeviceEnum[device_type].value - 1
                }), headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        # if r.json()['code'] == 0:
        #     if course_classroom.room_url:
        #         temp = eval(course_classroom.room_url)
        #         temp.append(r.json()['url'])
        #         course_classroom.room_url = str(temp)
        #     else:
        #         course_classroom.room_url = "['{}']".format(r.json()['url'])
        #     c_c_p = CourseClassParticipant(
        #             role_in_course=role_in_classroom,
        #             access_url=r.json()['url'],
        #             device_type=device_type,
        #             course_classroom_id=course_classroom.id,
        #             role_id=nick_name,
        #             updated_by=username
        #     )
        #     session.add(c_c_p)
        #     session.merge(course_classroom)
    return r.json()['url']
Пример #14
0
def smsverify():
    """
    swagger-doc: 'send verify code by sms'
    required: ['mobile_no']
    req:
      mobile_no:
        description: 'mobile NO to receive verify code'
        type: 'string'
      country_code:
        description: 'country code, if omit, default to 86'
        type: 'string'
    res:
      verify_code:
        description: 'verify code sent to user mobile NO'
        type: 'string'
    """
    mobile_no = request.json['mobile_no']
    country_code = '86'
    verify_code = random.randint(100000, 999999)
    if 'country_code' in request.json:
        country_code = request.json['country_code']
    r = requests.post(current_app.config['EP_LOCATION'] +
                      current_app.config['EP_SMS_PATH'],
                      data=json.dumps({
                          'type': 1,
                          'userName': mobile_no,
                          'registerType': 1,
                          'countryCode': country_code,
                          'code': str(verify_code)
                      }),
                      headers={'Content-type': 'application/json'})
    current_app.logger.debug(r.text)
    if r.json()['code'] == 0:
        with session_scope(db) as session:
            smslog = SmsLog(country_code=country_code,
                            mobile=mobile_no,
                            content=verify_code,
                            sms_channel='TX',
                            state=1,
                            result_code=0,
                            fee=5)
            session.add(smslog)
        redis_store.set('VC:' + mobile_no, str(verify_code))
        return jsonify({'verify_code': str(verify_code)})
    else:
        return jsonify({'message': r.json()['message']}), 500
Пример #15
0
 def sql_query(self):
     with session_scope(db) as session:
         session.add_all([
             Notification(notice='test-1'),
             Notification(notice='test-2', updated_by='rawsql')
         ])
         session.flush()
         sql1 = "select id, notice, updated_at, updated_by " \
                "from notification where notice like :x"
         r2 = session.execute(sql1, {'x': 'test-2'})
         row = r2.first()
         self.app.logger.debug('row=' + str(row))
         self.assertEqual(row['updated_by'], 'rawsql',
                          'check updated_at=rawsql')
         r3 = session.execute(sql1, {'x': 'test%'})
         for index, row in enumerate(r3.fetchall()):
             self.app.logger.debug('row ' + str(index) + ' = ' + str(row))
Пример #16
0
 def test_duobei_live(self):
     '''
     Test for services.live_service
     '''
     url = 'http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/pdf/' \
           'dds-product-introduction-intl-zh-2018-03-30.pdf'
     start_time = datetime.now().isoformat()[:-3] + 'Z'
     self.app.logger.debug(start_time)
     with session_scope(db) as session:
         cs = session.query(CourseSchedule).filter(
             CourseSchedule.updated_by == os.getpid()).first()
         if cs:
             r = create_room('86-13521273258', cs.id, 'test room', 60)
             self.app.logger.debug(r)
             self.assertIsNotNone(r, 'create room not return room for succ')
             room_id = r['roomId']
             r = edit_room('86-13521273258', room_id, 'edit room', 90)
             self.app.logger.debug(r)
             r = enter_room('86-13521273258', room_id, 'Tom')
             self.app.logger.debug(r)
             self.assertIsNotNone(r, 'enter room not return url')
             # test upload course ware
             r = upload_doc('86-13521273258', url, 'python-consul.pdf',
                            cs.course_id)
             self.app.logger.debug(r)
             self.assertIsNotNone(r, 'upload_doc not return ware_uid')
             # attach uploaded course ware with created room
             ware_uid = r
             r = attach_doc('86-13521273258', room_id, ware_uid)
             self.app.logger.debug(r)
             self.assertEqual(None, r,
                              'attach_doc not return None for succ')
             # get preview document url from ware_uid
             self.app.logger.debug('ware_uid: ' + ware_uid)
             r = preview_doc('86-13521273258', ware_uid)
             self.app.logger.debug(r)
             self.assertIsNotNone(r, 'preview_doc not return url for succ')
             # remove document from room
             r = remove_doc('86-13521273258', room_id, ware_uid)
             self.app.logger.debug(r)
             # self.assertEqual(None, r, 'remove_doc not return None for succ')
             # finally delete class room
             r = delete_room('86-13521273258', room_id)
             self.app.logger.debug(r)
             self.assertEqual(None, r,
                              'delete_room not return None for succ')
Пример #17
0
def edit_room(username, room_id, title=None, length=None,
              start_time=None,start_end=None, user_type=0,
              lang='en'):
    """
    Edit living teaching room created before.
    :param username: user account name
    :param room_id: room id returned by provider after doing room creation
    :param title: room title displayed
    :param length: lecture room services time duration
    :param start_time: room available time
    :param user_type: preserved for future use
    :param lang: user preferred lang
    :return: None if succ without error
    """
    with session_scope(db) as session:
        course_classroom = session.query(CourseClassroom).filter(
                CourseClassroom.room_id == room_id).one_or_none()
        if not course_classroom:
            raise RuntimeError('CourseClassroom of room_id passed in not found')
        r = requests.post(
                current_app.config['EP_LOCATION'] + current_app.config[
                    'EP_LIVE_PATH'] + '/editRoom',
                data=json.dumps({
                    'roomId': room_id,
                    'title': title,
                    'startTime': start_time,
                    'langth': length,
                    'userName': username,
                    'lang': lang,
                    'userType': user_type,
                }), headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        j = r.json()['room']
        if r.json()['code'] == 0:
            # succ, insert CourseClassroom record
            if title:
                course_classroom.room_title = title
            if start_time:
                course_classroom.duration_start = start_time.replace('T', ' ').replace('Z', '')
            if length:
                course_classroom.duration_end = start_end.replace('T', ' ').replace('Z', '')
            course_classroom.updated_by = username
            session.merge(course_classroom)
        else:
            raise RuntimeError(r.json()['message'])
Пример #18
0
def save_attachment(file):
    fn = file.filename
    ext = fn.rsplit('.', 1)[1].lower()
    hashed_fn = hashlib.sha256(fn.encode('utf8')).hexdigest() + '.' + ext
    disk_file = os.path.join(current_app.config['UPLOAD_FOLDER'], hashed_fn)
    file.save(disk_file)
    size = os.stat(disk_file).st_size
    updated_by = getattr(g, current_app.config['CUR_ID'])
    with session_scope(db) as session:
        attachment = Attachment(file_name=fn,
                                url_path=hashed_fn,
                                size=size,
                                mime_type=ext,
                                state=1,
                                updated_by=updated_by)
        result = session.add(attachment)
        current_app.logger.debug(result)
    return hashed_fn
Пример #19
0
def save_subject():
    """
    swagger-doc: 'schedule'
    required: []
    req:
      subject_id:
        description: '课节id'
        type: 'int'
      subject_type:
        description: '1:学习科目,2:意向科目'
        type: 'int'
    res:
      id:
        description: ''
        type: ''
    """
    student_id = getattr(g, current_app.config['CUR_USER'])['id']
    subject_id = request.json['subject_id']
    subject_type = request.json['subject_type']
    optional = 2
    if 'optional' in request.json:
        optional = request.json['optional']

    with session_scope(db) as session:

        studentSubject = session.query(StudentSubject).filter_by(student_id=student_id,subject_type=subject_type).one_or_none()

        if studentSubject is None :
            studentSubject = StudentSubject(optional = optional,
                                            subject_type = subject_type,
                                            student_id = student_id,
                                            subject_id = subject_id,
                                            updated_by=getattr(g, current_app.config['CUR_USER'])['username']
                                 )
            session.add(studentSubject)
            session.flush()
        else:
            setattr(studentSubject,'subject_id',subject_id)
            setattr(studentSubject,'subject_type',subject_type)
            setattr(studentSubject,'optional',optional)
            session.add(studentSubject)
            session.flush()

    return jsonify({'id':studentSubject.id })
Пример #20
0
def get_enter_room_url():
    """
    swagger-doc: 'schedule'
    required: []
    req:
      study_schedule_id:
        description: '课节id'
        type: 'string'
    res:
      url:
        description: '登录地址'
        type: ''
    """
    study_schedule_id = request.json['study_schedule_id']

    with session_scope(db) as session:

        studyschedule = session.query(StudySchedule).filter_by(id=study_schedule_id).one_or_none()

        if studyschedule is None :
            return jsonify({
                "error": "not found Study_Schedule: {0}".format(
                    study_schedule_id)
            }), 500

        if studyschedule.schedule_type.name == 'LOCKED' :
            return jsonify({
                "error": "study schedule has locked"
            }), 500


        courseclassroom = session.query(CourseClassroom).filter_by(course_schedule_id =studyschedule.course_schedule_id).one_or_none()

        if courseclassroom is None :
            return jsonify({
                "error": "found courseclassroom existing in {0}".format(
                    study_schedule_id)
            }), 500

        url = live_service.enter_room(getattr(g, current_app.config['CUR_USER'])['username'],courseclassroom.room_id,getattr(g, current_app.config['CUR_USER'])['name'],
                                      ClassroomRoleEnum.STUDENT.name,ClassroomDeviceEnum.PC.name)

    return jsonify({'url':url })
Пример #21
0
def delFile(folderId, user_type=0, lang='en'):
    """

    """
    with session_scope(db) as session:

        r = requests.post(current_app.config['EP_LOCATION'] +
                          current_app.config['EP_CLASSIN_PATH'] + '/delFile',
                          data=json.dumps({
                              'fileId': folderId,
                              'lang': lang,
                              'userType': user_type,
                          }),
                          headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        if r.json()['code'] == 0:
            return r.json()['fileId']
        else:
            raise RuntimeError(r.json()['message'])
Пример #22
0
def editCourseClass(courseId,
                    classId,
                    className,
                    beginTime,
                    endTime,
                    teacherAccount,
                    teacherName,
                    user_type=0,
                    lang='en'):
    """

    """
    with session_scope(db) as session:

        r = requests.post(current_app.config['EP_LOCATION'] +
                          current_app.config['EP_CLASSIN_PATH'] +
                          '/editCourseClass',
                          data=json.dumps({
                              'courseId':
                              courseId,
                              'classId':
                              classId,
                              'className':
                              className,
                              'beginTime':
                              beginTime.replace('T', ' ').replace('Z', ''),
                              'endTime':
                              endTime.replace('T', ' ').replace('Z', ''),
                              'teacherAccount':
                              teacherAccount,
                              'teacherName':
                              teacherName,
                              'lang':
                              lang,
                              'userType':
                              user_type,
                          }),
                          headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        if r.json()['code'] == 0:
            return r.json()['code']
        else:
            raise RuntimeError(r.json()['message'])
Пример #23
0
def apply_tryout():
    """
    swagger-doc: 'schedule'
    required: []
    req:
      start:
        description: '开始时间'
        type: 'string'
      end:
        description: '结束时间'
        type: 'string'
      student_id:
        description: '学生id,不传默认自己'
        type: 'string'

    res:
      verify_code:
        description: 'id'
        type: ''
    """
    start = request.json['start'].replace('T', ' ').replace('Z', '')
    end = request.json['end'].replace('T', ' ').replace('Z', '')
    student_id =  getattr(g, current_app.config['CUR_USER'])['id']
    if 'student_id' in request.json:
        student_id = request.json['student_id']

    with session_scope(db) as session:

        studyAppointment = StudyAppointment(
            student_id = student_id,
            delete_flag = 'IN_FORCE',
            open_time_start= start,
            open_time_end = end,
            appointment_state='WRITE_APPOINTMENT',
            updated_by=getattr(g, current_app.config['CUR_USER'])['username'],
            apply_by=getattr(g, current_app.config['CUR_USER'])['username']
        )

        session.add(studyAppointment)
        session.flush()

    return jsonify({'id':studyAppointment.id })
Пример #24
0
def getTempLoginKey(telephone, user_type=0, lang='en'):
    """

    """
    with session_scope(db) as session:

        r = requests.post(current_app.config['EP_LOCATION'] +
                          current_app.config['EP_CLASSIN_PATH'] +
                          '/getTempLoginKey',
                          data=json.dumps({
                              'telephone': telephone,
                              'lang': lang,
                              'userType': user_type,
                          }),
                          headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        if r.json()['code'] == 0:
            return r.json()['key']
        else:
            raise RuntimeError(r.json()['message'])
Пример #25
0
def changeTeacher(courseId, teacherAccount, user_type=0, lang='en'):
    """

    """
    with session_scope(db) as session:

        r = requests.post(current_app.config['EP_LOCATION'] +
                          current_app.config['EP_CLASSIN_PATH'] +
                          '/changeTeacher',
                          data=json.dumps({
                              'courseId': courseId,
                              'teacherAccount': teacherAccount,
                              'lang': lang,
                              'userType': user_type,
                          }),
                          headers={'Content-type': 'application/json'})
        current_app.logger.debug(r.text)
        if r.json()['code'] == 0:
            return r.json()['code']
        else:
            raise RuntimeError(r.json()['message'])
Пример #26
0
 def sql_check(self):
     todo_user = random_username()
     json.loads(super().register(todo_user,
                                 'Student').get_data(as_text=True))
     with session_scope(db) as session:
         r1 = session.execute("select * from student")
         row1 = r1.first()
         self.assertIsNotNone(
             row1, "After student register, no record found for "
             "student")
         r2 = session.add_all([
             Notification(notice='meeting today'),
             Notification(notice='meeting cancel')
         ])
         self.app.logger.debug('r2=' + str(r2))
         r3 = session.query(Notification).delete()
         self.app.logger.debug('r3=' + str(r3))
         r4 = session.query(Notification).first()
         self.app.logger.debug('r4=' + str(r4))
         self.assertIsNone(r4, "After delete all, first should return None")
         r5 = session.query(Notification).one_or_none()
         self.app.logger.debug('r5=' + str(r5))
Пример #27
0
async def verify_user(request):
    """
    是否放到线程池中执行是可选的,所以不一定要加装饰器,这个时候只能优化sql,确保速度够快
    :param request:
    :return:
    """
    request_data = request.json
    username = request_data.get('username')
    password = request_data.get('password')

    # user_agent = request.headers.get('User-Agent')

    with session_scope() as db_session:
        user = db_session.query(User).filter_by(username=username).first()
        if not user:
            raise exceptions.UserNotFound()

        if not user.check_password(password):
            raise exceptions.PasswordError()

        client_info = client_info_from_request_data(request_data)
        token = await create_and_cache_token(user.id, password, client_info)

        return {'user_id': user.id, 'token': token}
Пример #28
0
def login():
    """
    swagger-doc: 'do login for registered user'
    required: ['username', 'password', 'usertype']
    req:
      username:
        description: 'login user name'
        type: 'string'
      password:
        description: 'login user password'
        type: 'string'
      usertype:
        description: 'login user type (Student, Teacher, SysUser)'
        type: 'string'
    res:
      Authorization:
        description: 'Athorization jwt http header'
        type: 'string'
    """
    user_name = request.json['username']
    password = request.json['password']
    user_type = request.json['usertype']

    with session_scope(db) as session:
        user = session.query(
            user_source[user_type]).filter_by(username=user_name).first()
    if user:
        # check password
        if check_password_hash(getattr(user, 'password', ''), password):
            token = generate_jwt_token(current_app.config['JWT_HEADER'],
                                       user_name)
            return jsonify({**token, **{'id': getattr(user, 'id')}})
        else:
            return jsonify({'message': 'password check failed!'}), 401
    else:
        return jsonify({'message': user_name + ' not found!'}), 401
Пример #29
0
def register():
    """
    swagger-doc: 'do register for new user'
    required: ['username', 'password', 'usertype', 'verify_code']
    req:
      username:
        description: 'login user name'
        type: 'string'
      password:
        description: 'login user password'
        type: 'string'
      usertype:
        description: 'login user type (Student, Teacher, SysUser)'
        type: 'string'
      verify_code:
        description: 'code sent by calling email verify or sms verify'
        type: 'string'
      first_name:
        description: 'first_name'
        type: 'string'
      last_name:
        description: 'last_name'
        type: 'string'
      code:
        description: '国家代码'
        type: 'int'
    res:
      Authorization:
        description: 'Athorization jwt http header'
        type: 'string'
    """
    current_app.logger.debug(request.json)
    user_name = request.json['username']
    user_type = request.json['usertype']
    verify_code = request.json['verify_code']
    check_target = redis_store.get('VC:' + user_name)

    code = request.json['code']

    firstName = ''
    lastName = ''

    if 'first_name' in request.json:
        firstName = request.json['first_name']
    if 'last_name' in request.json:
        lastName = request.json['last_name']

    if check_target:
        check_target = check_target.decode('utf8')
    else:
        check_target = 'None'
    current_app.logger.debug(verify_code + ' ' + check_target + ' ' +
                             str(verify_code != check_target))
    if verify_code != check_target:
        return jsonify({'message': 'verify code check failed'}), 500
    target_table = user_source[user_type]
    with session_scope(db) as session:
        # check existing username in all 3 tables
        found = False
        message = ''
        if target_table in user_source.values():
            result = session.execute(
                select([target_table
                        ]).where(target_table.username == user_name))
            current_app.logger.debug("table_checked.__name__ " +
                                     str(target_table.__name__))
            row1 = result.first()
            message = target_table.__name__ if (row1 is not None) else ''
            found = found or (row1 is not None)
        else:
            return jsonify({"error":
                            " not found {0} ".format(target_table)}), 500

        if found:
            result.close()
            return jsonify({
                "error":
                "found {0} existing in {1}".format(user_name, message)
            }), 500
        # check if username is mobile or email, the mobile or email
        # should be unique in all 3 tables
        if '@' in user_name:
            for table_checked in user_source.values():
                result = session.execute(
                    select([table_checked
                            ]).where(table_checked.email == user_name))
                row1 = result.first()
                message = table_checked.__name__ + ' email' if (
                    row1 is not None) else ''
                found = found or (row1 is not None)
        else:
            for table_checked in user_source.values():
                result = session.execute(
                    select([table_checked
                            ]).where(table_checked.mobile == user_name))
                row1 = result.first()
                message = table_checked.__name__ + ' mobile' if (
                    row1 is not None) else ''
                found = found or (row1 is not None)
        if found:
            result.close()
            return jsonify({
                "error":
                "found {0} existing in {1}".format(user_name, message)
            }), 500
        email = user_name if '@' in user_name else None
        mobile = user_name if '@' not in user_name else None
        user = target_table(username=user_name,
                            password=generate_password_hash(
                                request.json['password']),
                            state=1,
                            updated_by=user_name,
                            email=email,
                            mobile=mobile,
                            nickname=user_name,
                            first_name=firstName,
                            last_name=lastName,
                            nation=code)
        current_app.logger.debug('encrypted password:'******'JWT_HEADER'], user.username)
    user_id = getattr(user, 'id')
    token.update({'id': user_id})
    # handle acl redis record
    redis_key = 'ACL:' + user_name + ':' + user_type.lower() + ':' + str(
        user_id)
    value = hashlib.md5(str(user).encode('utf-8')).hexdigest()
    redis_store.set(redis_key, value)

    # if user.mobile is not None:

    # if code != '86':
    #     mobile = '00'+code+'-'+mobile
    # current_app.logger.debug('code--->' + code+":"+mobile+"----->"+str(user_id))
    # teacher_id = classin_service.register(mobile,mobile, request.json['password'], 0, 'en')
    # current_app.logger.debug('target_table:' + user_type+'---table_id:'+str(user_id)+'-----teacher_id:'+str(teacher_id))
    # thirdDateLog = ThirdDateLog(table_name = user_type,
    #                            table_id = user_id,
    #                            third_id = str(teacher_id),
    #                             third_date = '',
    #                            delete_flag = 'IN_FORCE')
    # session.add(thirdDateLog)
    # session.flush()

    return jsonify(token)
Пример #30
0
def sysUser():
    """
    swagger-doc: 'do register for new user'
    required: ['username', 'password', 'usertype', 'verify_code']
    req:
      mobile:
        description: '手机号'
        type: 'string'
      name:
        description: '用户名'
        type: 'string'
      password:
        description: 'login user password'
        type: 'string'
      code:
        description: '国家代码'
        type: 'int'
      email:
        description: '邮箱'
        type: 'string'
      rolse:
        description: '角色id字符串 例如:1,2,3,4'
        type: 'string'
    res:
      id:
        description: '用户id'
        type: 'string'
    """
    current_app.logger.debug(request.json)
    mobile = request.json['mobile']
    name = request.json['name']
    email = request.json['email']
    rolse = request.json['rolse']
    user_type = 'SysUser'

    code = '86'
    if code in request.json:
        code = request.json['code']

    target_table = user_source[user_type]
    with session_scope(db) as session:
        sysUser = session.query(SysUser).filter_by(
            username=mobile).one_or_none()

        if sysUser is not None:
            return jsonify({"error": "found SysUser: {0}".format(mobile)}), 500

        sysUser = SysUser(
            username=mobile,
            password=generate_password_hash(request.json['password']),
            state=1,
            updated_by=getattr(g, current_app.config['CUR_USER'])['username'],
            email=email,
            mobile=mobile,
            nickname=mobile,
            nation=code,
            name=name)
        session.add(sysUser)
        session.flush()

        user_id = getattr(sysUser, 'id')
        for rolesId in rolse.split(','):
            sysUserRole = SysUserRole(
                sys_user_id=user_id,
                role_definition_id=rolesId,
                updated_by=getattr(g,
                                   current_app.config['CUR_USER'])['username'])
            session.add(sysUserRole)
            session.flush()

        if sysUser.mobile is not None:
            mobile = code + '-' + mobile
            if sysUser.nation is '86':
                mobile = sysUser.mobile

            teacher_id = classin_service.register(mobile, mobile,
                                                  request.json['password'], 0,
                                                  'en')
            thirdDateLog = ThirdDateLog(table_name='sys_user',
                                        table_id=user_id,
                                        third_id=teacher_id,
                                        third_date='',
                                        delete_flag='IN_FORCE')
            session.add(thirdDateLog)
            session.flush()

    return jsonify({'id': user_id})