def get(self, username, follower_or_following):
        if follower_or_following.lower() not in ["follower", "following"]:
            return error(ErrorCode.INVALID_PARAMS, 400)
        parser = reqparse.RequestParser(trim=True)
        parser.add_argument("page",
                            default=1,
                            type=inputs.positive,
                            location="args")
        parser.add_argument("per_page",
                            default=20,
                            type=inputs.positive,
                            location="args")
        args = parser.parse_args()
        this_user = UserModel.query.filter_by(username=username).first()
        if not this_user:
            return error(ErrorCode.USER_NOT_FOUND, 404)
        if follower_or_following.lower() == "follower":
            pagination = this_user.followers.paginate(args.page, args.per_page)
        if follower_or_following.lower() == "following":
            pagination = this_user.followed.paginate(args.page, args.per_page)
        p = get_item_pagination(
            pagination,
            "api.Follow",
            username=username,
            follower_or_following=follower_or_following,
        )

        return ok("ok",
                  data=marshal(
                      p, get_pagination_resource_fields(user_resource_fields)))
 def post(self, rating_hash_id):
     this_rating = RatingModel.query.get(decode_str_to_id(rating_hash_id))
     if not this_rating:
         return error(ErrorCode.RATING_NOT_FOUND, 404)
     parser = reqparse.RequestParser()
     parser.add_argument(
         "cate",
         choices=["like", "unlike", "report"],
         required=True,
         location="form",
         type=str,
     )
     args = parser.parse_args()
     if args.cate == "like":
         f = this_rating.like_by(g.current_user)
         if f:
             sql_db.session.commit()
             return ok("点赞成功", http_status_code=201)
         else:
             return error(ErrorCode.RATING_LIKE_ALREADY_EXISTS, 403)
     if args.cate == "unlike":
         f = this_rating.unlike_by(g.current_user)
         if f:
             sql_db.session.commit()
             return ok("取消点赞成功", http_status_code=201)
         else:
             return error(ErrorCode.RATING_LIKE_NOT_FOUND, 403)
     if args.cate == "report":
         f = this_rating.report_by(g.current_user)
         if f:
             sql_db.session.commit()
             return ok("举报评论成功", http_status_code=201)
         else:
             return error(ErrorCode.RATING_REPORT_FORBIDDEN, 403)
 def put(self):
     """reset password"""
     parser = reqparse.RequestParser()
     parser.add_argument(
         "email",
         type=inputs.regex("[^@]+@[^@]+\.[^@]+"),
         required=True,
         location="form",
     )
     args = parser.parse_args()
     this_user = UserModel.query.filter_by(email=args.email).first()
     if not this_user:
         return error(ErrorCode.USER_NOT_FOUND, 404)
     s = test_limit_of_send_email(this_user,
                                  AccountOperations.RESET_PASSWORD)
     if s == -2:
         token = generate_email_confirm_token(
             this_user.username, AccountOperations.RESET_PASSWORD)
         send_reset_password_email.delay(token, this_user.email,
                                         this_user.username)
         return ok(message="请到 %s 查收邮件!" % this_user.email)
     else:
         return error(ErrorCode.SENDING_EMAIL_FREQUENTLY,
                      http_status_code=403,
                      second=s)
 def delete(self, username, follower_or_following):
     if follower_or_following.lower() != "unfollow":
         return error(ErrorCode.INVALID_PARAMS, 400)
     this_user = UserModel.query.filter_by(username=username).first()
     if not this_user:
         return error(ErrorCode.USER_NOT_FOUND, 404)
     if g.current_user.unfollow(this_user):
         sql_db.session.commit()
         return ok(message="取消关注成功")
     else:
         return error(ErrorCode.FOLLOW_NOT_EXISTS, 403)
 def delete(self, rating_hash_id):
     this_rating = RatingModel.query.get(decode_str_to_id(rating_hash_id))
     if not this_rating:
         return error(ErrorCode.RATING_NOT_FOUND, 404)
     this_user = g.current_user
     if this_rating == this_rating.user or this_user.check_permission(
             "HANDLE_REPORT"):
         sql_db.session.delete(this_rating)
         sql_db.session.commit()
         return ok("删除成功")
     else:
         return error(ErrorCode.RATING_DELETE_FORBIDDEN, 403)
 def post(self, username, follower_or_following):
     """follow someone"""
     if follower_or_following.lower() != "follow":
         return error(ErrorCode.INVALID_PARAMS, 400)
     this_user = UserModel.query.filter_by(username=username).first()
     if not this_user:
         return error(ErrorCode.USER_NOT_FOUND, 404)
     if g.current_user.follow(this_user):
         sql_db.session.commit()
         return ok(message="关注成功", http_status_code=201)
     else:
         return error(ErrorCode.FOLLOW_ALREADY_EXISTS, 403)
    def patch(self, celebrity_hash_id):
        celebrity = CelebrityModel.query.get(
            decode_str_to_id(celebrity_hash_id))
        if not celebrity:
            return error(ErrorCode.CELEBRITY_NOT_FOUND, 404)

        parser = reqparse.RequestParser()
        parser.add_argument("douban_id",
                            type=inputs.regex("^[0-9]{0,10}$"),
                            location="form")
        parser.add_argument("image",
                            required=False,
                            type=FileStorage,
                            location="files")
        parser.add_argument("name", required=True, location="form")
        parser.add_argument("gender",
                            required=True,
                            choices=["male", "female"],
                            location="form")
        parser.add_argument("name_en", default="", type=str, location="form")
        parser.add_argument("born_place",
                            default="",
                            type=str,
                            location="form")
        parser.add_argument("aka", location="form")
        parser.add_argument("aka_en", location="form")
        args = parser.parse_args()
        if args.aka:
            args.aka = args.aka.strip()[:len(args.aka.strip()) - 1].split("/")
        if args.aka_en:
            args.aka_en = args.aka_en.strip()[:len(args.aka_en.strip()) -
                                              1].split("/")
        if args.gender == "male":
            args.gender = GenderType.MALE
        else:
            args.gender = GenderType.FEMALE
        if args.image:
            image = Image.create_one(args.image)
            celebrity.image = image
        celebrity.name = args.name
        celebrity.gender = args.gender
        celebrity.douban_id = args.douban_id
        if args.born_place:
            celebrity.born_place = args.born_place
        celebrity.name_en = args.name_en
        celebrity.aka_list = ("/".join(args.aka), )
        celebrity.aka_en_list = ("/".join(args.aka_en), )
        try:
            sql_db.session.commit()
        except IntegrityError:
            return error(ErrorCode.CELEBRITY_ALREADY_EXISTS, 403)
        return ok("Celebrity Updated", http_status_code=200)
