class TrelloTemporaryToken(db.Model): id = db.Column(db.Integer, primary_key=True) token = db.Column(db.String(256), index=True, unique=True, nullable=False) secret = db.Column(db.String(256), nullable=False) expires = db.Column(db.DateTime, nullable=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) user = db.relationship("User") def __init__(self, token=None, secret=None, user=None, expires=None): self.token = token self.secret = secret self.user = user self.expires = expires def get_raw_session(self, **kwargs): client_key = current_app.config["TRELLO_API_KEY"] client_secret = current_app.config["TRELLO_API_SECRET"] return OAuth1Session( client_key=client_key, client_secret=client_secret, resource_owner_key=self.token, resource_owner_secret=self.secret, **kwargs ) @classmethod def create(cls, trello_oauth_token): db.session.add(trello_oauth_token) db.session.commit() @classmethod def get_by_token(cls, token): return cls.query.filter_by(token=token).first()
class Trello(db.Model): id = db.Column(db.Integer, primary_key=True) token = db.Column(db.String(256), index=True, unique=True, nullable=False) secret = db.Column(db.String(256), nullable=False) username = db.Column(db.String(256)) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) user = db.relationship("User", backref="trellos") def __init__(self, token, secret, user, username=None): self.token = token self.secret = secret self.user = user self.username = username def get_raw_session(self, **kwargs): client_key = current_app.config["TRELLO_API_KEY"] client_secret = current_app.config["TRELLO_API_SECRET"] return OAuth1Session( client_key=client_key, client_secret=client_secret, resource_owner_key=self.token, resource_owner_secret=self.secret, **kwargs ) def get_session(self): return TrelloAPISession(self.get_raw_session()) def __str__(self): return f"{self.username}@Trello" @classmethod def create(cls, trello): db.session.add(trello) db.session.commit() @classmethod def remove(cls, trello): from life_scheduler.board.models import QuestSource sources = QuestSource.query.filter_by(backend_type="trello", backend_id=trello.id).all() for source in sources: db.session.delete(source) db.session.delete(trello) db.session.commit() @classmethod def get_by_token(cls, token): return cls.query.filter_by(token=token).first() @classmethod def get_by_id(cls, i): return cls.query.get(i)
class Google(db.Model): id = db.Column(db.Integer, primary_key=True) token = db.Column(db.JSON, nullable=False) email = db.Column(db.String(256)) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) user = db.relationship("User", backref="googles") def __init__(self, token=None, email=None, user=None): self.token = token self.email = email self.user = user def __str__(self): return f"{self.email}@Google" def get_raw_session(self, **kwargs): client_id = current_app.config["GOOGLE_CLIENT_ID"] client_secret = current_app.config["GOOGLE_CLIENT_SECRET"] refresh_url = "https://oauth2.googleapis.com/token" refresh_kwargs = { "client_id": client_id, "client_secret": client_secret, } return OAuth2Session(client_id=client_id, token=self.token, token_updater=self.update_token, auto_refresh_url=refresh_url, auto_refresh_kwargs=refresh_kwargs, **kwargs) def update_token(self, token): self.token = token db.session.commit() def get_session(self): return GoogleAPISession(self.get_raw_session()) @classmethod def create(cls, google): db.session.add(google) db.session.commit() @classmethod def remove(cls, google): from life_scheduler.board.models import QuestSource sources = QuestSource.query.filter_by(backend_type="google", backend_id=google.id).all() for source in sources: db.session.delete(source) db.session.delete(google) db.session.commit() @classmethod def get_by_id(cls, i): return cls.query.get(i)
class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True) name = db.Column(db.String(120)) given_name = db.Column(db.String(120)) family_name = db.Column(db.String(120)) picture = db.Column(db.String(120)) timezone = db.Column(db.String(120)) is_approved = db.Column(db.Boolean, default=False) def __init__(self, email=None, name=None, given_name=None, family_name=None, picture=None): self.email = email self.name = name self.given_name = given_name self.family_name = family_name self.picture = picture def set_approved(self, value): self.is_approved = value db.session.commit() def __repr__(self): return f"<User {self.email}>" @property def tz(self): return get_timezone(self.timezone) def time_from_iso_format(self, iso_string): t = time.fromisoformat(iso_string) return time.replace(t, tzinfo=self.tz) def datetime_from_iso_format(self, iso_string): dt = datetime.fromisoformat(iso_string) return datetime.replace(dt, tzinfo=self.tz) def datetime_now(self): return datetime.now(tz=self.tz) @classmethod def get_or_create(cls, user_dict): result = cls.get_by_email(user_dict["email"]) if not result: user = User(**user_dict) db.session.add(user) db.session.commit() result = user return result @classmethod def get_by_email(cls, email): result = cls.query.filter_by(email=email).first() return result @classmethod def get_all(cls): result = cls.query.all() return result