https://pulp.plan.io/https://pulp.plan.io/favicon.ico2019-06-06T20:04:48ZPulpPulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=444632019-06-06T20:04:48Zamacdona@redhat.comaustin@redhat.com
<ul></ul><p>I think this call should work:</p>
<pre><code>http --json PUT :24817/pulp/api/v3/repositories/cebe653e-f8ca-4b2f-acd0-93c5edf32b48/ name:=\"test_repo\"
</code></pre>
<p>The only difference is that for a PUT (which overrides all fields) we don't need to set description to null because it should be overwritten.</p> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=444902019-06-07T14:40:52Zamacdona@redhat.comaustin@redhat.com
<ul><li><strong>Triaged</strong> changed from <i>No</i> to <i>Yes</i></li><li><strong>Sprint</strong> set to <i>Sprint 54</i></li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=449242019-06-21T13:26:15Zttereshcttereshc@redhat.com
<ul><li><strong>Sprint</strong> changed from <i>Sprint 54</i> to <i>Sprint 55</i></li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=456392019-07-12T13:27:33Zdkliban@redhat.com
<ul><li><strong>Sprint</strong> changed from <i>Sprint 55</i> to <i>Sprint 56</i></li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=462232019-08-02T13:14:53Zrchan
<ul><li><strong>Sprint</strong> changed from <i>Sprint 56</i> to <i>Sprint 57</i></li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=470162019-08-26T14:30:59Zrchan
<ul><li><strong>Sprint</strong> changed from <i>Sprint 57</i> to <i>Sprint 58</i></li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=473162019-09-09T15:13:43Zfao89
<ul><li><strong>Status</strong> changed from <i>NEW</i> to <i>ASSIGNED</i></li><li><strong>Assignee</strong> set to <i>fao89</i></li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=473212019-09-09T17:44:29Zfao89
<ul></ul><p>openapi-generator creates this method:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="k">def</span> <span class="nf">sanitize_for_serialization</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="s">"""Builds a JSON POST object.
If obj is None, return None.
If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date
convert to string in iso8601 format.
If obj is list, sanitize each element in the list.
If obj is dict, return the dict.
If obj is OpenAPI model, return the properties dict.
:param obj: The data to serialize.
:return: The serialized form of data.
"""</span>
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">None</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">PRIMITIVE_TYPES</span><span class="p">):</span>
<span class="k">return</span> <span class="n">obj</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">.</span><span class="n">sanitize_for_serialization</span><span class="p">(</span><span class="n">sub_obj</span><span class="p">)</span>
<span class="k">for</span> <span class="n">sub_obj</span> <span class="ow">in</span> <span class="n">obj</span><span class="p">]</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">sanitize_for_serialization</span><span class="p">(</span><span class="n">sub_obj</span><span class="p">)</span>
<span class="k">for</span> <span class="n">sub_obj</span> <span class="ow">in</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="p">(</span><span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">,</span> <span class="n">datetime</span><span class="p">.</span><span class="n">date</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">.</span><span class="n">isoformat</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="n">obj_dict</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Convert model obj to dict except
</span> <span class="c1"># attributes `openapi_types`, `attribute_map`
</span> <span class="c1"># and attributes which value is not None.
</span> <span class="c1"># Convert attribute name to json key in
</span> <span class="c1"># model definition for request.
</span> <span class="n">obj_dict</span> <span class="o">=</span> <span class="p">{</span><span class="n">obj</span><span class="p">.</span><span class="n">attribute_map</span><span class="p">[</span><span class="n">attr</span><span class="p">]:</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
<span class="k">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">six</span><span class="p">.</span><span class="n">iteritems</span><span class="p">(</span><span class="n">obj</span><span class="p">.</span><span class="n">openapi_types</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">}</span>
<span class="k">return</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="bp">self</span><span class="p">.</span><span class="n">sanitize_for_serialization</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">six</span><span class="p">.</span><span class="n">iteritems</span><span class="p">(</span><span class="n">obj_dict</span><span class="p">)}</span>
</code></pre>
<p>which is called just before the API call.</p>
<p>On line 29 from here: <a href="https://pulp.plan.io/attachments/518581" class="external">https://pulp.plan.io/attachments/518581</a><br>
it sends a repository object, which is treated on sanitize_for_serialization, removing all the attrs with null value.<br>
If we replace line 29 for this:</p>
<pre><code class="python syntaxhl" data-language="python"><span class="n">repositories_api</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">repo_href</span><span class="p">,</span> <span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="n">repository</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="s">"description"</span><span class="p">:</span> <span class="n">repository</span><span class="p">.</span><span class="n">description</span><span class="p">})</span>
</code></pre>
<p>it will work as expected</p> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=473222019-09-09T18:10:59Zfao89
<ul><li><strong>Status</strong> changed from <i>ASSIGNED</i> to <i>NEW</i></li><li><strong>Assignee</strong> deleted (<del><i>fao89</i></del>)</li></ul><p>There is an open issue for it:<br>
<a href="https://github.com/OpenAPITools/openapi-generator/issues/1908" class="external">https://github.com/OpenAPITools/openapi-generator/issues/1908</a><br>
So for now, as a workaround we can use dict instead of models objects, as shown in the previous note.</p> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=473232019-09-09T18:12:42Zfao89
<ul><li><strong>Sprint</strong> deleted (<del><i>Sprint 58</i></del>)</li></ul> Pulp - Issue #4903: python bindings are unable to nullify repository descriptionhttps://pulp.plan.io/issues/4903?journal_id=629552020-09-25T13:40:05Zdkliban@redhat.com
<ul><li><strong>Status</strong> changed from <i>NEW</i> to <i>CLOSED - WONTFIX</i></li></ul><p>Please use the workaaround from the above comment.</p>