diff --git a/gallery/__init__.py b/gallery/__init__.py index 3f82f0e..d8987eb 100644 --- a/gallery/__init__.py +++ b/gallery/__init__.py @@ -13,19 +13,12 @@ import time import sys import os -# Import required OnlyLegs packages -#from packages import onlylegsDB -#onlylegsDB = onlylegsDB.DBmanager() -#onlylegsDB.initialize() - -#from packages import onlylegsSass -#onlylegsSass = onlylegsSass.Sassy('default') - # Import flask from flask import * from werkzeug.utils import secure_filename def create_app(test_config=None): + # Get environment variables from dotenv import load_dotenv load_dotenv(os.path.join('./gallery', 'user', '.env')) @@ -49,6 +42,16 @@ def create_app(test_config=None): os.makedirs(app.instance_path) except OSError: pass + + + # Load database + from . import db + db.init_app(app) + + # Load theme + #from . import sassy + #sassy.compile('default') + @app.errorhandler(405) def method_not_allowed(e): @@ -80,47 +83,19 @@ def create_app(test_config=None): msg = 'Server died inside :c' return render_template('error.html', error=error, msg=msg), 500 - from . import auth - app.register_blueprint(auth.bp) - from . import routes - app.register_blueprint(routes.bp) + # Load login, registration and logout manager + from . import auth + app.register_blueprint(auth.blueprint) + + # Load apis + from . import api + app.register_blueprint(api.blueprint) + + # Load routes for home and images + from . import gallery + app.register_blueprint(gallery.blueprint) app.add_url_rule('/', endpoint='index') - # - # METHODS - # - @app.route('/fileList/', methods=['GET']) - def image_list(item_type): - if request.method != 'GET': - abort(405) - - cursor = onlylegsDB.database.cursor() - cursor.execute("SELECT * FROM posts ORDER BY id DESC") - - item_list = cursor.fetchall() - - return jsonify(item_list) - - @app.route('/uploads//', methods=['GET']) - def uploads(quality, request_file): - if request.method != 'GET': - abort(405) - - quality = secure_filename(quality) - quality_dir = os.path.join(app.config['UPLOAD_FOLDER'], quality) - if not os.path.isdir(quality_dir): - abort(404) - - request_file = secure_filename(request_file) - - if not os.path.isfile(os.path.join(quality_dir, request_file)): - abort(404) - - return send_from_directory(quality_dir, request_file) - - from . import db - db.init_app(app) - return app \ No newline at end of file diff --git a/gallery/api.py b/gallery/api.py new file mode 100644 index 0000000..b0fbacc --- /dev/null +++ b/gallery/api.py @@ -0,0 +1,28 @@ +import functools +from flask import ( + Blueprint, flash, g, redirect, render_template, request, session, url_for, abort, jsonify, send_from_directory +) +from werkzeug.security import check_password_hash, generate_password_hash +from werkzeug.utils import secure_filename +from gallery.db import get_db + +blueprint = Blueprint('api', __name__, url_prefix='/api') + + +@blueprint.route('/uploads//', methods=['POST']) +def uploads(quality, request_file): + if request.method != 'POST': + abort(405) + + #quality = secure_filename(quality) + #quality_dir = os.path.join(app.config['UPLOAD_FOLDER'], quality) + #if not os.path.isdir(quality_dir): + # abort(404) + + #request_file = secure_filename(request_file) + + #if not os.path.isfile(os.path.join(quality_dir, request_file)): + # abort(404) + + #return send_from_directory(quality_dir, request_file) + abort(404) \ No newline at end of file diff --git a/gallery/auth.py b/gallery/auth.py index 37fa817..6371e77 100644 --- a/gallery/auth.py +++ b/gallery/auth.py @@ -5,10 +5,10 @@ from flask import ( from werkzeug.security import check_password_hash, generate_password_hash from gallery.db import get_db -bp = Blueprint('auth', __name__, url_prefix='/auth') +blueprint = Blueprint('auth', __name__, url_prefix='/auth') -@bp.before_app_request +@blueprint.before_app_request def load_logged_in_user(): user_id = session.get('user_id') @@ -20,7 +20,7 @@ def load_logged_in_user(): ).fetchone() -@bp.route('/register', methods=('GET', 'POST')) +@blueprint.route('/register', methods=('GET', 'POST')) def register(): if request.method == 'POST': username = request.form['username'] @@ -50,7 +50,7 @@ def register(): return render_template('auth/register.html') -@bp.route('/login', methods=('GET', 'POST')) +@blueprint.route('/login', methods=('GET', 'POST')) def login(): if request.method == 'POST': username = request.form['username'] @@ -76,7 +76,7 @@ def login(): return render_template('auth/login.html') -@bp.route('/logout') +@blueprint.route('/logout') def logout(): session.clear() return redirect(url_for('index')) diff --git a/gallery/gallery.py b/gallery/gallery.py new file mode 100644 index 0000000..a9d44b9 --- /dev/null +++ b/gallery/gallery.py @@ -0,0 +1,64 @@ +from flask import ( + Blueprint, flash, g, redirect, render_template, request, url_for, jsonify +) +from werkzeug.exceptions import abort +from werkzeug.utils import secure_filename +from gallery.auth import login_required +from gallery.db import get_db +blueprint = Blueprint('gallery', __name__) + + +@blueprint.route('/') +def index(): + return render_template('index.html') + +@blueprint.route('/image/') +def image(request_id): + # Check if request_id is valid + try: + request_id = int(request_id) + except ValueError: + abort(404) + + result = onlylegsDB.getImage(request_id) + + return render_template('image.html', fileName=result[1], id=request_id) + + +@blueprint.route('/group') +def groups(): + return render_template('groups/group.html', group_id='gwa gwa') + +@blueprint.route('/group/') +def group(id): + return render_template('groups/group.html', group_id=id) + + +@blueprint.route('/upload', methods=('GET', 'POST')) +@login_required +def upload(): + if request.method == 'POST': + file = request.files['file'] + form = request.form + + if secure_filename(file.filename) == '': + flash('No selected file') + return redirect('gallery.upload') + + return render_template('upload.html') + + +@blueprint.route('/profile') +def profile(): + return render_template('profile.html', user_id='gwa gwa') + + +@blueprint.route('/profile/') +def profile_id(id): + return render_template('profile.html', user_id=id) + + +@blueprint.route('/settings') +@login_required +def settings(): + return render_template('settings.html') \ No newline at end of file diff --git a/gallery/packages/onlylegsDB.py b/gallery/packages/onlylegsDB.py deleted file mode 100644 index 547d379..0000000 --- a/gallery/packages/onlylegsDB.py +++ /dev/null @@ -1,91 +0,0 @@ -import datetime -now = datetime.datetime.now() -import sys -import os - -class DBmanager(): - def __init__(self): - try: - import mysql.connector - from mysql.connector import Error - from dotenv import load_dotenv - except ImportError: - print("Error: could not import required packages") - sys.exit(1) - - env_path = os.path.join('usr', '.env') - if not os.path.exists(env_path): - print("Error: could not find .env file") - sys.exit(1) - - load_dotenv(env_path) - print(f"{now.hour}:{now.minute}:{now.second} - Connecting to database...") - - try: - database = mysql.connector.connect(host=os.environ.get('DB_HOST'), - port=os.environ.get('DB_PORT'), - database=os.environ.get('DB_NAME'), - user=os.environ.get('DB_USER'), - password=os.environ.get('DB_PASS') - ) - - if database.is_connected(): - db_Info = database.get_server_info() - print("Connected to MySQL Server version:", db_Info) - - cursor = database.cursor() - cursor.execute("select database();") - - record = cursor.fetchone() - print("Connected to database:", record[0]) - - print(f"{now.hour}:{now.minute}:{now.second} - Done!\n") - - except Error as e: - print("Error while connecting to Database!\nFull error:", e) - sys.exit(1) - - self.database = database - - def initialize(self): - if not os.path.exists(os.path.join('packages', 'tables', 'generate.sql')): - print("Error: could not find tables directory") - sys.exit(1) - else: - print(f"{now.hour}:{now.minute}:{now.second} - Initializing tables...") - - with open(os.path.join('packages', 'tables', 'generate.sql'), 'r') as sql: - cursor = self.database.cursor() - query = cursor.execute(sql.read(), multi=True) - - i = 0 - for res in query: - print(f"Query {i+1}: Affected {res.rowcount} rows") - i += 1 - - if not os.path.exists(os.path.join('packages', 'tables', 'junctions.sql')): - print("Error: could not find junctions directory") - sys.exit(1) - else: - print(f"{now.hour}:{now.minute}:{now.second} - Initializing junctions...") - - with open(os.path.join('packages', 'tables', 'junctions.sql'), 'r') as sql: - cursor = self.database.cursor() - query = cursor.execute(sql.read(), multi=True) - - i = 0 - for res in query: - print(f"Query {i+1}: Affected {res.rowcount} rows") - i += 1 - - self.database.commit() - print(f"{now.hour}:{now.minute}:{now.second} - Done!\n") - - def getImage(self, id): - sql = "SELECT * FROM posts WHERE id = %s" - img = (id,) - - cursor = self.database.cursor() - cursor.execute(sql, img) - - return cursor.fetchone() diff --git a/gallery/packages/tables/generate.sql b/gallery/packages/tables/generate.sql deleted file mode 100644 index 563451a..0000000 --- a/gallery/packages/tables/generate.sql +++ /dev/null @@ -1,67 +0,0 @@ -CREATE TABLE IF NOT EXISTS users ( - id INT(69) NOT NULL PRIMARY KEY AUTO_INCREMENT, - username VARCHAR(255) NOT NULL UNIQUE, - email VARCHAR(255) NOT NULL, - password VARCHAR(255) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS posts ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - file_name VARCHAR(255) NOT NULL UNIQUE, - author_id INT(69) NOT NULL, - description TEXT NOT NULL, - alt TEXT NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS groups ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - author_id INT(69) NOT NULL, - name VARCHAR(255) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS permissions ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - user_id INT(69) NOT NULL, - admin BOOLEAN NOT NULL DEFAULT FALSE, - create_posts BOOLEAN NOT NULL DEFAULT TRUE, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS devices ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - user_id INT(69) NOT NULL, - device_id VARCHAR(255) NOT NULL, - cookie VARCHAR(255) NOT NULL, - ip VARCHAR(255) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS tokens ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - token VARCHAR(255) NOT NULL UNIQUE, - is_used BOOLEAN NOT NULL DEFAULT FALSE, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS logs ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - ip VARCHAR(255) NOT NULL, - user_id INT(69) DEFAULT NULL, - code INT(69) NOT NULL, - note TEXT DEFAULT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS bans ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - ip VARCHAR(255) NOT NULL, - code INT(69) NOT NULL, - note TEXT DEFAULT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); diff --git a/gallery/packages/tables/junctions.sql b/gallery/packages/tables/junctions.sql deleted file mode 100644 index 53e8201..0000000 --- a/gallery/packages/tables/junctions.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE IF NOT EXISTS group_junction ( - id INT(69) PRIMARY KEY AUTO_INCREMENT, - group_id INT(69) NOT NULL, - image_id INT(69) NOT NULL -); \ No newline at end of file diff --git a/gallery/routes.py b/gallery/routes.py deleted file mode 100644 index 6ce3ea5..0000000 --- a/gallery/routes.py +++ /dev/null @@ -1,69 +0,0 @@ -from flask import ( - Blueprint, flash, g, redirect, render_template, request, url_for -) -from werkzeug.exceptions import abort - -from gallery.auth import login_required -from gallery.db import get_db - -bp = Blueprint('routes', __name__) - -# -# ROUTES -# -@bp.route('/') -def index(): - return render_template('index.html') - -@bp.route('/group') -def group(): - return render_template('group.html', group_id='gwa gwa') - -@bp.route('/group/') -def group_id(group_id): - try: - group_id = int(group_id) - except ValueError: - abort(404) - - return render_template('group.html', group_id=group_id) - -@bp.route('/upload') -def upload(): - return render_template('upload.html') - -@bp.route('/upload/form', methods=['POST']) -def upload_form(): - if request.method != 'POST': - abort(405) - - return 'balls' - -@bp.route('/profile') -def profile(): - return render_template('profile.html', user_id='gwa gwa') - -@bp.route('/profile/') -def profile_id(user_id): - try: - user_id = int(user_id) - except ValueError: - abort(404) - - return render_template('profile.html', user_id=user_id) - -@bp.route('/settings') -def settings(): - return render_template('settings.html') - -@bp.route('/image/') -def image(request_id): - # Check if request_id is valid - try: - request_id = int(request_id) - except ValueError: - abort(404) - - result = onlylegsDB.getImage(request_id) - - return render_template('image.html', fileName=result[1], id=request_id) \ No newline at end of file diff --git a/gallery/packages/onlylegsSass.py b/gallery/sassy.py similarity index 56% rename from gallery/packages/onlylegsSass.py rename to gallery/sassy.py index eb37b36..37058ca 100644 --- a/gallery/packages/onlylegsSass.py +++ b/gallery/sassy.py @@ -3,35 +3,25 @@ now = datetime.datetime.now() import sys import shutil import os +import sass -class Sassy(): +class compile(): def __init__(self, theme): - print("### OnlyLegs Theme Manager ###") - print(f"{now.hour}:{now.minute}:{now.second} - Loading theme...") + print(f"Loading '{theme}' theme...") - try: - import sass - except ImportError: - print("Could not find libsass!") - sys.exit(1) + theme_path = os.path.join('./user', 'themes', theme, 'style.scss') + font_path = os.path.join('./user', 'themes', theme, 'fonts') - theme_path = os.path.join('usr', 'themes', theme, 'style.scss') + print(f"Theme path: {theme_path}") if os.path.exists(theme_path): - print(f"Theme '{theme}' found at:", theme_path) self.sass = sass + self.loadTheme(theme_path) + self.loadFonts(font_path) else: print("No theme found!") sys.exit(1) - - font_path = os.path.join('usr', 'themes', theme, 'fonts') - - if os.path.exists(font_path): - print("Fonts found at:", font_path) - self.loadFonts(font_path) - else: - print("No fonts found!") print(f"{now.hour}:{now.minute}:{now.second} - Done!\n") @@ -41,24 +31,23 @@ class Sassy(): f.write(self.sass.compile(filename=theme, output_style='compressed')) print("Compiled successfully to:", f.name) except self.sass.CompileError as e: - print("Failed to compile!\nFull error:", e) + print("Failed to compile!\n", e) sys.exit(1) def loadFonts (self, font_path): - dest = os.path.join('static', 'theme', 'fonts') + dest = os.path.join('./static', 'theme', 'fonts') if os.path.exists(dest): print("Removing old fonts...") try: shutil.rmtree(dest) - print("Removed old fonts!") except Exception as e: - print("Failed to remove old fonts!\nFull error:", e) + print("Failed to remove old fonts!\n", e) sys.exit(1) try: shutil.copytree(font_path, dest) print("Copied fonts to:", dest) except Exception as e: - print("Failed to copy fonts!\nFull error:", e) + print("Failed to copy fonts!\n", e) sys.exit(1) \ No newline at end of file diff --git a/gallery/templates/group.html b/gallery/templates/groups/group.html similarity index 100% rename from gallery/templates/group.html rename to gallery/templates/groups/group.html diff --git a/gallery/templates/layout.html b/gallery/templates/layout.html index a706940..4b84abd 100644 --- a/gallery/templates/layout.html +++ b/gallery/templates/layout.html @@ -14,21 +14,21 @@