Commit bb0d31e5 authored by Eugene Shen's avatar Eugene Shen

Allow authentication using ERP5

Co-opt Webrtc Rooms module to directly store negotiations as attributes,
integrate Space Chat with ERP5 and pass parameters through the URL,
move Dropbox main login page, and make authentication more robust.
parent 6cdfcbfa
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
<script src="gadget_erp5_chat_login.js"></script> <script src="gadget_erp5_chat_login.js"></script>
</head> </head>
<body> <body>
<a href="https://www.dropbox.com/1/oauth2/authorize?client_id=igeiyv4pkt0y0mm&response_type=token&redirect_uri=https://softinst75770.host.vifib.net/erp5/web_site_module/web_chat/">
Log in to Dropbox first, if you wish to authenticate via Dropbox.
</a>
<form class="login-form"> <form class="login-form">
<label>Name:</label> <label>Name:</label>
<br /> <br />
...@@ -31,6 +35,10 @@ ...@@ -31,6 +35,10 @@
<input type="radio" name="role" value="guest" checked="checked" /> <input type="radio" name="role" value="guest" checked="checked" />
<label>Guest</label> <label>Guest</label>
<br /> <br />
<label>ERP5 URL:</label>
<br />
<input type="text" name="erp5" />
<br />
<input type="submit" value="Login!" /> <input type="submit" value="Login!" />
</form> </form>
</body> </body>
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
<value> <value>
<tuple> <tuple>
<string>classification/collaborative/team</string> <string>classification/collaborative/team</string>
<string>contributor/person_module/1</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -16,16 +16,6 @@ ...@@ -16,16 +16,6 @@
end = document.URL.length; end = document.URL.length;
} }
return decodeURIComponent(document.URL.slice(start, end)); return decodeURIComponent(document.URL.slice(start, end));
} else if (document.URL.indexOf(query + "%3D") != -1) {
var start = document.URL.indexOf(query + "%3D") + query.length + 3;
var end = document.URL.indexOf("%2C", start);
if (end === -1) {
end = document.URL.indexOf("&", start);
if (end === -1) {
end = document.URL.length;
}
}
return decodeURIComponent(document.URL.slice(start, end));
} else { } else {
return ""; return "";
} }
...@@ -44,6 +34,9 @@ ...@@ -44,6 +34,9 @@
webrtc_gadget.state_parameter_dict.folder = cleanId(form.folder.value); webrtc_gadget.state_parameter_dict.folder = cleanId(form.folder.value);
webrtc_gadget.state_parameter_dict.room = cleanId(form.room.value); webrtc_gadget.state_parameter_dict.room = cleanId(form.room.value);
webrtc_gadget.state_parameter_dict.role = form.role.value; webrtc_gadget.state_parameter_dict.role = form.role.value;
if (form.erp5.value != "") {
webrtc_gadget.state_parameter_dict.erp5 = form.erp5.value;
}
var element = my_gadget.state_parameter_dict.element; var element = my_gadget.state_parameter_dict.element;
while (element.firstChild) { while (element.firstChild) {
element.removeChild(element.firstChild); element.removeChild(element.firstChild);
...@@ -66,6 +59,7 @@ ...@@ -66,6 +59,7 @@
fields.folder.value = getQueryValue("folder"); fields.folder.value = getQueryValue("folder");
fields.room.value = getQueryValue("room"); fields.room.value = getQueryValue("room");
fields.name.value = getQueryValue("name"); fields.name.value = getQueryValue("name");
fields.erp5.value = getQueryValue("erp5");
}); });
}) })
......
...@@ -21,6 +21,12 @@ ...@@ -21,6 +21,12 @@
<input type="submit" value="Authenticate!" /> <input type="submit" value="Authenticate!" />
</form> </form>
<form class="erp5-form">
<label>Automatically connect via ERP5</label>
<br />
<input type="submit" value="Authenticate!" />
</form>
<form class="host-offer-form"> <form class="host-offer-form">
<label> <label>
Paste your guest's offer in this box: Paste your guest's offer in this box:
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
function pollUntilNotNull( function pollUntilNotNull(
delay_ms, timeout_ms, nullableFunction, callbackFunction) { delay_ms, timeout_ms, nullableFunction, callbackFunction) {
if (callbackFunction === undefined) {
callbackFunction = function () {};
}
return RSVP.any([ return RSVP.any([
RSVP.timeout(timeout_ms), RSVP.timeout(timeout_ms),
promiseDoWhile(function () { promiseDoWhile(function () {
...@@ -67,6 +70,15 @@ ...@@ -67,6 +70,15 @@
return dropbox_gadget.put(folder, {}); return dropbox_gadget.put(folder, {});
}) })
.push(null, function () { .push(null, function () {
return resetDropboxContent(dropbox_gadget, {folder: folder});
})
.push(null, logError);
}
function resetDropboxContent(dropbox_gadget, param_dict) {
var folder = param_dict.folder;
return new RSVP.Queue()
.push(function () {
return dropbox_gadget.allAttachments(folder); return dropbox_gadget.allAttachments(folder);
}) })
.push(function (attachment_list) { .push(function (attachment_list) {
...@@ -75,11 +87,12 @@ ...@@ -75,11 +87,12 @@
promise_list.push(dropbox_gadget.removeAttachment(folder, name)); promise_list.push(dropbox_gadget.removeAttachment(folder, name));
} }
return RSVP.all(promise_list); return RSVP.all(promise_list);
}) });
.push(null, logError);
} }
function getDropboxOffer(dropbox_gadget, folder, room) { function getDropboxOffer(dropbox_gadget, param_dict) {
var folder = param_dict.folder;
var room = param_dict.room;
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return dropbox_gadget.allAttachments(folder); return dropbox_gadget.allAttachments(folder);
...@@ -95,7 +108,9 @@ ...@@ -95,7 +108,9 @@
.push(null, logError); .push(null, logError);
} }
function getDropboxContent(dropbox_gadget, folder, name) { function getDropboxContent(dropbox_gadget, param_dict) {
var folder = param_dict.folder;
var name = param_dict.name;
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return dropbox_gadget.getAttachment(folder, name); return dropbox_gadget.getAttachment(folder, name);
...@@ -108,12 +123,17 @@ ...@@ -108,12 +123,17 @@
.push(null, logError); .push(null, logError);
} }
function putDropboxContent(dropbox_gadget, folder, name, content) { function putDropboxContent(dropbox_gadget, param_dict) {
var folder = param_dict.folder;
var name = param_dict.name;
var content = param_dict.content;
return dropbox_gadget.putAttachment( return dropbox_gadget.putAttachment(
folder, name, new Blob([content], {type: "text"})); folder, name, new Blob([content], {type: "text"}));
} }
function removeDropboxContent(dropbox_gadget, folder, name) { function removeDropboxContent(dropbox_gadget, param_dict) {
var folder = param_dict.folder;
var name = param_dict.name;
return dropbox_gadget.removeAttachment(folder, name); return dropbox_gadget.removeAttachment(folder, name);
} }
...@@ -124,34 +144,176 @@ ...@@ -124,34 +144,176 @@
} }
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return createDropboxJio(my_gadget, return createDropboxJio(
my_gadget.state_parameter_dict.dropbox_folder); my_gadget, my_gadget.state_parameter_dict.dropbox_folder);
}) })
.push(function () { .push(function () {
if (my_gadget.state_parameter_dict.role === "host") { var dropbox_params = [
hideElementByClass(my_gadget, ".dropbox-form"); my_gadget, "dropbox_gadget",
return authenticateHost(my_gadget, "dropbox_gadget", { my_gadget.state_parameter_dict.dropbox_folder, {
resetContent: resetDropboxContent,
getOffer: getDropboxOffer, getOffer: getDropboxOffer,
getContent: getDropboxContent, getContent: getDropboxContent,
putContent: putDropboxContent, putContent: putDropboxContent,
removeContent: removeDropboxContent removeContent: removeDropboxContent
}); }
];
if (my_gadget.state_parameter_dict.role === "host") {
hideElementByClass(my_gadget, ".dropbox-form");
return authenticateHost.apply(undefined, dropbox_params);
} else if (my_gadget.state_parameter_dict.role === "guest") { } else if (my_gadget.state_parameter_dict.role === "guest") {
return authenticateGuest(my_gadget, "dropbox_gadget", { return authenticateGuest.apply(undefined, dropbox_params);
getOffer: getDropboxOffer, }
getContent: getDropboxContent, })
putContent: putDropboxContent, .push(null, logError);
removeContent: removeDropboxContent }
function createErp5Jio(my_gadget, folder, url) {
var erp5_gadget;
return new RSVP.Queue()
.push(function () {
return my_gadget.declareGadget(
"gadget_jio.html", {scope: "erp5_gadget"});
})
.push(function (jio_gadget) {
erp5_gadget = jio_gadget;
return erp5_gadget.createJio({
type: "erp5",
url: url,
default_view_reference: "view"
}); });
})
.push(function () {
// Must use double quotation marks in query string!
return erp5_gadget.allDocs({
limit: [0, 300],
query: 'portal_type: "Webrtc Room"',
sort_on: [["last_modified", "descending"]],
select_list: ["title"]
});
})
.push(function (room_list) {
if (room_list.data.rows.length) {
for (var i = 0, i_len = room_list.data.rows.length; i < i_len; i++) {
if (room_list.data.rows[i].value.title === folder) {
return room_list.data.rows[i].id;
}
}
} }
return erp5_gadget.post({
title: folder,
portal_type: "Webrtc Room",
parent_relative_url: "webrtc_rooms_module"
});
})
.push(function (result) {
return result;
}) })
.push(null, logError); .push(null, logError);
} }
function authenticateHost(my_gadget, jio_gadget_name, jio_function_dict) { function resetErp5Content(erp5_gadget, param_dict) {
var folder = my_gadget.state_parameter_dict.dropbox_folder; var folder = param_dict.folder;
var url = param_dict.url;
return erp5_gadget.putAttachment(folder, url + "WebrtcRoom_resetContent",
new Blob([JSON.stringify({folder: folder})]));
}
function getErp5Content(erp5_gadget, param_dict) {
var folder = param_dict.folder;
var room = param_dict.room;
var name = param_dict.name;
var url = param_dict.url;
var action = param_dict.action;
return new RSVP.Queue()
.push(function () {
return erp5_gadget.putAttachment(folder, url + action,
new Blob([JSON.stringify({folder: folder, room: room, name: name})]));
})
.push(function (response) {
return response.currentTarget.responseText;
})
.push(function (offer_name) {
if (offer_name) {
return offer_name;
} else {
return null;
}
})
.push(null, logError);
}
function putErp5Content(erp5_gadget, param_dict) {
var content = param_dict.content;
var folder = param_dict.folder;
var name = param_dict.name;
var url = param_dict.url;
return erp5_gadget.putAttachment(folder, url + "WebrtcRoom_putContent",
new Blob([JSON.stringify(
{folder: folder, name: name, content: content})]));
}
function removeErp5Content(erp5_gadget, param_dict) {
var folder = param_dict.folder;
var name = param_dict.name;
var url = param_dict.url;
return erp5_gadget.putAttachment(folder, url + "WebrtcRoom_deleteContent",
new Blob([JSON.stringify({folder: folder, name: name})]));
}
function authenticateErp5(my_gadget) {
return new RSVP.Queue()
.push(function () {
return createErp5Jio(
my_gadget, my_gadget.state_parameter_dict.folder,
my_gadget.state_parameter_dict.erp5_url);
})
.push(function (folder_id) {
var lastIndex = folder_id.indexOf("/") + 1;
my_gadget.state_parameter_dict.erp5_folder = folder_id.slice(lastIndex);
my_gadget.state_parameter_dict.erp5_url =
my_gadget.state_parameter_dict.erp5_url + "webrtc_rooms_module/"
+ my_gadget.state_parameter_dict.erp5_folder + "/";
return my_gadget.getDeclaredGadget("erp5_gadget");
})
.push(function (erp5_gadget) {
return resetErp5Content(erp5_gadget, {
folder: my_gadget.state_parameter_dict.erp5_folder,
url: my_gadget.state_parameter_dict.erp5_url
});
})
.push(function () {
var erp5_params = [
my_gadget, "erp5_gadget",
my_gadget.state_parameter_dict.erp5_folder, {
resetContent: resetErp5Content,
getOffer: function (erp5_gadget, param_dict) {
param_dict.action = "WebrtcRoom_getOffer";
return getErp5Content(erp5_gadget, param_dict);
},
getContent: function (erp5_gadget, param_dict) {
param_dict.action = "WebrtcRoom_getContent";
return getErp5Content(erp5_gadget, param_dict);
},
putContent: putErp5Content,
removeContent: removeErp5Content
}
];
if (my_gadget.state_parameter_dict.role === "host") {
hideElementByClass(my_gadget, ".erp5-form");
return authenticateHost.apply(undefined, erp5_params);
} else if (my_gadget.state_parameter_dict.role === "guest") {
return authenticateGuest.apply(undefined, erp5_params);
}
})
.push(null, logError);
}
function authenticateHost(
my_gadget, jio_gadget_name, folder, jio_function_dict) {
var room = my_gadget.state_parameter_dict.room; var room = my_gadget.state_parameter_dict.room;
var name; var name;
var url = my_gadget.state_parameter_dict.erp5_url;
var jio_gadget; var jio_gadget;
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
...@@ -159,64 +321,67 @@ ...@@ -159,64 +321,67 @@
}) })
.push(function (storage_gadget) { .push(function (storage_gadget) {
jio_gadget = storage_gadget; jio_gadget = storage_gadget;
return pollUntilNotNull(500, 7200000, function () { return pollUntilNotNull(500, 3600000, function () {
console.log("getting offer name"); return jio_function_dict.getOffer(
return jio_function_dict.getOffer(jio_gadget, folder, room); jio_gadget, {folder: folder, room: room, url: url});
}, function (offer_name) { }, function (offer_name) {
name = offer_name; name = offer_name;
}); });
}) })
.push(function () { .push(function () {
var num = 10; return pollUntilNotNull(50, 30000, function () {
return pollUntilNotNull(50, 5000, function () { if (my_gadget.state_parameter_dict.offer_ready === true) {
num++; my_gadget.state_parameter_dict.offer_ready = false;
if (num >= 10) { return true;
num = 0; } else {
console.log("getting offer"); return null;
} }
});
}, function () {
throw jio_function_dict.resetContent(
jio_gadget, {folder: folder, url: url});
})
.push(function () {
return pollUntilNotNull(50, 5000, function () {
return jio_function_dict.getContent( return jio_function_dict.getContent(
jio_gadget, folder, "offer_" + name); jio_gadget, {folder: folder, name: "offer_" + name, url: url});
}, function (guest_offer) { }, function (guest_offer) {
return sendOffer(my_gadget, guest_offer); return sendOffer(my_gadget, guest_offer);
}); });
}, function () { }, function (error) {
console.log("1"); if (error.toString().indexOf("Timed out after") === 0) {
throw createInitialOffer(my_gadget);
} else {
throw error;
}
}) })
.push(function () { .push(function () {
var num = 10;
return pollUntilNotNull(50, 10000, function () { return pollUntilNotNull(50, 10000, function () {
num++;
if (num >= 10) {
num = 0;
console.log("getting candidate");
}
return my_gadget.state_parameter_dict.candidate; return my_gadget.state_parameter_dict.candidate;
}, function (host_answer) { }, function (host_answer) {
return jio_function_dict.putContent( return jio_function_dict.putContent(jio_gadget, {
jio_gadget, folder, "answer_" + name, host_answer) folder: folder, name: "answer_" + name,
content: host_answer, url: url });
}); });
}, function () {
console.log("2");
}) })
.push(null, logError)
.push(function () { .push(function () {
console.log('removing content');
return jio_function_dict.removeContent( return jio_function_dict.removeContent(
jio_gadget, folder, "offer_" + name); jio_gadget, {folder: folder, name: "offer_" + name, url: url});
}, function () {
console.log("3");
}) })
.push(null, logError)
.push(function () { .push(function () {
return authenticateHost(my_gadget, jio_gadget_name, jio_function_dict); return authenticateHost(
}, function () { my_gadget, jio_gadget_name, folder, jio_function_dict);
return authenticateHost(my_gadget, jio_gadget_name, jio_function_dict);
}) })
.push(null, logError); .push(null, logError);
} }
function authenticateGuest(my_gadget, jio_gadget_name, jio_function_dict) { function authenticateGuest(
var folder = my_gadget.state_parameter_dict.dropbox_folder; my_gadget, jio_gadget_name, folder, jio_function_dict) {
var room = my_gadget.state_parameter_dict.room; var room = my_gadget.state_parameter_dict.room;
var name; var name;
var url = my_gadget.state_parameter_dict.erp5_url;
var jio_gadget; var jio_gadget;
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
...@@ -224,44 +389,29 @@ ...@@ -224,44 +389,29 @@
}) })
.push(function (storage_gadget) { .push(function (storage_gadget) {
jio_gadget = storage_gadget; jio_gadget = storage_gadget;
var num = 10;
return pollUntilNotNull(50, 15000, function () { return pollUntilNotNull(50, 15000, function () {
num++;
if (num >= 10) {
num = 0;
console.log("getting candidate");
}
return my_gadget.state_parameter_dict.candidate; return my_gadget.state_parameter_dict.candidate;
}, function (guest_offer) { }, function (guest_offer) {
name = room + "_" + my_gadget.state_parameter_dict.name + ".txt"; name = room + "_" + my_gadget.state_parameter_dict.name + ".txt";
return jio_function_dict.putContent( return jio_function_dict.putContent(jio_gadget, {
jio_gadget, folder, "offer_" + name, guest_offer); folder: folder, name: "offer_" + name,
content: guest_offer, url: url});
}); });
}, function () {
console.log("4");
}) })
.push(function () { .push(function () {
var num = 10;
return pollUntilNotNull(50, 30000, function () { return pollUntilNotNull(50, 30000, function () {
num++;
if (num >= 10) {
num = 0;
console.log('getting answer');
}
return jio_function_dict.getContent( return jio_function_dict.getContent(
jio_gadget, folder, "answer_" + name); jio_gadget, {folder: folder, name: "answer_" + name, url: url});
}, function (host_answer) { }, function (host_answer) {
return sendAnswer(my_gadget, host_answer); return sendAnswer(my_gadget, host_answer);
}); });
}, function () { }, function () {
console.log("5"); return jio_function_dict.removeContent(
jio_gadget, {folder: folder, name: "answer_" + name, url: url});
}) })
.push(function () { .push(function () {
console.log("removing content");
return jio_function_dict.removeContent( return jio_function_dict.removeContent(
jio_gadget, folder, "answer_" + name); jio_gadget, {folder: folder, name: "answer_" + name, url: url});
}, function () {
console.log("6");
}) })
.push(null, logError); .push(null, logError);
} }
...@@ -322,6 +472,9 @@ ...@@ -322,6 +472,9 @@
.push(null, logError); .push(null, logError);
} }
}) })
.push(function () {
my_gadget.state_parameter_dict.offer_ready = true;
})
.push(null, logError); .push(null, logError);
} }
...@@ -342,6 +495,7 @@ ...@@ -342,6 +495,7 @@
my_gadget.state_parameter_dict.connected = true; my_gadget.state_parameter_dict.connected = true;
if (my_gadget.state_parameter_dict.role === "guest") { if (my_gadget.state_parameter_dict.role === "guest") {
hideElementByClass(my_gadget, ".dropbox-form"); hideElementByClass(my_gadget, ".dropbox-form");
hideElementByClass(my_gadget, ".erp5-form");
hideElementByClass(my_gadget, ".guest-offer-form"); hideElementByClass(my_gadget, ".guest-offer-form");
} }
return my_gadget.declareGadget( return my_gadget.declareGadget(
...@@ -458,15 +612,16 @@ ...@@ -458,15 +612,16 @@
role: null, role: null,
candidate: null, candidate: null,
connected: false, connected: false,
offer_ready: false,
data_channel_list: [], data_channel_list: [],
peer_connection_list: [], peer_connection_list: [],
// full path including user folder, e.g. "/Apps/OfficeJS Chat/nexedi/" // full path including user folder, e.g. "/Apps/OfficeJS Chat/nexedi/"
dropbox_folder: "/Apps/OfficeJS Chat", dropbox_folder: "/Apps/OfficeJS Chat",
dropbox_token: "igeiyv4pkt0y0mm", erp5_url: "https://softinst75770.host.vifib.net/erp5/"
document_url: "https://softinst75770.host.vifib.net/" + "web_site_module/web_chat/hateoas/",
+ "erp5/web_site_module/web_chat/", erp5_folder: null,
ice_config: { ice_config: {
iceServers: [{ url: "stun:stun.1.google.com:19302" }] iceServers: [{url: "stun:stun.1.google.com:19302"}]
}, },
ice_constraints: { ice_constraints: {
optional: [{DtlsSrtpKeyAgreement: true}] optional: [{DtlsSrtpKeyAgreement: true}]
...@@ -537,15 +692,6 @@ ...@@ -537,15 +692,6 @@
} else if (gadget.state_parameter_dict.role === "guest") { } else if (gadget.state_parameter_dict.role === "guest") {
hideElementByClass(gadget, ".host-offer-form"); hideElementByClass(gadget, ".host-offer-form");
} }
gadget.state_parameter_dict.element
.querySelector(".dropbox-form .dropbox-login").href =
"https://www.dropbox.com/1/oauth2/authorize?client_id="
+ gadget.state_parameter_dict.dropbox_token
+ "&response_type=token&redirect_uri="
+ gadget.state_parameter_dict.document_url
+ "&state=name=" + gadget.state_parameter_dict.name
+ ",folder=" + gadget.state_parameter_dict.folder
+ ",room=" + gadget.state_parameter_dict.room;
return createInitialOffer(gadget); return createInitialOffer(gadget);
}) })
.push(null, logError); .push(null, logError);
...@@ -557,6 +703,8 @@ ...@@ -557,6 +703,8 @@
switch (my_event.target.className) { switch (my_event.target.className) {
case "dropbox-form": case "dropbox-form":
return authenticateDropbox(gadget); return authenticateDropbox(gadget);
case "erp5-form":
return authenticateErp5(gadget);
case "host-offer-form": case "host-offer-form":
hideElementByClass(gadget, ".host-offer-form"); hideElementByClass(gadget, ".host-offer-form");
showElementByClass(gadget, ".host-answer-form"); showElementByClass(gadget, ".host-answer-form");
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_Transient_Objects_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Access_arbitrary_user_session_data_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_events_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_member_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_topics_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
</tuple>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>erp5_webrtc_room</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
import json
module = context.getPortalObject().getDefaultModule(portal_type="Webrtc Room")
webrtc_folder = module[folder]
negotiation_list = json.loads(webrtc_folder.negotiation_list)
negotiation_list.pop(name, None)
webrtc_folder.edit(
negotiation_list = json.dumps(negotiation_list)
)
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>folder, name</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoom_deleteContent</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
import json
module = context.getPortalObject().getDefaultModule(portal_type="Webrtc Room")
webrtc_folder = module[folder]
negotiation_list = json.loads(webrtc_folder.negotiation_list)
return negotiation_list.get(name, "")
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>folder, name</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoom_getContent</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
import json
module = context.getPortalObject().getDefaultModule(portal_type="Webrtc Room")
webrtc_folder = module[folder]
negotiation_list = json.loads(webrtc_folder.negotiation_list)
for name in negotiation_list:
if name.startswith("offer_" + room):
return name[6:]
return ""
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>folder, room</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoom_getOffer</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
import json
module = context.getPortalObject().getDefaultModule(portal_type="Webrtc Room")
webrtc_folder = module[folder]
negotiation_list = json.loads(webrtc_folder.negotiation_list)
negotiation_list[name] = content
webrtc_folder.edit(
negotiation_list = json.dumps(negotiation_list)
)
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>folder, name, content</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoom_putContent</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
import json
module = context.getPortalObject().getDefaultModule(portal_type="Webrtc Room")
webrtc_folder = module[folder]
webrtc_folder.edit(
negotiation_list = json.dumps({})
)
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>folder</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoom_resetContent</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5 Form" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>Base_edit</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>center</string>
<string>bottom</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list>
<string>my_title</string>
<string>my_negotiation_list</string>
</list>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoom_view</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>WebrtcRoom_view</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_view</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Webrtc Room</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="StringField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>my_negotiation_list</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>too_long</string> </key>
<value> <string>Too much input was given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>20</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string>text</string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>WebRTC Negotiation List</string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="StringField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>my_title</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>too_long</string> </key>
<value> <string>Too much input was given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>20</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string>text</string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Title</string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5 Form" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>WebrtcRoomsModule_addWebrtcRoom</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>use this dialog to create new rooms</string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>center</string>
<string>bottom</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list>
<string>your_title</string>
</list>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoomsModule_viewAddWebrtcRoom</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>WebrtcRoomsModule_viewAddWebrtcRoom</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_dialog</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>New Rooms</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="StringField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>your_title</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>too_long</string> </key>
<value> <string>Too much input was given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>20</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>input_type</string> </key>
<value> <string>text</string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Title</string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5 Form" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>Base_doSelect</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>center</string>
<string>bottom</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list>
<string>listbox</string>
</list>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebrtcRoomsModule_viewWebrtcRoomList</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>WebrtcRoomsModule_viewWebrtcRoomList</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_list</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Webrtc Rooms</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>columns</string>
<string>selection_name</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>columns</string> </key>
<value>
<list>
<tuple>
<string>title</string>
<string>Title</string>
</tuple>
<tuple>
<string>negotiation_list</string>
<string>WebRTC Negotiation List</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_list_mode_listbox</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value>
<list>
<tuple>
<string>Webrtc Room</string>
<string>Webrtc Room</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>selection_name</string> </key>
<value> <string>webrtc_rooms_module_selection</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>WebRTC Rooms</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_webrtc_room
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment