Ejemplo n.º 1
0
    def delete(self, blueprint, user=None, user_id=None):
        query = self.session.query(
            self.model).filter_by(provider=blueprint.name)
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(
            _get_real_user(ref, self.anon_user)
            for ref in (user, self.user, blueprint.config.get("user")))

        if self.user_required and not u and not uid:
            raise ValueError(
                "Cannot delete OAuth token without an associated user")

        # check for user ID
        if hasattr(self.model, "user_id") and uid:
            query = query.filter_by(user_id=uid)
        # check for user (relationship property)
        elif hasattr(self.model, "user") and u:
            query = query.filter_by(user=u)
        # if we have the property, but not value, filter by None
        elif hasattr(self.model, "user_id"):
            query = query.filter_by(user_id=None)
        # run query
        query.delete()
        self.session.commit()
        # invalidate cache
        self.cache.delete(
            self.make_cache_key(blueprint=blueprint,
                                user=user,
                                user_id=user_id))
Ejemplo n.º 2
0
    def get(self, blueprint, user=None, user_id=None):
        # check cache
        cache_key = self.make_cache_key(blueprint=blueprint, user=user, user_id=user_id)
        token = self.cache.get(cache_key)
        if token:
            return token

        # if not cached, make database queries
        query = (
            self.session.query(self.model)
            .filter_by(provider=blueprint.name)
        )
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(_get_real_user(ref, self.anon_user)
                  for ref in (user, self.user, blueprint.config.get("user")))
        # check for user ID
        if hasattr(self.model, "user_id") and uid:
            query = query.filter_by(user_id=uid)
        # check for user (relationship property)
        elif hasattr(self.model, "user") and u:
            query = query.filter_by(user=u)
        # if we have the property, but not value, filter by None
        elif hasattr(self.model, "user_id"):
            query = query.filter_by(user_id=None)
        # run query
        try:
            token = query.one().token
        except NoResultFound:
            token = None

        # cache the result
        self.cache.set(cache_key, token)

        return token
Ejemplo n.º 3
0
 def delete(self, blueprint, user=None, user_id=None):
     query = (self.session.query(
         self.model).filter_by(provider=blueprint.name))
     uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
     u = first(
         _get_real_user(ref, self.anon_user)
         for ref in (user, self.user, blueprint.config.get("user")))
     # check for user ID
     if hasattr(self.model, "user_id") and uid:
         query = query.filter_by(user_id=uid)
     # check for user (relationship property)
     elif hasattr(self.model, "user") and u:
         query = query.filter_by(user=u)
     # if we have the property, but not value, filter by None
     elif hasattr(self.model, "user_id"):
         query = query.filter_by(user_id=None)
     # run query
     query.delete()
     self.session.commit()
     # invalidate cache
     self.cache.delete(
         self.make_cache_key(
             blueprint=blueprint,
             user=user,
             user_id=user_id,
         ))
Ejemplo n.º 4
0
    def get(self, blueprint, user=None, user_id=None):
        # check cache
        cache_key = self.make_cache_key(blueprint=blueprint,
                                        user=user,
                                        user_id=user_id)
        token = self.cache.get(cache_key)
        if token:
            return token

        # if not cached, make database queries
        query = (self.session.query(
            self.model).filter_by(provider=blueprint.name))
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(
            _get_real_user(ref, self.anon_user)
            for ref in (user, self.user, blueprint.config.get("user")))
        # check for user ID
        if hasattr(self.model, "user_id") and uid:
            query = query.filter_by(user_id=uid)
        # check for user (relationship property)
        elif hasattr(self.model, "user") and u:
            query = query.filter_by(user=u)
        # if we have the property, but not value, filter by None
        elif hasattr(self.model, "user_id"):
            query = query.filter_by(user_id=None)
        # run query
        try:
            token = query.one().token
        except NoResultFound:
            token = None

        # cache the result
        self.cache.set(cache_key, token)

        return token
Ejemplo n.º 5
0
    def delete(self, blueprint, user=None, user_id=None):
        query = self.session.query(self.model).filter_by(provider=blueprint.name)
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(
            _get_real_user(ref, self.anon_user)
            for ref in (user, self.user, blueprint.config.get("user"))
        )

        if self.user_required and not u and not uid:
            raise ValueError("Cannot delete OAuth token without an associated user")

        # check for user ID
        if hasattr(self.model, "user_id") and uid:
            query = query.filter_by(user_id=uid)
        # check for user (relationship property)
        elif hasattr(self.model, "user") and u:
            query = query.filter_by(user=u)
        # if we have the property, but not value, filter by None
        elif hasattr(self.model, "user_id"):
            query = query.filter_by(user_id=None)
        # run query
        query.delete()
        self.session.commit()
        # invalidate cache
        self.cache.delete(
            self.make_cache_key(blueprint=blueprint, user=user, user_id=user_id)
        )
