Exemplo n.º 1
0
    def create(self, request, *args, **kwargs):
        if not is_admin(request):
            return HttpResponse(status=401)

        serializer = TheaterCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        theater_type_id = request.data.get('theaterType')

        try:
            TheaterType.objects.raw(
                f'SELECT * FROM THEATER_TYPE WHERE THEATER_TYPE_ID={theater_type_id};'
            )[0]
        except IndexError:
            return HttpResponse(status=400, content='theaterType이 올바르지 않습니다.')

        theater_row = request.data.get('theaterRow', 16)  # Nullable
        theater_col = request.data.get('theaterCol', 24)  # Nullable
        theater_name = request.data.get('theaterName')  # Nullable
        imp_seats = request.data.get('impSeats', [])  # Nullable

        seats = [(r, c) for r in range(1, theater_row + 1)
                 for c in range(1, theater_col + 1)]
        for i in imp_seats:
            if (i[0], i[1]) in seats:
                seats.remove((i[0], i[1]))

        with connection.cursor() as cursor:
            cursor.execute(
                        "INSERT INTO THEATER " \
                                f"VALUES (THEATER_SEQ.NEXTVAL, {theater_type_id}, " \
                                + (f"{theater_row}, {theater_col}, ") \
                                + (f"{len(seats)}, ") \
                                + (f"'{theater_name}');" if theater_name
                                    else "CONCAT(THEATER_SEQ.NEXTVAL, '관'));")
                    )
            for r in range(1, theater_row + 1):
                for c in range(1, theater_col + 1):
                    if (r, c) in seats:
                        seat_type = 1
                    else:
                        seat_type = 0
                    cursor.execute(
                                "INSERT INTO SEAT " \
                                        f"VALUES (SEAT_SEQ.NEXTVAL, {r}, {c}, THEATER_SEQ.CURRVAL, " \
                                        f"{seat_type});"
                            )
        return HttpResponse(status=201)
Exemplo n.º 2
0
    def destroy(self, request, pk, *args, **kwargs):
        if not is_admin(request):
            return HttpResponse(status=401)

        show_id = pk
        cursor = connection.cursor()
        cursor.execute(
            f'SELECT 1 FROM DUAL WHERE EXISTS (SELECT * FROM TICKET WHERE SHOW_ID={show_id});'
        )
        if cursor.fetchone():
            cursor.close()
            return HttpResponse(status=409, content="선택한 상영에 대한 결제정보가 존재합니다.")

        cursor.execute(f"DELETE FROM SHOW WHERE SHOW_ID={show_id}")
        cursor.close()
        return HttpResponse(status=204)
Exemplo n.º 3
0
    def destroy(self, request, pk, *args, **kwargs):
        if not is_admin(request):
            return HttpResponse(status=401)

        movie_id = pk
        try:
            Show.objects.raw(
                f'SELECT * FROM (SELECT * FROM SHOW WHERE MOVIE_ID={pk}) WHERE ROWNUM=1;'
            )[0]
        except IndexError:
            pass
        else:
            return HttpResponse(status=409, content="선택한 영화에 대한 상영정보가 존재합니다.")

        with connection.cursor() as cursor:
            cursor.execute(f"DELETE FROM MOVIE WHERE MOVIE_ID={movie_id}")
        return HttpResponse(status=204)
