Пример #1
0
    def delete(self, lecture_id):
        abort_if_lecture_not_exist(lecture_id)
        current_userid = current_id(request)
        res = youngs_redis.sismember(Constants.redis_youngs_live_lecture_listener_key(lecture_id), current_userid)
        if res is False:
            abort(403, message="Not a listener")

        res = youngs_redis.get(Constants.redis_youngs_live_lecture_occupy_key(lecture_id))
        youngs_redis.delete(Constants.redis_youngs_live_lecture_occupy_key(lecture_id))
        return jsonify({'results': 'success'})
Пример #2
0
    def get(self):
        """
        :return: lecture list
        """
        order_by = request.args.get('order_by')
        num = request.args.get('num', default=10)
        type = request.args.get('type')
        start = request.args.get('start', default=0)
        status = request.args.get('status', type=str)
        is_attended = request.args.get('is_attended', type=bool)
        is_teaching = request.args.get('is_teaching', type=bool)


        # lecture_all = Lecture.query.all()
        # for each_lecture in lecture_all:
        #     listeners = youngs_redis.smembers(Constants.redis_youngs_live_lecture_listener_key(each_lecture.id))

        current_userid = current_id(request)
        lecture_filter_query = []
        if type is not None:
            try:
                type = ast.literal_eval(type)
            except:
                abort(406, message="type wrong formed. it should be like type=['TOEIC','FREE']")
            lecture_filter_query.append(Lecture.type.in_(type))
        if status is not None:
            lecture_filter_query.append(Lecture.status == status)
        if is_teaching is not None:
            lecture_filter_query.append(Lecture.member_id == current_userid)
        if is_attended is True:
            # sorry for durty code haha
            lecture_list = Lecture.query.outerjoin(Attend).filter(Attend.member_id == current_userid)
            return marshal({'results': lecture_list}, lecture_list_fields['normal'])

        lecture_order_query = []
        if order_by is not None:
            if order_by == 'type':
                lecture_order_query.append(desc(Lecture.type))
            elif order_by == 'point':
                lecture_order_query.append(desc(Lecture.point_avg))
            lecture_order_query.append(desc(Lecture.register_timestamp))


        lecture_query = Lecture.query.filter(*lecture_filter_query).group_by(Lecture).\
            order_by(*lecture_order_query)

        lecture_list = lecture_query.offset(start).limit(num).all()
        return marshal({'results': lecture_list}, lecture_list_fields['normal'])
Пример #3
0
    def delete(self, lecture_id):
        abort_if_lecture_not_exist(lecture_id)
        current_userid = current_id(request)
        lecture = Lecture.query.filter_by(id=lecture_id).one()

        token = request.headers.get('Authorization').replace('JWT ', '', 1)
        res = youngs_redis.srem(Constants.redis_youngs_live_lecture_listener_key(lecture_id), current_userid)
        youngs_redis.hdel('auth:token:'+token, {'lecture_id': lecture_id})
        if current_userid == lecture.member_id:
            # teacher exit
            lecture.status = 'FINISHED'
        else:
            if res is not None:
                lecture.status = 'STANDBY'
        db.session.commit()
        return jsonify({'results': 'success'})
Пример #4
0
    def post(self, lecture_id):
        abort_if_lecture_not_exist(lecture_id)
        current_userid = current_id(request)
        lecture = Lecture.query.filter_by(id=lecture_id).one()
        args = self.review_post_parser.parse_args()
        review = Review(lecture_id=lecture_id,
                        member_id=current_userid,
                        point=args.point,
                        content=args.content)
        lecture.new_point(args.point)

        member = Member.query.filter_by(id=lecture.member_id).one()
        member.new_point(args.point)
        db.session.add(review)
        db.session.commit()
        return marshal(review, review_fields, envelope='results')
Пример #5
0
 def delete(self, lecture_id):
     """
     :return: lecture
     """
     abort_if_lecture_not_exist(lecture_id)
     lecture = Lecture.query.filter_by(id=lecture_id).one()
     db.session.delete(lecture)
     db.session.commit()
     current_userid = current_id(request)
     member = Member.query.filter_by(id=current_userid).one()
     member.lecture_num -= 1
     # redis_res = youngs_redis.srem(Constants.REDIS_YOUNGS_LECTURE_LIVE_KEY, lecture.id)
     # if redis_res == 0:
     #     log.error('chat.controllers.LectureItem.delete redis lecture id not eixsts')
     # else:
     #     # remove the lecture's members on the redis
     #     youngs_redis.delete(Constants.redis_witalkie_lecture_members_key(lecture.id))
     return jsonify({'results': 'success'})
