from flask import Flask, render_template, request, session, redirect, flash from flask_sqlalchemy import SQLAlchemy from datetime import datetime from flask_mail import Mail import pymysql pymysql.install_as_MySQLdb() import json import os from werkzeug.utils import secure_filename #19 import math with open('config.json', 'r') as c: params= json.load(c)["params"] local_server = True app = Flask(__name__, template_folder="temp") app.secret_key= 'super-secret-key' app.config['UPLOAD_FOLDER'] = params['upload_location'] #add email to this app.config.update( MAIL_SERVER = 'smtp.gmail.com', MAIL_PORT = '465', MAIL_USE_SSL = True, MAIL_USERNAME = params['gmail-user'], MAIL_PASSWORD = params['gmail-password'] ) mail = Mail(app) #adding configurations if(local_server): app.config['SQLALCHEMY_DATABASE_URI'] = params['local_uri'] else: app.config['SQLALCHEMY_DATABASE_URI'] = params['prod_uri'] db = SQLAlchemy(app) class Contact(db.Model): ''' sno,name, phone_num, msg,date,email''' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) phone_num = db.Column(db.String(12), nullable=False) mes = db.Column(db.String(120), nullable=False) date = db.Column(db.String(12), nullable=True) email = db.Column(db.String(20), nullable=False) # def __init__(self, username, email): # self.username = username # self.email = email # def __repr__(self): # return '' % self.username class Posts(db.Model): sno = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80), nullable=False) slug = db.Column(db.String(21), nullable=False) content = db.Column(db.String(120), nullable=False) tagline = db.Column(db.String(120), nullable=False) date = db.Column(db.String(12), nullable=True) img_file = db.Column(db.String(12), nullable=True) @app.route("/") def home(): # flash("Subscribe to CodeWithHarry!", "success") # flash("Like this app","danger") posts = Posts.query.filter_by().all() #[0: params['no_of_posts]] last = math.ceil(len(posts)/int(params['no_of_posts'])) page = request.args.get('page') if (not str(page).isnumeric()): page = 1 #pagination logic #first page page = int(page) posts = posts[(page-1)*int(params['no_of_posts']):(page-1)*int(params['no_of_posts'])+ int(params['no_of_posts'])] if page==1: prev = "#" next = "/?page="+ str(page+1) #last page elif page==last: prev = "/?page="+ str(page-1) next = "#" #middle page else: prev = "/?page="+ str(page-1) next = "/?page="+ str(page+1) return render_template('index.html', params=params, posts=posts, prev=prev, next=next) @app.route("/about") def about(): return render_template('about.html',params=params) #fetching posts from database @app.route("/post/", methods=['GET']) def post_route(post_slug): post = Posts.query.filter_by(slug=post_slug).first() return render_template('post.html', params=params, post=post) @app.route("/dashboard", methods=['GET','POST']) def dashboard(): if ('user' in session and session['user'] == params['admin_user'] ): posts = Posts.query.all() return render_template('dashboard.html', params=params, posts=posts) if request.method=='POST': #redirect to admin panel username = request.form.get('uname') userpass = request.form.get("pass") if username==params['admin_user'] and userpass==params['admin_password']: # set the session variable session['user'] = username posts = Posts.query.all() return render_template('dashboard.html', params=params) else: return render_template("login.html", params=params) #17 @app.route("/uploader" , methods=['GET', 'POST']) def uploader(): if "user" in session and session['user']==params['admin_user']: if request.method=='POST': f = request.files['file1'] f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename))) return "Uploaded successfully!" #17 @app.route('/logout') def logout(): session.pop('user') return redirect('/dashboard') #18 @app.route("/delete/" , methods=['GET', 'POST']) def delete(sno): if "user" in session and session['user']==params['admin_user']: post = Posts.query.filter_by(sno=sno).first() db.session.delete(post) db.session.commit() return redirect("/dashboard") @app.route("/contact", methods =['GET','POST']) def contact(): if (request.method=='POST'): #Add entry to the database name = request.form.get('name') email = request.form.get('email') phone = request.form.get('phone') message = request.form.get('message') entry = Contact(name=name, phone_num = phone, mes= message,date= datetime.now(), email=email) db.session.add(entry) db.session.commit() #send a email mail.send_message('New message from ' + name, sender=email, recipients = [params['gmail-user']], body = message + "\n" + phone ) flash("Thanks for submitting your details. We will get back to you soon","success") return render_template('contact.html',params=params) @app.route("/edit/", methods =['GET','POST']) def edit(sno): if ('user' in session and session['user'] == params['admin_user'] ): if request.method=="POST": box_title = request.form.get('title') tline = request.form.get('tline') slug = request.form.get('slug') content = request.form.get('content') img_file = request.form.get('img_file') date = datetime.now() if sno=='0': post = Posts(title=box_title, slug=slug, content=content, tagline=tline, img_file=img_file, date=date) db.session.add(post) db.session.commit() else: post = Posts.query.filter_by(sno=sno).first() post.box_title = box_title post.tline = tline post.slug = slug post.content = content post.img_file = img_file post.date = date db.session.commit() return redirect('/edit/'+sno) post = Posts.query.filter_by(sno=sno).first() return render_template('edit.html', params=params,post=post, sno=sno) app.run(debug=True)