changeset 6316:bf3546d1cd77

db: clean up SQLAlchemy session flushes Many calls to Session().flush() were completely superfluous and have been removed. (See also the note on "flush" in the contributor docs.) For the remaining calls, a comment has been added to explain why it's necessary.
author Søren Løvborg <sorenl@unity3d.com>
date Wed, 09 Nov 2016 14:17:34 +0100
parents 2d5fecba40ed
children 36e22160e5e5
files kallithea/lib/auth_modules/__init__.py kallithea/model/gist.py kallithea/model/user.py kallithea/model/user_group.py kallithea/tests/models/test_settings.py
diffstat 5 files changed, 15 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/lib/auth_modules/__init__.py	Mon Nov 07 14:51:12 2016 +0100
+++ b/kallithea/lib/auth_modules/__init__.py	Wed Nov 09 14:17:34 2016 +0100
@@ -288,7 +288,6 @@
                 extern_name=user_data["extern_name"],
                 extern_type=self.name
             )
-            Session().flush()
             # enforce user is just in given groups, all of them has to be ones
             # created from plugins. We store this info in _group_data JSON field
             groups = user_data['groups'] or []
--- a/kallithea/model/gist.py	Mon Nov 07 14:51:12 2016 +0100
+++ b/kallithea/model/gist.py	Wed Nov 09 14:17:34 2016 +0100
@@ -122,7 +122,7 @@
         gist.gist_expires = gist_expires
         gist.gist_type = safe_unicode(gist_type)
         self.sa.add(gist)
-        self.sa.flush()
+        self.sa.flush() # make database assign gist.gist_id
         if gist_type == Gist.GIST_PUBLIC:
             # use DB ID for easy to use GIST ID
             gist_id = safe_unicode(gist.gist_id)
@@ -211,8 +211,6 @@
         gist.gist_expires = gist_expires
         gist.owner = owner
         gist.gist_type = gist_type
-        self.sa.add(gist)
-        self.sa.flush()
 
         message = 'updated file'
         message += 's: ' if len(gist_mapping) > 1 else ': '
--- a/kallithea/model/user.py	Mon Nov 07 14:51:12 2016 +0100
+++ b/kallithea/model/user.py	Wed Nov 09 14:17:34 2016 +0100
@@ -92,7 +92,8 @@
             setattr(new_user, k, v)
 
         new_user.api_key = generate_api_key()
-        self.sa.add(new_user)
+        Session().add(new_user)
+        Session().flush() # make database assign new_user.user_id
 
         log_create_user(new_user.get_dict(), cur_user)
         return new_user
@@ -164,10 +165,13 @@
                 new_user.password = get_crypt_password(password) \
                     if password else ''
 
-            self.sa.add(new_user)
+            if user is None:
+                Session().add(new_user)
+                Session().flush() # make database assign new_user.user_id
 
             if not edit:
                 log_create_user(new_user.get_dict(), cur_user)
+
             return new_user
         except (DatabaseError,):
             log.error(traceback.format_exc())
@@ -182,9 +186,6 @@
         form_data['extern_name'] = ''
         new_user = self.create(form_data)
 
-        self.sa.add(new_user)
-        self.sa.flush()
-
         # notification to admins
         subject = _('New user registration')
         body = (
--- a/kallithea/model/user_group.py	Mon Nov 07 14:51:12 2016 +0100
+++ b/kallithea/model/user_group.py	Wed Nov 09 14:17:34 2016 +0100
@@ -132,18 +132,19 @@
 
             for k, v in form_data.items():
                 if k == 'users_group_members':
-                    user_group.members = []
-                    self.sa.flush()
                     members_list = []
                     if v:
                         v = [v] if isinstance(v, basestring) else v
                         for u_id in set(v):
                             member = UserGroupMember(user_group.users_group_id, u_id)
                             members_list.append(member)
-                    setattr(user_group, 'members', members_list)
+                            self.sa.add(member)
+                    user_group.members = members_list
                 setattr(user_group, k, v)
 
-            self.sa.add(user_group)
+            # Flush to make db assign users_group_member_id to newly
+            # created UserGroupMembers.
+            self.sa.flush()
         except Exception:
             log.error(traceback.format_exc())
             raise
--- a/kallithea/tests/models/test_settings.py	Mon Nov 07 14:51:12 2016 +0100
+++ b/kallithea/tests/models/test_settings.py	Wed Nov 09 14:17:34 2016 +0100
@@ -7,7 +7,7 @@
 def test_passing_list_setting_value_results_in_string_valued_setting():
     assert Setting.get_by_name(name) is None
     setting = Setting.create_or_update(name, ['spam', 'eggs'])
-    Session().flush()
+    Session().flush() # must flush so we can delete it below
     try:
         assert Setting.get_by_name(name) is not None
         # Quirk: list value is stringified.
@@ -16,23 +16,21 @@
         assert Setting.get_by_name(name).app_settings_type == 'unicode'
     finally:
         Session().delete(setting)
-        Session().flush()
 
 def test_list_valued_setting_creation_requires_manual_value_formatting():
     assert Setting.get_by_name(name) is None
     # Quirk: need manual formatting of list setting value.
     setting = Setting.create_or_update(name, 'spam,eggs', type='list')
-    Session().flush()
+    Session().flush() # must flush so we can delete it below
     try:
         assert setting.app_settings_value == ['spam', 'eggs']
     finally:
         Session().delete(setting)
-        Session().flush()
 
 def test_list_valued_setting_update():
     assert Setting.get_by_name(name) is None
     setting = Setting.create_or_update(name, 'spam', type='list')
-    Session().flush()
+    Session().flush() # must flush so we can delete it below
     try:
         assert setting.app_settings_value == [u'spam']
         # Assign back setting value.
@@ -43,4 +41,3 @@
         assert setting.app_settings_value == ["[u\"[u'spam']\"]"]
     finally:
         Session().delete(setting)
-        Session().flush()