Пример #6
0
    def post(self, lecture_id):
        abort_if_lecture_not_exist(lecture_id)
        current_userid = current_id(request)
        lecture = Lecture.query.filter_by(id=lecture_id).one()
        args = self.review_post_parser.parse_args()
        review = Review(
                lecture_id=lecture_id,
                member_id=current_userid,
                point=args.point,
                content=args.content
        )
        lecture.new_point(args.point)

        member = Member.query.filter_by(id=lecture.member_id).one()
        member.new_point(args.point)
        db.session.add(review)
        db.session.commit()
        return marshal(review, review_fields, envelope='results')
Пример #7
0
    def post(self, lecture_id):
        lecture = Lecture.query.filter_by(id=lecture_id).one()
        if lecture.status not in ['STANDBY', 'READY']:
            abort(403, message="Lecture is not attendable")
        current_userid = current_id(request)
        res = youngs_redis.smembers(Constants.redis_youngs_live_lecture_listener_key(lecture_id))
        if res is not None:
            for each_listener in res:
                listener = int(each_listener.decode('utf-8'))
                if Member.query.filter_by(id=listener).first() is None:
                    # User removed
                    youngs_redis.srem(Constants.redis_youngs_live_lecture_listener_key(lecture_id), listener)

                if current_userid == lecture.member_id:
                    continue

                if listener != current_userid and listener != lecture.member_id:
                    abort(409, message="Someone is already listening the lecture")

        if Attend.query.filter_by(member_id=current_userid, lecture_id=lecture_id).first() is None:

            attend = Attend(
                member_id=current_userid,
                lecture_id=lecture_id
            )
            db.session.add(attend)

        if current_userid != lecture.member_id:
            # student attended
            print(current_userid)
            print(lecture.member_id)
            lecture.status = 'ONAIR'
        else:
            lecture.status = 'STANDBY'
        db.session.commit()
        token = request.headers.get('Authorization').replace('JWT ', '', 1)
        youngs_redis.sadd(Constants.redis_youngs_live_lecture_listener_key(lecture_id), current_userid)
        # youngs_redis.expire(Constants.redis_youngs_live_lecture_listener_key(lecture_id), 600)
        youngs_redis.hset('auth:token:' + token, 'lecture_id', lecture_id)

        return jsonify({'results': 'success'})
Пример #8
0
    def post(self, lecture_id):
        lecture = Lecture.query.filter_by(id=lecture_id).one()
        current_userid = current_id(request)
        if lecture.status != 'ONAIR':
            abort(403, message="Lecture is not in ONAIR")

        res = youngs_redis.sismember(Constants.redis_youngs_live_lecture_listener_key(lecture_id), current_userid)
        if res is False:
            abort(403, message="Not a listener")

        # request occupy
        redis_res = youngs_redis.get(Constants.redis_youngs_live_lecture_occupy_key(lecture_id))
        if redis_res is not None and redis_res.decode('utf-8') != current_userid:
            abort(409, message="Someone speacking")

        # Occupy
        pipe = youngs_redis.pipeline()
        pipe.set(Constants.redis_youngs_live_lecture_occupy_key(lecture_id), current_userid)
        pipe.expire(Constants.redis_youngs_live_lecture_occupy_key(lecture_id), 10)
        pipe.execute()
        return jsonify({'results': 'success'})
Пример #9
0
    def post(self):
        args = self.lecture_post_parser.parse_args()
        current_userid = current_id(request)
        lecture = Lecture(
            member_id=current_userid,
            title=args.title,
            description=args.description,
            type=args.type
        )
        if args.img is not None:
            img_filename = save_json_image('LECTURE_IMAGE_FOLDER', args.img)
            lecture.img_filename = img_filename
            lecture.img_url = generate_image_url('lecture', img_filename)
        else:
            abort(406, message="img required")
        db.session.add(lecture)
        member = Member.query.filter_by(id=current_userid).one()
        member.lecture_num += 1

        db.session.commit()

        return marshal(lecture, lecture_fields['normal'], envelope='results')