@@ -134,17 +134,23 @@ def save(self, ignore_update_fields=None, *args, **kwargs):
134134 previous_config = self .app .config_set .latest ()
135135 for field in self .allof_fields :
136136 if ignore_update_fields is None or field not in ignore_update_fields :
137- getattr (
138- self ,
139- "_update_%s" % field ,
140- partial (self ._update_field , field )
141- )(previous_config )
137+ self .merge_field (field , previous_config )
142138 except Config .DoesNotExist :
143139 self ._update_tags (previous_config = {'tags' : {}})
144140 return super (Config , self ).save (* args , ** kwargs )
145141
146- def _update_field (self , field , previous_config ):
147- data = getattr (previous_config , field , {}).copy ()
142+ def merge_field (self , field , old_config , replace_ptypes = []):
143+ getattr (
144+ self ,
145+ "_update_%s" % field ,
146+ partial (self ._update_field , field )
147+ )(old_config , replace_ptypes )
148+
149+ def _update_field (self , field , previous_config , replace_ptypes = []):
150+ data = {
151+ k : v for k , v in getattr (previous_config , field , {}).copy ().items ()
152+ if k not in replace_ptypes
153+ }
148154 new_data = getattr (self , field , {}).copy ()
149155 # remove config keys if a null value is provided
150156 for key , value in new_data .items ():
@@ -158,8 +164,11 @@ def _update_field(self, field, previous_config):
158164 data [key ] = self ._merge_data (field , data .get (key , {}), value )
159165 setattr (self , field , data )
160166
161- def _update_values (self , previous_config ):
162- data = getattr (previous_config , 'values' , []).copy ()
167+ def _update_values (self , previous_config , replace_ptypes = []):
168+ data = [
169+ item for item in getattr (previous_config , 'values' , []).copy ()
170+ if item .get ('ptype' ) not in replace_ptypes
171+ ]
163172 new_data = getattr (self , 'values' , []).copy ()
164173 for new_item in new_data :
165174 added = True
@@ -175,12 +184,15 @@ def _update_values(self, previous_config):
175184 else : # force to string
176185 new_item ['value' ] = str (new_item ['value' ])
177186 break
178- if added and new_item ['value' ] is not None and new_item [ 'value' ] != "" :
187+ if added and new_item ['value' ] is not None :
179188 data .append (new_item )
180189 setattr (self , 'values' , data )
181190
182- def _update_values_refs (self , previous_config ):
183- data = getattr (previous_config , 'values_refs' , {}).copy ()
191+ def _update_values_refs (self , previous_config , replace_ptypes = []):
192+ data = {
193+ k : v for k , v in getattr (previous_config , 'values_refs' , {}).copy ().items ()
194+ if k not in replace_ptypes
195+ }
184196 new_data = getattr (self , 'values_refs' , {}).copy ()
185197 # remove config keys if a null value is provided
186198 for ptype , values in new_data .items ():
@@ -192,7 +204,7 @@ def _update_values_refs(self, previous_config):
192204 data .pop (ptype )
193205 else :
194206 values_refs = data .get (ptype , [])
195- values_refs .extend (new_data . get ( ptype , []) )
207+ values_refs .extend (values )
196208 data [ptype ] = list (set (values_refs ))
197209 setattr (self , 'values_refs' , data )
198210
@@ -208,9 +220,12 @@ def _merge_data(self, field, data, new_data):
208220 data [key ] = value
209221 return data
210222
211- def _update_tags (self , previous_config ):
223+ def _update_tags (self , previous_config , replace_ptypes = [] ):
212224 """verify the tags exist on any nodes as labels"""
213- data = getattr (previous_config , 'tags' , {}).copy ()
225+ data = {
226+ k : v for k , v in getattr (previous_config , 'tags' , {}).copy ().items ()
227+ if k not in replace_ptypes
228+ }
214229 new_data = getattr (self , 'tags' , {}).copy ()
215230 # remove config keys if a null value is provided
216231 for ptype , values in new_data .items ():
@@ -236,14 +251,17 @@ def _update_tags(self, previous_config):
236251 'tags' , data .get (ptype , {}), values )
237252 setattr (self , 'tags' , data )
238253
239- def _update_limits (self , previous_config ):
240- data = getattr (previous_config , 'limits' , {}).copy ()
254+ def _update_limits (self , previous_config , replace_ptypes = []):
255+ data = {
256+ k : v for k , v in getattr (previous_config , 'limits' , {}).copy ().items ()
257+ if k not in replace_ptypes
258+ }
241259 new_data = getattr (self , 'limits' , {}).copy ()
242260 # check procfile
243- for key , value in new_data .items ():
261+ for ptype , value in new_data .items ():
244262 if value is None :
245- if key in self .app .ptypes :
263+ if ptype in self .app .ptypes :
246264 raise UnprocessableEntity (
247- "the %s has already been used and cannot be deleted" % key )
265+ "the %s has already been used and cannot be deleted" % ptype )
248266 self ._merge_data ('limits' , data , new_data )
249267 setattr (self , 'limits' , data )
0 commit comments