From c92948b7d561b5c049a06ce7a2e9b551120880e9 2014-07-17 20:55:27
From: Jason Grout <jgrout6@bloomberg.net>
Date: 2014-07-17 20:55:27
Subject: [PATCH] Prepend a sentinel value to model ids to distinguish them from normal UUIDs (from Sylvain Corlay).

---

diff --git a/IPython/html/static/widgets/js/widget.js b/IPython/html/static/widgets/js/widget.js
index 92bfcbe..55b954a 100644
--- a/IPython/html/static/widgets/js/widget.js
+++ b/IPython/html/static/widgets/js/widget.js
@@ -213,7 +213,7 @@ define(["widgets/js/manager",
             var that = this;
             var packed;
             if (value instanceof Backbone.Model) {
-                return value.id;
+                return "IPY_MODEL_" + value.id;
 
             } else if ($.isArray(value)) {
                 packed = [];
@@ -252,13 +252,15 @@ define(["widgets/js/manager",
                 });
                 return unpacked;
 
+            } else if (typeof value === 'string' && value.slice(0,10) === "IPY_MODEL_") {
+		var model = this.widget_manager.get_model(value.slice(10, value.length));
+		if (model) {
+		    return model;
+		} else {
+		    return value;
+		}
             } else {
-                var model = this.widget_manager.get_model(value);
-                if (model) {
-                    return model;
-                } else {
                     return value;
-                }
             }
         },
 
diff --git a/IPython/html/widgets/widget.py b/IPython/html/widgets/widget.py
index 72c9c23..2abada0 100644
--- a/IPython/html/widgets/widget.py
+++ b/IPython/html/widgets/widget.py
@@ -322,7 +322,7 @@ class Widget(LoggingConfigurable):
         elif isinstance(x, (list, tuple)):
             return [self._serialize_trait(v) for v in x]
         elif isinstance(x, Widget):
-            return x.model_id
+            return "IPY_MODEL_" + x.model_id
         else:
             return x # Value must be JSON-able
 
@@ -335,7 +335,7 @@ class Widget(LoggingConfigurable):
             return {k: self._unserialize_trait(v) for k, v in x.items()}
         elif isinstance(x, (list, tuple)):
             return [self._unserialize_trait(v) for v in x]
-        elif isinstance(x, string_types) and x in Widget.widgets:
+        elif isinstance(x, string_types) and x.startswith('IPY_MODEL_') and x[10:] in Widget.widgets:
             # we want to support having child widgets at any level in a hierarchy
             # trusting that a widget UUID will not appear out in the wild
             return Widget.widgets[x]