Exemplo n.º 4
0
    def create(self, request, *args, **kwargs):
        if not is_admin(request):
            return HttpResponse(status=401)

        serializer = MovieCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        movie_name = request.data.get('movieName')
        movie_time = request.data.get('movieTime')  # Nullable
        movie_desc = request.data.get('movieDescription')  # Nullable
        if movie_desc:
            movie_desc = movie_desc.replace("'", "''")
        movie_distr = request.data.get('movieDistribute')  # Nullable
        movie_release = request.data.get('movieRelease')  # Nullable
        movie_gen = request.data.get('movieGen')  # Nullable
        directors = request.data.get('directors')  # Nullable
        actors = request.data.get('actors')  # Nullable
        poster_url = request.data.get('moviePosterUrl')  # Nullable
        movie_grade = request.data.get('movieGrade')  # Nullable

        with connection.cursor() as cursor:
            cursor.execute(
                        "INSERT INTO MOVIE " \
                                f"VALUES (MOVIE_SEQ.NEXTVAL, '{movie_name}', " \
                                + (f"(TO_DATE('{movie_time}','HH24:MI:SS')), " if movie_time else "NULL,") \
                                + (f"'{movie_desc}', " if movie_desc else "NULL, ") \
                                + (f"'{movie_distr}', " if movie_distr else "NULL, ") \
                                + (f"'{movie_release}', " if movie_release else "NULL, ") \
                                + (f"'{movie_gen}', " if movie_gen else "NULL, ") \
                                + (f"0, ") \
                                + (f"'{directors}', " if directors else "NULL, ") \
                                + (f"'{actors}', " if actors else "NULL, ") \
                                + (f"'{poster_url}', " if poster_url else "NULL, ") \
                                + (f"'{movie_grade}');" if movie_grade else "NULL);")
                    )
        return HttpResponse(status=201)
Exemplo n.º 5
0
    def create(self, request, *args, **kwargs):
        if not is_admin(request):
            return HttpResponse(status=403)

        serializer = ShowCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        movie_id = request.data.get('movieId')
        theater_id = request.data.get('theaterId')
        show_start_time = request.data.get('showStartTime')

        try:
            movie = Movie.objects.raw(
                f"SELECT * FROM (SELECT * FROM MOVIE WHERE MOVIE_ID={movie_id} AND " \
                        f"MOVIE_RELEASE <= TO_DATE('{show_start_time}', " \
                        "'YYYY-MM-DD HH24:MI:SS')) WHERE ROWNUM=1;"
            )[0]
            Theater.objects.raw(
                f"SELECT * FROM (SELECT * FROM THEATER WHERE THEATER_ID={theater_id}) WHERE ROWNUM=1;"
            )[0]
        except IndexError:
            return HttpResponse(status=400,
                                content="영화 개봉일 또는 상영관 번호를 다시 한번 확인해주세요.")

        def delta(movie_time: datetime.time) -> datetime.timedelta:
            return datetime.datetime.combine(
                datetime.date.min, movie_time) - datetime.datetime.min

        start_time_dt = datetime.datetime.strptime(show_start_time,
                                                   '%Y-%m-%d %H:%M:%S')
        if movie.movie_time:
            movie_time_delta = delta(movie.movie_time)
        else:
            return HttpResponse(status=400,
                                content=f"{movie_id}번 영화에 상영시간 정보가 없습니다.")
        show_end_time = start_time_dt + movie_time_delta

        yesterday = start_time_dt - datetime.timedelta(1)
        tomorrow = start_time_dt + datetime.timedelta(1)

        with connection.cursor() as cursor:
            cursor.execute(
                f"SELECT S.SHOW_START_TIME, M.MOVIE_TIME FROM SHOW S, MOVIE M " \
                        f"WHERE S.THEATER_ID={theater_id} AND "
                        f"TO_DATE('{yesterday}', 'YYYY-MM-DD HH24:MI:SS') < S.SHOW_START_TIME AND " \
                        f"TO_DATE('{tomorrow}', 'YYYY-MM-DD HH24:MI:SS') > S.SHOW_START_TIME AND "
                        f"S.MOVIE_ID=M.MOVIE_ID;")
            for show in cursor.fetchall():
                s_start_dt = show[0]
                s_end_dt = show[0] + delta(show[1].time())
                if (s_start_dt < start_time_dt and start_time_dt < s_end_dt
                    ) or (start_time_dt <= s_start_dt
                          and s_start_dt < show_end_time):
                    return HttpResponse(status=400, content="상영시간이 겹칩니다.")

        show_count = movie.show_total_count + 1
        with connection.cursor() as cursor:
            cursor.execute(
                    "INSERT INTO SHOW " \
                            f"VALUES (SHOW_SEQ.NEXTVAL, {theater_id}, " \
                            f"'{show_start_time}', {show_count}, {movie_id});"
                    )
            cursor.execute(
                        "UPDATE MOVIE SET " \
                                f"SHOW_TOTAL_COUNT={show_count} WHERE MOVIE_ID={movie_id};"
                    )
        return HttpResponse(status=201)
