logic.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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, os
  11. import subprocess as sp
  12. logic = Blueprint('logic', __name__)
  13. @logic.route('/', methods=['GET', 'POST'])
  14. @login_required
  15. def home():
  16. def generate_csv():
  17. header = ['name', 'link', 'group', 'status']
  18. alphanumeric = string.ascii_letters + string.digits
  19. ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
  20. open(f'app/static/generated/{ralphanum}.csv', 'a').close
  21. with open(f'app/static/generated/{ralphanum}.csv', 'w', encoding='UTF8', newline='') as f:
  22. writer = csv.writer(f, delimiter=',', quotechar='"')
  23. writer.writerow(header)
  24. for bg, bml in bb_dic.items():
  25. for bm in bml:
  26. writer.writerow([bm.name, bm.link, bg, bm.status])
  27. #cwd = os.getcwd()
  28. p1 = sp.run(f'curl --upload-file app/static/generated/{ralphanum}.csv https://transfer.raqnet.org/', shell=True, capture_output=True, text=True)
  29. return redirect(p1.stdout, code=302)
  30. #return send_file(f'{cwd}/app/static/generated/{ralphanum}.csv', as_attachment=True, attachment_filename='test.csv')
  31. # owned groups
  32. bgroups = Groups.query.filter_by(owner=current_user.id).all()
  33. # owned bookmarks
  34. bmarks = Bookmark.query.filter_by(owner=current_user.id).all()
  35. bb_dic = dict() # dict of lists
  36. for bg in bgroups:
  37. inter_list = list()
  38. for bm in bmarks:
  39. if bm.group == bg.group:
  40. inter_list.append(bm)
  41. bb_dic[bg.group] = inter_list
  42. if request.method == "POST":
  43. username = request.form.get('username')
  44. passwd = request.form.get('password')
  45. passwdc = request.form.get('password_confirm')
  46. new_pic = request.files.get('profile_image')
  47. dl_bookml = request.form.get('dl_bookml')
  48. if username:
  49. nusern_dbcall = User.query.filter_by(id=current_user.id).first()
  50. nusern_dbcall.username = username
  51. db.session.commit()
  52. flash('Username updated!', category='success')
  53. elif passwd and passwdc:
  54. if passwd == passwdc:
  55. npasswd_dbcall = User.query.filter_by(id=current_user.id).first()
  56. npasswd_dbcall.password = generate_password_hash(passwdc, method='sha256')
  57. db.session.commit()
  58. flash('Password successfully updated', category='success')
  59. else:
  60. flash('Passwords must match!', category='error')
  61. elif new_pic:
  62. # generate random filename for uploaded file
  63. alphanumeric = string.ascii_letters + string.digits
  64. ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
  65. new_pic_dbcall = User.query.filter_by(id=current_user.id).first()
  66. if '.png' in new_pic.filename:
  67. new_pic.save(f'app/static/uploads/{ralphanum}.png')
  68. new_pic_dbcall.profile_image = f'{ralphanum}.png'
  69. elif '.jpg' in new_pic.filename or 'jpeg' in new_pic.filename:
  70. new_pic.save(f'app/static/uploads/{ralphanum}.jpeg')
  71. new_pic_dbcall.profile_image = f'{ralphanum}.jpeg'
  72. db.session.commit()
  73. flash('Profile Pic updated!', category='success')
  74. elif dl_bookml:
  75. return generate_csv()
  76. return render_template('home.html', user=current_user, bdic=bb_dic)
  77. @logic.route('/shared', methods=['GET', 'POST'])
  78. @login_required
  79. def shared():
  80. # owned groups
  81. bgroups = Groups.query.filter_by(owner=current_user.id).all()
  82. # owned bookmarks
  83. bmarks = Bookmark.query.filter_by(owner=current_user.id).all()
  84. bb_dic = dict() # dict of lists
  85. for bg in bgroups:
  86. inter_list = list()
  87. for bm in bmarks:
  88. if bm.group == bg.group and bm.status == 'public':
  89. inter_list.append(bm)
  90. if len(inter_list) != 0:
  91. bb_dic[bg.group] = inter_list
  92. return render_template('shared.html', user=current_user, bdic=bb_dic)
  93. @logic.route('/create', methods=['GET', 'POST'])
  94. @login_required
  95. def create():
  96. bgroups = Groups.query.filter_by(owner=current_user.id).all()
  97. if request.method == 'POST':
  98. wlink = request.form.get('web_link')
  99. wname = request.form.get('web_name')
  100. wgroup = request.form.get('web_group')
  101. ngroup = request.form.get('new_group')
  102. wstatus = request.form.get('share_public_private')
  103. if wlink and wname and wstatus:
  104. if wgroup == 'cng-555' and ngroup != '':
  105. wgroup = ngroup
  106. new_link = Bookmark(owner=current_user.id, status=wstatus, name=wname, group=wgroup, link=wlink)
  107. group_check = Groups.query.filter_by(group=wgroup).first()
  108. if not group_check:
  109. new_group = Groups(owner=current_user.id, group=wgroup)
  110. db.session.add(new_group)
  111. db.session.add(new_link)
  112. db.session.commit()
  113. flash('New Bookmark added!', category='success')
  114. return render_template('create_bookmark.html', user=current_user, bgroups=bgroups)
  115. @logic.route('/login', methods=['GET', 'POST'])
  116. def login():
  117. if request.method == 'POST':
  118. email = request.form.get('email')
  119. challenge_passwd = request.form.get('passwd_login')
  120. user = User.query.filter_by(email=email).first()
  121. if user:
  122. if check_password_hash(user.password, challenge_passwd):
  123. flash('Successful Login!', category='success')
  124. login_user(user, remember=True)
  125. return redirect(url_for('logic.home'))
  126. else:
  127. flash('Unsucessful Login!', category='error')
  128. else:
  129. flash('Unsucessful Login!', category='error')
  130. return render_template('login.html', user=current_user)
  131. @logic.route('/logout')
  132. @login_required
  133. def logout():
  134. logout_user()
  135. return redirect(url_for('logic.login'))
  136. @logic.route('/register', methods=['GET', 'POST'])
  137. def register():
  138. pass_list = list()
  139. if request.method == 'POST':
  140. email = request.form.get('email')
  141. username = request.form.get('username')
  142. passwd_1 = request.form.get('passwd_1')
  143. passwd_2 = request.form.get('passwd_2')
  144. # Basic User Input Checks
  145. email_check = User.query.filter_by(email=email).first()
  146. if len(email) < 1:
  147. flash('Your Email must be longer than 0 characters.', category='error')
  148. elif email_check:
  149. flash('This Email is already taken', category='error')
  150. else:
  151. pass_list.append('p')
  152. if len(username) < 1:
  153. flash('Username must be something', category='error')
  154. else:
  155. pass_list.append('p')
  156. if len(passwd_1) < 8 or len(passwd_2) < 8:
  157. flash('Your Password must be longer than or equal to 8 characters.', category='error')
  158. else:
  159. if passwd_1 != passwd_2:
  160. flash('Your Passwords must match!', category='error')
  161. else:
  162. if len(pass_list) == 2:
  163. new_user = User(email=email, username=username, password=generate_password_hash(passwd_2, method='sha256'))
  164. db.session.add(new_user)
  165. db.session.commit()
  166. flash('Account Registration Successful!', category='success')
  167. return redirect(url_for('logic.home'))
  168. else:
  169. flash('Registration Failed', category='error')
  170. return render_template("register.html", user=current_user)