Compare commits
1 Commits
master
...
log-recipe
| Author | SHA1 | Date | |
|---|---|---|---|
| f65caebdf1 |
|
|
@ -1,3 +1,7 @@
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import copy
|
||||||
|
from datetime import datetime
|
||||||
from peewee import IntegrityError
|
from peewee import IntegrityError
|
||||||
from ui.barcodes_step_editor import Barcodes_Step_Editor
|
from ui.barcodes_step_editor import Barcodes_Step_Editor
|
||||||
from ui.connector_step_editor import Connector_Step_Editor
|
from ui.connector_step_editor import Connector_Step_Editor
|
||||||
|
|
@ -13,10 +17,66 @@ from ui.vision_step_editor import Vision_Step_Editor
|
||||||
from ui.instruction_step_editor import Instruction_Step_Editor
|
from ui.instruction_step_editor import Instruction_Step_Editor
|
||||||
|
|
||||||
|
|
||||||
|
def create_log(log_dir, old_data, new_data):
|
||||||
|
"""
|
||||||
|
Creates a log file detailing the changes between two recipe dictionaries.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
log_dir (str): The directory to save the log files.
|
||||||
|
old_data (dict): The recipe dictionary before the changes.
|
||||||
|
new_data (dict): The recipe dictionary after the changes.
|
||||||
|
"""
|
||||||
|
# Create the log directory if it doesn't exist
|
||||||
|
os.makedirs(log_dir, exist_ok=True)
|
||||||
|
|
||||||
|
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
||||||
|
log_filename = f"recipe_change_log_{timestamp}.json"
|
||||||
|
log_filepath = os.path.join(log_dir, log_filename)
|
||||||
|
|
||||||
|
# Identify changes by comparing the dictionaries
|
||||||
|
diff = {
|
||||||
|
"changes": {},
|
||||||
|
"added": {},
|
||||||
|
"removed": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find keys that were added or changed
|
||||||
|
for key, new_value in new_data.items():
|
||||||
|
if key not in old_data:
|
||||||
|
diff["added"][key] = new_value
|
||||||
|
elif old_data[key] != new_value:
|
||||||
|
diff["changes"][key] = {
|
||||||
|
"old_value": old_data[key],
|
||||||
|
"new_value": new_value
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find keys that were removed
|
||||||
|
for key in old_data:
|
||||||
|
if key not in new_data:
|
||||||
|
diff["removed"][key] = old_data[key]
|
||||||
|
|
||||||
|
log_entry = {
|
||||||
|
"timestamp": timestamp,
|
||||||
|
"description": "Recipe changes applied.",
|
||||||
|
"changes_summary": diff,
|
||||||
|
"old_recipe_state": old_data,
|
||||||
|
"new_recipe_state": new_data
|
||||||
|
}
|
||||||
|
|
||||||
|
# Save the log entry as a JSON file
|
||||||
|
try:
|
||||||
|
with open(log_filepath, 'w') as f:
|
||||||
|
json.dump(log_entry, f, indent=4)
|
||||||
|
print(f"✅ Log saved to {log_filepath}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Error saving log file: {e}")
|
||||||
|
|
||||||
|
|
||||||
class Recipe_Spec_And_Step_Editor(Editor):
|
class Recipe_Spec_And_Step_Editor(Editor):
|
||||||
def __init__(self, action=None, cell_widget=None, unsupported_steps=None):
|
def __init__(self, action=None, cell_widget=None, unsupported_steps=None):
|
||||||
super().__init__(action=action, cell_widget=cell_widget)
|
super().__init__(action=action, cell_widget=cell_widget)
|
||||||
self.crud = None
|
self.crud = None
|
||||||
|
self.original_recipe_data = None # Added to store the original data for logging
|
||||||
self.steps_map = {
|
self.steps_map = {
|
||||||
"count": {
|
"count": {
|
||||||
"type": "count",
|
"type": "count",
|
||||||
|
|
@ -140,6 +200,9 @@ class Recipe_Spec_And_Step_Editor(Editor):
|
||||||
self.reset_steps()
|
self.reset_steps()
|
||||||
|
|
||||||
def render(self, data, field_name=None, row_number=None, crud=None):
|
def render(self, data, field_name=None, row_number=None, crud=None):
|
||||||
|
# Store a deep copy of the original data to compare later
|
||||||
|
self.original_recipe_data = copy.deepcopy(data)
|
||||||
|
|
||||||
super().render(data, field_name=field_name, row_number=row_number, crud=crud)
|
super().render(data, field_name=field_name, row_number=row_number, crud=crud)
|
||||||
self.crud = crud
|
self.crud = crud
|
||||||
steps_data = data.get("steps", {})
|
steps_data = data.get("steps", {})
|
||||||
|
|
@ -155,10 +218,9 @@ class Recipe_Spec_And_Step_Editor(Editor):
|
||||||
def parse(self, action=None, row_number=None, crud=None):
|
def parse(self, action=None, row_number=None, crud=None):
|
||||||
ret = super().parse(row_number=row_number, crud=crud)
|
ret = super().parse(row_number=row_number, crud=crud)
|
||||||
ret["steps"] = {}
|
ret["steps"] = {}
|
||||||
#self.save_steps()
|
|
||||||
for step_name, step_map in self.steps_map.items():
|
for step_name, step_map in self.steps_map.items():
|
||||||
if not step_map.get("hidden", False):
|
if not step_map.get("hidden", False):
|
||||||
ret["steps"][step_name]=self.steps_map[step_name]["spec"]
|
ret["steps"][step_name] = self.steps_map[step_name]["spec"]
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def render_steps(self):
|
def render_steps(self):
|
||||||
|
|
@ -173,16 +235,21 @@ class Recipe_Spec_And_Step_Editor(Editor):
|
||||||
self.render_steps()
|
self.render_steps()
|
||||||
|
|
||||||
def save_steps(self):
|
def save_steps(self):
|
||||||
for step_name,step_map in self.steps_map.items():
|
for step_name, step_map in self.steps_map.items():
|
||||||
if not step_map.get("hidden", False):
|
if not step_map.get("hidden", False):
|
||||||
editor = step_map.get("editor", None)
|
editor = step_map.get("editor", None)
|
||||||
if editor is not None:
|
if editor is not None:
|
||||||
step_dict = editor.parse()
|
step_dict = editor.parse()
|
||||||
self.steps_map[step_name]["spec"]=step_dict
|
self.steps_map[step_name]["spec"] = step_dict
|
||||||
else:
|
else:
|
||||||
self.steps_map[step_name]["spec"] = {}
|
self.steps_map[step_name]["spec"] = {}
|
||||||
if self.crud is not None:
|
if self.crud is not None:
|
||||||
self.crud().set_modified()
|
self.crud().set_modified()
|
||||||
parsed_value=self.parse()
|
parsed_value = self.parse()
|
||||||
|
|
||||||
|
# Call the logging function to save changes
|
||||||
|
log_directory = "recipe_logs"
|
||||||
|
create_log(log_directory, self.original_recipe_data, parsed_value)
|
||||||
|
|
||||||
self.cell_widget().value = parsed_value
|
self.cell_widget().value = parsed_value
|
||||||
self.reset_steps()
|
self.reset_steps()
|
||||||
Loading…
Reference in New Issue
Block a user