From db7408f9ed8dd3d9245e67cc260140800f2397a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Pracha=C5=99?= <jan.prachar@gmail.com>
Date: Fri, 5 Mar 2021 13:03:23 +0100
Subject: [PATCH] global root_place causes
 sqlalchemy.orm.exc.DetachedInstanceError

Instance <Place> is not bound to a Session; attribute refresh operation
cannot proceed (Background on this error at:
http://sqlalche.me/e/13/bhk3)
---
 mo/db.py      | 9 +--------
 mo/imports.py | 4 +++-
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/mo/db.py b/mo/db.py
index 95184e96..f24e55c8 100644
--- a/mo/db.py
+++ b/mo/db.py
@@ -118,15 +118,8 @@ class Place(Base):
         return len(PlaceType.choices(level=self.level + 1)) > 0
 
 
-# Předpokládáme, že za běhu aplikace se root nezmění
-root_place_cache: Optional[Place] = None
-
-
 def get_root_place():
-    global root_place_cache
-    if root_place_cache is None:
-        root_place_cache = get_session().query(Place).filter_by(parent=None).one()
-    return root_place_cache
+    return get_session().query(Place).filter_by(parent=None).one()
 
 
 def get_place_by_code(code: str, fetch_school: bool = False) -> Optional[Place]:
diff --git a/mo/imports.py b/mo/imports.py
index 6d59a2ca..72c7b7b3 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -572,9 +572,11 @@ class JudgeImport(Import):
     log_msg_prefix = 'Opravovatelé'
     log_details = {'action': 'import-judges'}
     template_basename = 'sablona-oprav'
+    root_place: db.Place
 
     def setup(self):
         assert self.round is not None
+        self.root_place = db.get_root_place()
 
     def import_row(self, r: mo.csv.Row):
         assert isinstance(r, JudgeImportRow)
@@ -595,7 +597,7 @@ class JudgeImport(Import):
             return
 
         contest = self.obtain_contest(oblast, allow_none=True)
-        place = contest.place if contest else db.get_root_place()
+        place = contest.place if contest else self.root_place
         if not self.check_rights(place):
             return self.error(f'K místu "{place.get_code()}" nemáte práva na správu soutěže')
 
-- 
GitLab