seitime-frappe/frappe/utils/diff.py
Ankush Menat 81b37cb7d2
refactor: clean up code to py310 supported features (#17367)
refactor: clean up code to py39+ supported syntax

- f-strings instead of format
- latest typing support instead of pre 3.9 TitleCase
- remove UTF-8 declarations.
- many more changes

Powered by https://github.com/asottile/pyupgrade/ + manual cleanups
2022-07-01 11:51:05 +05:30

59 lines
1.5 KiB
Python

import json
from difflib import unified_diff
import frappe
from frappe.utils import pretty_date
from frappe.utils.data import cstr
@frappe.whitelist()
def get_version_diff(
from_version: int | str, to_version: int | str, fieldname: str = "script"
) -> list[str]:
before, before_timestamp = _get_value_from_version(from_version, fieldname)
after, after_timestamp = _get_value_from_version(to_version, fieldname)
if not (before and after):
return ["Values not available for diff"]
before = before.split("\n")
after = after.split("\n")
diff = unified_diff(
before,
after,
fromfile=cstr(from_version),
tofile=cstr(to_version),
fromfiledate=before_timestamp,
tofiledate=after_timestamp,
)
return list(diff)
def _get_value_from_version(version_name: int | str, fieldname: str):
version = frappe.get_list("Version", fields=["data", "modified"], filters={"name": version_name})
if version:
data = json.loads(version[0].data)
changed_fields = data.get("changed", [])
# data structure of field: [fieldname, before_save, after_save]
for field in changed_fields:
if field[0] == fieldname:
return field[2], str(version[0].modified)
return None, None
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def version_query(doctype, txt, searchfield, start, page_len, filters):
results = frappe.get_list(
"Version",
fields=["name", "modified"],
filters=filters,
limit_start=start,
limit_page_length=page_len,
order_by="modified desc",
)
return [(d.name, pretty_date(d.modified), d.modified) for d in results]