121 lines
3.8 KiB
Python
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)
|