3 from datetime import date
4 from flask import Flask, request, session, redirect, url_for, abort, \
5 render_template, flash, send_from_directory
6 from werkzeug.utils import secure_filename
7 from flaskr.db import get_db
9 """ ---------------- ---------------- App Init ---------------- ---------------- """
10 UPLOAD_FOLDER = 'c:/Users/Joseph/Downloads/Media_Server_Upload'
11 ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
12 DOWNLOAD_FROM_DIRECTORY = 'c:/Users/Joseph/Downloads/Media_Server_Upload'
13 WORK_DIRECTORY = 'c:/Users/Joseph/Documents/GitHub/flaskr_mediaserver/'
14 SQL_DIRECTORY = 'sql/'
16 # create our little application :)
19 app.config.from_object(__name__)
20 app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
21 app.config['DOWNLOAD_FROM_DIRECTORY'] = DOWNLOAD_FROM_DIRECTORY
22 # Load default config and override config from an environment variable
23 app.config.update(dict(
24 DATABASE=os.path.join(app.root_path, 'flaskr.db'),
25 SECRET_KEY='development key',
29 app.config.from_envvar('FLASKR_SETTINGS', silent=True)
32 def allowed_file(filename):
33 return '.' in filename and \
34 filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
46 """ ---------------- ---------------- General Functions ---------------- ---------------- """
48 @app.route('/login', methods=['GET', 'POST'])
51 if request.method == 'POST':
52 if request.form['username'] != app.config['USERNAME']:
53 error = 'Invalid username'
54 elif request.form['password'] != app.config['PASSWORD']:
55 error = 'Invalid password'
57 session['logged_in'] = True
58 flash('You were logged in')
60 # return redirect(url_for('item_list'))
61 return render_template('dashboard.html')
62 return render_template('login.html', error=error)
68 session.pop('logged_in', None)
69 flash('You were logged out')
70 # return redirect(url_for('item_list'))
71 return render_template('dashboard.html')
78 #Get row count of a table
79 def get_next_row(currentTable):
80 sql_string = open('sql/select_row_count.sql', 'r').read()
81 sql_string = sql_string.replace("currentTable", currentTable)
83 cur = db.execute(sql_string)
84 row_count = cur.fetchone()
87 """ ---------------- ---------------- Main Routes ---------------- ---------------- """
88 #Display Data - Dashboard
91 return render_template('dashboard.html')
95 #Show the settings page
96 # Need to add in DB: a table and place to put the settings like file server save location
97 @app.route('/mediaserver_settings', methods=['GET', 'POST'])
98 def mediaserver_settings():
100 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'select_settings.sql', 'r').read()
101 cur = db.execute(sql_string)
102 default_upload_path = cur.fetchall()
103 print("default_upload_path")
104 print(default_upload_path[0])
105 print("default_upload_path")
106 return render_template('mediaserver_settings.html', default_upload_path=default_upload_path)
109 @app.route('/save_settings', methods=['POST'])
110 def mediaserver_save_settings():
111 # add db stuff here to add the save location to db
112 # or can use a text file to store the data
113 # then need to retrieve the save location foZr use
115 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'delete_settings.sql', 'r').read()
116 db.execute(sql_string)
118 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'insert_settings.sql', 'r').read()
119 db.execute(sql_string, [request.form['server_file_path']])
121 app.config['UPLOAD_FOLDER'] = request.form['server_file_path']
122 app.config['DOWNLOAD_FROM_DIRECTORY'] = request.form['server_file_path']
125 return redirect(url_for('mediaserver_settings'))
130 Use DB to store filenames and folders
131 get filenames and folders using DB select when displaying webpage
134 #Select all files and display webpage
135 @app.route('/mediaserver_list')
136 def mediaserver_file_list():
137 # sql_string = open('sql/select_all_pcparts.sql', 'r').read()
138 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'select_mediaserver_file_list.sql', 'r').read()
139 #Need to insert into sql folder hiearchy of file (add column to db: file_path
143 cur = db.execute(sql_string)
144 items = cur.fetchall()
146 #Get array of files and folders in the download directory
147 files_and_folders = os.listdir(app.config['DOWNLOAD_FROM_DIRECTORY'])
149 print(files_and_folders)
152 print(files_and_folders)
157 #Will use this for later (will have to build path_of_file from SQL select statement)
158 #Only if we need creation time (c) or modified time (m) from the OS when file is being downloaded
159 #Create array to store date.time of files in download directory
160 files_creation_time = []
162 for file in files_and_folders:
163 path_of_file = app.config['DOWNLOAD_FROM_DIRECTORY'] + "/" + file
164 print("last modified: %s" % time.ctime(os.path.getctime(path_of_file)))
165 files_creation_time.append(time.ctime(os.path.getctime(path_of_file)))
166 #print("created: %s" % time.ctime(os.path.getctime(file)))
168 #return render_template('mediaserver_file_list.html', files_and_folders=files_and_folders)
169 return render_template('mediaserver_file_list.html', items=items)
173 #@app.route('/get-files/<path:path>',methods = ['GET','POST'])
174 #def get_files(path):
176 # """Download a file."""
178 # return send_from_directory(DOWNLOAD_DIRECTORY, path, as_attachment=True)
179 # except FileNotFoundError:
182 @app.route('/mediaserver_download_file', methods=['POST'])
183 def mediaserver_download_file():
185 # Select from DB the file (find filename, return row)
186 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'select_fileToDownload.sql', 'r').read()
188 #abc = db.execute('PRAGMA FOREIGN_KEYS=ON')
189 file = db.execute(sql_string,[request.form['file_to_download']])
191 DownloadFileList = file.fetchall()
192 #print("AAAAAAA 5555555 AAAAA")
193 #print(DownloadFileList[0][2])
194 #a11 = str(DownloadFileList[0][2])
196 #a12 = a11.split('.')
198 abc = DownloadFileList[0][2].split('\\')
202 #print("AAAAAAA 5555555 AAAAA")
204 # file_path - filepath of the file to download
205 # DownloadFileList - file name of the file to download
207 return send_from_directory(file_path, DownloadFileList[0][1], as_attachment=True)
208 except FileNotFoundError:
211 flash('File downloaded from OS disk!')
212 return redirect(url_for('mediaserver_file_list'))
215 """ ---------------- ---------------- Delete Part ---------------- ----------------"""
216 @app.route('/mediaserver_delete_file', methods=['POST'])
217 def mediaserver_delete_file():
219 # Need OS operations to locate the file to delete it instead of SQL
220 # save the file to the OS' hard drive
221 # file.delete(os.path.join(app.config['UPLOAD_FOLDER'], filename))
222 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'select_fileToDelete.sql', 'r').read()
224 filepath_of_file_to_delete = db.execute(sql_string,[request.form['file_to_delete']])
225 #print(filepath_of_file_to_delete)
226 db_files = filepath_of_file_to_delete.fetchall()
227 #print("db_files.file_id")
228 #print(db_files[0][0])
229 #print("db_files.file_id")
230 os.remove(db_files[0][0])
232 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'delete_file.sql', 'r').read()
234 #abc = db.execute('PRAGMA FOREIGN_KEYS=ON')
235 db.execute(sql_string,[request.form['file_to_delete']])
237 flash('File data deleted from database and file deleted from Operating System!')
238 return redirect(url_for('mediaserver_file_list'))
241 # save the file to the OS' hard drive
242 #file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
245 #Display Data - a part's details
246 #@app.route('/pcparts_list/<int:pcPartId>/<pcPartType>/part_details/')
247 #def part_details(pcPartId, pcPartType):
248 # selected_row = get_part_details(pcPartId, pcPartType)
250 # pcPartId ==> current part id
251 # selected_row ==> the part's details
252 # return render_template('/pcparts/select_ssd.html', pcPartId=pcPartId, selected_row=selected_row, pcPartType=pcPartType)
257 # Display Form - Add a New File
258 @app.route('/mediaserver_addFile.html', methods=['GET', 'POST'])
259 def mediaserver_addFiles():
260 #pcBuildList = get_pcBuildList()
262 return render_template('mediaserver_addFile.html')
266 # Submit POST - Add a New File
267 # This is the executive command (not browsable web page)
268 @app.route('/mediaserver_addFile', methods=['GET', 'POST'])
270 if not session.get('logged_in'):
275 if request.method == 'POST':
276 # check if the post request has the file part
277 if 'file' not in request.files:
278 flash('No file part')
279 return redirect(request.url)
280 file = request.files['file']
281 # If the user does not select a file, the browser submits an
282 # empty file without a filename.
283 if file.filename == '':
284 flash('No selected file')
285 return redirect(request.url)
286 #if file and allowed_file(file.filename):
290 filename = secure_filename(file.filename)
292 # insert file path here (also includes file name)
293 filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
294 #filepath = app.config['UPLOAD_FOLDER'] + '/'
298 # save the file to the OS' hard drive
299 file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
300 #Get filesize (in bytes)
301 filesize = os.path.getsize(os.path.join(app.config['UPLOAD_FOLDER'], filename))
303 # Need to add file and file info to sqlite database
305 #sql_string = open('c:/Users/Joseph/Documents/GitHub/flaskr_mediaserver/sql/upload_file.sql', 'r').read()
306 sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'upload_file.sql', 'r').read()
307 db.execute(sql_string, [filename,
313 return redirect(url_for('add_file', name=filename))
316 flash('File extension not supported!')
318 return render_template('mediaserver_addFile.html')
320 #Submit POST - Add a New File
321 #@app.route('/mediaserver_addFile', methods=['GET', 'POST'])
323 # if not session.get('logged_in'):
327 # sql_string = open('c:/Users/Joseph/Documents/GitHub/flaskr_mediaserver/sql/upload_file.sql', 'r').read()
328 # db.execute(sql_string, [request.form['file_name'],
329 # request.form['file_data']
333 #return redirect(url_for('dashboard'))
334 #return render_template('dashboard.html')
335 # return render_template('mediaserver_addFile.html')