|
|
- # -*- 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
- ))
|