예제 #1
0
def select_teacher(lesson_id, owner_id, user_id):
    lesson = Lesson.query.get(lesson_id)
    if lesson.status == LessonStatus.BIDDING \
            or lesson.status == LessonStatus.FINISHED:
        raise BadRequestError(cause=ErrorCause.EXPIRED_LESSON_DEALING,
                              extra_message='Lesson status is not dealing.')
    owner = lesson.owner
    if owner.id != owner_id:
        raise InsufficientPermissionError()
    selected_user = User.query.get(user_id)
    if selected_user is None:
        raise NoSuchElementError(
            extra_message='The selected User does not exist.')
    lesson_bidding = LessonBidding.query \
        .filter(LessonBidding.lesson_id == lesson_id) \
        .filter(LessonBidding.user_id == user_id).first()
    if lesson_bidding is None:
        raise NoSuchElementError(extra_message='User does not bid.')
    # 학생의 coin 값 차감
    #subtract_coins(owner_id,
    #               max(int((lesson.preferred_price - lesson_bidding.price) * 3),
    #                   CoinValueOfTransactionType.MIN_SELECT_USER),
    #               TransactionType.SELECT_TEACHER)

    subtract_coins(owner_id, CoinValueOfTransactionType.MIN_SELECT_USER,
                   TransactionType.SELECT_TEACHER)
    lesson.status = LessonStatus.FINISHED
    lesson.selected_user_id = selected_user.id
    lesson_bidding.is_selected = True
    if not is_checked_phone_number(owner_id, user_id):
        check = CheckPhoneNumber()
        check.user_id = owner_id
        check.checked_user_id = user_id
        check.created_at = current_millis()
        db.session.add(check)
    if not is_checked_phone_number(user_id, owner_id):
        check = CheckPhoneNumber()
        check.user_id = user_id
        check.checked_user_id = owner_id
        check.created_at = current_millis()
        db.session.add(check)
    db.session.commit()

    # 선택되지 않은 teacher들 coin 값 반환
    unselected_biddings = LessonBidding.query \
        .filter(LessonBidding.lesson_id == lesson_id) \
        .filter(LessonBidding.user_id != user_id).all()
    for bidding in unselected_biddings:
        add_coins(bidding.user_id, CoinValueOfTransactionType.BIDDING,
                  TransactionType.REFUND_FOR_UNSELECTED)
    add_notification(NotificationRequest().to(
        selected_user.id).on_user_selected(selected_user.id, lesson.id))
    return selected_user
예제 #2
0
def create_lesson(user_id):
    if user_id is None:
        raise InvalidTokenError()
    user = User.query.get(user_id)
    if user.type != UserType.STUDENT:
        raise InvalidArgumentError(
            extra_message='It can be available only by student.')
    lesson = Lesson.query \
        .filter((Lesson.status == LessonStatus.BIDDING) | (Lesson.status == LessonStatus.DEALING)) \
        .filter(Lesson.owner_id == user_id).first()
    if lesson is not None:
        raise ElementAlreadyExists(extra_message='Student already has lesson.')
    student = user.student
    lesson = Lesson()
    lesson.owner_id = user.id
    lesson.status = LessonStatus.BIDDING
    current_time = current_millis()
    lesson.created_at = current_time
    lesson.created_time = datetime.utcnow()

    lesson.email = user.email
    lesson.name = user.name
    lesson.gender = user.gender
    lesson.phone_number = user.phone_number
    lesson.birth_year = user.birth_year
    lesson.zip_code = user.zip_code
    lesson.address = user.address
    lesson.sido = user.sido
    lesson.sigungu = user.sigungu
    lesson.bname = user.bname
    lesson.latitude = user.latitude
    lesson.longitude = user.longitude
    lesson.student_status = student.student_status
    lesson.grade = student.grade
    lesson.department = student.department
    lesson.level = student.level
    lesson.class_available_count = student.class_available_count
    lesson.class_time = student.class_time
    lesson.class_type = student.class_type
    lesson.preferred_gender = student.preferred_gender
    lesson.preferred_price = student.preferred_price
    lesson.description = student.description
    lesson.available_subjects = []
    for subject in student.available_subjects:
        lesson.available_subjects.append(subject)
    lesson.available_days_of_week = []
    for day_of_week in student.available_days_of_week:
        lesson.available_days_of_week.append(day_of_week)
    db.session.add(lesson)
    db.session.commit()
    add_notification(NotificationRequest().to(user_id).on_start_bidding(
        lesson.id))
    return lesson
