~edwargix/git.sr.ht

b2f98eaee1bfef16bc47c7cbb82619c717057923 — Drew DeVault 7 years ago 7b4692d
Updates per meta.sr.ht API changes
A gitsrht/alembic/versions/f86f4bd632a4_add_user_type_to_user.py => gitsrht/alembic/versions/f86f4bd632a4_add_user_type_to_user.py +73 -0
@@ 0,0 1,73 @@
"""Add user_type to user

Revision ID: f86f4bd632a4
Revises: 8d26b98e7d44
Create Date: 2018-12-28 16:50:52.875127

"""

# revision identifiers, used by Alembic.
revision = 'f86f4bd632a4'
down_revision = '8d26b98e7d44'

from alembic import op
import sqlalchemy as sa
import sqlalchemy_utils as sau
from enum import Enum
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session as BaseSession, relationship
from srht.config import cfg
import requests
try:
    from tqdm import tqdm
except ImportError:
    def tqdm(iterable):
        yield from iterable

metasrht = cfg("meta.sr.ht", "origin")

Session = sessionmaker()
Base = declarative_base()

class UserType(Enum):
    unconfirmed = "unconfirmed"
    active_non_paying = "active_non_paying"
    active_free = "active_free"
    active_paying = "active_paying"
    active_delinquent = "active_delinquent"
    admin = "admin"

class User(Base):
    __tablename__ = 'user'
    id = sa.Column(sa.Integer, primary_key=True)
    username = sa.Column(sa.Unicode(256))
    oauth_token = sa.Column(sa.String(256), nullable=False)
    user_type = sa.Column(
            sau.ChoiceType(UserType, impl=sa.String()),
            nullable=False,
            default=UserType.unconfirmed)

def upgrade():
    op.drop_column('user', 'paid')
    op.add_column('user', sa.Column('user_type', sa.Unicode,
        nullable=False, server_default='active_non_paying'))

    bind = op.get_bind()
    session = Session(bind=bind)
    print("Migrating user_type (this expects meta.sr.ht to be available)")
    for user in tqdm(session.query(User).all()):
        r = requests.get("{}/api/user/profile".format(metasrht), headers={
            "Authorization": f"token {user.oauth_token}"
        })
        if r.status_code != 200:
            print(f"Failed for {user.username}", r.status_code, r.json())
            continue
        p = r.json()
        user.user_type = UserType(p["user_type"])
    session.commit()


def downgrade():
    op.drop_column('user', 'user_type')
    op.add_column('user', sa.Column('paid', sa.Boolean,
        nullable=False, server_default='f'))

M gitsrht/app.py => gitsrht/app.py +4 -4
@@ 71,13 71,13 @@ class GitApp(SrhtFlask):
            return User.query.filter(User.username == username).one_or_none()

    def lookup_or_register(self, exchange, profile, scopes):
        user = User.query.filter(User.username == profile["username"]).first()
        user = User.query.filter(User.username == profile["name"]).first()
        if not user:
            user = User()
            db.session.add(user)
        user.username = profile.get("username")
        user.email = profile.get("email")
        user.paid = profile.get("paid")
        user.username = profile["name"]
        user.email = profile["email"]
        user.user_type = profile["user_type"]
        user.oauth_token = exchange["token"]
        user.oauth_token_expires = exchange["expires"]
        user.oauth_token_scopes = scopes

M gitsrht/oauth.py => gitsrht/oauth.py +6 -6
@@ 1,9 1,9 @@
from srht.config import cfg
from srht.oauth import OAuthScope, AbstractOAuthService, set_base_service
from srht.oauth import meta_delegated_exchange
from srht.oauth import delegated_exchange
from srht.flask import DATE_FORMAT
from srht.database import db
from gitsrht.types import OAuthToken, User
from gitsrht.types import OAuthToken, User, UserType
from datetime import datetime

client_id = cfg("git.sr.ht", "oauth-client-id")


@@ 22,16 22,16 @@ class GitOAuthService(AbstractOAuthService):
        ).first()
        if oauth_token:
            return oauth_token
        _token, profile = meta_delegated_exchange(
        _token, profile = delegated_exchange(
                token, client_id, client_secret, revocation_url)
        expires = datetime.strptime(_token["expires"], DATE_FORMAT)
        scopes = set(OAuthScope(s) for s in _token["scopes"].split(","))
        user = User.query.filter(User.username == profile["username"]).first()
        if not user:
            user = User()
            user.username = profile.get("username")
            user.email = profile.get("email")
            user.paid = profile.get("paid")
            user.username = profile["username"]
            user.email = profile["email"]
            user.user_type = UserType(profile["user_type"])
            user.oauth_token = token
            user.oauth_token_expires = expires
            db.session.add(user)

M gitsrht/types/__init__.py => gitsrht/types/__init__.py +1 -1
@@ 1,4 1,4 @@
from .user import User
from .user import User, UserType
from .repository import Repository, RepoVisibility
from .oauthtoken import OAuthToken
from .webhook import Webhook

M gitsrht/types/user.py => gitsrht/types/user.py +13 -1
@@ 1,6 1,15 @@
import sqlalchemy as sa
import sqlalchemy_utils as sau
from srht.database import Base
from enum import Enum

class UserType(Enum):
    unconfirmed = "unconfirmed"
    active_non_paying = "active_non_paying"
    active_free = "active_free"
    active_paying = "active_paying"
    active_delinquent = "active_delinquent"
    admin = "admin"

class User(Base):
    __tablename__ = 'user'


@@ 12,7 21,10 @@ class User(Base):
    oauth_token_expires = sa.Column(sa.DateTime, nullable=False)
    oauth_token_scopes = sa.Column(sa.String, nullable=False, default="")
    email = sa.Column(sa.String(256), nullable=False)
    paid = sa.Column(sa.Boolean, nullable=False)
    user_type = sa.Column(
            sau.ChoiceType(UserType, impl=sa.String()),
            nullable=False,
            default=UserType.unconfirmed)

    def __repr__(self):
        return '<User {} {}>'.format(self.id, self.username)