aboutsummaryrefslogtreecommitdiff
path: root/logic/database.gd
diff options
context:
space:
mode:
Diffstat (limited to 'logic/database.gd')
-rw-r--r--logic/database.gd226
1 files changed, 226 insertions, 0 deletions
diff --git a/logic/database.gd b/logic/database.gd
new file mode 100644
index 0000000..1abb984
--- /dev/null
+++ b/logic/database.gd
@@ -0,0 +1,226 @@
+extends ItemList
+class_name Database
+
+const DATABASE_FILE_PATH: String = "user://database.csv"
+const DATE_SEPARATOR: String = "-"
+const DATE_FORMAT: String = "%04d-%02d-%02d"
+const ENTRY_PROTOTYPE: Dictionary = {
+ "process_id": "",
+ "surgery_id": "",
+ "place": "",
+ "date": "",
+ "date_year": 0,
+ "date_month": 0,
+ "date_day": 0,
+ "anesthetic": "",
+ "first_assistant": "",
+ "type": "",
+ "sub_type": "",
+ "sub_sub_type": "",
+ "pathology": "",
+ "intervention": "",
+ "is_urgency": false,
+ "notes": "",
+}
+
+var db: Array
+var staged_idx: int
+
+onready var delete_button: Button = get_node("actions/delete")
+onready var edit_button: Button = get_node("actions/edit")
+onready var add_button: Button = get_node("actions/add")
+
+onready var stage: Stage = get_node("/root/main/stage")
+
+
+func _init():
+ staged_idx = -1
+ load_database()
+ store_database() # @DAM Only for testing.
+
+
+# @DAM WIP
+#func _notification(what: int):
+# if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST:
+# clear_selection()
+
+
+func _ready():
+ self.connect("nothing_selected", self, "clear_selection")
+ delete_button.connect("pressed", self, "delete_action")
+ edit_button.connect("pressed", self, "edit_action")
+ add_button.connect("pressed", self, "add_action")
+ stage.connect("save", self, "save")
+ stage.connect("discard", self, "discard")
+ refresh_list()
+
+
+func get_entry_view(database_entry: Dictionary) -> String:
+ return "%6s | %6s | %s" % [database_entry.process_id, database_entry.surgery_id, get_entry_date(database_entry)]
+
+
+func refresh_list():
+ self.clear()
+ for it in db:
+ self.add_item(get_entry_view(it))
+
+
+func clear_selection():
+ unselect_all()
+
+
+func delete_action():
+ # @DAM Could do some performance improvements
+ var selected_entries_idx := self.get_selected_items()
+ var sorted_idx := Array(selected_entries_idx)
+ sorted_idx.sort()
+ sorted_idx.invert()
+ for idx in sorted_idx:
+ db.remove(idx)
+ self.remove_item(idx)
+
+
+func edit_action():
+ var selected_entries_idx := self.get_selected_items()
+ if selected_entries_idx.size() != 1:
+ return
+ staged_idx = selected_entries_idx[0]
+ self.visible = false
+ stage.visible = true
+ stage.set_stage(db[staged_idx])
+
+
+func add_action():
+ self.visible = false
+ stage.visible = true
+ var staged := instance_entry()
+ stage.set_stage(staged)
+ # @DAM This signal is connected but, if we select "DISCARD" it stays connectd.
+ # Maybe I should always keep the connection and use two different buttons on sage screen.
+ stage.connect("save", self, "save_new", [], CONNECT_ONESHOT)
+
+
+func save(database_entry: Dictionary):
+ if staged_idx >= 0:
+ db[staged_idx] = database_entry
+ set_item_text(staged_idx, get_entry_view(database_entry))
+# items[staged_idx] = get_entry_view(database_entry)
+ else:
+ db.append(database_entry)
+ add_item(get_entry_view(database_entry))
+
+ staged_idx = -1
+ self.visible = true
+
+
+func discard():
+ staged_idx = -1
+ self.visible = true
+
+
+func load_database():
+ var file := File.new()
+ file.open(DATABASE_FILE_PATH, File.READ_WRITE)
+ var headers: PoolStringArray
+ var is_first_line := true
+# while database_file.eof_reached() == false:
+ while file.get_position() < file.get_len():
+ var csv_entry := file.get_csv_line()
+ if is_first_line:
+ is_first_line = false
+ headers = csv_entry
+ continue
+ var entry = ENTRY_PROTOTYPE.duplicate(true)
+ for idx in headers.size():
+ var field_name := headers[idx]
+ var field_value := csv_entry[idx]
+ match field_name:
+ "date_year", "date_month", "date_day":
+ entry[field_name] = int(field_value)
+ "is_urgency":
+ entry[field_name] = true if field_value.strip_edges().to_lower() == "true" else false
+ _:
+ entry[field_name] = field_value
+ db.append(entry)
+ return
+ db = [
+ instance_entry({
+ "process_id": "000001",
+ "surgery_id": "100000",
+ "place": "central",
+ "date": "2020-01-31",
+ }),
+ instance_entry({
+ "process_id": "000002",
+ "surgery_id": "200000",
+ "place": "central",
+ "date": "2020-02-31",
+ }),
+ instance_entry({
+ "process_id": "000003",
+ "surgery_id": "300000",
+ "place": "central",
+ "date": "2020-03-31",
+ }),
+ instance_entry({
+ "process_id": "000004",
+ "surgery_id": "400000",
+ "place": "central",
+ "date": "2020-04-31",
+ }),
+ instance_entry({
+ "process_id": "000012",
+ "surgery_id": "210000",
+ "place": "central",
+ "date": "2020-12-31",
+ }),
+ ]
+
+
+func store_database():
+ var file := File.new()
+ file.open(DATABASE_FILE_PATH, File.WRITE)
+ var header := PoolStringArray(ENTRY_PROTOTYPE.keys())
+ file.store_csv_line(header)
+ var entry := PoolStringArray()
+ for it in db:
+ file.store_csv_line(it.values())
+ file.close()
+
+
+func instance_entry(params: Dictionary = {}) -> Dictionary:
+ var new_entry := ENTRY_PROTOTYPE.duplicate(true)
+ new_entry.process_id = params.get("process_id", "")
+ new_entry.surgery_id = params.get("surgery_id", "")
+ new_entry.place = params.get("place", "")
+
+ var today = OS.get_date()
+ set_entry_date(new_entry, params.get("date", DATE_FORMAT % [today.year, today.month, today.day]))
+
+ new_entry.anesthetic = params.get("anesthetic", "")
+ new_entry.first_assistant = params.get("first_assistant", "")
+ new_entry.type = params.get("type", "")
+ new_entry.sub_type = params.get("sub_type", "")
+ new_entry.sub_sub_type = params.get("sub_sub_type", "")
+ new_entry.pathology = params.get("pathology", "")
+ new_entry.intervention = params.get("intervention", "")
+ new_entry.is_urgency = params.get("is_urgency", false)
+ new_entry.notes = params.get("notes", "")
+
+ return new_entry
+
+
+func get_entry_date(entry: Dictionary) -> String:
+ return DATE_FORMAT % [entry.date_year, entry.date_month, entry.date_day]
+
+
+func set_entry_date(entry: Dictionary, date: String):
+ date = date.strip_edges().replace(" ", DATE_SEPARATOR).replace("/", DATE_SEPARATOR).replace("\\", DATE_SEPARATOR)
+ var year_month_idx := date.find(DATE_SEPARATOR)
+ var month_day_idx := date.find(DATE_SEPARATOR, year_month_idx + 1)
+ entry.date = date
+ entry.date_year = int(date.substr(0, year_month_idx))
+ entry.date_month = int(date.substr(year_month_idx + 1, month_day_idx - year_month_idx - 1))
+ entry.date_day = int(date.substr(month_day_idx + 1))
+
+