@@ -25,7 +25,7 @@ def sync_versions_to_db(project, versions, type): # pylint: disable=redefined-b
25
25
26
26
- check if user has a ``stable`` / ``latest`` version and disable ours
27
27
- update old versions with newer configs (identifier, type, machine)
28
- - create new versions that do not exist on DB
28
+ - create new versions that do not exist on DB (in bulk)
29
29
- it does not delete versions
30
30
31
31
:param project: project to update versions
@@ -40,6 +40,7 @@ def sync_versions_to_db(project, versions, type): # pylint: disable=redefined-b
40
40
old_versions = dict (old_version_values )
41
41
42
42
# Add new versions
43
+ versions_to_create = []
43
44
added = set ()
44
45
has_user_stable = False
45
46
has_user_latest = False
@@ -81,7 +82,7 @@ def sync_versions_to_db(project, versions, type): # pylint: disable=redefined-b
81
82
identifier = version_id ,
82
83
type = type ,
83
84
machine = False ,
84
- ) # noqa
85
+ )
85
86
86
87
log .info (
87
88
'(Sync Versions) Updated Version: [%s=%s] ' ,
@@ -90,13 +91,12 @@ def sync_versions_to_db(project, versions, type): # pylint: disable=redefined-b
90
91
)
91
92
else :
92
93
# New Version
93
- created_version = Version .objects .create (
94
- project = project ,
95
- type = type ,
96
- identifier = version_id ,
97
- verbose_name = version_name ,
98
- )
99
- added .add (created_version .slug )
94
+ versions_to_create .append ((version_id , version_name ))
95
+
96
+ added .update (
97
+ _create_versions_in_bulk (project , type , versions_to_create )
98
+ )
99
+
100
100
if not has_user_stable :
101
101
stable_version = (
102
102
project .versions .filter (slug = STABLE , type = type ).first ()
@@ -120,6 +120,32 @@ def sync_versions_to_db(project, versions, type): # pylint: disable=redefined-b
120
120
return added
121
121
122
122
123
+ def _create_versions_in_bulk (project , type , versions ):
124
+ """
125
+ Create versions (tuple of version_id and version_name) in batch.
126
+
127
+ Returns the slug of all added versions.
128
+ """
129
+ added = set ()
130
+ batch_size = 150
131
+ objs = (
132
+ Version (
133
+ project = project ,
134
+ type = type ,
135
+ identifier = version_id ,
136
+ verbose_name = version_name ,
137
+ )
138
+ for version_id , version_name in versions
139
+ )
140
+ while True :
141
+ batch = list (itertools .islice (objs , batch_size ))
142
+ if not batch :
143
+ break
144
+ Version .objects .bulk_create (batch , batch_size )
145
+ added .update (v .slug for v in batch )
146
+ return added
147
+
148
+
123
149
def _set_or_create_version (project , slug , version_id , verbose_name , type_ ):
124
150
"""Search or create a version and set its machine attribute to false."""
125
151
version = (project .versions .filter (slug = slug ).first ())
0 commit comments