Exemplo n.º 6
0
    def partial_update(self, request, pk, *args, **kwargs):
        if not is_admin(request):
            return HttpResponse(status=401)

        serializer = MoviePatchSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        movie_release = request.data.get('movieRelease')  # Nullable

        with connection.cursor() as cursor:
            cursor.execute(
                f"""SELECT MOVIE_NAME, MOVIE_TIME, MOVIE_DESC, MOVIE_DISTR, 
                               MOVIE_RELEASE, MOVIE_GEN, DIRECTORS, ACTORS, POSTER_URL, 
                               MOVIE_GRADE FROM MOVIE WHERE MOVIE_ID={pk};""")
            _res = cursor.fetchone()
            if not _res:
                return HttpResponse(status=404)
            _res = list(_res)
            if movie_release:
                cursor.execute(f"""SELECT * FROM SHOW WHERE MOVIE_ID={pk} AND 
                    SHOW_START_TIME < TO_DATE('{movie_release}', 'YYYY-MM-DD');"""
                               )
                if cursor.fetchone():
                    return HttpResponse(status=400,
                                        content="개봉예정일보다 먼저 상영하는 상영정보가 존재합니다.")

            qs = []
            for col in request.data:
                if col == "movieName":
                    qs.append(f"MOVIE_NAME='{request.data.get('movieName')}'")
                    _res[0] = request.data.get('movieName')
                elif col == "movieTime":
                    qs.append(
                        f"MOVIE_TIME=TO_DATE('{request.data.get('movieTime')}', 'HH24:MI:SS')"
                    )
                    _res[1] = request.data.get('movieTime')
                elif col == "movieDescription":
                    desc = request.data.get('movieDescription').replace(
                        "'", "''")
                    qs.append(f"MOVIE_DESC='{desc}'")
                    _res[2] = request.data.get('movieDescription')
                elif col == "movieDistribute":
                    qs.append(
                        f"MOVIE_DISTR='{request.data.get('movieDistribute')}'")
                    _res[3] = request.data.get('movieDistribute')
                elif col == "movieRelease":
                    qs.append(f"MOVIE_RELEASE='{movie_release}'")
                    _res[4] = request.data.get('movieRelease')
                elif col == "movieGen":
                    qs.append(f"MOVIE_GEN='{request.data.get('movieGen')}'")
                    _res[5] = request.data.get('movieGen')
                elif col == "directors":
                    qs.append(f"DIRECTORS='{request.data.get('directors')}'")
                    _res[6] = request.data.get('directors')
                elif col == "actors":
                    qs.append(f"ACTORS='{request.data.get('actors')}'")
                    _res[7] = request.data.get('actors')
                elif col == "moviePosterUrl":
                    qs.append(
                        f"POSTER_URL='{request.data.get('moviePosterUrl')}'")
                    _res[8] = request.data.get('moviePosterUrl')
                elif col == "movieGrade":
                    qs.append(
                        f"MOVIE_GRADE='{request.data.get('movieGrade')}'")
                    _res[9] = request.data.get('movieGrade')

            cursor.execute(
                f"UPDATE MOVIE SET {','.join(qs)} WHERE MOVIE_ID={pk};")
            res = {
                "movieName": _res[0],
                "movieTime": _res[1],
                "movieDescription": _res[2],
                "movieDistribute": _res[3],
                "movieRelease": _res[4],
                "movieGen": _res[5],
                "directors": _res[6],
                "actors": _res[7],
                "moviePosterUrl": _res[8],
                "movieGrade": _res[9],
            }
        return JsonResponse(res, status=200)