コード例 #1
0
    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
コード例 #2
0
ファイル: tracker.py プロジェクト: yairm210/Sefaria-Project
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