Beispiel #8
0
 def post(self, movie_hash_id):
     parser = reqparse.RequestParser()
     parser.add_argument(
         "interest",
         type=int,
         choices=[RatingType.COLLECT, RatingType.WISH, RatingType.DO],
         required=True,
         location="form",
     )
     parser.add_argument(
         "score",
         type=inputs.positive,
         choices=[i for i in range(0, 11)],
         default=0,
         location="form",
     )
     parser.add_argument("tags",
                         type=inputs.regex("^.{0,512}$"),
                         location="form")
     parser.add_argument("comment",
                         type=inputs.regex("^.{0,128}$"),
                         location="form")
     args = parser.parse_args()
     this_movie = MovieModel.query.get(decode_str_to_id(movie_hash_id))
     this_user = g.current_user
     if not this_movie:
         return error(ErrorCode.MOVIE_NOT_FOUND, 404)
     f = False
     if args.interest == RatingType.WISH:
         f = this_user.wish_movie(this_movie,
                                  comment=args.comment,
                                  tags_name=args.tags.split(" "))
     if args.interest == RatingType.DO:
         f = this_user.do_movie(
             this_movie,
             score=args.score,
             comment=args.comment,
             tags_name=args.tags.split(" "),
         )
     if args.interest == RatingType.COLLECT:
         f = this_user.collect_movie(
             this_movie,
             score=args.score,
             comment=args.comment,
             tags_name=args.tags.split(" "),
         )
     if f:
         print(1)
         sql_db.session.commit()
         return ok("Rating This Movie Successfully")
     return error(ErrorCode.RATING_ALREADY_EXISTS, 403)
 def patch(self, username):
     current_app.logger.info(
         "modify profile of {username}".format(username=username))
     parser = reqparse.RequestParser(trim=True)
     parser.add_argument(
         "username",
         required=False,
         type=inputs.regex("^[a-zA-Z0-9\_]{6,16}$"),
         location="form",
     )
     parser.add_argument("city_id", location="form")
     parser.add_argument("signature",
                         type=inputs.regex("^.{1,64}$"),
                         location="form")
     parser.add_argument("avatar_file", type=FileStorage, location="files")
     args = parser.parse_args()
     user = g.current_user
     if args.username and args.username != g.current_user.username:
         if not user.change_username(args.username):
             return error(ErrorCode.USER_ALREADY_EXISTS, 403)
     if args.city_id:
         user.city_id = args.city_id
     if args.signature:
         user.signature = args.signature
     if args.avatar_file:
         avatar = Image.create_one(args.avatar_file)
         user.avatar = avatar
     sql_db.session.commit()
     return ok("ok", username=user.username, signature=user.signature)
