| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- # Site Back-End Logic
- from hmac import new
- from unicodedata import category
- from flask import Blueprint, render_template, request, flash, redirect, url_for, send_file
- from flask_login import login_user, login_required, logout_user, current_user
- from werkzeug.security import generate_password_hash, check_password_hash
- from .models import User, Bookmark, Groups
- from . import db
- import string, secrets
- import csv
- import subprocess as sp
- from . import iconfetch as icof
- logic = Blueprint('logic', __name__)
- # User Home Profile
- @logic.route('/', methods=['GET', 'POST'])
- @login_required
- def home():
- # generate csv of bookmarks
- def generate_csv():
- header = ['name', 'link', 'group', 'status']
- alphanumeric = string.ascii_letters + string.digits
- ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
- open(f'app/static/generated/{ralphanum}.csv', 'a').close
- with open(f'app/static/generated/{ralphanum}.csv', 'w', encoding='UTF8', newline='') as f:
- writer = csv.writer(f, delimiter=',', quotechar='"')
- writer.writerow(header)
- for bg, bml in bb_dic.items():
- for bm in bml:
- writer.writerow([bm.name, bm.link, bg, bm.status])
- p1 = sp.run(f'curl --upload-file app/static/generated/{ralphanum}.csv https://transfer.raqnet.org/',
- shell=True,
- capture_output=True,
- text=True
- )
- # clean up
- p2 = sp.run(f'rm app/static/generated/*', shell=True)
- return redirect(p1.stdout, code=302)
- # initialize dictionary of bookmarks and groups
- # owned groups
- bgroups = Groups.query.filter_by(owner=current_user.id).all()
- # owned bookmarks
- bmarks = Bookmark.query.filter_by(owner=current_user.id).all()
- # populate bookmark dict for show
- bb_dic = dict() # dict of lists
- for bg in bgroups:
- inter_list = list()
- for bm in bmarks:
- if bm.group == bg.group:
- inter_list.append(bm)
- bb_dic[bg.group] = inter_list
- # POST request method
- if request.method == "POST":
- username = request.form.get('username')
- passwd = request.form.get('password')
- passwdc = request.form.get('password_confirm')
- new_pic = request.files.get('profile_image')
- dl_bookml = request.form.get('dl_bookml')
- delbm = request.form.get('web_delete')
- if username:
- nusern_dbcall = User.query.filter_by(id=current_user.id).first()
- nusern_dbcall.username = username
- db.session.commit()
- flash('Username updated!', category='success')
- elif passwd and passwdc:
- if passwd == passwdc:
- npasswd_dbcall = User.query.filter_by(id=current_user.id).first()
- npasswd_dbcall.password = generate_password_hash(passwdc, method='sha256')
- db.session.commit()
- flash('Password successfully updated', category='success')
- else:
- flash('Passwords must match!', category='error')
- elif new_pic:
- # generate random filename for uploaded file
- alphanumeric = string.ascii_letters + string.digits
- ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
- new_pic_dbcall = User.query.filter_by(id=current_user.id).first()
- if '.png' in new_pic.filename:
- new_pic.save(f'app/static/uploads/{ralphanum}.png')
- new_pic_dbcall.profile_image = f'{ralphanum}.png'
- elif '.jpg' in new_pic.filename or 'jpeg' in new_pic.filename:
- new_pic.save(f'app/static/uploads/{ralphanum}.jpeg')
- new_pic_dbcall.profile_image = f'{ralphanum}.jpeg'
- db.session.commit()
- flash('Profile Pic updated!', category='success')
- elif dl_bookml:
- return generate_csv()
- elif delbm:
- bmq = Bookmark.query.get(delbm)
- if bmq:
- if bmq.owner == current_user.id:
- db.session.delete(bmq)
- db.session.commit()
- flash('Bookmark deleted!', category='success')
- return redirect(url_for('logic.home'))
- return render_template('home.html', user=current_user, bdic=bb_dic)
- # Public Bookmarks
- @logic.route('/shared', methods=['GET', 'POST'])
- @login_required
- def shared():
- # owned groups
- bgroups = Groups.query.filter_by(owner=current_user.id).all()
- # owned bookmarks
- bmarks = Bookmark.query.filter_by(owner=current_user.id).all()
- bb_dic = dict() # dict of lists
- for bg in bgroups:
- inter_list = list()
- for bm in bmarks:
- if bm.group == bg.group and bm.status == 'public':
- inter_list.append(bm)
- if len(inter_list) != 0:
- bb_dic[bg.group] = inter_list
- return render_template('shared.html', user=current_user, bdic=bb_dic)
- # Create new bookmark
- @logic.route('/create', methods=['GET', 'POST'])
- @login_required
- def create():
- # load bookmark groups
- bgroups = Groups.query.filter_by(owner=current_user.id).all()
- if request.method == 'POST':
- wlink = request.form.get('web_link')
- wname = request.form.get('web_name')
- wgroup = request.form.get('web_group')
- ngroup = request.form.get('new_group')
- wstatus = request.form.get('share_public_private')
- if wlink and wname and wstatus:
- # fetch/check icon
- sitecon = icof.check_icon(wlink)
- if not sitecon:
- sitecon = icof.fetch_icon(wlink)
- # add bookmark to database
- if wgroup == 'cng-555' and ngroup != '':
- wgroup = ngroup
- new_link = Bookmark(owner=current_user.id,
- status=wstatus,
- name=wname,
- group=wgroup,
- link=wlink,
- icon=sitecon
- )
- group_check = Groups.query.filter_by(group=wgroup).first()
- if not group_check:
- new_group = Groups(owner=current_user.id, group=wgroup)
- db.session.add(new_group)
- db.session.add(new_link)
- db.session.commit()
- flash('New Bookmark added!', category='success')
- return render_template('create_bookmark.html', user=current_user, bgroups=bgroups)
- # Account management
- @logic.route('/login', methods=['GET', 'POST'])
- def login():
- if request.method == 'POST':
- email = request.form.get('email')
- challenge_passwd = request.form.get('passwd_login')
- user = User.query.filter_by(email=email).first()
- if user:
- if check_password_hash(user.password, challenge_passwd):
- flash('Successful Login!', category='success')
- login_user(user, remember=True)
- return redirect(url_for('logic.home'))
- else:
- flash('Unsucessful Login!', category='error')
- else:
- flash('Unsucessful Login!', category='error')
-
- return render_template('login.html', user=current_user)
- @logic.route('/logout')
- @login_required
- def logout():
- logout_user()
- return redirect(url_for('logic.login'))
- @logic.route('/register', methods=['GET', 'POST'])
- def register():
- pass_list = list()
- if request.method == 'POST':
- email = request.form.get('email')
- username = request.form.get('username')
- passwd_1 = request.form.get('passwd_1')
- passwd_2 = request.form.get('passwd_2')
- # Basic User Input Checks
- email_check = User.query.filter_by(email=email).first()
- if len(email) < 1:
- flash('Your Email must be longer than 0 characters.', category='error')
- elif email_check:
- flash('This Email is already taken', category='error')
- else:
- pass_list.append('p')
-
- if len(username) < 1:
- flash('Username must be something', category='error')
- else:
- pass_list.append('p')
- if len(passwd_1) < 8 or len(passwd_2) < 8:
- flash('Your Password must be longer than or equal to 8 characters.', category='error')
- else:
- if passwd_1 != passwd_2:
- flash('Your Passwords must match!', category='error')
- else:
- if len(pass_list) == 2:
- new_user = User(email=email,
- username=username,
- password=generate_password_hash(passwd_2, method='sha256')
- )
- db.session.add(new_user)
- db.session.commit()
- flash('Account Registration Successful!', category='success')
- return redirect(url_for('logic.home'))
- else:
- flash('Registration Failed', category='error')
- return render_template("register.html", user=current_user)
|