diff --git a/migrate.py b/migrate.py index d233c6a6..38c66e9b 100644 --- a/migrate.py +++ b/migrate.py @@ -5,6 +5,7 @@ import base64 import re import frontmatter from migration.tables.users import migrate as migrateUser +from migration.tables.users import migrate_2stage as migrateUser_2stage from migration.tables.content_items import get_metadata, migrate as migrateShout from migration.tables.content_item_categories import migrate as migrateCategory from migration.tables.tags import migrate as migrateTag @@ -48,6 +49,7 @@ def users(users_by_oid, users_by_slug, users_data): if len(sys.argv) > 2: limit = int(sys.argv[2]) print('migrating %d users...' % limit) counter = 0 + id_map = {} for entry in users_data: oid = entry['_id'] user = migrateUser(entry) @@ -59,8 +61,10 @@ def users(users_by_oid, users_by_slug, users_data): del user['username'] del user['email'] users_by_slug[user['slug']] = user # public + id_map[user['old_id']] = user['id'] counter += 1 - export_authors = dict(sorted(users_by_slug.items(), key=lambda item: item[1]['rating'])[-10:]) + for entry in users_data: + migrateUser_2stage(entry, id_map) try: open('migration/data/users.old_id.json', 'w').write(json.dumps(users_by_oid, cls=DateTimeEncoder)) # NOTE: by old_id open('migration/data/users.slug.json', 'w').write(json.dumps(users_by_slug, cls=DateTimeEncoder)) # NOTE: by slug diff --git a/migration/tables/users.py b/migration/tables/users.py index ec4e2d48..eec4b1c6 100644 --- a/migration/tables/users.py +++ b/migration/tables/users.py @@ -4,9 +4,7 @@ from dateutil.parser import parse from migration.html2text import html2text from orm.base import local_session -counter = 0 - -def migrate(entry, limit=668): +def migrate(entry): ''' type User { @@ -21,7 +19,6 @@ def migrate(entry, limit=668): emailConfirmed: Boolean # should contain all emails too id: Int! muted: Boolean - rating: Int roles: [Role] updatedAt: DateTime wasOnlineAt: DateTime @@ -40,7 +37,6 @@ def migrate(entry, limit=668): res['wasOnlineAt'] = parse(entry.get('loggedInAt', entry['createdAt'])) res['emailConfirmed'] = entry['emails'][0]['verified'] res['createdAt'] = parse(entry['createdAt']) - res['rating'] = entry['rating'] # number res['roles'] = [] # entry['roles'] # roles by community res['ratings'] = [] # entry['ratings'] res['notifications'] = [] @@ -89,22 +85,23 @@ def migrate(entry, limit=668): old = res['old_id'] user = User.create(**res.copy()) res['id'] = user.id - res['ratings'] = [] - for user_rating_old in entry.get('ratings',[]): - with local_session() as session: - rater = session.query(User).filter(old == user_rating_old['createdBy']).first() - if rater: - user_rating_dict = { - 'value': user_rating_old['value'], - 'rater_id': rater.id, - 'user_id': user.id - } - cts = user_rating_old.get('createdAt') - if cts: user_rating_dict['createdAt'] = date_parse(cts) - try: - user_rating = UserRating.create(**user_rating_dict) - res['ratings'].append(user_rating_dict) - except Exception as e: - print(comment_rating_dict) - raise e + return res + +def migrate_2stage(entry, id_map): + for rating_entry in entry.get('ratings',[]): + rater_old_id = rating_entry['createdBy'] + rater_id = id_map.get(rater_old_id) + if not rater_id: + continue + old_id = entry['_id'] + user_rating_dict = { + 'value': rating_entry['value'], + 'rater_id': rater_id, + 'user_id': id_map.get(old_id) + } + with local_session() as session: + try: + user_rating = UserRating.create(**user_rating_dict) + except Exception as e: + print(e) diff --git a/orm/user.py b/orm/user.py index 25296d67..50d45372 100644 --- a/orm/user.py +++ b/orm/user.py @@ -49,12 +49,12 @@ class User(Base): bio: str = Column(String, nullable=True, comment="Bio") userpic: str = Column(String, nullable=True, comment="Userpic") name: str = Column(String, nullable=True, comment="Display name") - rating: int = Column(Integer, nullable=True, comment="Rating") slug: str = Column(String, unique=True, comment="User's slug") muted: bool = Column(Boolean, default=False) emailConfirmed: bool = Column(Boolean, default=False) createdAt: DateTime = Column(DateTime, nullable=False, default = datetime.now, comment="Created at") wasOnlineAt: DateTime = Column(DateTime, nullable=False, default = datetime.now, comment="Was online at") + deletedAt: DateTime = Column(DateTime, nullable=True, comment="Deleted at") links: JSONType = Column(JSONType, nullable=True, comment="Links") oauth: str = Column(String, nullable=True) notifications = relationship(lambda: UserNotifications) diff --git a/resolvers/auth.py b/resolvers/auth.py index 56184b86..e6b8142e 100644 --- a/resolvers/auth.py +++ b/resolvers/auth.py @@ -8,7 +8,7 @@ from auth.authorize import Authorize from auth.identity import Identity from auth.password import Password from auth.email import send_confirm_email, send_auth_email -from orm import User +from orm import User, UserStorage from orm.base import local_session from resolvers.base import mutation, query from exceptions import InvalidPassword @@ -40,13 +40,13 @@ async def register(*_, email: str, password: str = ""): if not password: user = User.create(**user_dict) await send_confirm_email(user) - UserStorage.add_user(user) + await UserStorage.add_user(user) return { "user": user } user_dict["password"] = Password.encode(password) user = User.create(**user_dict) token = await Authorize.authorize(user) - UserStorage.add_user(user) + await UserStorage.add_user(user) return {"user": user, "token": token }