Beispiel #10
0
 def get(self, time_range):
     if time_range not in ["week", "month"]:
         return error(ErrorCode.INVALID_PARAMS, 400)
     parser = reqparse.RequestParser()
     parser.add_argument("page",
                         default=1,
                         type=inputs.positive,
                         location="args")
     parser.add_argument("per_page",
                         default=20,
                         type=inputs.positive,
                         location="args")
     args = parser.parse_args()
     if time_range == "week":
         days = 7
     else:
         days = 30
     movie_ids, total = get_rank_movie_ids_with_range(
         days, args.page, args.per_page)
     movies = MovieModel.query.filter(MovieModel.id.in_(movie_ids)).all()
     pagination = Pagination("", args.page, args.per_page, total, movies)
     p = get_item_pagination(pagination,
                             "api.LeaderBoard",
                             time_range=time_range)
     return ok(
         "ok",
         data=marshal(
             p,
             get_pagination_resource_fields(movie_summary_resource_fields)),
     )
Beispiel #11
0
 def get(self, type_name):
     parser = reqparse.RequestParser()
     parser.add_argument("page",
                         default=1,
                         type=inputs.positive,
                         location="args")
     parser.add_argument("per_page",
                         default=20,
                         type=inputs.positive,
                         location="args")
     args = parser.parse_args()
     if type_name == "friendship":
         pagination = (g.current_user.notifications_received.filter_by(
             category=NotificationType.FOLLOW).order_by(
                 NotificationModel.created_at.desc()).paginate(
                     args.page, args.per_page))
     elif type_name == "like":
         pagination = (g.current_user.notifications_received.filter_by(
             category=NotificationType.RATING_ACTION).order_by(
                 NotificationModel.created_at.desc()).paginate(
                     args.page, args.per_page))
     else:
         return error(ErrorCode.INVALID_PARAMS, 403)
     for notification in pagination.items:
         notification.is_read = True
     sql_db.session.commit()
     p = get_item_pagination(pagination,
                             "api.Notification",
                             type_name=type_name)
     return ok(
         "ok",
         data=marshal(
             p,
             get_pagination_resource_fields(notification_resource_fields)),
     )
Beispiel #12
0
 def delete(self, movie_hash_id):
     movie = MovieModel.query.get(decode_str_to_id(movie_hash_id))
     if not movie:
         return error(ErrorCode.MOVIE_NOT_FOUND, 404)
     sql_db.session.delete(movie)
     sql_db.session.commit()
     return ok("Deleted This Movie Successfully!")
