From 3234a072e0310def1ebb3d3856ae36314526bc3b Mon Sep 17 00:00:00 2001 From: Adrien Ufferte Date: Mon, 19 May 2025 11:54:58 +0200 Subject: [PATCH] Allow user to edit device of student --- folder_zipper.gd | 4 ++- resources/user/teacher_settings.gd | 2 +- sources/language_tool/globals.gd | 7 +---- .../language_selection/package_downloader.gd | 6 ++--- sources/menus/settings/lesson_unlocks.gd | 26 ++++++++++--------- sources/menus/settings/teacher_settings.gd | 8 +++--- sources/minigames/ants/word.gd | 1 - sources/utils/autoloads/user_data_manager.gd | 26 +++++++++++++++++-- 8 files changed, 50 insertions(+), 30 deletions(-) diff --git a/folder_zipper.gd b/folder_zipper.gd index 03c3290b..20fef50e 100644 --- a/folder_zipper.gd +++ b/folder_zipper.gd @@ -27,5 +27,7 @@ func write_folder_recursive(abs_path: String, rel_path: String) -> Error: func compress(path: String, output_name: String) -> void: open(output_name, ZIPPacker.APPEND_CREATE) path = path.simplify_path() - write_folder_recursive(path.get_base_dir(), path.get_file()) + var err: Error = write_folder_recursive(path.get_base_dir(), path.get_file()) + if err != OK: + Logger.error("FolderZipper: Error " + error_string(err) + " while compressing folder: %s" % path) close() diff --git a/resources/user/teacher_settings.gd b/resources/user/teacher_settings.gd index e56b1928..bb4a2b45 100644 --- a/resources/user/teacher_settings.gd +++ b/resources/user/teacher_settings.gd @@ -71,7 +71,7 @@ func update_student_device(student_code: int, new_student_device: int) -> void: Logger.warn("TeacherSettings: update_student_device: student new device does not exists, it should not be possible. Update will still work anyway.") students[new_student_device] = [] students[new_student_device].append(student_data) - (ServerManager as ServerManagerClass).update_student(student_data) + UserDataManager.move_user_device_folder(str(current_student_device), str(new_student_device), student_code) return Logger.warn("TeacherSettings: update_student_device: student not found with code " + str(student_code)) diff --git a/sources/language_tool/globals.gd b/sources/language_tool/globals.gd index d443f7cb..08c88302 100644 --- a/sources/language_tool/globals.gd +++ b/sources/language_tool/globals.gd @@ -1,6 +1,6 @@ -#Autoload for prof_tool extends Node +# For prof_tool only var main_menu_selected_tab: int = 0 var device_colors: Array[Color] = [ @@ -25,8 +25,3 @@ var device_colors: Array[Color] = [ Color("ffaf57"), Color("9670e0"), ] - -func _ready() -> void: - var scene_path: String = get_tree().current_scene.get_scene_file_path() - if scene_path != "res://sources/language_tool/prof_tool_menu.tscn": - queue_free() # If we are not in the editor, this autoload is not needed since it is only useful for the prof_tool diff --git a/sources/menus/language_selection/package_downloader.gd b/sources/menus/language_selection/package_downloader.gd index 3635ce2c..03f06cc7 100644 --- a/sources/menus/language_selection/package_downloader.gd +++ b/sources/menus/language_selection/package_downloader.gd @@ -174,7 +174,7 @@ func _copy_data(this: PackageDownloader) -> void: # Move the data to the locale folder of the user var error: Error = DirAccess.rename_absolute(user_language_resources_path.path_join(subfolder), current_language_path) if error != OK: - Logger.error("PackageDownloader: Error " + str(error) + " while renaming folder from %s to %s" % [user_language_resources_path.path_join(subfolder), current_language_path]) + Logger.error("PackageDownloader: Error " + error_string(error) + " while renaming folder from %s to %s" % [user_language_resources_path.path_join(subfolder), current_language_path]) # Cleanup unnecessary files DirAccess.remove_absolute(language_zip_path) @@ -202,7 +202,7 @@ func delete_directory_recursive(path: String) -> void: else: err = dir.remove(full_path) if err != OK: - Logger.error("PackageDownloader: Error " + str(err) + " while deleting file : %s" % full_path) + Logger.error("PackageDownloader: Error " + error_string(err) + " while deleting file : %s" % full_path) file_name = dir.get_next() dir.list_dir_end() @@ -210,7 +210,7 @@ func delete_directory_recursive(path: String) -> void: # Supprime le dossier lui-même err = DirAccess.remove_absolute(path) if err != OK: - Logger.error("PackageDownloader: Error " + str(err) + " while deleting folder : %s" % path) + Logger.error("PackageDownloader: Error " + error_string(err) + " while deleting folder : %s" % path) else: Logger.info("PackageDownloader: ✅ Folder deleted : %s" % path) diff --git a/sources/menus/settings/lesson_unlocks.gd b/sources/menus/settings/lesson_unlocks.gd index 621ac63a..6783d26b 100644 --- a/sources/menus/settings/lesson_unlocks.gd +++ b/sources/menus/settings/lesson_unlocks.gd @@ -12,10 +12,12 @@ const student_unlock_scene: PackedScene = preload("res://sources/menus/settings/ @onready var lesson_container: VBoxContainer = %LessonContainer @onready var name_line_edit: LineEdit = %NameLineEdit @onready var device_selection_container: PanelContainer = %DeviceSelectionContainer +@onready var container: GridContainer = %GridContainer var teacher_settings: SettingsTeacherSettings = null -@export var device: int +@export var device: int: + set = _on_device_changed @export var student: int: set = _on_student_changed @@ -48,6 +50,10 @@ ORDER BY LessonNb") student_unlock.unlocks_changed.connect(_create_lessons) +func _on_device_changed(value: int)-> void: + device = value + + func _on_student_changed(value: int)-> void: student = value progression = UserDataManager.get_student_progression_for_code(device, student) @@ -79,12 +85,6 @@ func _on_name_changed(new_name: String) -> void: teacher_settings.update_student_name(student, new_name) - - - - -@onready var container: GridContainer = %GridContainer - func _device_selection_refresh() -> void: if not UserDataManager.teacher_settings: return @@ -99,9 +99,11 @@ func _device_selection_refresh() -> void: container.add_child(button) button.pressed.connect(_device_button_pressed.bind(device_id)) + func _device_button_pressed(device_id: int) -> void: - device = device_id - print("DEVICE SELECTED : " + str(device)) - #Logger.trace("DeviceSelection: User selected device %d" % device_id) - #if UserDataManager.set_device_id(device_id): - #get_tree().change_scene_to_file(login_scene_path) + var resSet: Dictionary = await ServerManager.set_student_data(student, {"device_id": device_id}) + if resSet.code == 200: + device_selection_container.visible = false + UserDataManager.teacher_settings.update_student_device(student, device_id) + await teacher_settings.refresh_devices_tabs() + device = device_id diff --git a/sources/menus/settings/teacher_settings.gd b/sources/menus/settings/teacher_settings.gd index 88958fa9..98a66ea4 100644 --- a/sources/menus/settings/teacher_settings.gd +++ b/sources/menus/settings/teacher_settings.gd @@ -21,7 +21,7 @@ const device_tab_scene: PackedScene = preload("res://sources/menus/settings/devi var last_device_id: int = -1 func _ready() -> void: - _refresh_devices_tabs() + refresh_devices_tabs() if await ServerManager.check_internet_access(): add_device_button.show() @@ -34,7 +34,7 @@ func _ready() -> void: lesson_unlocks.teacher_settings = self -func _refresh_devices_tabs() -> void: +func refresh_devices_tabs() -> void: for child: Node in devices_tab_container.get_children(false): child.queue_free() @@ -117,7 +117,7 @@ func _on_add_device_popup_accepted() -> void: var res: Dictionary = await ServerManager.add_student({"device" : last_device_id + 1}) if res.code == 200: UserDataManager.update_configuration(res.body as Dictionary) - _refresh_devices_tabs() + refresh_devices_tabs() await get_tree().create_timer(1).timeout var count: int = devices_tab_container.get_tab_count() devices_tab_container.current_tab = count -1 @@ -140,7 +140,7 @@ func _on_delete_student_popup_accepted() -> void: current_tab.students = UserDataManager.teacher_settings.students[current_tab.device_id] current_tab.refresh() else: - _refresh_devices_tabs() + refresh_devices_tabs() func update_student_name(student_code: int, student_name: String) -> void: diff --git a/sources/minigames/ants/word.gd b/sources/minigames/ants/word.gd index 735fae7d..781eb81d 100644 --- a/sources/minigames/ants/word.gd +++ b/sources/minigames/ants/word.gd @@ -1,4 +1,3 @@ -# TODO: Clean the reason why there is so much UNSAFE_PROPERTY_ACCESS in this script. extends TextureButton class_name Word diff --git a/sources/utils/autoloads/user_data_manager.gd b/sources/utils/autoloads/user_data_manager.gd index 481c8ca2..81d12c1e 100644 --- a/sources/utils/autoloads/user_data_manager.gd +++ b/sources/utils/autoloads/user_data_manager.gd @@ -381,8 +381,9 @@ func get_student_progression_for_code(device: int, code: int) -> UserProgression func save_student_progression_for_code(device: int, code: int, progression: UserProgression) -> void: var progression_path: String = "user://".path_join(_device_settings.teacher).path_join(str(device)).path_join(_device_settings.language).path_join(str(code)).path_join("progression.tres") - ResourceSaver.save(progression, progression_path) - + var error: Error = ResourceSaver.save(progression, progression_path) + if error != OK: + Logger.error("UserDataManager: save_student_progression_for_code(device = %s, code = %s): error %s" % [str(device), str(code), error_string(error)]) #endregion @@ -485,6 +486,7 @@ func is_speech_played(speech: String) -> bool: #endregion +#region utils func _delete_dir(path: String) -> void: var dir: DirAccess = DirAccess.open(path) @@ -493,3 +495,23 @@ func _delete_dir(path: String) -> void: for subfolder: String in dir.get_directories(): _delete_dir(path.path_join(subfolder)) dir.remove(subfolder) + +func move_user_device_folder(old_device: String, new_device: String, student_code: int) -> void: + var parentDirPath: String = "user://".path_join(_device_settings.teacher) + var parentDir: DirAccess = DirAccess.open(parentDirPath) + var oldChildDir: String = old_device.path_join(_device_settings.language).path_join(str(student_code)) + var newChildDir: String = new_device.path_join(_device_settings.language).path_join(str(student_code)) + var newParentDir: String = newChildDir.get_base_dir() # = "2/fr_FR" + if not parentDir.dir_exists(newParentDir): + var err: Error = parentDir.make_dir_recursive(newParentDir) + if err != OK: + push_error("UserDataManager: Cannot create parent folder: %s" % error_string(err)) + return + if parentDir.dir_exists(str(oldChildDir)): + var err: Error = parentDir.rename(oldChildDir, newChildDir) + if err != OK: + Logger.error("UserDataManager: Error while renaming folder: %s" % error_string(err)) + else: + Logger.error("UserDataManager: The folder '%s' cannot be moved because it does no exists in %s." % [old_device, parentDirPath]) + +#endregion