Adding Single Movie CRUD Functionality
#controllers/dashboard/movie.py import config, copy, lib, datetime, uuid from flask import render_template, session, request, redirect from models.userdb import Userdb from models.moviedb import Moviedb class Movie(): def __init__(self): self.userdb = Userdb() self.lib = lib.Lib() self.moviedb = Moviedb() def get_post(self): vdict = copy.deepcopy(config.vdict) vdict['site_title'] = "ទំព័រភាពយន្តទោល" vdict['datetime'] = self.lib.get_timezone() session['page'] = 0 if (request.method == "POST") and ('logged-in' in session): vid = request.form['fvid'] type = request.form['ftype'] title = request.form['ftitle'] content = request.form['fcontent'] country = request.form['fcountry'] date = request.form['fdate'] time = request.form['ftime'] author = session['logged-in'] try: date = datetime.datetime.strptime(date, "%d/%m/%Y") except ValueError: vdict['message'] = 'ទំរង់កាលបរិច្ឆេទមិនត្រឹមត្រូវ!' return render_template('dashboard/movie.html', data=vdict) try: time = datetime.datetime.strptime(time, "%H:%M:%S") except ValueError: vdict['message'] = 'ទំរង់ពេលវេលាមិនត្រឹមត្រូវ!' return render_template('dashboard/movie.html', data=vdict) if 'edit-id' in session: id = session['edit-id'] self.moviedb.update(vid, type, title, country, content, date, time, author, id) session.pop('edit-id', None) else: id = str(uuid.uuid4().int) self.moviedb.insert(id, vid, type, title, country, content, date, time, author) vdict['movies'] = self.moviedb.select(vdict['dashboard_max_post']) vdict['thumbs'] = self.lib.get_thumbs(vdict['movies'], 5, type='movie') return render_template('dashboard/movie.html', data=vdict) elif 'logged-in' in session: vdict['movies'] = self.moviedb.select(vdict['dashboard_max_post']) vdict['thumbs'] = self.lib.get_thumbs(vdict['movies'], 5, type='movie') return render_template('dashboard/movie.html', data=vdict) else: return redirect('/login/') def edit(self, id): vdict = copy.deepcopy(config.vdict) vdict['site_title'] = 'កែតំរូវភាពយន្តទោល' session['edit-id'] = id if 'logged-in' in session: vdict['movies'] = self.moviedb.select(vdict['dashboard_max_post']) vdict['thumbs'] = self.lib.get_thumbs(vdict['movies'], 5, type='movie') vdict['movie'] = self.moviedb.select(id=id) date = (vdict['movie'][6]).strftime('%d/%m/%Y') time = (vdict['movie'][7]).strftime('%H:%M:%S') vdict['datetime'] = (date, time) return render_template('dashboard/movie.html', data=vdict) return redirect('/login/') def delete(self, id): self.moviedb.delete(id) return redirect('/dashboard/movie/') def load(self): if 'logged-in' in session: vdict = copy.deepcopy(config.vdict) session['page'] += 1 vdict['movies'] = self.moviedb.select(vdict['dashboard_max_post'], page=session['page']) vdict['thumbs'] = self.lib.get_thumbs(vdict['movies'], 5, type="movie") new_list = [] for movie in vdict['movies']: new_movie = list(movie) new_movie[6] = movie[6].strftime('%d/%m/%Y') new_movie[7] = movie[7].strftime('%H:%M:%S') new_list.append(new_movie) vdict['movies'] = new_list return vdict else: return render_template('login.html', data=vdict)
#models/userdb.py import os, psycopg2 class Moviedb(): def __init__(self): self.create_table() def set_conection(self): if 'DYNO' in os.environ: DATABASE_URL = os.environ['DATABASE_URL'] self.conn = psycopg2.connect(DATABASE_URL, sslmode='require') self.cursor = self.conn.cursor() else: self.conn = psycopg2.connect( database="postgres", user="postgres", password="sokhavuth", host="localhost", port="5432" ) self.cursor = self.conn.cursor() def create_table(self): self.set_conection() SQL = '''CREATE TABLE IF NOT EXISTS MOVIES( ID TEXT, VID TEXT, TYPE TEXT, TITLE TEXT, COUNTRY TEXT, CONTENT TEXT, CDATE DATE, CTIME TIME, AUTHOR TEXT )''' self.cursor.execute(SQL) self.conn.commit() self.conn.close() def insert(self, *movie): self.set_conection() self.cursor.execute("INSERT INTO MOVIES (ID, VID, TYPE, TITLE, COUNTRY, CONTENT, CDATE, CTIME, AUTHOR) VALUES %s ", (movie,)) self.conn.commit() self.conn.close() def select(self, amount=5, id='', page=0): self.set_conection() if id: SQL = "SELECT * FROM MOVIES WHERE ID=%s" self.cursor.execute(SQL, (id,)) result = self.cursor.fetchone() elif page: SQL = "SELECT * FROM MOVIES ORDER BY CDATE DESC, CTIME DESC OFFSET %s ROWS FETCH NEXT %s ROWS ONLY" self.cursor.execute(SQL, (amount*page, amount)) result = self.cursor.fetchall() else: SQL = "SELECT * FROM MOVIES ORDER BY CDATE DESC, CTIME DESC LIMIT %s" self.cursor.execute(SQL, (amount,)) result = self.cursor.fetchall() self.conn.close() return result def delete(self, id): self.set_conection() SQL = "DELETE FROM MOVIES WHERE ID = %s" self.cursor.execute(SQL, (id,)) self.conn.commit() self.conn.close() def update(self, *movie): self.set_conection() sql = "UPDATE MOVIES SET VID = %s, TYPE = %s, TITLE = %s, COUNTRY = %s, CONTENT = %s, CDATE = %s, CTIME = %s, AUTHOR = %s WHERE ID = %s" self.cursor.execute(sql, movie) self.conn.commit() self.conn.close() def search(self, query): self.set_conection() sql = "SELECT * from USERS WHERE" sql += " EMAIL LIKE '%"+query+"%'" sql += " OR CONTENT LIKE '%"+query+"%'" sql += " ORDER BY CATDATE DESC, CATTIME DESC LIMIT 20" self.cursor.execute(sql) result = self.cursor.fetchall() return result
<!--templates/dashboard/movie.html--> {% extends 'dashboard/index.html' %} {% block head %} {{ super() }} <link href="/static/styles/dashboard/movie.css" rel="stylesheet"> <script src="/static/scripts/dashboard/movie.js"></script> {% endblock %} {% block content %} <form id='movie' action='/dashboard/movie/' method="POST" > {% if 'movie' in data %} <input id='movie-title' value="{{ data['movie'][3] }}" name="ftitle" type="text" placeholder="ចំណងជើងភាពយន្ត" required /> <textarea name="fcontent" id="editor" >{{ data['movie'][5] }}</textarea> {% else: %} <input id='movie-title' value="" name="ftitle" type="text" placeholder="ចំណងជើងភាពយន្ត" required /> <textarea name="fcontent" id="editor" ></textarea> {% endif %} <div id="bottombar"> <input id="submit" class="bottom-widget" type="submit" value="ចុះផ្សាយ"> {% if 'movie' in data %} <input type="text" value="{{ data['movie'][1] }}" class="bottom-widget" name="fvid" required /> <select id="type" class="bottom-widget" name="ftype"> <option>YouTube</option> <option>Facebook</option> <option>Dailymotion</option> <option>Vimeo</option> <option>OKRU</option> </select> <script>$("#type").val("{{data['movie'][2]}}").change();</script> <select id="country" class="bottom-widget" name="fcountry" > <option>World</option> <option>Korean</option> <option>Chinese</option> <option>Thai</option> <option>Khmer</option> </select> <script>$("#country").val("{{data['movie'][4]}}").change();</script> <input id="movie-date" value="{{ data['datetime'][0] }}" class="bottom-widget " type="text" name="fdate" required /> <input id="movie-time" value="{{ data['datetime'][1] }}" class="bottom-widget " type="text" name="ftime" required /> {% else %} <input type="text" value="" class="bottom-widget" placeholder="Video ID" name="fvid" required /> <select id="type" class="bottom-widget" name="ftype"> <option>YouTube</option> <option>Facebook</option> <option>Dailymotion</option> <option>Vimeo</option> <option>OKRU</option> </select> <select id="country" class="bottom-widget" name="fcountry" > <option>World</option> <option>Korean</option> <option>Chinese</option> <option>Thai</option> <option>Khmer</option> </select> <input id="user-date" value="{{ data['datetime'][0] }}" class="bottom-widget user-date" type="text" name="fdate" required /> <input id="user-time" value="{{ data['datetime'][1] }}" class="bottom-widget user-time" type="text" name="ftime" required /> {% endif %} </div> </form> <div id="message">{{ data['message'] }}</div> <script src="/static/scripts/ckeditor/config.js"></script> {% endblock %} {% block item_listing %} <ul id="item-listing" class="item-listing region"> {% if 'movies' in data %} {% for v in range(data['movies']|length) %} <li class="movie"> <a class="thumbnail" href="/movie/{{ data['movies'][v][0] }}"> <img src="{{data['thumbs'][v]}}" /> </a> <div class='title'> <a href="/movie/{{ data['movies'][v][0] }}">{{ data['movies'][v][3] }}</a> <div>{{ data['movies'][v][4] }}</div> <span>{{ data['movies'][v][6].strftime('%d/%m/%Y') }}</span> </div> <div class="crud"> <div class="user">{{ data['movies'][v][8] }}</div> <a href='/dashboard/movie/edit/{{ data["movies"][v][0] }}'><img src="/static/images/edit.png" /></a> <a href='/dashboard/movie/delete/{{ data["movies"][v][0] }}'><img src="/static/images/delete.png" /></a> </div> </li> {% endfor %} {% endif %} </ul> <div id="load-more" class="load-more region"> <img onclick="movie.load_items('/dashboard/movie/load/', 'movies')" src="/static/images/load-more.png" /> </div> {% endblock %}
//static/scritps/dashboard/movie.js class Movie{ load_items(url){ $('#load-more img').attr('src', '/static/images/loading.gif'); $.get(url, function(data, status){ if(status === "success"){ movie.listing_movies(data) }else{ alert('Fail to connect to server.'); } }); } listing_movies(data){ var html = ''; for(var v=0; v<data['movies'].length; v++){ html += '<li class="movie">'; html += `<a class="thumbnail" href="/movie/${ data['movies'][v][0] }"><img src="${data['thumbs'][v]}" /></a>`; html += `<div class='title'>`; html += `<a href="/movie/${ data['movies'][v][0] }">${ data['movies'][v][3] }</a>`; html += `<div>${ data['movies'][v][4] }</div>` html += `<span>${ data['movies'][v][6] }</span>`; html += `</div>`; html += `<div class="crud">`; html += `<div class="user">${ data['movies'][v][8] }</div>`; html += `<a href='/dashboard/movie/delete/${ data["movies"][v][0] }'><img src="/static/images/delete.png" /></a>`; html += `<a href='/dashboard/movie/edit/${ data["movies"][v][0] }'><img src="/static/images/edit.png" /></a>`; html += `</div>`; html += `</li>`; } $('#item-listing').append(html); $('#load-more img').attr('src', '/static/images/load-more.png') } }//end class const movie = new Movie();
GitHub: "https://github.com/Sokhavuth/ETV
Heroku: https://khmerweb-etv.herokuapp.com/
Comments
Post a Comment