Beispiel #13
0
    def get(self, coming_or_showing):
        parser = reqparse.RequestParser()
        parser.add_argument("page",
                            default=1,
                            type=inputs.positive,
                            location="args")
        parser.add_argument("per_page",
                            default=20,
                            type=inputs.positive,
                            location="args")
        args = parser.parse_args()
        if coming_or_showing.lower() not in ["coming", "showing"]:
            return error(ErrorCode.INVALID_PARAMS, 400)

        if coming_or_showing.lower() == "coming":
            pagination = (MovieModel.query.filter_by(
                cinema_status=MovieCinemaStatus.COMING).order_by(
                    MovieModel.created_at.desc()).paginate(
                        page=args["page"], per_page=args.per_page))
        elif coming_or_showing.lower() == "showing":
            pagination = (MovieModel.query.filter_by(
                cinema_status=MovieCinemaStatus.SHOWING).order_by(
                    MovieModel.created_at.desc()).paginate(
                        page=args["page"], per_page=args.per_page))
        p = get_item_pagination(pagination,
                                "api.CinemaMovie",
                                coming_or_showing=coming_or_showing)
        return ok(
            "ok",
            data=marshal(
                p,
                get_pagination_resource_fields(movie_summary_resource_fields)),
        )
    def get(self, username_or_email):
        parser = reqparse.RequestParser()
        parser.add_argument("value", required=True, location="args")
        args = parser.parse_args()
        if username_or_email not in ["username", "email"]:
            return error(ErrorCode.INVALID_PARAMS, 400)

        if username_or_email == "username":
            if UserModel.query.filter_by(username=args.value).first():
                return ok("this username already existed")
            else:
                return error(ErrorCode.USER_NOT_FOUND, 404)
        if username_or_email == "email":
            if UserModel.query.filter_by(email=args.value).first():
                return ok("this username already existed")
            else:
                return error(ErrorCode.USER_NOT_FOUND, 404)
 def delete(self, celebrity_hash_id):
     celebrity = CelebrityModel.query.get(
         decode_str_to_id(celebrity_hash_id))
     if not celebrity:
         return error(ErrorCode.CELEBRITY_NOT_FOUND, 404)
     sql_db.session.delete(celebrity)
     sql_db.session.commit()
     return ok("已删除该艺人")
