SAE-A2-TruthInquiry/bulk_import.py

185 lines
5.2 KiB
Python

from dotenv import load_dotenv
load_dotenv()
import sys
import yaml
import os
from sqlalchemy.orm import sessionmaker
from truthinquiry.ext.database.models import *
from truthinquiry.ext.database.sa import engine
Session = sessionmaker(bind=engine)
session = Session()
# full reset .w.
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
class LocaleManager():
def __init__(self):
self.used_lids = [0]
[self.used_lids.append(locale.LID) for locale in session.query(Locale).all()]
def get_unused_lid(self):
new_lid = max(self.used_lids) + 1
self.used_lids.append(new_lid)
return new_lid
def get_used_lids(self):
return self.used_lids[1:]
def bulk_import(data, dir):
# Data list that will be commited to the db
TEXT_LIST = []
TRAIT_DICT = {}
REACTION_LIST = []
QUESTIONS_LIST = []
ANSWER_LIST = []
NPC_DICT = {}
ROOMS_LIST = []
lm = LocaleManager()
getid = lm.get_unused_lid
reactions_img_dir = os.path.join(dir, data["reactions_img_dir"])
# Questions
# Where type questions
question_type_zero = QuestionType(0, getid())
QUESTIONS_LIST.append(question_type_zero)
question_type_one = QuestionType(1, getid())
QUESTIONS_LIST.append(question_type_one)
questions = data["questions"]
# handle where type quetions
for question in questions["where"]["text"]:
lang = list(question.keys())[0]
text = list(question.values())[0]
TEXT_LIST.append(Text(0,question_type_zero.TEXT_LID, lang, text))
# handle with who type quetions
for question in questions["withwho"]["text"]:
lang = list(question.keys())[0]
text = list(question.values())[0]
TEXT_LIST.append(Text(0,question_type_one.TEXT_LID, lang, text))
# Traits
traits = data["traits"]
for trait_key, trait in traits.items():
# create the new trait
new_trait = Trait(None, getid(), getid())
for lang in trait["name"]:
TEXT_LIST.append(Text(0,new_trait.NAME_LID,
lang, trait["name"][lang]))
for lang in trait["description"]:
TEXT_LIST.append(Text(0,new_trait.DESC_LID, lang,
trait["description"][lang]))
TRAIT_DICT[trait_key] = new_trait
# Npcs
npcs = data["npcs"]
npcid = 1
for npc_key, npc in npcs.items():
new_npc = Npc(npcid, getid())
# handle the names
for lang in npc["name"]:
TEXT_LIST.append(Text(0,new_npc.NAME_LID, lang, npc["name"][lang]))
for question_type in npc["answers"]:
question_type_id = question_type_zero.QUESTION_TYPE_ID if question_type == "where" else question_type_one.QUESTION_TYPE_ID
new_answer = Answer(question_type_id, new_npc.NPC_ID, getid())
ANSWER_LIST.append(new_answer)
for answer in npc["answers"][question_type]:
lang = list(answer.keys())[0]
text = list(answer.values())[0]
TEXT_LIST.append(Text(0,new_answer.TEXT_LID, lang, text))
NPC_DICT[npc_key] = new_npc
npcid += 1
# Reactions
for npc_key in os.listdir(reactions_img_dir):
for reaction_file in os.listdir(os.path.join(reactions_img_dir, npc_key)):
img_path = os.path.join(reactions_img_dir, npc_key, reaction_file)
with open(img_path, "rb") as f:
img_data = f.read()
npc = NPC_DICT[npc_key]
trait_key = os.path.splitext(reaction_file)[0]
if trait_key == 'default':
npc.DEFAULT_IMG = img_data
else:
trait = TRAIT_DICT[trait_key]
new_reaction = Reaction(None, npc.NPC_ID, None)
new_reaction.TRAIT = trait
new_reaction.IMG = img_data
REACTION_LIST.append(new_reaction)
# rooms
rooms = data["rooms"]
for room in rooms.values():
new_room = Place(0,getid())
for lang in room:
TEXT_LIST.append(Text(0,new_room.NAME_LID, lang, room[lang]))
ROOMS_LIST.append(new_room)
for lid in lm.get_used_lids():
print("lid :"+ str(lid))
session.add(Locale(lid))
for text in TEXT_LIST:
print("Text : "+str(text))
session.add(text)
session.commit()
for question in QUESTIONS_LIST:
print("Question : "+str(question))
session.add(question)
session.commit()
for trait in TRAIT_DICT.values():
print("Trait : "+ str(trait))
session.add(trait)
session.commit()
for npc in NPC_DICT.values():
print("Npc : "+ str(npc))
session.add(npc)
session.commit()
for reaction in REACTION_LIST:
print("Reaction : " + str(reaction))
session.add(reaction)
session.commit()
for answer in ANSWER_LIST:
print("Answer : "+ str(answer))
session.add(answer)
session.commit()
for room in ROOMS_LIST:
print("Room : "+str(room))
session.add(room)
session.commit()
if len(sys.argv) <= 1:
print("Please enter input file")
else:
path = sys.argv[1]
bulk_import(yaml.load(open(path, "r"), yaml.Loader), os.path.dirname(path))