|
11 | 11 | """ |
12 | 12 | import weakref |
13 | 13 |
|
14 | | -from sqlalchemy import and_, case, select, event, inspection |
| 14 | +from sqlalchemy import and_, case, event, inspection, select |
15 | 15 | from sqlalchemy.orm import object_session |
16 | 16 | from sqlalchemy.orm.base import NO_VALUE |
17 | 17 | from sqlalchemy.sql import func |
@@ -423,13 +423,30 @@ def after_flush_postexec(self, session, context): |
423 | 423 | if instance not in session: |
424 | 424 | continue |
425 | 425 | parent = self.get_parent_value(instance) |
| 426 | + |
426 | 427 | while parent != NO_VALUE and parent is not None: |
427 | 428 | instances.discard(parent) |
428 | | - session.expire(parent, ['left', 'right']) |
| 429 | + session.expire(parent, ['left', 'right', 'tree_id', 'level']) |
429 | 430 | parent = self.get_parent_value(parent) |
430 | 431 | else: |
431 | | - session.expire(instance, ['tree_id', 'level']) |
| 432 | + session.expire(instance, ['left', 'right', 'tree_id', 'level']) |
| 433 | + self.expire_session_for_children(session, instance) |
432 | 434 |
|
433 | 435 | @staticmethod |
434 | 436 | def get_parent_value(instance): |
435 | 437 | return inspection.inspect(instance).attrs.parent.loaded_value |
| 438 | + |
| 439 | + @staticmethod |
| 440 | + def expire_session_for_children(session, instance): |
| 441 | + children = instance.children |
| 442 | + |
| 443 | + def expire_recursively(node): |
| 444 | + children = node.children |
| 445 | + for item in children: |
| 446 | + session.expire(item, ['left', 'right', 'tree_id', 'level']) |
| 447 | + expire_recursively(item) |
| 448 | + |
| 449 | + if children != NO_VALUE and children is not None: |
| 450 | + for item in children: |
| 451 | + session.expire(item, ['left', 'right', 'tree_id', 'level']) |
| 452 | + expire_recursively(item) |
0 commit comments