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)
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)
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)
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)
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)
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)