# -*- coding: utf-8 -*-
|
|
"""
|
|
:author: Grey Li (李辉)
|
|
:url: http://greyli.com
|
|
:copyright: © 2018 Grey Li <withlihui@gmail.com>
|
|
:license: MIT, see LICENSE for more details.
|
|
"""
|
|
import os
|
|
import uuid
|
|
|
|
try:
|
|
from urlparse import urlparse, urljoin
|
|
except ImportError:
|
|
from urllib.parse import urlparse, urljoin
|
|
|
|
import PIL
|
|
from PIL import Image
|
|
from flask import current_app, request, url_for, redirect, flash
|
|
from itsdangerous import BadSignature, SignatureExpired
|
|
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
|
|
|
|
from albumy.extensions import db
|
|
from albumy.models import User
|
|
from albumy.settings import Operations
|
|
|
|
|
|
def generate_token(user, operation, expire_in=None, **kwargs):
|
|
s = Serializer(current_app.config['SECRET_KEY'], expire_in)
|
|
|
|
data = {'id': user.id, 'operation': operation}
|
|
data.update(**kwargs)
|
|
return s.dumps(data)
|
|
|
|
|
|
def validate_token(user, token, operation, new_password=None):
|
|
s = Serializer(current_app.config['SECRET_KEY'])
|
|
|
|
try:
|
|
data = s.loads(token)
|
|
except (SignatureExpired, BadSignature):
|
|
return False
|
|
|
|
if operation != data.get('operation') or user.id != data.get('id'):
|
|
return False
|
|
|
|
if operation == Operations.CONFIRM:
|
|
user.confirmed = True
|
|
elif operation == Operations.RESET_PASSWORD:
|
|
user.set_password(new_password)
|
|
elif operation == Operations.CHANGE_EMAIL:
|
|
new_email = data.get('new_email')
|
|
if new_email is None:
|
|
return False
|
|
if User.query.filter_by(email=new_email).first() is not None:
|
|
return False
|
|
user.email = new_email
|
|
else:
|
|
return False
|
|
|
|
db.session.commit()
|
|
return True
|
|
|
|
|
|
def rename_image(old_filename):
|
|
ext = os.path.splitext(old_filename)[1]
|
|
new_filename = uuid.uuid4().hex + ext
|
|
return new_filename
|
|
|
|
|
|
def resize_image(image, filename, base_width):
|
|
filename, ext = os.path.splitext(filename)
|
|
img = Image.open(image)
|
|
if img.size[0] <= base_width:
|
|
return filename + ext
|
|
w_percent = (base_width / float(img.size[0]))
|
|
h_size = int((float(img.size[1]) * float(w_percent)))
|
|
img = img.resize((base_width, h_size), PIL.Image.ANTIALIAS)
|
|
|
|
filename += current_app.config['ALBUMY_PHOTO_SUFFIX'][base_width] + ext
|
|
img.save(os.path.join(current_app.config['ALBUMY_UPLOAD_PATH'], filename), optimize=True, quality=85)
|
|
return filename
|
|
|
|
|
|
def is_safe_url(target):
|
|
ref_url = urlparse(request.host_url)
|
|
test_url = urlparse(urljoin(request.host_url, target))
|
|
return test_url.scheme in ('http', 'https') and \
|
|
ref_url.netloc == test_url.netloc
|
|
|
|
|
|
def redirect_back(default='main.index', **kwargs):
|
|
for target in request.args.get('next'), request.referrer:
|
|
if not target:
|
|
continue
|
|
if is_safe_url(target):
|
|
return redirect(target)
|
|
return redirect(url_for(default, **kwargs))
|
|
|
|
|
|
def flash_errors(form):
|
|
for field, errors in form.errors.items():
|
|
for error in errors:
|
|
flash(u"Error in the %s field - %s" % (
|
|
getattr(form, field).label.text,
|
|
error
|
|
))
|