예제 #3
0
def add_favorite(from_user_id, to_user_id):
    favorite = get_favorite(from_user_id, to_user_id)
    if favorite is not None:
        raise ElementAlreadyExists(extra_message='Already favorites.')
    if User.query.get(from_user_id) is None or User.query.get(
            to_user_id) is None:
        raise NoSuchElementError(extra_message='User does not exist.')
    favorite = UserFavorite()
    favorite.from_user_id = from_user_id
    favorite.to_user_id = to_user_id
    favorite.created_at = current_millis()
    db.session.add(favorite)
    add_notification(NotificationRequest().to(to_user_id).on_user_favorited(
        to_user_id, from_user_id))
    db.session.commit()
    return favorite
예제 #4
0
def cancel_lesson(user_id, lesson_id):
    lesson = Lesson.query.get(lesson_id)
    if lesson is None:
        raise NoSuchElementError(extra_message='Lesson does not exist.')
    if lesson.owner.id != user_id:
        raise InsufficientPermissionError()
    lesson.status = LessonStatus.CANCELED
    db.session.commit()

    biddings = LessonBidding.query.filter(
        LessonBidding.lesson_id == lesson_id).all()
    for bidding in biddings:
        add_notification(NotificationRequest().to(
            bidding.user.id).on_lesson_canceled(lesson.owner.id, lesson.id))
        add_coins(bidding.user_id, CoinValueOfTransactionType.BIDDING,
                  TransactionType.REFUND)
    return lesson
예제 #5
0
def add_lesson_favorite(lesson_id, user_id):
    lesson_favorite = LessonFavorite.query \
        .filter(LessonFavorite.lesson_id == lesson_id) \
        .filter(LessonFavorite.user_id == user_id).first()
    if lesson_favorite is not None:
        raise ElementAlreadyExists(
            extra_message='Lesson Favorite already exists.')
    lesson = Lesson.query.get(lesson_id)
    lesson_favorite = LessonFavorite()
    lesson_favorite.lesson_id = lesson_id
    lesson_favorite.user_id = user_id
    lesson_favorite.created_at = current_millis()
    db.session.add(lesson_favorite)
    add_notification(NotificationRequest().to(
        lesson.owner_id).on_lesson_favorited(lesson_id, user_id))
    db.session.commit()
    return lesson_favorite
예제 #6
0
def add_lesson_bidding(lesson_id, user_id, bidding_request):
    lesson = Lesson.query.get(lesson_id)
    if lesson is None:
        raise NoSuchElementError(extra_message='Lesson is not existed.')
    if lesson.status != LessonStatus.BIDDING:
        raise BadRequestError(cause=ErrorCause.EXPIRED_LESSON_BIDDING,
                              message='Lesson is expired.')
    user = User.query.get(user_id)
    if user.type != UserType.TEACHER:
        raise InvalidArgumentError(
            extra_message='It can be available only by teacher.')
    bidding = LessonBidding.query \
        .filter(LessonBidding.lesson_id == lesson_id) \
        .filter(LessonBidding.user_id == user.id).first()
    if bidding is not None:
        raise ElementAlreadyExists(extra_message='Already bidding.')
    bidding = LessonBidding()
    bidding.lesson_id = lesson.id
    bidding.user_id = user.id
    if bidding_request is None:
        raise InvalidArgumentError(
            extra_message='Bidding price must not be null.')
    price = StringUtils.to_int(bidding_request.price)
    if price is None:
        raise InvalidArgumentError(extra_message='Price is wrong.')
    bidding.price = price
    bidding.created_at = current_millis()
    db.session.add(bidding)
    db.session.commit()

    # 선생님은 입찰할 때마다 coin을 차감시킨다.
    subtract_coins(user_id, CoinValueOfTransactionType.BIDDING,
                   TransactionType.BIDDING)
    add_notification(NotificationRequest().to(
        lesson.owner.id).on_bidding_lesson(user_id, lesson.id))
    return bidding
예제 #7
0
def send_ping_push(user_id):
    notification_service.add_notification(notification_service.NotificationRequest()
                                          .to(user_id)
                                          .on_test(user_id))