logic.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. # Site Back-End Logic
  2. from hmac import new
  3. from unicodedata import category
  4. from flask import Blueprint, render_template, request, flash, redirect, url_for, send_file
  5. from flask_login import login_user, login_required, logout_user, current_user
  6. from werkzeug.security import generate_password_hash, check_password_hash
  7. from .models import User, Bookmark, Groups
  8. from . import db
  9. import string, secrets
  10. import csv
  11. import subprocess as sp
  12. from . import iconfetch as icof
  13. logic = Blueprint('logic', __name__)
  14. # User Home Profile
  15. @logic.route('/', methods=['GET', 'POST'])
  16. @login_required
  17. def home():
  18. # generate csv of bookmarks
  19. def generate_csv():
  20. header = ['name', 'link', 'group', 'status']
  21. alphanumeric = string.ascii_letters + string.digits
  22. ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
  23. open(f'app/static/generated/{ralphanum}.csv', 'a').close
  24. with open(f'app/static/generated/{ralphanum}.csv', 'w', encoding='UTF8', newline='') as f:
  25. writer = csv.writer(f, delimiter=',', quotechar='"')
  26. writer.writerow(header)
  27. for bg, bml in bb_dic.items():
  28. for bm in bml:
  29. writer.writerow([bm.name, bm.link, bg, bm.status])
  30. p1 = sp.run(f'curl --upload-file app/static/generated/{ralphanum}.csv https://transfer.raqnet.org/',
  31. shell=True,
  32. capture_output=True,
  33. text=True
  34. )
  35. # clean up
  36. p2 = sp.run(f'rm app/static/generated/*', shell=True)
  37. return redirect(p1.stdout, code=302)
  38. # initialize dictionary of bookmarks and groups
  39. # owned groups
  40. bgroups = Groups.query.filter_by(owner=current_user.id).all()
  41. # owned bookmarks
  42. bmarks = Bookmark.query.filter_by(owner=current_user.id).all()
  43. # populate bookmark dict for show
  44. bb_dic = dict() # dict of lists
  45. for bg in bgroups:
  46. inter_list = list()
  47. for bm in bmarks:
  48. if bm.group == bg.group:
  49. inter_list.append(bm)
  50. bb_dic[bg.group] = inter_list
  51. # POST request method
  52. if request.method == "POST":
  53. username = request.form.get('username')
  54. passwd = request.form.get('password')
  55. passwdc = request.form.get('password_confirm')
  56. new_pic = request.files.get('profile_image')
  57. dl_bookml = request.form.get('dl_bookml')
  58. delbm = request.form.get('web_delete')
  59. if username:
  60. nusern_dbcall = User.query.filter_by(id=current_user.id).first()
  61. nusern_dbcall.username = username
  62. db.session.commit()
  63. flash('Username updated!', category='success')
  64. elif passwd and passwdc:
  65. if passwd == passwdc:
  66. npasswd_dbcall = User.query.filter_by(id=current_user.id).first()
  67. npasswd_dbcall.password = generate_password_hash(passwdc, method='sha256')
  68. db.session.commit()
  69. flash('Password successfully updated', category='success')
  70. else:
  71. flash('Passwords must match!', category='error')
  72. elif new_pic:
  73. # generate random filename for uploaded file
  74. alphanumeric = string.ascii_letters + string.digits
  75. ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
  76. new_pic_dbcall = User.query.filter_by(id=current_user.id).first()
  77. if '.png' in new_pic.filename:
  78. new_pic.save(f'app/static/uploads/{ralphanum}.png')
  79. new_pic_dbcall.profile_image = f'{ralphanum}.png'
  80. elif '.jpg' in new_pic.filename or 'jpeg' in new_pic.filename:
  81. new_pic.save(f'app/static/uploads/{ralphanum}.jpeg')
  82. new_pic_dbcall.profile_image = f'{ralphanum}.jpeg'
  83. db.session.commit()
  84. flash('Profile Pic updated!', category='success')
  85. elif dl_bookml:
  86. return generate_csv()
  87. elif delbm:
  88. bmq = Bookmark.query.get(delbm)
  89. if bmq:
  90. if bmq.owner == current_user.id:
  91. db.session.delete(bmq)
  92. db.session.commit()
  93. flash('Bookmark deleted!', category='success')
  94. return redirect(url_for('logic.home'))
  95. return render_template('home.html', user=current_user, bdic=bb_dic)
  96. # Public Bookmarks
  97. @logic.route('/shared', methods=['GET', 'POST'])
  98. @login_required
  99. def shared():
  100. # owned groups
  101. bgroups = Groups.query.filter_by(owner=current_user.id).all()
  102. # owned bookmarks
  103. bmarks = Bookmark.query.filter_by(owner=current_user.id).all()
  104. bb_dic = dict() # dict of lists
  105. for bg in bgroups:
  106. inter_list = list()
  107. for bm in bmarks:
  108. if bm.group == bg.group and bm.status == 'public':
  109. inter_list.append(bm)
  110. if len(inter_list) != 0:
  111. bb_dic[bg.group] = inter_list
  112. return render_template('shared.html', user=current_user, bdic=bb_dic)
  113. # Create new bookmark
  114. @logic.route('/create', methods=['GET', 'POST'])
  115. @login_required
  116. def create():
  117. # load bookmark groups
  118. bgroups = Groups.query.filter_by(owner=current_user.id).all()
  119. if request.method == 'POST':
  120. wlink = request.form.get('web_link')
  121. wname = request.form.get('web_name')
  122. wgroup = request.form.get('web_group')
  123. ngroup = request.form.get('new_group')
  124. wstatus = request.form.get('share_public_private')
  125. if wlink and wname and wstatus:
  126. # fetch/check icon
  127. sitecon = icof.check_icon(wlink)
  128. if not sitecon:
  129. sitecon = icof.fetch_icon(wlink)
  130. # add bookmark to database
  131. if wgroup == 'cng-555' and ngroup != '':
  132. wgroup = ngroup
  133. new_link = Bookmark(owner=current_user.id,
  134. status=wstatus,
  135. name=wname,
  136. group=wgroup,
  137. link=wlink,
  138. icon=sitecon
  139. )
  140. group_check = Groups.query.filter_by(group=wgroup).first()
  141. if not group_check:
  142. new_group = Groups(owner=current_user.id, group=wgroup)
  143. db.session.add(new_group)
  144. db.session.add(new_link)
  145. db.session.commit()
  146. flash('New Bookmark added!', category='success')
  147. return render_template('create_bookmark.html', user=current_user, bgroups=bgroups)
  148. # Account management
  149. @logic.route('/login', methods=['GET', 'POST'])
  150. def login():
  151. if request.method == 'POST':
  152. email = request.form.get('email')
  153. challenge_passwd = request.form.get('passwd_login')
  154. user = User.query.filter_by(email=email).first()
  155. if user:
  156. if check_password_hash(user.password, challenge_passwd):
  157. flash('Successful Login!', category='success')
  158. login_user(user, remember=True)
  159. return redirect(url_for('logic.home'))
  160. else:
  161. flash('Unsucessful Login!', category='error')
  162. else:
  163. flash('Unsucessful Login!', category='error')
  164. return render_template('login.html', user=current_user)
  165. @logic.route('/logout')
  166. @login_required
  167. def logout():
  168. logout_user()
  169. return redirect(url_for('logic.login'))
  170. @logic.route('/register', methods=['GET', 'POST'])
  171. def register():
  172. pass_list = list()
  173. if request.method == 'POST':
  174. email = request.form.get('email')
  175. username = request.form.get('username')
  176. passwd_1 = request.form.get('passwd_1')
  177. passwd_2 = request.form.get('passwd_2')
  178. # Basic User Input Checks
  179. email_check = User.query.filter_by(email=email).first()
  180. if len(email) < 1:
  181. flash('Your Email must be longer than 0 characters.', category='error')
  182. elif email_check:
  183. flash('This Email is already taken', category='error')
  184. else:
  185. pass_list.append('p')
  186. if len(username) < 1:
  187. flash('Username must be something', category='error')
  188. else:
  189. pass_list.append('p')
  190. if len(passwd_1) < 8 or len(passwd_2) < 8:
  191. flash('Your Password must be longer than or equal to 8 characters.', category='error')
  192. else:
  193. if passwd_1 != passwd_2:
  194. flash('Your Passwords must match!', category='error')
  195. else:
  196. if len(pass_list) == 2:
  197. new_user = User(email=email,
  198. username=username,
  199. password=generate_password_hash(passwd_2, method='sha256')
  200. )
  201. db.session.add(new_user)
  202. db.session.commit()
  203. flash('Account Registration Successful!', category='success')
  204. return redirect(url_for('logic.home'))
  205. else:
  206. flash('Registration Failed', category='error')
  207. return render_template("register.html", user=current_user)