def _data_object(cls, **kwargs): from sefaria.model import library, Version i = library.get_index(kwargs.get("index")) assert i v = Version().load({ "language": kwargs.get("language"), "title": i.title, "versionTitle": kwargs.get("version") }) assert v d = { "index": i.title, "version": v.versionTitle, "language": v.language } ref = kwargs.get("ref") if ref: oref = text.Ref(ref) d["ref"] = oref.normal() if kwargs.get("he"): d["he"] = kwargs.get("he") if kwargs.get("en"): d["en"] = kwargs.get("en") return d
def modify_bulk_text(user: int, version: model.Version, text_map: dict, vsource=None, **kwargs) -> dict: """ user: user ID of user making modification version: version object of text being modified text_map: dict with segment ref keys and text values. Each key/value pair represents a segment that should be modified. Segments that don't have changes will be ignored. vsource: optional parameter to set the version source of the version. not sure why this is here. I copied it from modify_text. """ def populate_change_map(old_text, en_tref, he_tref, _): nonlocal change_map, existing_tref_set existing_tref_set.add(en_tref) new_text = text_map.get(en_tref, None) if new_text is None or new_text == old_text: return change_map[en_tref] = (old_text, new_text, model.Ref(en_tref)) change_map = {} existing_tref_set = set() version.walk_thru_contents(populate_change_map) new_ref_set = set(text_map.keys()).difference(existing_tref_set) for new_tref in new_ref_set: if len(text_map[new_tref].strip()) == 0: # this ref doesn't exist for this version. probably exists in a different version # no reason to add to change_map if it has not content continue change_map[new_tref] = ('', text_map[new_tref], model.Ref(new_tref)) if vsource: version.versionSource = vsource # todo: log this change # modify version in place error_map = {} for _, new_text, oref in change_map.values(): try: version.sub_content_with_ref(oref, new_text) except Exception as e: error_map[oref.normal( )] = f"Ref doesn't match schema of version. Exception: {repr(e)}" version.save() for old_text, new_text, oref in change_map.values(): if oref.normal() in error_map: continue post_modify_text(user, kwargs.get("type"), oref, version.language, version.versionTitle, old_text, new_text, version._id, **kwargs) return error_map