Merge branch 'duplicates-fix' into 'main'
Duplicates fix See merge request discoursio/discoursio-api!8
This commit is contained in:
commit
af3d3b08ad
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user