From d210744ef01f10f88fcd482f9cdbe3273a05281c Mon Sep 17 00:00:00 2001 From: David Monjoie Date: Fri, 11 Sep 2015 09:59:00 +0200 Subject: [PATCH] [IMP] website_form: various improvements - Fixed the module name and category in manifest - Fixed website_form_blacklisted being ignored - Unauthorized readonly and magic fields - Reset the form on successfull submit - Added missing date field - Added date and datetime validation --- addons/website_form/__openerp__.py | 13 ++--- addons/website_form/controllers/main.py | 4 +- addons/website_form/models/models.py | 9 ++- .../static/src/js/website_form.js | 57 +++++++++++++++++-- 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/addons/website_form/__openerp__.py b/addons/website_form/__openerp__.py index 7fef0b7fd63..98eec6a4e5f 100644 --- a/addons/website_form/__openerp__.py +++ b/addons/website_form/__openerp__.py @@ -1,14 +1,9 @@ { - 'name': 'Website Form Builder', - 'category': 'Website', - 'summary': 'Build custom web forms using the website builder', + 'name': 'Website Form Controller', + 'category': 'Hidden', + 'summary': 'Generic controller for website forms', + 'description': 'Generic controller for website forms', 'version': '1.0', - 'description': """ -Odoo Form Builder -==================== - -Allows you to build web forms on the website using the website builder. - """, 'depends': ['website', 'mail'], 'data': [ 'views/assets.xml', diff --git a/addons/website_form/controllers/main.py b/addons/website_form/controllers/main.py index 214a8647e07..2832c5e22cf 100644 --- a/addons/website_form/controllers/main.py +++ b/addons/website_form/controllers/main.py @@ -96,7 +96,7 @@ class WebsiteForm(http.Controller): 'custom': '', # Custom fields values } - authorized_fields = model.get_authorized_fields(); + authorized_fields = model.sudo().get_authorized_fields(); error_fields = [] for field_name, field_value in kwargs.items(): @@ -181,7 +181,7 @@ class WebsiteForm(http.Controller): def insert_attachment(self, model, id_record, files): orphan_attachment_ids = [] record = model.env[model.model].browse(id_record) - authorized_fields = model.get_authorized_fields() + authorized_fields = model.sudo().get_authorized_fields() for file in files: custom_field = file.field_name not in authorized_fields attachment_value = { diff --git a/addons/website_form/models/models.py b/addons/website_form/models/models.py index 8fdc5e4bf9a..e6e769f59e5 100644 --- a/addons/website_form/models/models.py +++ b/addons/website_form/models/models.py @@ -1,6 +1,7 @@ from openerp import tools from openerp import models, fields, api +MAGIC_FIELDS = ["id", "create_uid", "create_date", "write_uid", "write_date", "__last_update"] class website_form_config(models.Model): _inherit = 'website' @@ -23,9 +24,8 @@ class website_form_model(models.Model): def get_authorized_fields(self): model = self.env[self.model] fields_get = model.fields_get() - domain = [('model_id', 'in', self.all_inherited_model_ids()), ('website_form_blacklisted', '=', False)] - for elem in self.env['ir.model.fields'].search(domain): + for elem in self.env['ir.model.fields'].search([('model_id', 'in', self.all_inherited_model_ids())]): if elem.website_form_blacklisted: fields_get.pop(elem.name, None) for key, val in model._inherits.iteritems(): @@ -36,6 +36,11 @@ class website_form_model(models.Model): for field in [f for f in fields_get if f in default_values]: fields_get[field]['required'] = False + # Remove readonly and magic fields + for field in fields_get.keys(): + if fields_get[field]['readonly'] or field in MAGIC_FIELDS: + del fields_get[field] + return fields_get diff --git a/addons/website_form/static/src/js/website_form.js b/addons/website_form/static/src/js/website_form.js index e191790c144..cea891ef135 100644 --- a/addons/website_form/static/src/js/website_form.js +++ b/addons/website_form/static/src/js/website_form.js @@ -20,9 +20,7 @@ odoo.define('website_form.animation', function (require) { // Initialize datetimepickers var l10n = _t.database.parameters; - this.$target.find('.o_website_form_datetime').datetimepicker({ - pickTime: true, - useSeconds: true, + var datepickers_options = { startDate: moment({ y: 1900 }), endDate: moment().add(200, "y"), calendarWeeks: true, @@ -34,7 +32,13 @@ odoo.define('website_form.animation', function (require) { }, language : moment.locale(), format : time.strftime_to_moment_format(l10n.date_format +' '+ l10n.time_format), - }); + } + this.$target.find('.o_website_form_datetime').datetimepicker(datepickers_options); + + // Adapt options to date-only pickers + datepickers_options.pickTime = false; + datepickers_options.format = time.strftime_to_moment_format(l10n.date_format); + this.$target.find('.o_website_form_date').datetimepicker(datepickers_options); }, stop: function() { @@ -114,6 +118,9 @@ odoo.define('website_form.animation', function (require) { else { self.update_status('success'); } + + // Reset the form + self.$target[0].reset(); } }) .fail(function(result_data){ @@ -122,6 +129,7 @@ odoo.define('website_form.animation', function (require) { }, check_error_fields: function(error_fields) { + var self = this; var form_valid = true; // Loop on all fields this.$target.find('.form-field').each(function(k, field){ @@ -146,6 +154,13 @@ odoo.define('website_form.animation', function (require) { return input.required && input.type == 'checkbox' }) return !_.any(checkboxes, function(checkbox){return checkbox.checked}) + + // Special cases for dates and datetimes + } else if ($(input).hasClass('o_website_form_date')) { + return !self.is_datetime_valid(input.value, 'date'); + } else if ($(input).hasClass('o_website_form_datetime')) { + return !self.is_datetime_valid(input.value, 'datetime'); + } else { return !input.checkValidity(); } @@ -161,6 +176,40 @@ odoo.define('website_form.animation', function (require) { return form_valid; }, + is_datetime_valid: function(value, type_of_date) { + if (value === "") { + return true; + } else { + try { + this.parse_date(value, type_of_date); + return true; + } catch(e) { + return false; + } + } + }, + + // This is a stripped down version of format.js parse_value function + parse_date: function (value, type_of_date, value_if_empty) { + var date_pattern = time.strftime_to_moment_format(_t.database.parameters.date_format), + time_pattern = time.strftime_to_moment_format(_t.database.parameters.time_format); + var date_pattern_wo_zero = date_pattern.replace('MM','M').replace('DD','D'), + time_pattern_wo_zero = time_pattern.replace('HH','H').replace('mm','m').replace('ss','s'); + switch (type_of_date) { + case 'datetime': + var datetime = moment(value, [date_pattern + ' ' + time_pattern, date_pattern_wo_zero + ' ' + time_pattern_wo_zero], true); + if (datetime.isValid()) + return time.datetime_to_str(datetime.toDate()); + throw new Error(_.str.sprintf(_t("'%s' is not a correct datetime"), value)); + case 'date': + var date = moment(value, [date_pattern, date_pattern_wo_zero], true); + if (date.isValid()) + return time.date_to_str(date.toDate()); + throw new Error(_.str.sprintf(_t("'%s' is not a correct date"), value)); + } + return value; + }, + update_status: function(status) { this.$target.find('#o_website_form_result').replaceWith(qweb.render("website_form.status_" + status)) },