Beispiel #16
0
 def delete(self, movie_hash_id):
     this_movie = MovieModel.query.get(decode_str_to_id(movie_hash_id))
     this_user = g.current_user
     if not this_movie:
         return error(ErrorCode.MOVIE_NOT_FOUND, 404)
     this_user.delete_rating_on(this_movie)
     sql_db.session.commit()
     return ok("Deleted This Rating Successfully!")
 def post(self, operation):
     parser = reqparse.RequestParser()
     parser.add_argument("token", type=str, required=True, location="form")
     if operation == AccountOperations.CONFIRM:
         args = parser.parse_args()
         f = validate_email_confirm_token(args.token,
                                          AccountOperations.CONFIRM)
         if f:
             return ok("您的邮箱已确认!")
         else:
             return error(ErrorCode.INVALID_TOKEN, 403)
     elif operation == AccountOperations.RESET_PASSWORD:
         parser.add_argument(
             "password",
             type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
             required=True,
             location="form",
         )
         args = parser.parse_args()
         if validate_email_confirm_token(args.token,
                                         AccountOperations.RESET_PASSWORD,
                                         new_password=args.password):
             return ok("您的密码已重置")
         else:
             return error(ErrorCode.INVALID_TOKEN, 403)
     elif operation == AccountOperations.CHANGE_EMAIL:
         parser.add_argument(
             "new_email",
             type=inputs.regex("[^@]+@[^@]+\.[^@]+"),
             required=True,
             location="form",
         )
         args = parser.parse_args()
         if UserModel.query.filter_by(email=args.new_email).first():
             return error(ErrorCode.EMAIL_ALREADY_EXISTS, 403)
         if validate_email_confirm_token(args.token,
                                         AccountOperations.CHANGE_EMAIL,
                                         new_email=args.new_email):
             return ok("您的邮箱已修改, 请到新邮箱查看确认邮件!")
         else:
             return error(ErrorCode.INVALID_TOKEN, 403)
     else:
         return error(ErrorCode.INVALID_PARAMS, 403)
 def get(self, username):
     user = UserModel.query.filter_by(username=username).first()
     if user:
         return ok(
             "ok",
             data=marshal(user, user_resource_fields),
             followed=user.is_following(g.current_user),
             follow=user.is_followed_by(g.current_user),
         )
     else:
         return error(ErrorCode.USER_NOT_FOUND, 404)
 def post(self):
     parser = reqparse.RequestParser(trim=True)
     parser.add_argument(
         "grant_type",
         type=str,
         choices=["password"],
         help="grant_type must be in ['password'] ",
         required=True,
         location="form",
     )
     parser.add_argument(
         "username",
         type=inputs.regex("^[a-zA-Z0-9\_]{6,16}$"),
         required=True,
         help="username cannot be blank!",
         location="form",
     )
     parser.add_argument(
         "password",
         type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
         required=True,
         help="password cannot be blank!",
         location="form",
     )
     args = parser.parse_args()
     user = UserModel.query.filter_by(username=args["username"]).first()
     if not user or not user.validate_password(args["password"]):
         return error(ErrorCode.USERNAME_OR_PASSWORD_ERROR, 400)
     if user.is_locked:
         return error(ErrorCode.ACCOUNT_IS_LOCKED, 403)
     if not user.email_confirmed:
         return error(ErrorCode.EMAIL_NOT_CONFIRMED, 403)
     expire_in = 60 * 60 * 24
     data = {
         "access_token": user.generate_token(expire_in),
         "token_type": "bearer",
         "expires_in": expire_in,
         "role": user.role_name,
     }
     return data, 201, {"Cache-Control": "no-store", "Pragma": "no-cache"}
 def post(self):
     """resent email for confirm"""
     parser = reqparse.RequestParser()
     parser.add_argument(
         "username",
         type=inputs.regex("^[a-zA-Z0-9\_]{6,16}$"),
         required=True,
         location="form",
     )
     parser.add_argument(
         "password",
         type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
         required=True,
         location="form",
     )
     args = parser.parse_args()
     this_user = UserModel.query.filter_by(username=args.username).first()
     if not this_user:
         return error(ErrorCode.USER_NOT_FOUND, 404)
     if not this_user.validate_password(args.password):
         return error(ErrorCode.PASSWORD_VALIDATE_ERROR, 403)
     if this_user.email_confirmed:
         return error(ErrorCode.EMAIL_ALREADY_CONFIRMED, 403)
     s = test_limit_of_send_email(g.current_user,
                                  AccountOperations.RESET_PASSWORD)
     if s == -2:
         token = generate_email_confirm_token(
             g.current_user.username,
             AccountOperations.CONFIRM,
             email=this_user.email,
         )
         send_change_email_email.delay(token, g.current_user.email,
                                       g.current_user.username)
         return ok(message="请到 %s 查收邮件!" % g.current_user.email)
     else:
         return error(ErrorCode.SENDING_EMAIL_FREQUENTLY,
                      http_status_code=403,
                      second=s)
 def put(self):
     """change email"""
     s = test_limit_of_send_email(g.current_user,
                                  AccountOperations.CHANGE_EMAIL)
     if s == -2:
         token = generate_email_confirm_token(
             g.current_user.username, AccountOperations.CHANGE_EMAIL)
         send_change_email_email.delay(token, g.current_user.email,
                                       g.current_user.username)
         return ok(message="请到 %s 查收邮件!" % g.current_user.email)
     else:
         return error(ErrorCode.SENDING_EMAIL_FREQUENTLY,
                      http_status_code=403,
                      second=s)
 def post(self):
     parser = reqparse.RequestParser()
     parser.add_argument("douban_id",
                         type=inputs.regex("^[0-9]{0,10}$"),
                         location="form")
     parser.add_argument("image",
                         required=True,
                         type=FileStorage,
                         location="files")
     parser.add_argument("name", required=True, location="form")
     parser.add_argument("gender",
                         required=True,
                         choices=["male", "female"],
                         location="form")
     parser.add_argument("name_en", default="", type=str, location="form")
     parser.add_argument("born_place",
                         default="",
                         type=str,
                         location="form")
     parser.add_argument("aka", location="form")
     parser.add_argument("aka_en", location="form")
     args = parser.parse_args()
     if args.aka:
         args.aka = args.aka.split("/")
     if args.aka_en:
         args.aka_en = args.aka_en.split("/")
     if args.gender == "male":
         args.gender = GenderType.MALE
     else:
         args.gender = GenderType.FEMALE
     image = Image.create_one(args.image)
     celebrity = CelebrityModel.create_one(
         args.name,
         args.gender,
         image=image,
         douban_id=args.douban_id,
         born_place=args.born_place,
         name_en=args.name_en,
         aka_list=args.aka,
         aka_en_list=args.aka_en,
     )
     if not celebrity:
         return error(ErrorCode.CELEBRITY_ALREADY_EXISTS, 403)
     else:
         sql_db.session.add(celebrity)
         sql_db.session.commit()
         return ok("ok", http_status_code=201)
 def delete(self, username):
     current_app.logger.info(
         "delete account of {username}".format(username=username))
     parser = reqparse.RequestParser(trim=True)
     parser.add_argument(
         "password",
         type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
         required=True,
         help="password cannot be blank!",
         location="form",
     )
     args = parser.parse_args()
     if not g.current_user.validate_password(args.password):
         return error(ErrorCode.FORBIDDEN, 403)
     sql_db.session.delete(g.current_user)
     sql_db.session.commit()
     return ok("删除用户成功")
 def put(self, username):
     this_user = UserModel.query.filter_by(username=username).first()
     if not this_user:
         return error(ErrorCode.USER_NOT_FOUND, 404)
     parse = reqparse.RequestParser(trim=True)
     parse.add_argument(
         "role_name",
         required=True,
         choices=[
             role[0] for role in Role.query.with_entities(
                 Role.role_name).distinct().all()
         ],
         type=str,
         location="form",
     )
     args = parse.parse_args()
     this_user.change_role(args.role_name)
     sql_db.session.commit()
     return ok(message="修改权限成功")
 def post(self):
     parser = reqparse.RequestParser(trim=True)
     parser.add_argument(
         "username",
         type=inputs.regex("^[a-zA-Z0-9\_]{6,16}$"),
         required=True,
         help="username is not formatted",
         location="form",
     )
     parser.add_argument(
         "password",
         type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
         required=True,
         help="password is not formatted",
         location="form",
     )
     parser.add_argument(
         "email",
         type=inputs.regex("[^@]+@[^@]+\.[^@]+"),
         required=True,
         help="email is not formatted",
         location="form",
     )
     args = parser.parse_args()
     user = UserModel.create_one(args["username"], args["email"],
                                 args["password"])
     if not user:
         return error(ErrorCode.USER_ALREADY_EXISTS, 403)
     sql_db.session.add(user)
     sql_db.session.commit()
     token = generate_email_confirm_token(user.username,
                                          AccountOperations.CONFIRM,
                                          email=user.email)
     send_confirm_email.delay(token, user.email, user.username)
     return ok(
         "register user succeed",
         http_status_code=201,
         username=user.username,
         role_name=user.role_name,
     )
 def patch(self):
     """change password"""
     parser = reqparse.RequestParser()
     parser.add_argument(
         "old_password",
         type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
         required=True,
         location="form",
     )
     parser.add_argument(
         "new_password",
         type=inputs.regex("^[0-9a-zA-Z\_\.\!\@\#\$\%\^\&\*]{6,20}$"),
         required=True,
         location="form",
     )
     args = parser.parse_args()
     current_user = g.current_user
     if current_user.validate_password(args.old_password):
         current_user.change_password(args.old_password)
         sql_db.session.commit()
         return ok("密码修改成功")
     else:
         return error(ErrorCode.PASSWORD_VALIDATE_ERROR, 403)
