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 ''.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 '' \ .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)