Skip to content

Commit

Permalink
Avatars management with Flask-Avatars
Browse files Browse the repository at this point in the history
  • Loading branch information
greyli committed Aug 5, 2018
1 parent 57848f7 commit d8eb4d5
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 3 deletions.
3 changes: 2 additions & 1 deletion albumy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from albumy.blueprints.auth import auth_bp
from albumy.blueprints.main import main_bp
from albumy.blueprints.user import user_bp
from albumy.extensions import bootstrap, db, login_manager, mail, dropzone, moment, csrf
from albumy.extensions import bootstrap, db, login_manager, mail, dropzone, moment, avatars, csrf
from albumy.models import Role, User, Photo, Permission
from albumy.settings import config

Expand Down Expand Up @@ -44,6 +44,7 @@ def register_extensions(app):
mail.init_app(app)
dropzone.init_app(app)
moment.init_app(app)
avatars.init_app(app)
csrf.init_app(app)


Expand Down
7 changes: 6 additions & 1 deletion albumy/blueprints/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"""
import os

from flask import render_template, current_app, request, Blueprint
from flask import render_template, current_app, send_from_directory, request, Blueprint
from flask_login import login_required, current_user

from albumy.decorators import confirm_required, permission_required
Expand All @@ -28,6 +28,11 @@ def explore():
return render_template('main/explore.html')


@main_bp.route('/avatars/<path:filename>')
def get_avatar(filename):
return send_from_directory(current_app.config['AVATARS_SAVE_PATH'], filename)


@main_bp.route('/upload', methods=['GET', 'POST'])
@login_required
@confirm_required
Expand Down
2 changes: 2 additions & 0 deletions albumy/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
:copyright: © 2018 Grey Li <withlihui@gmail.com>
:license: MIT, see LICENSE for more details.
"""
from flask_avatars import Avatars
from flask_bootstrap import Bootstrap
from flask_dropzone import Dropzone
from flask_login import LoginManager, AnonymousUserMixin
Expand All @@ -20,6 +21,7 @@
mail = Mail()
dropzone = Dropzone()
moment = Moment()
avatars = Avatars()
csrf = CSRFProtect()


Expand Down
13 changes: 13 additions & 0 deletions albumy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from datetime import datetime

from flask import current_app
from flask_avatars import Identicon
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

Expand Down Expand Up @@ -66,6 +67,9 @@ class User(db.Model, UserMixin):
bio = db.Column(db.String(120))
location = db.Column(db.String(50))
member_since = db.Column(db.DateTime, default=datetime.utcnow)
avatar_s = db.Column(db.String(64))
avatar_m = db.Column(db.String(64))
avatar_l = db.Column(db.String(64))

confirmed = db.Column(db.Boolean, default=False)

Expand All @@ -76,6 +80,7 @@ class User(db.Model, UserMixin):

def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
self.generate_avatar()
self.set_role()

def set_password(self, password):
Expand All @@ -92,6 +97,14 @@ def set_role(self):
def validate_password(self, password):
return check_password_hash(self.password_hash, password)

def generate_avatar(self):
avatar = Identicon()
filenames = avatar.generate(text=self.username)
self.avatar_s = filenames[0]
self.avatar_m = filenames[1]
self.avatar_l = filenames[2]
db.session.commit()

@property
def is_admin(self):
return self.role.name == 'Administrator'
Expand Down
3 changes: 3 additions & 0 deletions albumy/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ class BaseConfig:

SQLALCHEMY_TRACK_MODIFICATIONS = False

AVATARS_SAVE_PATH = os.path.join(ALBUMY_UPLOAD_PATH, 'avatars')
AVATARS_SIZE_TUPLE = (30, 100, 200)

MAIL_SERVER = os.getenv('MAIL_SERVER')
MAIL_PORT = 465
MAIL_USE_SSL = True
Expand Down
4 changes: 3 additions & 1 deletion albumy/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@
<div class="dropdown nav-item">
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown" role="button"
aria-expanded="false">
{{ current_user.name }}<span class="caret"></span>
<img class="avatar-xs"
src="{{ url_for('main.get_avatar', filename=current_user.avatar_s) }}">
<span class="caret"></span>
</a>
<div class="dropdown-menu dropdown-menu-right" role="menu">
<h6 class="dropdown-header">Logged in as {{ current_user.username }}</h6>
Expand Down
Empty file added uploads/avatars/.gitkeep
Empty file.

0 comments on commit d8eb4d5

Please sign in to comment.