Beispiel #27
0
 def get(self, genre_hash_id):
     parser = reqparse.RequestParser()
     parser.add_argument("page",
                         default=1,
                         type=inputs.positive,
                         location="args")
     parser.add_argument("per_page",
                         default=20,
                         type=inputs.positive,
                         location="args")
     args = parser.parse_args()
     genre_id = decode_str_to_id(genre_hash_id)
     genre = Genre.query.get(genre_id)
     if not genre:
         return error(ErrorCode.GENRES_NOT_FOUND, 404)
     score_stmt = (sql_db.session.query(
         Rating.movie_id.label("movie_id"),
         func.avg(Rating.score).label("avg_score"),
     ).filter(Rating.category == RatingType.COLLECT).group_by(
         Rating.movie_id).order_by(desc("avg_score")).subquery())
     movies = MovieModel.query.filter(
         MovieModel.genres.contains(genre)).subquery()
     pagination = (sql_db.session.query(MovieModel).outerjoin(
         score_stmt, MovieModel.id == score_stmt.c.movie_id).filter(
             MovieModel.id == movies.c.id).order_by(
                 score_stmt.c.avg_score.desc()).paginate(
                     args.page, args.per_page))
     p = get_item_pagination(pagination,
                             "api.MovieGenresRank",
                             genre_hash_id=genre_hash_id)
     return ok(
         "ok",
         data=marshal(
             p,
             get_pagination_resource_fields(movie_summary_resource_fields)),
     )
 def get(self, celebrity_hash_id):
     celebrity = CelebrityModel.query.get(
         decode_str_to_id(celebrity_hash_id))
     if not celebrity:
         return error(ErrorCode.CELEBRITY_NOT_FOUND, 404)
     return ok("ok", data=marshal(celebrity, celebrity_resource_fields))
    def get(self, celebrity_hash_id):
        this_celebrity = CelebrityModel.query.get(
            decode_str_to_id(celebrity_hash_id))
        if not this_celebrity:
            return error(ErrorCode.CELEBRITY_NOT_FOUND, 404)
        parser = reqparse.RequestParser()
        parser.add_argument("cate",
                            type=str,
                            choices=["director", "celebrity"],
                            location="args")
        parser.add_argument("page",
                            default=1,
                            type=inputs.positive,
                            location="args")
        parser.add_argument("per_page",
                            default=20,
                            type=inputs.positive,
                            location="args")
        args = parser.parse_args()
        director_pagination = this_celebrity.director_movies.order_by(
            Movie.year.desc()).paginate(args.page, args.per_page)
        director_p = get_item_pagination(
            director_pagination,
            "api.CelebrityMovie",
            celebrity_hash_id=celebrity_hash_id,
            cate=args.cate,
        )

        celebrity_pagination = this_celebrity.celebrity_movies.order_by(
            Movie.year.desc()).paginate(args.page, args.per_page)
        celebrity_p = get_item_pagination(
            celebrity_pagination,
            "api.CelebrityMovie",
            celebrity_hash_id=celebrity_hash_id,
            cate=args.cate,
        )
        if args.cate:
            if args.cate == "director":
                return ok(
                    "ok",
                    data=marshal(
                        director_p,
                        get_pagination_resource_fields(
                            movie_summary_resource_fields),
                    ),
                )
            else:
                return ok(
                    "ok",
                    data=marshal(
                        celebrity_p,
                        get_pagination_resource_fields(
                            movie_summary_resource_fields),
                    ),
                )
        else:
            return ok(
                "ok",
                data={
                    "directed":
                    marshal(
                        director_p,
                        get_pagination_resource_fields(
                            movie_summary_resource_fields),
                    ),
                    "celebrity":
                    marshal(
                        celebrity_p,
                        get_pagination_resource_fields(
                            movie_summary_resource_fields),
                    ),
                },
            )
