summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gitsrht/alembic/versions/f86f4bd632a4_add_user_type_to_user.py73
-rw-r--r--gitsrht/app.py8
-rw-r--r--gitsrht/oauth.py12
-rw-r--r--gitsrht/types/__init__.py2
-rw-r--r--gitsrht/types/user.py14
5 files changed, 97 insertions, 12 deletions
diff --git a/gitsrht/alembic/versions/f86f4bd632a4_add_user_type_to_user.py b/gitsrht/alembic/versions/f86f4bd632a4_add_user_type_to_user.py
new file mode 100644
index 0000000..775ad3a
--- /dev/null
+++ b/gitsrht/alembic/versions/f86f4bd632a4_add_user_type_to_user.py
@@ -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'))
diff --git a/gitsrht/app.py b/gitsrht/app.py
index 1cea729..f8a4511 100644
--- a/gitsrht/app.py
+++ b/gitsrht/app.py
@@ -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
diff --git a/gitsrht/oauth.py b/gitsrht/oauth.py
index 99e1064..a546ef7 100644
--- a/gitsrht/oauth.py
+++ b/gitsrht/oauth.py
@@ -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)
diff --git a/gitsrht/types/__init__.py b/gitsrht/types/__init__.py
index 8b4c79e..d3f5c6a 100644
--- a/gitsrht/types/__init__.py
+++ b/gitsrht/types/__init__.py
@@ -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
diff --git a/gitsrht/types/user.py b/gitsrht/types/user.py
index 8d6fc86..1b996eb 100644
--- a/gitsrht/types/user.py
+++ b/gitsrht/types/user.py
@@ -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)