diff --git a/api/routers/__pycache__/toolbox.cpython-313.pyc b/api/routers/__pycache__/toolbox.cpython-313.pyc index eb7f388..be0dbf3 100644 Binary files a/api/routers/__pycache__/toolbox.cpython-313.pyc and b/api/routers/__pycache__/toolbox.cpython-313.pyc differ diff --git a/api/routers/toolbox.py b/api/routers/toolbox.py index c930989..26dcb86 100644 --- a/api/routers/toolbox.py +++ b/api/routers/toolbox.py @@ -16,7 +16,19 @@ async def add_toolbox(reqDict=Depends(requestDict)): result = await ToolboxHandler.add(toolboxData, userId) if result: response["status"] = "ok" - logger.info(response) + return response + + +@router.put("/", summary="Обновление ящика") +async def update_toolbox(reqDict=Depends(requestDict)): + toolboxId = reqDict.get("body").get("toolboxId") + logger.info(f"Обновление ящика #{toolboxId}") + response = {"status": "error"} + userId = reqDict.get("body").get("userId") + toolboxData = reqDict.get("body").get("editToolboxData") + result = await ToolboxHandler.edit(toolboxId, **toolboxData, user_id=userId) + if result: + response["status"] = "ok" return response diff --git a/api/static/js/index.js b/api/static/js/index.js index 8a2290f..6615484 100644 --- a/api/static/js/index.js +++ b/api/static/js/index.js @@ -463,7 +463,7 @@ function setupFilters(tabId, tools, categoriesMap) { } } -function addToolbox() { +function addToolbox(editData = null) { // Проверяем, существует ли уже модальное окно let modal = document.getElementById('addToolboxModal'); @@ -482,7 +482,7 @@ function addToolbox() { -
+
@@ -525,7 +525,7 @@ function addToolbox() {
@@ -533,8 +533,22 @@ function addToolbox() {
`; + // Если редактирование + if (editData) { + modal.querySelector('#toolboxTitle').value = editData.title; + modal.querySelector('#toolboxDescription').value = editData.description; + modal.querySelector('#toolboxMonitoring').checked = editData.monitoring; + modal.querySelector('#addToolboxModalLabel').textContent = 'Редактировать склад'; + modal.querySelector('#submitToolboxText').textContent = 'Сохранить'; + if (editData.owner_id) { + modal.querySelector('#toolboxMonitoringContainer').classList.add('d-none'); + } + } + + // Добавляем модальное окно в DOM document.body.appendChild(modal); + // Инициализация модального окна const bsModal = new bootstrap.Modal(modal); @@ -623,39 +637,76 @@ function addToolbox() { const userId = userData.id; + let editToolboxData = {} + + if (editData) { + Object.keys(toolboxData).forEach(key => { + if (toolboxData[key] !== editData[key]) { + editToolboxData[key] = toolboxData[key]; + } + }); + } + + if (Object.keys(editToolboxData).length === 0 && editData) { + showInfo('Новые данные склада совпадают с текущими', 'warning'); + // Возвращаем кнопку в исходное состояние + submitBtn.disabled = false; + spinner.style.display = 'none'; + return; + } + try { - // Отправка данных (замените на ваш реальный endpoint) - const response = await apiRequest("/toolbox/", { toolboxData, userId }); + // Отправка данных + + let method = 'POST' + let sendData = { toolboxData, userId } + + if (editData) { + method = 'PUT'; + const toolboxId = editData.id; + sendData = { toolboxId, userId, editToolboxData }; + } + + const response = await apiRequest("/toolbox/", sendData, method); if (response.status !== 'ok') { - throw new Error('Ошибка при добавлении склада'); + if (!editData) { + throw new Error('Ошибка при добавлении склада'); + } else { + throw new Error('Ошибка при обновлении склада'); + } } // Успешная отправка bsModal.hide(); // Показываем уведомление об успехе - showInfo('Склад успешно добавлен', 'success'); + const successMessageText = editData ? 'Склад успешно обновлен' : 'Склад успешно добавлен'; + showInfo(successMessageText, 'success'); // Здесь можно добавить обновление списка складов await uploadTab('toolbox'); } catch (error) { - console.error('Ошибка при добавлении склада:', error); + console.error('Ошибка при добавлении (обновлении) склада:', error); // Возвращаем кнопку в исходное состояние submitBtn.disabled = false; spinner.style.display = 'none'; // Показываем сообщение об ошибке - showInfo('Ошибка при добавлении склада. Попробуйте еще раз.', 'error'); + const errorMessageText = editData ? 'Ошибка при обновлении склада' : 'Ошибка при добавлении склада'; + showInfo(errorMessageText, 'error'); // Можно добавить более детальное сообщение об ошибке const errorDiv = document.createElement('div'); errorDiv.className = 'alert alert-danger mt-3'; - errorDiv.innerHTML = ` + errorDiv.innerHTML = !editData ? ` Ошибка! Не удалось добавить склад. Проверьте соединение и попробуйте еще раз. + ` : ` + Ошибка! Не удалось обновить склад. + Проверьте соединение и попробуйте еще раз. `; const modalBody = modal.querySelector('.modal-body'); @@ -855,6 +906,9 @@ async function loadToolboxContent(toolboxId) {
${toolboxInfo?.title || 'Склад'}

${toolboxInfo?.description || 'Описание отсутствует'}

+ ${toolboxOwn} @@ -910,6 +964,14 @@ async function loadToolboxContent(toolboxId) { `; + if (accessData.manage_toolboxes) { + contentContainer.querySelector('#editToolbox').addEventListener('click', () => { + addToolbox(toolboxInfo); + }); + } else { + contentContainer.querySelector('#editToolbox').remove(); + } + // Инициализация таблицы с данными await initializeToolboxTable(processedData, toolboxOwn, quantityMonitoring); diff --git a/db/__init__.py b/db/__init__.py index 5c2ae57..e5e47c0 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -1,4 +1,4 @@ -from sqlalchemy import delete, update +from sqlalchemy import delete from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker from sqlalchemy.exc import InvalidRequestError @@ -17,6 +17,7 @@ Base = declarative_base() class CRUD: + @staticmethod async def create(db_data, refresh: bool = False): try: is_lst = isinstance(db_data, list) @@ -43,9 +44,10 @@ class CRUD: logger.debug("Запись создана") return db_data if refresh else None except Exception as e: - logger.error(f"Ошибка создания: {str(e)}", exc_debug=True) + logger.error(f"Ошибка создания: {str(e)}", exc_info=True) return None + @staticmethod async def read(query, all: bool = False): try: async with SessionLocal() as db: @@ -58,9 +60,10 @@ class CRUD: else results.unique().scalars().first() ) except Exception as e: - logger.error(f"Ошибка чтения: {str(e)}", exc_debug=True) + logger.error(f"Ошибка чтения: {str(e)}", exc_info=True) return None + @staticmethod async def delete(db_data) -> bool: def itemdebug(instance): from sqlalchemy import inspect @@ -98,18 +101,29 @@ class CRUD: return True except Exception as e: await db.rollback() - logger.error(f"Ошибка удаления: {str(e)}", exc_debug=True) + logger.error(f"Ошибка удаления: {str(e)}", exc_info=True) return False - async def update(db_data, id, **kwargs): + @staticmethod + async def update(model, id: int, **kwargs): + from sqlalchemy import update as sa_update + async with SessionLocal() as db: try: - query = update(db_data).where(db_data.id == id).values(**kwargs) - item = await db.execute(query) + query = ( + sa_update(model) + .where(model.id == id) + .values(**kwargs) + .execution_options(synchronize_session="fetch") + ) + await db.execute(query) await db.commit() + logger.debug("Запись обновлена") - return await db.get(db_data, id) + + return await db.get(model, id) + except Exception as e: await db.rollback() - logger.error(f"Ошибка обновления: {str(e)}", exc_debug=True) + logger.error(f"Ошибка обновления: {str(e)}", exc_info=True) return None diff --git a/db/__pycache__/__init__.cpython-313.pyc b/db/__pycache__/__init__.cpython-313.pyc index 9a1d819..3f58611 100644 Binary files a/db/__pycache__/__init__.cpython-313.pyc and b/db/__pycache__/__init__.cpython-313.pyc differ diff --git a/db/handlers/__pycache__/toolbox.cpython-313.pyc b/db/handlers/__pycache__/toolbox.cpython-313.pyc index ee7125b..cd9df0f 100644 Binary files a/db/handlers/__pycache__/toolbox.cpython-313.pyc and b/db/handlers/__pycache__/toolbox.cpython-313.pyc differ diff --git a/db/handlers/toolbox.py b/db/handlers/toolbox.py index 96420ef..26745df 100644 --- a/db/handlers/toolbox.py +++ b/db/handlers/toolbox.py @@ -42,7 +42,7 @@ class ToolboxHandler: return {} try: user_id = kwargs.pop("user_id", None) - editedToolbox = await toolbox.edit(**kwargs) + editedToolbox = await toolbox.edit(toolboxId, **kwargs) except Exception as e: logger.error(f"Ошибка обновления тулбокса: {str(e)}") return {} diff --git a/db/schemas/__pycache__/toolbox.cpython-313.pyc b/db/schemas/__pycache__/toolbox.cpython-313.pyc index f290ce4..c77da5f 100644 Binary files a/db/schemas/__pycache__/toolbox.cpython-313.pyc and b/db/schemas/__pycache__/toolbox.cpython-313.pyc differ diff --git a/db/schemas/toolbox.py b/db/schemas/toolbox.py index 9520d1b..ee5c535 100644 --- a/db/schemas/toolbox.py +++ b/db/schemas/toolbox.py @@ -27,5 +27,6 @@ class Toolbox(Base): async def save(self): return await CRUD.create(self, refresh=True) + @staticmethod async def edit(id: int, **kwargs): return await CRUD.update(Toolbox, id, **kwargs)