docs: def put_object(request, old_pid):
      """MNStorage.update(session, pid, object, newPid, sysmeta) → Identifier."""
      if django.conf.settings.REQUIRE_WHITELIST_FOR_UPDATE:
          d1_gmn.app.auth.assert_create_update_delete_permission(request)
      d1_gmn.app.util.coerce_put_post(request)
      d1_gmn.app.views.assert_db.post_has_mime_parts(
          request, (('field', 'newPid'), ('file', 'object'), ('file', 'sysmeta'))
      )
      d1_gmn.app.views.assert_db.is_valid_pid_to_be_updated(old_pid)
      sysmeta_pyxb = d1_gmn.app.sysmeta.deserialize(request.FILES['sysmeta'])
      new_pid = request.POST['newPid']
      d1_gmn.app.views.assert_sysmeta.matches_url_pid(sysmeta_pyxb, new_pid)
      d1_gmn.app.views.assert_sysmeta.obsoletes_matches_pid_if_specified(
          sysmeta_pyxb, old_pid
      )
      sysmeta_pyxb.obsoletes = old_pid
      sid = d1_common.xml.get_opt_val(sysmeta_pyxb, 'seriesId')
      d1_gmn.app.views.assert_sysmeta.is_valid_sid_for_chain(old_pid, sid)
      d1_gmn.app.views.create.create_sciobj(request, sysmeta_pyxb)
      # The create event for the new object is added in create_sciobj(). The update
      # event on the old object is added here.
      d1_gmn.app.event_log.log_update_event(
          old_pid,
          request,
          timestamp=d1_common.date_time.normalize_datetime_to_utc(
              sysmeta_pyxb.dateUploaded
          ),
      )
      d1_gmn.app.sysmeta.update_modified_timestamp(old_pid)
      return new_pid