Ejemplo n.º 6
0
 def make_cache_key(self, blueprint, user=None, user_id=None):
     uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
     if not uid:
         u = first(
             _get_real_user(ref, self.anon_user)
             for ref in (user, self.user, blueprint.config.get("user")))
         uid = getattr(u, "id", u)
     return "flask_dance_token|{name}|{user_id}".format(name=blueprint.name,
                                                        user_id=uid)
Ejemplo n.º 7
0
 def make_cache_key(self, blueprint, user=None, user_id=None):
     uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
     if not uid:
         u = first(_get_real_user(ref, self.anon_user)
                   for ref in (user, self.user, blueprint.config.get("user")))
         uid = getattr(u, "id", u)
     return "flask_dance_token|{name}|{user_id}".format(
         name=blueprint.name, user_id=uid,
     )
Ejemplo n.º 8
0
    def get(self, blueprint, user=None, user_id=None):
        """When you have a statement in your code that says
        "if <provider>.authorized:" (for example "if twitter.authorized:"),
        a long string of function calls result in this function being used to
        check the Flask server's cache and database for any records associated
        with the current_user. The `user` and `user_id` parameters are actually
        not set in that case (see base.py:token(), that's what calls this
        function), so the user information is instead loaded from the
        current_user (if that's what you specified when you created the
        blueprint) with blueprint.config.get('user_id').

        :param blueprint:
        :param user:
        :param user_id:
        :return:
        """
        # check cache
        cache_key = self.make_cache_key(blueprint=blueprint,
                                        user=user,
                                        user_id=user_id)
        token = self.cache.get(cache_key)
        if token:
            return token

        # if not cached, make database queries
        query = self.session.query(
            self.model).filter_by(provider=blueprint.name)
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(
            _get_real_user(ref, self.anon_user)
            for ref in (user, self.user, blueprint.config.get("user")))

        if self.user_required and not u and not uid:
            raise ValueError(
                "Cannot get OAuth token without an associated user")

        # check for user ID
        if hasattr(self.model, "user_id") and uid:
            query = query.filter_by(user_id=uid)
        # check for user (relationship property)
        elif hasattr(self.model, "user") and u:
            query = query.filter_by(user=u)
        # if we have the property, but not value, filter by None
        elif hasattr(self.model, "user_id"):
            query = query.filter_by(user_id=None)
        # run query
        try:
            token = query.one().token
        except NoResultFound:
            token = None

        # cache the result
        self.cache.set(cache_key, token)

        return token
Ejemplo n.º 9
0
    def get(self, blueprint, user=None, user_id=None):
        """ When you have a statement in your code that says
        "if <provider>.authorized:" (for example "if twitter.authorized:"),
        a long string of function calls result in this function being used to
        check the Flask server's cache and database for any records associated
        with the current_user. The `user` and `user_id` parameters are actually
        not set in that case (see base.py:token(), that's what calls this
        function), so the user information is instead loaded from the
        current_user (if that's what you specified when you created the
        blueprint) with blueprint.config.get('user_id').

        :param blueprint:
        :param user:
        :param user_id:
        :return:
        """
        # check cache
        cache_key = self.make_cache_key(blueprint=blueprint, user=user, user_id=user_id)
        token = self.cache.get(cache_key)
        if token:
            return token

        # if not cached, make database queries
        query = self.session.query(self.model).filter_by(provider=blueprint.name)
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(
            _get_real_user(ref, self.anon_user)
            for ref in (user, self.user, blueprint.config.get("user"))
        )

        if self.user_required and not u and not uid:
            raise ValueError("Cannot get OAuth token without an associated user")

        # check for user ID
        if hasattr(self.model, "user_id") and uid:
            query = query.filter_by(user_id=uid)
        # check for user (relationship property)
        elif hasattr(self.model, "user") and u:
            query = query.filter_by(user=u)
        # if we have the property, but not value, filter by None
        elif hasattr(self.model, "user_id"):
            query = query.filter_by(user_id=None)
        # run query
        try:
            token = query.one().token
        except NoResultFound:
            token = None

        # cache the result
        self.cache.set(cache_key, token)

        return token
