Merge pull request #3 from Perfectfire33/test
[openhouseparty.online/.git] / flaskr.py
1 # all the imports
2 import os, time
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
8
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/'
15
16 # create our little application :)
17 app = Flask(__name__)
18
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',
26     USERNAME='admin',
27     PASSWORD='testing'
28 ))
29 app.config.from_envvar('FLASKR_SETTINGS', silent=True)
30
31 # Called in
32 def allowed_file(filename):
33     return '.' in filename and \
34            filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
35
36
37
38
39
40
41
42
43
44
45
46 """ ---------------- ---------------- General Functions ---------------- ---------------- """
47 # Login
48 @app.route('/login', methods=['GET', 'POST'])
49 def login():
50     error = None
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'
56         else:
57             session['logged_in'] = True
58             flash('You were logged in')
59
60             # return redirect(url_for('item_list'))
61             return render_template('dashboard.html')
62     return render_template('login.html', error=error)
63
64
65 # Logout
66 @app.route('/logout')
67 def logout():
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')
72
73
74
75
76
77     
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)
82     db = get_db()
83     cur = db.execute(sql_string)
84     row_count = cur.fetchone()
85     return row_count
86     
87 """ ---------------- ---------------- Main Routes ---------------- ---------------- """
88 #Display Data - Dashboard
89 @app.route('/')
90 def dashboard():
91     return render_template('dashboard.html')
92
93
94
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():
99     db = get_db()
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)
107
108
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
114     db = get_db()
115     sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'delete_settings.sql', 'r').read()
116     db.execute(sql_string)
117     db.commit()
118     sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'insert_settings.sql', 'r').read()
119     db.execute(sql_string, [request.form['server_file_path']])
120     db.commit()
121     app.config['UPLOAD_FOLDER'] = request.form['server_file_path']
122     app.config['DOWNLOAD_FROM_DIRECTORY'] = request.form['server_file_path']
123
124
125     return redirect(url_for('mediaserver_settings'))
126
127
128
129 """
130 Use DB to store filenames and folders
131 get filenames and folders using DB select when displaying webpage
132 """
133
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
140
141
142         db = get_db()
143         cur = db.execute(sql_string)
144         items = cur.fetchall()
145
146         #Get array of files and folders in the download directory
147         files_and_folders = os.listdir(app.config['DOWNLOAD_FROM_DIRECTORY'])
148         print("AAAAAAA")
149         print(files_and_folders)
150         print("AAAAAAA")
151         print("AAAAAAA")
152         print(files_and_folders)
153         print("AAAAAAA")
154
155
156
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 = []
161
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)))
167
168         #return render_template('mediaserver_file_list.html', files_and_folders=files_and_folders)
169         return render_template('mediaserver_file_list.html', items=items)
170
171
172         
173 #@app.route('/get-files/<path:path>',methods = ['GET','POST'])
174 #def get_files(path):
175 #
176 #    """Download a file."""
177 #    try:
178 #        return send_from_directory(DOWNLOAD_DIRECTORY, path, as_attachment=True)
179 #    except FileNotFoundError:
180 #        abort(404)
181
182 @app.route('/mediaserver_download_file', methods=['POST'])
183 def mediaserver_download_file():
184
185         # Select from DB the file (find filename, return row)
186         sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'select_fileToDownload.sql', 'r').read()
187         db = get_db()
188         #abc = db.execute('PRAGMA FOREIGN_KEYS=ON')
189         file = db.execute(sql_string,[request.form['file_to_download']])
190         #db.commit()
191         DownloadFileList = file.fetchall()
192         #print("AAAAAAA 5555555   AAAAA")
193         #print(DownloadFileList[0][2])
194         #a11 = str(DownloadFileList[0][2])
195         #print(a11)
196         #a12 = a11.split('.')
197         #print(a12)
198         abc = DownloadFileList[0][2].split('\\')
199         file_path = abc[0]
200         #print("file_path")
201         #print(file_path)
202         #print("AAAAAAA 5555555   AAAAA")
203
204         # file_path - filepath of the file to download
205         # DownloadFileList - file name of the file to download
206         try:
207             return send_from_directory(file_path, DownloadFileList[0][1], as_attachment=True)
208         except FileNotFoundError:
209             abort(404)
210
211         flash('File downloaded from OS disk!')
212         return redirect(url_for('mediaserver_file_list'))
213
214
215 """ ---------------- ---------------- Delete Part ---------------- ----------------"""
216 @app.route('/mediaserver_delete_file', methods=['POST'])
217 def mediaserver_delete_file():
218
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()
223         db = get_db()
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])
231
232         sql_string = open(WORK_DIRECTORY + SQL_DIRECTORY + 'delete_file.sql', 'r').read()
233
234         #abc = db.execute('PRAGMA FOREIGN_KEYS=ON')
235         db.execute(sql_string,[request.form['file_to_delete']])
236         db.commit()
237         flash('File data deleted from database and file deleted from Operating System!')
238         return redirect(url_for('mediaserver_file_list'))
239
240
241 # save the file to the OS' hard drive
242 #file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
243
244
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)
249         #Display the page
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)
253
254
255
256
257 # Display Form - Add a New File
258 @app.route('/mediaserver_addFile.html', methods=['GET', 'POST'])
259 def mediaserver_addFiles():
260     #pcBuildList = get_pcBuildList()
261
262     return render_template('mediaserver_addFile.html')
263
264
265
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'])
269 def add_file():
270     if not session.get('logged_in'):
271         abort(401)
272
273
274
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):
287         if file:
288
289
290             filename = secure_filename(file.filename)
291
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'] + '/'
295
296
297
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))
302
303             # Need to add file and file info to sqlite database
304             db = get_db()
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,
308                                     filepath,
309                                     filesize,
310                                     date.today()
311                                 ])
312             db.commit()
313             return redirect(url_for('add_file', name=filename))
314
315         else:
316             flash('File extension not supported!')
317
318     return render_template('mediaserver_addFile.html')
319
320 #Submit POST - Add a New File
321 #@app.route('/mediaserver_addFile', methods=['GET', 'POST'])
322 #def add_file():
323 #    if not session.get('logged_in'):
324 #        abort(401)
325 #
326 #    db = get_db()
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']
330 #                            ])
331 #    db.commit()
332 #
333     #return redirect(url_for('dashboard'))
334     #return render_template('dashboard.html')
335 #    return render_template('mediaserver_addFile.html')
336
337
338
339