flask-base/auth/models.py
2018-03-31 18:26:40 +02:00

121 lines
3.8 KiB
Python

from flask import g, session, url_for
from flask_security import RoleMixin, UserMixin
from flask_login import user_logged_in
from flaskbase.extensions import db, social
from importlib import import_module
# Define models
roles_users = db.Table(
'roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('users.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('roles.id'))
)
class Role(db.Model, RoleMixin):
__tablename__ = 'roles'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
def __unicode__(self):
return '{0.description} ({0.name})'.format(self)
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
is_superuser = db.Column(db.Boolean(), default=False)
last_login_ip = db.Column(db.String(128))
last_login_at = db.Column(db.DateTime())
current_login_ip = db.Column(db.String(128))
current_login_at = db.Column(db.DateTime())
login_count = db.Column(db.Integer)
invited_by_id = db.Column(db.Integer, db.ForeignKey('users.id',
ondelete='SET NULL'))
invited_by = db.relationship('User', remote_side=[id],
backref='invited_users')
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
display_name = db.Column(db.String(128), info={
'label': 'Display name',
'description': 'Your email will be used instead if empty.',
})
def __repr__(self):
return '<User {0.email}>'.format(self)
def __unicode__(self):
return self.display_name or self.email
@property
def image_url(self):
if self.connections:
return self.connections[0].image_url
return None
def first_login(self):
"""Checks if user has just logged in (used in base template)"""
g.first_login = session.pop('first_login', False) or \
g.get('first_login', False)
return g.first_login
@property
def profile_url(self):
return url_for('profile.public', id=self.id, _external=True)
@property
def is_ghost(self):
return not self.confirmed_at
@user_logged_in.connect
def track_first_login(app, user):
"""Tracks first user login"""
if not user.login_count:
session['first_login'] = True
class Connection(db.Model):
__tablename__ = 'connections'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
user = db.relationship('User', backref='connections')
provider_id = db.Column(db.String(255))
provider_user_id = db.Column(db.String(255))
access_token = db.Column(db.String(255))
secret = db.Column(db.String(255))
email = db.Column(db.String(255))
full_name = db.Column(db.String(255))
display_name = db.Column(db.String(255))
profile_url = db.Column(db.String(512))
image_url = db.Column(db.String(512))
rank = db.Column(db.Integer)
def __repr__(self):
return '<Connection {0.provider_id}:{0.provider_user_id} {0.user}>' \
.format(self)
def get_api(self):
provider = social.providers.get(self.provider_id)
if not provider:
return None
module = import_module(provider.module)
return module.get_api(connection=self,
consumer_key=provider.consumer_key,
consumer_secret=provider.consumer_secret)