Merge branch 'duplicates-fix' into 'main'

Duplicates fix

See merge request discoursio/discoursio-api!8
This commit is contained in:
Igor 2023-01-29 01:57:06 +00:00
commit af3d3b08ad
3 changed files with 78 additions and 57 deletions

View File

@ -135,6 +135,7 @@ async def shouts_handle(storage, args):
print("[migration] " + str(counter) + " content items were migrated") print("[migration] " + str(counter) + " content items were migrated")
print("[migration] " + str(pub_counter) + " have been published") print("[migration] " + str(pub_counter) + " have been published")
print("[migration] " + str(discours_author) + " authored by @discours")
print("[migration] " + str(anonymous_author) + " authored by @anonymous") print("[migration] " + str(anonymous_author) + " authored by @anonymous")

View File

@ -38,56 +38,58 @@ def get_shout_slug(entry):
def create_author_from_app(app): def create_author_from_app(app):
user = None
userdata = None userdata = None
if app: with local_session() as session:
try: # check if email is used
with local_session() as session: user = session.query(User).where(User.email == app['email']).first()
# check if email is used if not user:
user = session.query(User).where(User.email == app['email']).first() # print('[migration] app %r' % app)
if not user: name = app.get('name')
print('[migration] creating user...') if name:
name = app.get('name') slug = translit(name, "ru", reversed=True).lower()
if name: slug = re.sub('[^0-9a-zA-Z]+', '-', slug)
slug = translit(name, "ru", reversed=True).lower() # check if slug is used
slug = re.sub('[^0-9a-zA-Z]+', '-', slug) if slug:
# check if slug is used user = session.query(User).where(User.slug == slug).first()
if slug:
# get slug from email
if user:
slug = app['email'].split('@')[0]
user = session.query(User).where(User.slug == slug).first()
# one more try
if user:
slug += '-author'
user = session.query(User).where(User.slug == slug).first() user = session.query(User).where(User.slug == slug).first()
else:
# print(f'[migration] author @{slug} is found by email')
pass
# get slug from email else:
if user: # print(f'[migration] author @{slug} is found')
slug = app['email'].split('@')[0] pass
user = session.query(User).where(User.slug == slug).first()
# one more try
if user:
slug += '-author'
user = session.query(User).where(User.slug == slug).first()
else:
print(f'[migration] author @{slug} is found by email')
else:
print(f'[migration] author @{slug} is found')
# create user with application data # create user with application data
if not user: if not user:
userdata = { userdata = {
"username": app["email"], "username": app["email"],
"email": app["email"], "email": app["email"],
"name": app.get("name", ""), "name": app.get("name", ""),
"bio": app.get("bio", ""), "bio": app.get("bio", ""),
"emailConfirmed": False, "emailConfirmed": False,
"slug": slug, "slug": slug,
"createdAt": ts, "createdAt": ts,
"lastSeen": ts, "lastSeen": ts,
} }
user = User.create(**userdata) # print('[migration] userdata %r' % userdata)
session.add(user) user = User.create(**userdata)
session.commit() session.add(user)
session.commit()
userdata['id'] = user.id
if not userdata:
userdata = user.dict() userdata = user.dict()
except Exception as e:
print(app)
raise e
return userdata return userdata
@ -108,24 +110,38 @@ async def create_shout(shout_dict):
async def get_user(entry, storage): async def get_user(entry, storage):
user_oid = entry.get("createdBy") app = entry.get("application")
userdata = storage["users"]["by_oid"].get(user_oid) userdata = None
user_oid = None
if app:
userdata = create_author_from_app(app)
# print("[migration] from app")
if not userdata: if not userdata:
userdata = create_author_from_app(entry.get("application")) user_oid = entry.get("createdBy")
print("[migration] from user_oid") if user_oid == "0":
if not userdata: userdata = discours
print("[migration] no app no user_oid") elif user_oid:
userdata = anondict userdata = storage["users"]["by_oid"].get(user_oid)
# print("[migration] user from user_oid")
else:
# print("[migration] no app, no user_oid")
userdata = anondict
print(app)
# cleanup slug # cleanup slug
slug = userdata.get("slug", "") if userdata:
if slug: slug = userdata.get("slug", "")
slug = re.sub('[^0-9a-zA-Z]+', '-', slug) if slug:
userdata["slug"] = slug slug = re.sub('[^0-9a-zA-Z]+', '-', slug)
userdata["slug"] = slug
else:
userdata = anondict
user = await process_user(userdata, storage, user_oid) user = await process_user(userdata, storage, user_oid)
return user, user_oid return user, user_oid
async def migrate(entry, storage): async def migrate(entry, storage):
author, user_oid = await get_user(entry, storage) author, user_oid = await get_user(entry, storage)
r = { r = {
@ -237,7 +253,12 @@ async def add_topics_follower(entry, storage, user):
async def process_user(userdata, storage, oid): async def process_user(userdata, storage, oid):
with local_session() as session: with local_session() as session:
uid = userdata.get("id", 1) # anonymous as uid = userdata.get("id") # anonymous as
if not uid:
print(userdata)
print("has no id field, set it @anonymous")
userdata = anondict
uid = 1
user = session.query(User).filter(User.id == uid).first() user = session.query(User).filter(User.id == uid).first()
if not user: if not user:
try: try:

View File

@ -190,7 +190,6 @@ async def load_shouts_by(_, info, options):
) )
for [shout_id, viewed_stat] in session.execute(viewed_stat_query).unique(): for [shout_id, viewed_stat] in session.execute(viewed_stat_query).unique():
shouts.append(shout)
shouts_map[shout_id].stat['viewed'] = viewed_stat shouts_map[shout_id].stat['viewed'] = viewed_stat
return shouts return shouts