Ejemplo n.º 10
0
    def set(self, blueprint, token, user=None, user_id=None):
        uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
        u = first(
            _get_real_user(ref, self.anon_user)
            for ref in (user, self.user, blueprint.config.get("user")))

        if self.user_required and not u and not uid:
            raise ValueError(
                "Cannot set OAuth token without an associated user")

        # if there was an existing model, delete it
        existing_query = (self.session.query(
            self.model).filter_by(provider=blueprint.name))
        # check for user ID
        has_user_id = hasattr(self.model, "user_id")
        if has_user_id and uid:
            existing_query = existing_query.filter_by(user_id=uid)
        # check for user (relationship property)
        has_user = hasattr(self.model, "user")
        if has_user and u:
            existing_query = existing_query.filter_by(user=u)
        # queue up delete query -- won't be run until commit()
        existing_query.delete()
        # create a new model for this token
        kwargs = {
            "provider": blueprint.name,
            "token": token,
        }
        if has_user_id and uid:
            kwargs["user_id"] = uid
        if has_user and u:
            kwargs["user"] = u
        self.session.add(self.model(**kwargs))
        # commit to delete and add simultaneously
        self.session.commit()
        # invalidate cache
        self.cache.delete(
            self.make_cache_key(blueprint=blueprint,
                                user=user,
                                user_id=user_id))
Ejemplo n.º 11
0
 def set(self, blueprint, token, user=None, user_id=None):
     # if there was an existing model, delete it
     existing_query = (
         self.session.query(self.model)
         .filter_by(provider=blueprint.name)
     )
     # check for user ID
     has_user_id = hasattr(self.model, "user_id")
     if has_user_id:
         uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
         if uid:
             existing_query = existing_query.filter_by(user_id=uid)
     # check for user (relationship property)
     has_user = hasattr(self.model, "user")
     if has_user:
         u = first(_get_real_user(ref, self.anon_user)
                   for ref in (user, self.user, blueprint.config.get("user")))
         if u:
             existing_query = existing_query.filter_by(user=u)
     # queue up delete query -- won't be run until commit()
     existing_query.delete()
     # create a new model for this token
     kwargs = {
         "provider": blueprint.name,
         "token": token,
     }
     if has_user_id and uid:
         kwargs["user_id"] = uid
     if has_user and u:
         kwargs["user"] = u
     self.session.add(self.model(**kwargs))
     # commit to delete and add simultaneously
     self.session.commit()
     # invalidate cache
     self.cache.delete(self.make_cache_key(
         blueprint=blueprint, user=user, user_id=user_id
     ))
Ejemplo n.º 12
0
 def delete(self, blueprint, user=None, user_id=None):
     query = (
         self.session.query(self.model)
         .filter_by(provider=blueprint.name)
     )
     uid = first([user_id, self.user_id, blueprint.config.get("user_id")])
     u = first(_get_real_user(ref, self.anon_user)
               for ref in (user, self.user, blueprint.config.get("user")))
     # check for user ID
     if hasattr(self.model, "user_id") and uid:
         query = query.filter_by(user_id=uid)
     # check for user (relationship property)
     elif hasattr(self.model, "user") and u:
         query = query.filter_by(user=u)
     # if we have the property, but not value, filter by None
     elif hasattr(self.model, "user_id"):
         query = query.filter_by(user_id=None)
     # run query
     query.delete()
     self.session.commit()
     # invalidate cache
     self.cache.delete(self.make_cache_key(
         blueprint=blueprint, user=user, user_id=user_id,
     ))
Ejemplo n.º 13
0
def test_first():
    assert first([1, 2, 3]) == 1
    assert first([None, 2, 3]) == 2
    assert first([None, 0, False, [], {}]) == None
    assert first([None, 0, False, [], {}], default=42) == 42
    first([1, 1, 3, 4, 5], key=lambda x: x % 2 == 0) == 4
Ejemplo n.º 14
0
def test_first():
    assert first([1, 2, 3]) == 1
    assert first([None, 2, 3]) == 2
    assert first([None, 0, False, [], {}]) == None
    assert first([None, 0, False, [], {}], default=42) == 42
    first([1, 1, 3, 4, 5], key=lambda x: x % 2 == 0) == 4