Beispiel #30
0
 def patch(self):
     parser = reqparse.RequestParser()
     parser.add_argument("movie_id",
                         type=str,
                         location="form",
                         required=True)
     parser.add_argument("douban_id",
                         type=inputs.regex("^[0-9]{0,10}$"),
                         location="form")
     parser.add_argument("title", type=str, required=True, location="form")
     parser.add_argument("subtype",
                         choices=["movie", "tv"],
                         required=True,
                         location="form")
     parser.add_argument("year", type=int, required=True, location="form")
     parser.add_argument("image",
                         required=False,
                         type=FileStorage,
                         location="files")
     parser.add_argument("countries",
                         required=True,
                         type=str,
                         location="form")
     parser.add_argument("genres_name",
                         required=True,
                         type=str,
                         location="form")
     parser.add_argument("original_title", type=str, location="form")
     parser.add_argument("summary",
                         required=True,
                         type=str,
                         location="form")
     parser.add_argument("aka", type=str, location="form")
     parser.add_argument(
         "cinema_status",
         default=MovieCinemaStatus.FINISHED,
         type=int,
         choices=[
             MovieCinemaStatus.FINISHED,
             MovieCinemaStatus.COMING,
             MovieCinemaStatus.SHOWING,
         ],
     )
     parser.add_argument("director_ids",
                         required=True,
                         type=str,
                         location="form")
     parser.add_argument("celebrities_ids",
                         required=True,
                         type=str,
                         location="form")
     parser.add_argument("seasons_count", type=int, location="form")
     parser.add_argument("episodes_count", type=int, location="form")
     parser.add_argument("current_season", type=int, location="form")
     args = parser.parse_args()
     movie = MovieModel.query.get(decode_str_to_id(args.movie_id))
     if not movie:
         return error(ErrorCode.MOVIE_NOT_FOUND, 404)
     if args.subtype == "movie":
         args.seasons_count = args.episodes_count = args.current_season = None
     if args.aka:
         args.aka = args.aka.strip().split("/")
     if args.genres_name:
         args.genres_name = args.genres_name.strip().split(" ")
     if args.countries:
         args.countries = args.countries.strip().split(" ")
     directors_obj = Celebrity.query.filter(
         Celebrity.id.in_([
             decode_str_to_id(hash_id)
             for hash_id in args.director_ids.split(" ")
             if args.director_ids
         ]))
     celebrities_obj = Celebrity.query.filter(
         Celebrity.id.in_([
             decode_str_to_id(hash_id)
             for hash_id in args.celebrities_ids.split(" ")
             if args.celebrities_ids
         ]))
     if args.image:
         image = Image.create_one(args.image)
     movie.title = args.title
     movie.subtype = args.subtype
     if args.image:
         movie.image = image
     movie.year = args.year
     movie.douban_id = args.douban_id
     movie.original_title = args.original_title
     movie.seasons_count = args.seasons_count
     movie.episodes_count = args.episodes_count
     movie.current_season = args.current_season
     movie.summary = args.summary
     movie.cinema_status = args.cinema_status
     movie.aka_list = "/".join(args.aka)
     movie.genres.clear()
     movie.countries.clear()
     movie.directors.clear()
     movie.celebrities.clear()
     for genre_name in args.genres_name:
         genre_obj = Genre.create_one(genre_name)
         movie.genres.append(genre_obj)
     for country_name in args.countries:
         country_obj = Country.create_one(country_name)
         movie.countries.append(country_obj)
     movie.directors += directors_obj
     movie.celebrities += celebrities_obj
     try:
         sql_db.session.commit()
     except IntegrityError:
         return error(ErrorCode.MOVIE_ALREADY_EXISTS, 403)
     return ok("Movie Updated!", http_status_code=200)