# import csv
from flask import Flask, render_template, request, redirect
from pymongo import MongoClient
from bson import ObjectId
import plotly.graph_objs as go
from plotly.subplots import make_subplots
import plotly.express as px
app = Flask(__name__)
client = MongoClient('mongodb://localhost:27017/')
db = client['pbl']
koleksi = db['film']
# Membaca file CSV dan memasukkan data ke MongoDB jika belum ada
# path_csv = 'ds_salaries.csv'
# with open(path_csv, 'r') as csvfile:
# csv_reader = csv.DictReader(csvfile)
# for row in csv_reader:
# koleksi.insert_one(row)
# Rute untuk menampilkan data dari koleksi MongoDB
# Rute untuk menampilkan data dari koleksi MongoDB
def get_formatted_data():
data_cursor = koleksi.find()
formatted_data = []
header = ['title', 'type', 'release_year', 'age_certification', 'runtime', 'genres', 'production_countries', 'seasons', 'imdb_id', 'imdb_score', 'imdb_votes']
for row in data_cursor:
formatted_row = {key: row[key] for key in header}
formatted_data.append(formatted_row)
return formatted_data
# Rute lainnya untuk tambah, edit, dan hapus data
# Rute untuk menampilkan data dan melakukan pencarian
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
query = request.form.get('query')
if query:
data_cursor = koleksi.find({
'$or': [
{'title': {'$regex': query, '$options': 'i'}},
{'type': {'$regex': query, '$options': 'i'}},
{'release_year': {'$regex': query, '$options': 'i'}},
{'age_certification': {'$regex': query, '$options': 'i'}},
{'runtime': {'$regex': query, '$options': 'i'}},
{'genres': {'$regex': query, '$options': 'i'}},
{'production_countries': {'$regex': query, '$options': 'i'}},
{'seasons': {'$regex': query, '$options': 'i'}},
{'imdb_id': {'$regex': query, '$options': 'i'}},
{'imdb_score': {'$regex': query, '$options': 'i'}},
{'imdb_votes': {'$regex': query, '$options': 'i'}}
]
})
data_list = list(data_cursor)
return render_template('index.html', data=data_list)
else:
return redirect('/')
else:
data_cursor = koleksi.find()
data_list = list(data_cursor)
return render_template('index.html', data=data_list)
# Rute untuk menambah data baru
@app.route('/add', methods=['POST'])
def add():
new_data = {
'title': request.form['title'],
'type': request.form['type'],
'release_year': request.form['release_year'],
'age_certification': request.form['age_certification'],
'runtime': request.form['runtime'],
'genres': request.form['genres'],
'production_countries': request.form['production_countries'],
'seasons': request.form['seasons'],
'imdb_id': request.form['imdb_id'],
'imdb_score': request.form['imdb_score'],
'imdb_votes': request.form['imdb_votes']
}
koleksi.insert_one(new_data)
return redirect('/')
# Rute untuk menghapus data
@app.route('/delete/<id>', methods=['GET'])
def delete(id):
koleksi.delete_one({'_id': ObjectId(id)})
return redirect('/')
# Rute untuk menampilkan form edit
@app.route('/edit/<string:row_id>', methods=['GET'])
def edit_data(row_id):
data = koleksi.find_one({'_id': ObjectId(row_id)})
if data:
return render_template('edit.html', data=data)
else:
return "Data not found", 404 # Optional: Menampilkan pesan jika data tidak ditemukan
# ... Kode lainnya ...
@app.route('/graph', methods=['GET'])
def show_graph():
data_list = get_formatted_data()
# Memproses data untuk grafik
imdb_scores = []
type_count = {}
seasons_count = {}
for row in data_list:
# Proses untuk IMDb Scores
imdb_score = row.get('imdb_score', '')
try:
if imdb_score:
imdb_scores.append(float(imdb_score))
except ValueError as e:
print(f"Error converting IMDb score '{imdb_score}' to float. Error: {e}")
# Proses untuk Type SHOW Distribution (semua jenis tipe)
type_show = row.get('type', '')
type_count[type_show] = type_count.get(type_show, 0) + 1
# Proses untuk Seasons Distribution
seasons = row.get('seasons', '')
seasons_count[seasons] = seasons_count.get(seasons, 0) + 1
# Membuat grafik lingkaran (pie chart) dengan Plotly Express untuk Type SHOW Distribution
fig_pie_type = px.pie(names=list(type_count.keys()), values=list(type_count.values()), title='Type Film')
# Membuat grafik lingkaran (pie chart) dengan Plotly Express untuk Seasons Distribution
fig_pie_seasons = px.pie(names=list(seasons_count.keys()), values=list(seasons_count.values()), title='Seasons Distribution')
# Membuat grafik batang (bar chart) dengan 10 IMDb scores tertinggi
top_10_imdb_scores = sorted(data_list, key=lambda x: float(x['imdb_score']), reverse=True)[:10]
fig_bar = go.Figure(data=go.Bar(x=[row['title'] for row in top_10_imdb_scores], y=[float(row['imdb_score']) for row in top_10_imdb_scores], name='Top 10 IMDb Scores'),)
# Menambahkan keterangan pada grafik batang
fig_bar.update_layout(title='Top 10 IMDb Scores', xaxis_title='Film', yaxis_title='IMDb Score')
# Menyimpan gambar grafik sementara
graph_pie_type = fig_pie_type.to_html(full_html=False)
graph_pie_seasons = fig_pie_seasons.to_html(full_html=False)
graph_bar = fig_bar.to_html(full_html=False)
return render_template('graph.html', graph_pie_type=graph_pie_type, graph_pie_seasons=graph_pie_seasons, graph_bar=graph_bar)
@app.route('/update/<id>', methods=['POST'])
def update(id):
updated_data = {
'title': request.form['title'],
'type': request.form['type'],
'release_year': request.form['release_year'],
'age_certification': request.form['age_certification'],
'runtime': request.form['runtime'],
'genres': request.form['genres'],
'production_countries': request.form['production_countries'],
'seasons': request.form['seasons'],
'imdb_id': request.form['imdb_id'],
'imdb_score': request.form['imdb_score'],
'imdb_votes': request.form['imdb_votes']
}
koleksi.update_one({'_id': ObjectId(id)}, {'$set': updated_data})
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)