vboxes fix

This commit is contained in:
2026-03-19 14:28:09 +01:00
parent b7f7c1f7c0
commit 06dfbfcbc4
30 changed files with 4405 additions and 166 deletions
+33 -9
View File
@@ -11,7 +11,7 @@ from sqlalchemy.orm import selectinload
from app.core.exceptions import ConflictError, ForbiddenError, NotFoundError
from app.models.mailbox import Mailbox
from app.models.user import User
from app.models.virtual_box import VirtualBox, VirtualBoxAssignment, VirtualBoxRule
from app.models.virtual_box import VirtualBox, VirtualBoxAssignment, VirtualBoxRule, virtual_box_mailboxes
from app.schemas.virtual_box import (
AssignedUserResponse,
VirtualBoxCreate,
@@ -65,10 +65,15 @@ class VirtualBoxService:
)
self.db.add(rule)
# Associa le caselle reali
# Associa le caselle reali (INSERT diretto sulla tabella di associazione
# per evitare MissingGreenlet con SQLAlchemy async)
if data.mailbox_ids:
mailboxes = await self._load_mailboxes(data.mailbox_ids, tenant_id)
vbox.mailboxes = mailboxes
valid_mailboxes = await self._load_mailboxes(data.mailbox_ids, tenant_id)
if valid_mailboxes:
await self.db.execute(
virtual_box_mailboxes.insert(),
[{"virtual_box_id": vbox.id, "mailbox_id": mb.id} for mb in valid_mailboxes],
)
await self.db.flush()
return await self._load_full(vbox.id)
@@ -136,10 +141,19 @@ class VirtualBoxService:
if data.is_active is not None:
vbox.is_active = data.is_active
# Aggiorna le caselle associate se fornito
# Aggiorna le caselle associate se fornito (INSERT/DELETE diretti)
if data.mailbox_ids is not None:
mailboxes = await self._load_mailboxes(data.mailbox_ids, tenant_id)
vbox.mailboxes = mailboxes
await self.db.execute(
virtual_box_mailboxes.delete().where(
virtual_box_mailboxes.c.virtual_box_id == vbox_id
)
)
valid_mailboxes = await self._load_mailboxes(data.mailbox_ids, tenant_id)
if valid_mailboxes:
await self.db.execute(
virtual_box_mailboxes.insert(),
[{"virtual_box_id": vbox_id, "mailbox_id": mb.id} for mb in valid_mailboxes],
)
await self.db.flush()
return await self._load_full(vbox_id)
@@ -196,8 +210,18 @@ class VirtualBoxService:
if not vbox or vbox.tenant_id != tenant_id:
raise NotFoundError("Virtual Box")
mailboxes = await self._load_mailboxes(mailbox_ids, tenant_id)
vbox.mailboxes = mailboxes
# Sostituzione completa con INSERT/DELETE diretti
await self.db.execute(
virtual_box_mailboxes.delete().where(
virtual_box_mailboxes.c.virtual_box_id == vbox_id
)
)
valid_mailboxes = await self._load_mailboxes(mailbox_ids, tenant_id)
if valid_mailboxes:
await self.db.execute(
virtual_box_mailboxes.insert(),
[{"virtual_box_id": vbox_id, "mailbox_id": mb.id} for mb in valid_mailboxes],
)
await self.db.flush()
return await self._load_full(vbox_id)