[ADD] sync-on-start tutoring

bzr revid: xmo@openerp.com-20130215131950-df68dpp0iz3dhdte
This commit is contained in:
Xavier Morel
2013-02-15 14:19:50 +01:00
parent 06954ded48
commit f25c4725b8
4 changed files with 114 additions and 0 deletions
+21
View File
@@ -282,6 +282,27 @@ tools while playing with the stopwatch will show that the save
(creation) request is indeed sent (and replied to, even though we're
ignoring the response at this point).
These saved data should now be loaded and displayed when first opening
the action, so the user can see his previously recorded times. This is
done by overloading the model's ``start`` method: the purpose of
:js:func:`~openerp.base.Widget.start()` is to perform *asynchronous*
initialization steps, so the rest of the web client knows to "wait"
and gets a readiness signal. In this case, it will fetch the data
recorded previously using the :js:class:`~openerp.web.Query` interface
and add this data to an ordered list added to the widget's template:
.. patch::
And for consistency's sake (so that the display a user leaves is
pretty much the same as the one he comes back to), newly created
records should also automatically be added to the list:
.. patch::
Note that we're only displaying the record once we know it's been
saved from the database (the ``create`` call has returned without
error).
.. [#DOM-building] they are not alternative solutions: they work very
well together. Templates are used to build "just
DOM", sub-widgets are used to build DOM subsections
+64
View File
@@ -0,0 +1,64 @@
Index: web_example/static/src/js/first_module.js
===================================================================
--- web_example.orig/static/src/js/first_module.js
+++ web_example/static/src/js/first_module.js
@@ -11,20 +11,36 @@ openerp.web_example = function (instance
this._super.apply(this, arguments);
this._start = null;
this._watch = null;
+ this.model = new instance.web.Model('web_example.stopwatch');
+ },
+ start: function () {
+ var display = this.display_record.bind(this);
+ return this.model.query()
+ .filter([['user_id', '=', instance.session.uid]])
+ .all().done(function (records) {
+ _(records).each(display);
+ });
},
current: function () {
// Subtracting javascript dates returns the difference in milliseconds
return new Date() - this._start;
},
- update_counter: function (time) {
+ display_record: function (record) {
+ $('<li>')
+ .text(this.format_time(record.time))
+ .appendTo(this.$('.oe_web_example_saved'));
+ },
+ format_time: function (time) {
var h, m, s;
s = time / 1000;
m = Math.floor(s / 60);
s -= 60*m;
h = Math.floor(m / 60);
m -= 60*h;
- this.$('.oe_web_example_timer').text(
- _.str.sprintf("%02d:%02d:%02d", h, m, s));
+ return _.str.sprintf("%02d:%02d:%02d", h, m, s);
+ },
+ update_counter: function (time) {
+ this.$('.oe_web_example_timer').text(this.format_time(time));
},
watch_start: function () {
this.$el.addClass('oe_web_example_started')
@@ -45,7 +61,7 @@ openerp.web_example = function (instance
this._start = this._watch = null;
this.$el.removeClass('oe_web_example_started')
.addClass('oe_web_example_stopped');
- new instance.web.Model('web_example.stopwatch').call('create', [{
+ this.model.call('create', [{
user_id: instance.session.uid,
time: time,
}]);
Index: web_example/static/src/xml/web_example.xml
===================================================================
--- web_example.orig/static/src/xml/web_example.xml
+++ web_example/static/src/xml/web_example.xml
@@ -7,5 +7,6 @@
<p class="oe_web_example_stop">
<button type="button">Stop</button>
</p>
+ <ol class="oe_web_example_saved"></ol>
</div>
</templates>
+27
View File
@@ -0,0 +1,27 @@
Index: web_example/static/src/js/first_module.js
===================================================================
--- web_example.orig/static/src/js/first_module.js
+++ web_example/static/src/js/first_module.js
@@ -55,16 +55,20 @@ openerp.web_example = function (instance
33);
},
watch_stop: function () {
+ var self = this;
clearInterval(this._watch);
var time = this.current();
this.update_counter(time);
this._start = this._watch = null;
this.$el.removeClass('oe_web_example_started')
.addClass('oe_web_example_stopped');
- this.model.call('create', [{
+ var record = {
user_id: instance.session.uid,
time: time,
- }]);
+ };
+ this.model.call('create', [record]).done(function () {
+ self.display_record(record);
+ });
},
destroy: function () {
if (this._watch) {
+2
View File
@@ -15,3 +15,5 @@
17
18
19
20
21