From fb313dfc178560eb5d5ec7900eee0e4f61b80b3a Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Mon, 28 Aug 2023 10:52:55 +0300 Subject: Implement computing of diffs --- gn3/case_attributes.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'gn3') diff --git a/gn3/case_attributes.py b/gn3/case_attributes.py index 78fc579..cc5feb7 100644 --- a/gn3/case_attributes.py +++ b/gn3/case_attributes.py @@ -1,9 +1,14 @@ """Implement case-attribute manipulations.""" +import os +import csv +import tempfile from functools import reduce from MySQLdb.cursors import DictCursor from flask import jsonify, Response, Blueprint, current_app +from gn3.commands import run_cmd + from gn3.db_utils import Connection, database_connection from gn3.auth.authentication.users import User @@ -84,9 +89,29 @@ def __process_edit_data__(form_data) -> tuple[dict, ...]: """Process data from form and return tuple of dicts.""" raise NotImplementedError -def __compute_diff__(original_data: tuple[dict, ...], edit_data: tuple[dict, ...]): +def __write_csv__(fieldnames, data): + """Write the given `data` to a csv file and return the path to the file.""" + fd, filepath = tempfile.mkstemp(".csv") + os.close(fd) + with open(filepath, "w", encoding="utf-8") as csvfile: + writer = csv.DictWriter(filename, fieldnames=fieldnames, dialect="unix") + writer.writeheader() + writer.writerows(data) + + return filepath + +def __compute_diff__(calabels: tuple[str, ...], original_data: tuple[dict, ...], edit_data: tuple[dict, ...]): """Return the diff of the data.""" - raise NotImplementedError + fieldnames = ["Strain"] + sorted(calabels) # Make first column the strain. + basefilename = __write_csv__(fieldnames, original_data) + deltafilename = __write_csv__(fieldnames, edit_data) + diff_results = run_cmd(json.dumps( + ["csvdiff", basefilename, deltafilename, "--format", "json"])) + os.unlink(basefilename) + os.unlink(deltafilename) + if diff_results["code"] == 0: + return json.loads(diff_results["output"]) + return {} def __queue_diff__(conn: Connection, user: User, diff) -> str: """ -- cgit v1.2.3