diff options
| author | Martin Geubelle <mge@odoo.com> | 2017-04-14 11:07:14 +0200 |
|---|---|---|
| committer | Martin Geubelle <mge@odoo.com> | 2017-04-19 17:49:34 +0200 |
| commit | 90d6573579768525e339fa843a906016befd8aab (patch) | |
| tree | 10913d57432b311cc5c6f6215327b614013f2532 | |
| parent | 3445597940f4bf7791be8071910c4257254eb700 (diff) | |
[FIX] lunch: adapt the code to new views
We also adapt the code to comply to the new guidelines and we have
added some tests.
| -rw-r--r-- | addons/lunch/models/lunch.py | 4 | ||||
| -rw-r--r-- | addons/lunch/static/src/js/lunch.js | 135 | ||||
| -rw-r--r-- | addons/lunch/static/src/xml/lunch.xml | 22 | ||||
| -rw-r--r-- | addons/lunch/static/tests/lunch_tests.js | 145 | ||||
| -rw-r--r-- | addons/lunch/views/lunch_templates.xml | 6 |
5 files changed, 238 insertions, 74 deletions
diff --git a/addons/lunch/models/lunch.py b/addons/lunch/models/lunch.py index e677b1506cc..b7407ce0386 100644 --- a/addons/lunch/models/lunch.py +++ b/addons/lunch/models/lunch.py @@ -99,9 +99,7 @@ class LunchOrder(models.Model): 'supplier': line.supplier.name, 'note': line.note, 'price': line.price, - 'currency': line.currency_id.symbol, - 'digits': [69, line.currency_id.decimal_places], - 'position': line.currency_id.position, + 'currency_id': line.currency_id.id, } self.previous_order_widget = json.dumps(lunch_data) diff --git a/addons/lunch/static/src/js/lunch.js b/addons/lunch/static/src/js/lunch.js index 0f6b9b5cb8a..8c455083b0d 100644 --- a/addons/lunch/static/src/js/lunch.js +++ b/addons/lunch/static/src/js/lunch.js @@ -1,81 +1,94 @@ odoo.define('lunch.previous_orders', function (require) { "use strict"; +var AbstractField = require('web.AbstractField'); var core = require('web.core'); -var field_utils = require('web.field_utils'); var field_registry = require('web.field_registry'); -var relational_fields = require('web.relational_fields'); -var QWeb = core.qweb; +var field_utils = require('web.field_utils'); -var FieldMany2Many = relational_fields.FieldMany2Many; +var QWeb = core.qweb; -var LunchPreviousOrdersWidget = FieldMany2Many.extend({ - className: 'row o_lunch_last_orders', +var LunchPreviousOrdersWidget = AbstractField.extend({ events: { - 'click .o_add_button': 'set_order_line', + 'click .o_add_button': '_onAddOrder', }, - supported_field_types: [], - init: function() { + supportedFieldTypes: ['one2many'], + /** + * @override + */ + init: function () { this._super.apply(this, arguments); - this.lunch_data = {}; - this.fields_to_read = ['product_id', 'supplier', 'note', 'price', 'category_id', 'currency_id']; - this.format_value = function (value) { - var options = _.extend({}, this.nodeOptions, { data: this.recordData }); - return field_utils.format.monetary(value, this.field, options); - }; + this.lunchData = JSON.parse(this.value); }, - get_line_value: function(id) { - var data = _.clone(this.lunch_data[id]); - if (typeof this.lunch_data[id].product_id[0] !== 'undefined'){ - data.product_id = this.lunch_data[id].product_id[0]; - } - if (typeof this.lunch_data[id].supplier[0] !== 'undefined'){ - data.supplier = this.lunch_data[id].supplier[0]; - } - if (typeof this.lunch_data[id].category_id[0] !== 'undefined'){ - data.category_id = this.lunch_data[id].category_id[0]; - } - return data; + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Used by the widget to render the previous order price like a monetary. + * + * @private + * @param {Object} order + * @returns {string} the monetary formatting of order price + */ + _formatValue: function (order) { + var options = _.extend({}, this.nodeOptions, order); + return field_utils.format.monetary(order.price, this.field, options); }, - set_order_line: function() { - // FIXME: This is the true functionality of this widget in edit mode - // var data = this.get_line_value(parseInt($(event.currentTarget).data('id'))); - // var order_line_ids = this.field_manager.fields.order_line_ids; - // order_line_ids.data_create(data); - // order_line_ids.reload_current_view(); + /** + * @private + * @override + */ + _render: function () { + if (this.lunchData !== false) { + // group data by supplier for display + var categories = _.groupBy(this.lunchData, 'supplier'); + this.$el.html(QWeb.render('LunchPreviousOrdersWidgetList', { + formatValue: this._formatValue.bind(this), + categories: categories, + })); + } else { + return this.$el.html(QWeb.render('LunchPreviousOrdersWidgetNoOrder')); + } }, - render: function() { - var self = this; - // Fetch values - // FIXME: this might be replaced when we implement a way for widgets - // to declare which fields they need from the relational data - this.trigger_up('perform_model_rpc', { - model: 'lunch.order.line', - method: 'read', - args: [ - this.value, - this.fields_to_read - ], - on_success: function (orders) { - if (_.isEmpty(orders)) { - self.$el.html(QWeb.render("LunchPreviousOrdersWidgetNoOrder")); - } else { - _.each(orders, function(order) { - self.lunch_data[order.id] = order; - }); - var categories = _.groupBy(orders, function(o){ return o.supplier[1]; }); - return self.$el.html(QWeb.render("LunchPreviousOrdersWidgetList", {'widget': self, 'categories': categories})); - } - } + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {MouseEvent} event + */ + _onAddOrder: function (event) { + // Get order details from line + var lineID = parseInt($(event.currentTarget).data('id')); + if (!lineID) { + return; + } + var values = { + product_id: { + id: this.lunchData[lineID].product_id, + display_name: this.lunchData[lineID].product_name, + }, + note: this.lunchData[lineID].note, + price: this.lunchData[lineID].price, + }; + + // create a new order line + this.trigger_up('field_changed', { + dataPointID: this.dataPointID, + changes: { + order_line_ids: { + operation: 'CREATE', + data: values, + }, + }, }); }, - has_no_value: function() { - return false; - }, }); field_registry.add('previous_order', LunchPreviousOrdersWidget); -return LunchPreviousOrdersWidget; - }); diff --git a/addons/lunch/static/src/xml/lunch.xml b/addons/lunch/static/src/xml/lunch.xml index cda28f4fa3b..4efb8f9f5de 100644 --- a/addons/lunch/static/src/xml/lunch.xml +++ b/addons/lunch/static/src/xml/lunch.xml @@ -7,20 +7,22 @@ <p class="text-muted">Don't forget the alerts displayed in the reddish area</p> </div> <t t-name="LunchPreviousOrdersWidgetList"> - <div t-foreach="categories" t-as="product_category" class="col-sm-4"> - <h3><t t-esc="product_category"/></h3> - <div t-foreach='categories[product_category]' t-as='product' class="o_lunch_vignette"> - <button type="button" class="pull-right o_add_button oe_edit_only oe_link" t-att-data-id="product.id"> + <div t-foreach="categories" t-as="supplier" class="col-md-4"> + <h3><t t-esc="supplier"/></h3> + <div t-foreach='categories[supplier]' t-as='order' class="o_lunch_vignette"> + <button type="button" class="pull-right o_add_button oe_edit_only oe_link" t-att-data-id="order.line_id"> <span class="fa fa-plus-square"></span> <span>Add</span> </button> - <div class="o_lunch_text"> - <div class="badge pull-right"> - <t t-esc="widget.format_value(product.price)"/> <t t-esc="product.currency_id[1]"/> - </div> - <t t-esc="product.product_id[1]"/> + <div> + <t t-esc="order.product_name"/> + <span class="badge pull-right"> + <span class="o_lunch_price" t-raw="formatValue(order)"/> + </span> + </div> + <div class="text-muted"> + <t t-if="order.note != false" t-esc="order.note"/> </div> - <div class="text-muted"><t t-if="product.note != false" t-esc="product.note"/></div> </div> </div> </t> diff --git a/addons/lunch/static/tests/lunch_tests.js b/addons/lunch/static/tests/lunch_tests.js new file mode 100644 index 00000000000..fc48cb2df23 --- /dev/null +++ b/addons/lunch/static/tests/lunch_tests.js @@ -0,0 +1,145 @@ +odoo.define('lunch.tests', function (require) { +"use strict"; + +var FormView = require('web.FormView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; + +QUnit.module('lunch', { + beforeEach: function () { + this.data = { + order: { + fields: { + previous_order_widget: {type: 'text'}, + order_line_ids: {type: 'many2many', relation: 'order_line'} + }, + records: [{ + id: 1, + name: 'coucou', + }, { + id: 2, + name: 'coucou', + }, { + id: 11, + }], + }, + order_line: { + fields: { + product_id: {type: 'many2one', relation: 'product'}, + note: {type: 'text'}, + price: {type: 'float'}, + }, + }, + supplier: { + fields: {}, + records: [{ + id: 1, + display_name: "Coin Gourmant", + }, { + id: 2, + display_name: "Pizza Inn", + }] + }, + product: { + fields: {}, + records: [{ + id: 1, + name: 'Pizza Margherita', + }], + } + }; + }, +}, function () { + + QUnit.test("empty previous_order widget", function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + arch: '<form>' + + '<sheet>' + + '<field name="previous_order_widget" widget="previous_order"/>' + + '<field name="order_line_ids"/>' + + '</sheet>' + + '</form>', + data: this.data, + model: 'order', + archs: { + "order_line,false,list": '<tree string="Orders">' + + '<field name="product_id"/>' + + '<field name="note"/>' + + '<field name="price"/>' + + '</tree>', + }, + }); + + var widgetText = form.$('.o_form_field[name="previous_order_widget"]').text(); + assert.ok(widgetText.indexOf('This is the first time you order a meal') !== -1, + "the widget should display its no content text"); + assert.strictEqual(form.$('.o_lunch_vignette').length, 0, + "there should be no vignette"); + + form.destroy(); + }); + + QUnit.test("add an order line with previous_order widget", function (assert) { + assert.expect(4); + + var form = createView({ + View: FormView, + arch: '<form>' + + '<sheet>' + + '<field name="previous_order_widget" widget="previous_order"/>' + + '<field name="order_line_ids"/>' + + '</sheet>' + + '</form>', + data: this.data, + model: 'order', + mockRPC: function (route, args) { + if (args.method === 'default_get') { + return $.when({ + previous_order_widget: '{' + + '"8": {' + + '"note": "coucou",' + + '"line_id": 8,' + + '"digits": [69, 2],' + + '"product_id": 1,' + + '"currency": "$",' + + '"supplier": "Pizza Inn",' + + '"position": "before",' + + '"price": 6.9,' + + '"product_name": "Pizza Margherita"' + + '}' + + '}' + }); + } + return this._super.apply(this, arguments); + }, + archs: { + "order_line,false,list": '<tree string="Orders">' + + '<field name="product_id"/>' + + '<field name="note"/>' + + '<field name="price"/>' + + '</tree>', + }, + }); + + assert.strictEqual(form.$('.o_list_view tr.o_data_row').length, 0, + "there should be no row in the one2many list"); + + assert.strictEqual(form.$('.o_lunch_vignette').length, 1, + "there should be a vignette"); + + // add an order + form.$('.o_lunch_vignette .o_add_button').click(); + + assert.strictEqual(form.$('.o_list_view tr.o_data_row').length, 1, + "there should be one new row in the one2many list"); + assert.strictEqual(form.$('.o_list_view tr.o_data_row').text(), "Pizza Margheritacoucou6.90", + "the line should contain the correct data"); + + form.destroy(); + }); +}); +}); diff --git a/addons/lunch/views/lunch_templates.xml b/addons/lunch/views/lunch_templates.xml index 20fb24a0933..8e16254ebb7 100644 --- a/addons/lunch/views/lunch_templates.xml +++ b/addons/lunch/views/lunch_templates.xml @@ -6,4 +6,10 @@ <script type="text/javascript" src="/lunch/static/src/js/lunch.js"></script> </xpath> </template> + + <template id="qunit_suite" name="lunch tests" inherit_id="web.qunit_suite"> + <xpath expr="//t[@t-set='head']" position="inside"> + <script type="text/javascript" src="/lunch/static/tests/lunch_tests.js"/> + </xpath> + </template> </odoo> |
