migrate user rating; remove unused user column

This commit is contained in:
knst-kotov 2021-12-08 13:29:04 +03:00
parent 1c38d51113
commit 8092d8a262
4 changed files with 29 additions and 28 deletions

View File

@ -5,6 +5,7 @@ import base64
import re import re
import frontmatter import frontmatter
from migration.tables.users import migrate as migrateUser 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_items import get_metadata, migrate as migrateShout
from migration.tables.content_item_categories import migrate as migrateCategory from migration.tables.content_item_categories import migrate as migrateCategory
from migration.tables.tags import migrate as migrateTag 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]) if len(sys.argv) > 2: limit = int(sys.argv[2])
print('migrating %d users...' % limit) print('migrating %d users...' % limit)
counter = 0 counter = 0
id_map = {}
for entry in users_data: for entry in users_data:
oid = entry['_id'] oid = entry['_id']
user = migrateUser(entry) user = migrateUser(entry)
@ -59,8 +61,10 @@ def users(users_by_oid, users_by_slug, users_data):
del user['username'] del user['username']
del user['email'] del user['email']
users_by_slug[user['slug']] = user # public users_by_slug[user['slug']] = user # public
id_map[user['old_id']] = user['id']
counter += 1 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: 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.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 open('migration/data/users.slug.json', 'w').write(json.dumps(users_by_slug, cls=DateTimeEncoder)) # NOTE: by slug

View File

@ -4,9 +4,7 @@ from dateutil.parser import parse
from migration.html2text import html2text from migration.html2text import html2text
from orm.base import local_session from orm.base import local_session
counter = 0 def migrate(entry):
def migrate(entry, limit=668):
''' '''
type User { type User {
@ -21,7 +19,6 @@ def migrate(entry, limit=668):
emailConfirmed: Boolean # should contain all emails too emailConfirmed: Boolean # should contain all emails too
id: Int! id: Int!
muted: Boolean muted: Boolean
rating: Int
roles: [Role] roles: [Role]
updatedAt: DateTime updatedAt: DateTime
wasOnlineAt: DateTime wasOnlineAt: DateTime
@ -40,7 +37,6 @@ def migrate(entry, limit=668):
res['wasOnlineAt'] = parse(entry.get('loggedInAt', entry['createdAt'])) res['wasOnlineAt'] = parse(entry.get('loggedInAt', entry['createdAt']))
res['emailConfirmed'] = entry['emails'][0]['verified'] res['emailConfirmed'] = entry['emails'][0]['verified']
res['createdAt'] = parse(entry['createdAt']) res['createdAt'] = parse(entry['createdAt'])
res['rating'] = entry['rating'] # number
res['roles'] = [] # entry['roles'] # roles by community res['roles'] = [] # entry['roles'] # roles by community
res['ratings'] = [] # entry['ratings'] res['ratings'] = [] # entry['ratings']
res['notifications'] = [] res['notifications'] = []
@ -89,22 +85,23 @@ def migrate(entry, limit=668):
old = res['old_id'] old = res['old_id']
user = User.create(**res.copy()) user = User.create(**res.copy())
res['id'] = user.id res['id'] = user.id
res['ratings'] = []
for user_rating_old in entry.get('ratings',[]): return res
with local_session() as session:
rater = session.query(User).filter(old == user_rating_old['createdBy']).first() def migrate_2stage(entry, id_map):
if rater: 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 = { user_rating_dict = {
'value': user_rating_old['value'], 'value': rating_entry['value'],
'rater_id': rater.id, 'rater_id': rater_id,
'user_id': user.id 'user_id': id_map.get(old_id)
} }
cts = user_rating_old.get('createdAt') with local_session() as session:
if cts: user_rating_dict['createdAt'] = date_parse(cts)
try: try:
user_rating = UserRating.create(**user_rating_dict) user_rating = UserRating.create(**user_rating_dict)
res['ratings'].append(user_rating_dict)
except Exception as e: except Exception as e:
print(comment_rating_dict) print(e)
raise e
return res

View File

@ -49,12 +49,12 @@ class User(Base):
bio: str = Column(String, nullable=True, comment="Bio") bio: str = Column(String, nullable=True, comment="Bio")
userpic: str = Column(String, nullable=True, comment="Userpic") userpic: str = Column(String, nullable=True, comment="Userpic")
name: str = Column(String, nullable=True, comment="Display name") 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") slug: str = Column(String, unique=True, comment="User's slug")
muted: bool = Column(Boolean, default=False) muted: bool = Column(Boolean, default=False)
emailConfirmed: bool = Column(Boolean, default=False) emailConfirmed: bool = Column(Boolean, default=False)
createdAt: DateTime = Column(DateTime, nullable=False, default = datetime.now, comment="Created at") 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") 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") links: JSONType = Column(JSONType, nullable=True, comment="Links")
oauth: str = Column(String, nullable=True) oauth: str = Column(String, nullable=True)
notifications = relationship(lambda: UserNotifications) notifications = relationship(lambda: UserNotifications)

View File

@ -8,7 +8,7 @@ from auth.authorize import Authorize
from auth.identity import Identity from auth.identity import Identity
from auth.password import Password from auth.password import Password
from auth.email import send_confirm_email, send_auth_email 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 orm.base import local_session
from resolvers.base import mutation, query from resolvers.base import mutation, query
from exceptions import InvalidPassword from exceptions import InvalidPassword
@ -40,13 +40,13 @@ async def register(*_, email: str, password: str = ""):
if not password: if not password:
user = User.create(**user_dict) user = User.create(**user_dict)
await send_confirm_email(user) await send_confirm_email(user)
UserStorage.add_user(user) await UserStorage.add_user(user)
return { "user": user } return { "user": user }
user_dict["password"] = Password.encode(password) user_dict["password"] = Password.encode(password)
user = User.create(**user_dict) user = User.create(**user_dict)
token = await Authorize.authorize(user) token = await Authorize.authorize(user)
UserStorage.add_user(user) await UserStorage.add_user(user)
return {"user": user, "token": token } return {"user": user, "token": token }