credativ team mailing list archive
-
credativ team
-
Mailing list archive
-
Message #05345
[Merge] lp:~therp-nl/openupgrade-addons/7.0-mail into lp:openupgrade-addons
Stefan Rijnhart (Therp) has proposed merging lp:~therp-nl/openupgrade-addons/7.0-mail into lp:openupgrade-addons.
Requested reviews:
Holger Brunn (Therp) (hbrunn): code review
For more details, see:
https://code.launchpad.net/~therp-nl/openupgrade-addons/7.0-mail/+merge/176010
Migration of the mail module, including the nice HTMLifier code from Credativ's abandoned contribution (https://code.launchpad.net/~credativ/openupgrade-addons/7.0/+merge/170411)
--
https://code.launchpad.net/~therp-nl/openupgrade-addons/7.0-mail/+merge/176010
Your team OpenUpgrade Committers is subscribed to branch lp:openupgrade-addons.
=== added file 'email_template/migrations/7.0.1.1/openupgrade_analysis_working.txt'
--- email_template/migrations/7.0.1.1/openupgrade_analysis_working.txt 1970-01-01 00:00:00 +0000
+++ email_template/migrations/7.0.1.1/openupgrade_analysis_working.txt 2013-07-23 18:20:38 +0000
@@ -0,0 +1,46 @@
+---Fields in module 'email_template'---
+### To convert to body_html if that is empty
+email_template / email.template / body_text (text) : DEL
+
+### Ignore useless fields from former inherit on mail.message
+email_template / email.template / date (datetime) : DEL
+email_template / email.template / headers (text) : DEL
+email_template / email.template / message_id (char) : DEL
+email_template / email.template / original (binary) : DEL
+email_template / email.template / partner_id (many2one) : DEL relation: res.partner
+email_template / email.template / references (text) : DEL
+email_template / email.template / res_id (integer) : DEL
+email_template / email.template / state (selection) : DEL selection_keys: ['cancel', 'exception', 'outgoing', 'received', 'sent']
+email_template / email.template / subtype (char) : DEL
+email_template / email.template / user_id (many2one) : DEL relation: res.users
+
+### Mention the loss of BCCs in the user notes
+email_template / email.template / email_bcc (char) : DEL
+
+### Ignore new field (list of partner ids?)
+email_template / email.template / email_recipients (char) : NEW
+
+### Ignore previously unused field
+email_template / email.template / track_campaign_item (boolean) : DEL
+
+### Ignore this TransientModel.
+### The analysis cannot distinguish Models from TransientModels that inherit from Model
+email_template / email_template.preview / body_text (text) : DEL
+email_template / email_template.preview / date (datetime) : DEL
+email_template / email_template.preview / email_bcc (char) : DEL
+email_template / email_template.preview / email_recipients (char) : NEW
+email_template / email_template.preview / headers (text) : DEL
+email_template / email_template.preview / message_id (char) : DEL
+email_template / email_template.preview / original (binary) : DEL
+email_template / email_template.preview / partner_id (many2one) : DEL relation: res.partner
+email_template / email_template.preview / references (text) : DEL
+email_template / email_template.preview / state (selection) : DEL selection_keys: ['cancel', 'exception', 'outgoing', 'received', 'sent']
+email_template / email_template.preview / subtype (char) : DEL
+email_template / email_template.preview / track_campaign_item (boolean) : DEL
+email_template / email_template.preview / user_id (many2one) : DEL relation: res.users
+# Ignore this TransientModel
+email_template / mail.compose.message / template_id (selection) : NEW selection_keys: function
+---XML records in module 'email_template'---
+DEL ir.model.access: email_template.access_email_template_manager
+DEL ir.model.access: email_template.access_email_template_preview_system
+NEW ir.ui.view: email_template.res_partner_opt_out_search
=== added file 'email_template/migrations/7.0.1.1/post-migration.py'
--- email_template/migrations/7.0.1.1/post-migration.py 1970-01-01 00:00:00 +0000
+++ email_template/migrations/7.0.1.1/post-migration.py 2013-07-23 18:20:38 +0000
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Credativ Ltd (<http://credativ.co.uk>)
+# (C) 2013 Therp BV (<http://therp.nl>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+from openerp.tools.mail import plaintext2html
+
+def convert_mail_bodies(cr):
+ """
+ Convert plain bodies to sanitized html.
+ """
+ cr.execute(
+ "SELECT id, %(body_text)s FROM email_template "
+ "WHERE body_html IS NULL AND body_html != '' AND body_text IS NOT NULL" % {
+ 'body_text': openupgrade.get_legacy_name('body_text'),
+ })
+ for row in cr.fetchall():
+ body = plaintext2html(row[1])
+ cr.execute("UPDATE mail_message SET body_html = %s WHERE id = %s", body, row[0])
+
+ # Migrate translations of text templates
+ cr.execute(
+ """
+ SELECT tr_text.res_id, tr_text.lang, tr_text.value,
+ (SELECT COUNT(*) FROM ir_translation tr_count
+ WHERE tr_count.type = 'model'
+ AND tr_count.name = 'email.template,body_html'
+ AND tr_count.res_id = tr_text.res_id
+ AND tr_count.lang = tr_text.lang) as count
+ FROM ir_translation tr_text
+ WHERE type = 'model'
+ AND name = 'email.template,body_text'
+ AND NOT EXISTS (
+ SELECT tr_html.id
+ FROM ir_translation tr_html
+ WHERE tr_html.type = 'model'
+ AND tr_html.name = 'email.template,body_html'
+ AND tr_text.res_id = tr_html.res_id
+ AND tr_text.lang = tr_html.lang
+ AND (tr_html.value is not NULL OR tr_html.value != '')
+ )
+ """)
+
+ for (res_id, lang, value, count) in cr.fetchall():
+ body = plaintext2html(value)
+ if count:
+ cr.execute(
+ """
+ UPDATE ir_translation
+ SET value = %s
+ WHERE type = 'model'
+ AND name = 'email.template,body_html'
+ AND res_id = %s
+ AND lang = %s
+ """, (body, res_id, lang))
+ else:
+ cr.execute(
+ """
+ INSERT INTO ir_translation
+ (lang, name, type, res_id, value, src)
+ VALUES (
+ %s, 'email.template,body_html', 'model', %s, %s,
+ (SELECT body_html
+ FROM email_template et
+ WHERE et.id = %s))
+ """, (lang, res_id, body, res_id))
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ convert_mail_bodies(cr)
+
=== added file 'email_template/migrations/7.0.1.1/pre-migration.py'
--- email_template/migrations/7.0.1.1/pre-migration.py 1970-01-01 00:00:00 +0000
+++ email_template/migrations/7.0.1.1/pre-migration.py 2013-07-23 18:20:38 +0000
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+
+column_renames = {
+ 'email.template': [
+ # Existing fields to ignore
+ # Existing fields to transform
+ ('body_text', None),
+ ]}
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ openupgrade.rename_columns(cr, column_renames)
=== added file 'email_template/migrations/7.0.1.1/user_notes.txt'
--- email_template/migrations/7.0.1.1/user_notes.txt 1970-01-01 00:00:00 +0000
+++ email_template/migrations/7.0.1.1/user_notes.txt 2013-07-23 18:20:38 +0000
@@ -0,0 +1,1 @@
+You can no longer use BCC recipients in email templates. Also, text emails are converted to html now. Any existing templates will be migrated.
=== added file 'fetchmail/migrations/7.0.1.0/post-migration.py'
--- fetchmail/migrations/7.0.1.0/post-migration.py 1970-01-01 00:00:00 +0000
+++ fetchmail/migrations/7.0.1.0/post-migration.py 2013-07-23 18:20:38 +0000
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+
+def move_fetchmail_server_id(cr):
+ """
+ Fetchmail now relates to mail.mail, not mail.message
+ """
+ cr.execute(
+ "UPDATE mail_mail SET fetchmail_server_id = "
+ " mail_message.%(fetchmail_server_id)s "
+ "FROM mail_mail, mail_message "
+ "WHERE mail_mail.mail_message_id = mail_message.id "
+ " AND mail_message.%(fetchmail_server_id)s IS NOT NULL" % {
+ 'fetchmail_server_id': openupgrade.get_legacy_name(
+ 'fetchmail_server_id'),
+ })
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ move_fetchmail_server_id(cr)
=== added file 'fetchmail/migrations/7.0.1.0/pre-migration.py'
--- fetchmail/migrations/7.0.1.0/pre-migration.py 1970-01-01 00:00:00 +0000
+++ fetchmail/migrations/7.0.1.0/pre-migration.py 2013-07-23 18:20:38 +0000
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+
+column_renames = {
+ 'mail.message': [
+ # Existing fields to ignore
+ # Existing fields to transform
+ ('fetchmail_server_id', None),
+ ]}
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ openupgrade.rename_columns(cr, column_renames)
=== added file 'fetchmail/migrations/7.0.1.0/user_notes.txt'
--- fetchmail/migrations/7.0.1.0/user_notes.txt 1970-01-01 00:00:00 +0000
+++ fetchmail/migrations/7.0.1.0/user_notes.txt 2013-07-23 18:20:38 +0000
@@ -0,0 +1,1 @@
+This migration script adapts existing emails to technical changes.
=== added file 'mail/migrations/7.0.1.0/data.xml'
--- mail/migrations/7.0.1.0/data.xml 1970-01-01 00:00:00 +0000
+++ mail/migrations/7.0.1.0/data.xml 2013-07-23 18:20:38 +0000
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <record id="ir_cron_mail_scheduler_action">
+ <field eval="'mail.mail'" name="model"/>
+ </record>
+ </data>
+</openerp>
+
=== added file 'mail/migrations/7.0.1.0/openupgrade_analysis_working.txt'
--- mail/migrations/7.0.1.0/openupgrade_analysis_working.txt 1970-01-01 00:00:00 +0000
+++ mail/migrations/7.0.1.0/openupgrade_analysis_working.txt 2013-07-23 18:20:38 +0000
@@ -0,0 +1,213 @@
+---Fields in module 'mail'---
+### Ignore new mail configuration: aliases, followers, groups, message subtypes, notifications
+mail / ir.ui.menu / mail_group_id (many2one) : NEW relation: mail.group
+mail / mail.alias / alias_defaults (text) : NEW required: required, req_default: {}
+mail / mail.alias / alias_force_thread_id (integer): NEW
+mail / mail.alias / alias_model_id (many2one) : NEW relation: ir.model, required: required
+mail / mail.alias / alias_name (char) : NEW required: required
+mail / mail.alias / alias_user_id (many2one) : NEW relation: res.users
+mail / mail.followers / partner_id (many2one) : NEW relation: res.partner, required: required
+mail / mail.followers / res_id (integer) : NEW
+mail / mail.followers / res_model (char) : NEW required: required
+mail / mail.followers / subtype_ids (many2many) : NEW relation: mail.message.subtype
+mail / mail.group / _inherits (False) : NEW
+mail / mail.group / alias_id (many2one) : NEW relation: mail.alias, required: required
+mail / mail.group / description (text) : NEW
+mail / mail.group / group_ids (many2many) : NEW relation: res.groups
+mail / mail.group / group_public_id (many2one) : NEW relation: res.groups
+mail / mail.group / image (binary) : NEW
+mail / mail.group / menu_id (many2one) : NEW relation: ir.ui.menu, required: required
+mail / mail.group / message_ids (one2many) : NEW relation: mail.message
+mail / mail.group / name (char) : NEW required: required
+mail / mail.group / public (selection) : NEW required: required, selection_keys: ['groups', 'private', 'public'], req_default: groups
+mail / mail.message.subtype / default (boolean) : NEW
+mail / mail.message.subtype / description (text) : NEW
+mail / mail.message.subtype / name (char) : NEW required: required
+mail / mail.message.subtype / parent_id (many2one) : NEW relation: mail.message.subtype
+mail / mail.message.subtype / relation_field (char) : NEW
+mail / mail.message.subtype / res_model (char) : NEW
+mail / mail.notification / message_id (many2one) : NEW relation: mail.message, required: required
+mail / mail.notification / partner_id (many2one) : NEW relation: res.partner, required: required
+mail / mail.notification / read (boolean) : NEW
+mail / mail.notification / starred (boolean) : NEW
+
+### Dealt with split up between mail.message and mail.mail. See below.
+mail / mail.mail / _inherits (False) : NEW
+mail / mail.mail / auto_delete (boolean) : NEW
+mail / mail.mail / body_html (text) : NEW
+mail / mail.mail / email_cc (char) : NEW
+mail / mail.mail / email_from (char) : NEW
+mail / mail.mail / email_to (text) : NEW
+mail / mail.mail / mail_message_id (many2one) : NEW relation: mail.message, required: required
+mail / mail.mail / mail_server_id (many2one) : NEW relation: ir.mail_server
+mail / mail.mail / notification (boolean) : NEW
+mail / mail.mail / references (text) : NEW
+mail / mail.mail / reply_to (char) : NEW
+mail / mail.mail / state (selection) : NEW selection_keys: ['cancel', 'exception', 'outgoing', 'received', 'sent']
+mail / mail.message / attachment_ids (many2many) : NEW relation: ir.attachment
+mail / mail.message / author_id (many2one) : NEW relation: res.partner
+mail / mail.message / body (html) : NEW
+mail / mail.message / child_ids (one2many) : NEW relation: mail.message
+mail / mail.message / date (datetime) : NEW
+mail / mail.message / email_from (char) : NEW
+mail / mail.message / message_id (char) : NEW
+mail / mail.message / model (char) : NEW
+mail / mail.message / notification_ids (one2many) : NEW relation: mail.notification
+mail / mail.message / notified_partner_ids (many2many): NEW relation: res.partner
+mail / mail.message / parent_id (many2one) : NEW relation: mail.message
+mail / mail.message / partner_ids (many2many) : NEW relation: res.partner
+mail / mail.message / res_id (integer) : NEW
+mail / mail.message / subject (char) : NEW
+mail / mail.message / subtype_id (many2one) : NEW relation: mail.message.subtype
+mail / mail.message / type (selection) : NEW selection_keys: ['comment', 'email', 'notification']
+mail / mail.message / vote_user_ids (many2many) : NEW relation: res.users
+mail / res.partner / emails (one2many) : DEL relation: mail.message
+mail / res.partner / message_ids (one2many) : NEW relation: mail.message
+mail / res.partner / notification_email_send (selection): NEW required: required, selection_keys: ['all', 'comment', 'email', 'none'], req_default: function
+
+### Ignore. Broken output from analysis, but res_users inherit from mail.alias now. The aliases are created at model initialization time
+mail / res.users / _inherits (False) : NEW mode: modify
+mail / res.users / alias_id (many2one) : NEW relation: mail.alias, required: required
+
+---XML records in module 'mail'---
+### Ignore interface records
+NEW ir.actions.act_window: mail.action_view_followers
+NEW ir.actions.act_window: mail.action_view_groups
+NEW ir.actions.act_window: mail.action_view_mail_alias
+NEW ir.actions.act_window: mail.action_view_mail_mail
+NEW ir.actions.act_window: mail.action_view_message_subtype
+NEW ir.actions.act_window: mail.action_view_notifications
+DEL ir.actions.act_window: mail.act_res_partner_emails
+DEL ir.actions.act_window: mail.action_view_mailgate_thread
+DEL ir.actions.act_window.view: mail.action_view_mailgate_thread_view1
+DEL ir.actions.act_window.view: mail.action_view_mailgate_thread_view2
+NEW ir.actions.client: mail.action_mail_archives_feeds
+NEW ir.actions.client: mail.action_mail_group_feeds
+NEW ir.actions.client: mail.action_mail_inbox_feeds
+NEW ir.actions.client: mail.action_mail_star_feeds
+NEW ir.actions.client: mail.action_mail_to_me_feeds
+NEW ir.ui.menu: mail.mail_alias_menu
+NEW ir.ui.menu: mail.mail_allgroups
+NEW ir.ui.menu: mail.mail_archivesfeeds
+NEW ir.ui.menu: mail.mail_feeds
+NEW ir.ui.menu: mail.mail_feeds_main
+NEW ir.ui.menu: mail.mail_group_root
+NEW ir.ui.menu: mail.mail_inboxfeeds
+NEW ir.ui.menu: mail.mail_my_stuff
+NEW ir.ui.menu: mail.mail_starfeeds
+NEW ir.ui.menu: mail.mail_tomefeeds
+NEW ir.ui.menu: mail.menu_email_followers
+NEW ir.ui.menu: mail.menu_email_notifications
+NEW ir.ui.menu: mail.menu_mail_mail
+NEW ir.ui.menu: mail.menu_mail_message
+NEW ir.ui.menu: mail.menu_message_subtype
+DEL ir.ui.menu: mail.menu_email_message
+NEW ir.ui.view: mail.mail_wizard_invite_form
+NEW ir.ui.view: mail.view_followers_tree
+NEW ir.ui.view: mail.view_general_configuration_mail_alias_domain
+NEW ir.ui.view: mail.view_group_form
+NEW ir.ui.view: mail.view_group_kanban
+NEW ir.ui.view: mail.view_group_search
+NEW ir.ui.view: mail.view_group_tree
+NEW ir.ui.view: mail.view_mail_alias_form
+NEW ir.ui.view: mail.view_mail_alias_search
+NEW ir.ui.view: mail.view_mail_alias_tree
+NEW ir.ui.view: mail.view_mail_form
+NEW ir.ui.view: mail.view_mail_message_subtype_form
+NEW ir.ui.view: mail.view_mail_search
+NEW ir.ui.view: mail.view_mail_subscription_form
+NEW ir.ui.view: mail.view_mail_tree
+NEW ir.ui.view: mail.view_message_form
+NEW ir.ui.view: mail.view_message_search
+NEW ir.ui.view: mail.view_message_subtype_tree
+NEW ir.ui.view: mail.view_message_tree
+NEW ir.ui.view: mail.view_notification_tree
+NEW ir.ui.view: mail.view_users_form_mail
+NEW ir.ui.view: mail.view_users_form_simple_modif_mail
+DEL ir.ui.view: base.view_crm_partner_info_History
+DEL ir.ui.view: mail.view_email_message_form
+DEL ir.ui.view: mail.view_email_message_search
+DEL ir.ui.view: mail.view_email_message_tree
+DEL ir.ui.view: mail.view_mailgate_thread_form
+DEL ir.ui.view: mail.view_mailgate_thread_tree
+
+### Ignore new scheduled task
+NEW ir.cron: mail.ir_cron_module_update_notification
+
+### Ignore swap out of access rules
+NEW ir.model.access: mail.access_mail_alias_all
+NEW ir.model.access: mail.access_mail_alias_system
+NEW ir.model.access: mail.access_mail_alias_user
+NEW ir.model.access: mail.access_mail_followers_all
+NEW ir.model.access: mail.access_mail_followers_system
+NEW ir.model.access: mail.access_mail_followers_user
+NEW ir.model.access: mail.access_mail_group_all
+NEW ir.model.access: mail.access_mail_group_user
+NEW ir.model.access: mail.access_mail_mail_all
+NEW ir.model.access: mail.access_mail_mail_system
+NEW ir.model.access: mail.access_mail_mail_user
+NEW ir.model.access: mail.access_mail_message_all
+NEW ir.model.access: mail.access_mail_message_subtype_all
+NEW ir.model.access: mail.access_mail_message_subtype_system
+NEW ir.model.access: mail.access_mail_message_user
+NEW ir.model.access: mail.access_mail_notification_all
+NEW ir.model.access: mail.access_mail_notification_system
+NEW ir.model.access: mail.access_mail_notification_user
+NEW ir.model.access: mail.access_mail_thread_all
+NEW ir.model.access: mail.access_publisher_warranty_contract_all
+DEL ir.model.access: mail.access_mail_message
+DEL ir.model.access: mail.access_mail_thread
+NEW ir.rule: mail.mail_followers_read_write_own
+NEW ir.rule: mail.mail_group_public_and_joined
+NEW ir.rule: mail.mail_notification_read_write_own
+
+### Ignore new configuration data
+NEW mail.group: mail.group_all_employees
+NEW mail.message: mail.module_install_notification
+NEW mail.message.subtype: mail.mt_comment
+
+### Here is some manual bookkeeping to deal with the split up between
+### mail.message and the new mail.mail model.
+### Fields in mail.message:
+### KEEP ###
+# < subject (char, 512) > Keep
+# < model (char, 128) > Keep
+# < res_id (integer) > Keep
+# < date (datetime) > Keep
+# < email_from (char) > Keep
+# < message_id (char) > Keep
+# < attachment_ids (m2m res.attachment) > Keep
+### Transform ###
+# < body_text (text) > txt2html to 'body' on mail.message if not body_html. DONE
+# < body_html (text) > Move to 'body' on mail.message. Also? Move to mail.mail. DONE
+# < partner_id (m2o res.partner) > Move to m2m partner_ids. DONE
+# < user_id (m2o res.users) > author_id (m2o res.partner). Look up user's partner DONE
+# > record_name > call mail_message(_get_record_name) field function after setting model and res_id iff model && res_id DONE
+# > type (email, comment, notification) > Set to notification DONE
+# > parent_id > ? Lookup by in-reply-to?
+### MOVE TO MAIL.MAIL ###
+# < mail_server_id (m2o, ir.mail_server) > Move to mail.mail DONE
+# < email_to (char) > Move to mail.mail DONE
+# < email_cc (char) > Move to mail.mail DONE
+# < email_bcc (char) > Move to mail.mail DONE
+# < reply_to (char) > Move to mail.mail DONE
+# < references (text) > Move to mail.mail DONE
+# < state (outgoing, sent, received, exception, cancel) > Move to mail.mail DONE
+# < autodelete (burn after sending, not relevant) > Move to mail.mail DONE
+### IGNORE ###
+# < subtype (char, {html|plain} > Ignore
+# < headers (text) > Ignore
+# < display_text (text, unstored function). Ignore
+# < original (fields.binary, various formats). Ignore
+# > child_ids > inverse of parent_id. Ignore
+# > notified_partner_ids (m2m res.partner). Ignore
+# > notification_ids (o2m mail.notification) > Ignore
+# > to_read (bool function). Ignore
+# > starred (bool function). Ignore
+# > vote_user_ids (m2m res.users). Ignore
+# > subtype_id (m2o mail.message.subtype). Look for relevant subtype if possible?
+
+# Fields in model mail.mail:
+# > notification (bool) Is set to True in the model's create() method
+# > mail_message_id (m2o, mail.message) DONE
+
=== added file 'mail/migrations/7.0.1.0/post-migration.py'
--- mail/migrations/7.0.1.0/post-migration.py 1970-01-01 00:00:00 +0000
+++ mail/migrations/7.0.1.0/post-migration.py 2013-07-23 18:20:38 +0000
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 credativ Ltd (<http://credativ.co.uk>)
+# (C) 2013 Therp BV (<http://therp.nl>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import logging
+from openerp import pooler, SUPERUSER_ID
+from openerp.tools.mail import html_sanitize, plaintext2html
+from openerp.openupgrade import openupgrade
+
+logger = logging.getLogger('OpenUpgrade (mail)')
+
+subtype_mapping = {
+ 'plain': (openupgrade.get_legacy_name('body_text'), plaintext2html),
+ 'html': (openupgrade.get_legacy_name('body_html'), html_sanitize),
+ }
+
+def convert_mail_bodies(cr, pool):
+ """
+ Convert plain and html bodies to sanitized html.
+ """
+ message_obj = pool.get('mail.message')
+ for subtype in subtype_mapping.keys():
+ field, func = subtype_mapping[subtype]
+ logger.info("converting %s messages", subtype)
+ cr.execute(
+ "SELECT id, %(field)s FROM mail_message "
+ "WHERE %(msg_subtype)s = '%(subtype)s'" % {
+ 'msg_subtype': openupgrade.get_legacy_name('subtype'),
+ 'field': field,
+ 'subtype': subtype,
+ })
+ for row in cr.fetchall():
+ body = func(row[1])
+ cr.execute("UPDATE mail_message SET body = %s WHERE id = %s", body, row[0])
+
+def create_mail_mail(cr, pool):
+ """
+ Create mail.mail records for every mail.message in the system,
+ because every mail.message in 6.1 is a conventional email.
+ Also perform some other transformations.
+ """
+ message_obj = pool.get('mail.message')
+ mail_obj = pool.get('mail.mail')
+ message_ids = message_obj.search([])
+ messages = message_obj.read(message_obj.search([]), {}, '_classic_write')
+
+ cr.execute("""SELECT user_id FROM mail_message""")
+ user_ids = dict(cr.fetchall)
+
+ for message in messages:
+ # Set message type to notification
+ write_vals = {
+ 'type': 'notification',
+ }
+ # Convert user_id to author partner
+ if user_ids[message['id']]:
+ write_vals['author_id'] = openupgrade.get_partner_id_from_user_id(
+ cr, user_ids[message['id']])
+ message_obj.write(message['id'], write_vals)
+
+ # Set stored (but not recalculated) function field record_name
+ if message['model'] and message['res_id']:
+ model = pool.get(message['model'])
+ if model:
+ name = model.name_get(
+ cr, SUPERUSER_ID, [message['res_id']])[0][1]
+ cr.execute(
+ """
+ UPDATE mail_message
+ SET record_name = %s
+ WHERE id = %s
+ """, name, message['id'])
+
+ mail_id = mail_obj.create(
+ {
+ 'mail_message_id': message['id'],
+ })
+
+ # Copy legacy fields from message table to mail table
+ cr.execute(
+ """
+ UPDATE mail_mail
+ SET mail.body_html = msg.body,
+ mail.mail_server_id = msg.%(mail_server_id)s,
+ mail.email_to = msg.%(email_to)s,
+ mail.email_cc = msg.%(email_cc)s,
+ mail.email_bcc = msg.%(email_bcc)s,
+ mail.reply_to = msg.%(reply_to)s,
+ mail.references = msg.%(references)s,
+ mail.state = msg.%(state)s,
+ mail.autodelete = msg.%(autodelete)s,
+ FROM mail_mail mail, mail_message msg
+ WHERE mail.mail_message_id = msg.id
+ """ % {
+ 'mail_server_id': openupgrade.get_legacy_name('mail_server_id'),
+ 'email_to': openupgrade.get_legacy_name('email_to'),
+ 'email_cc': openupgrade.get_legacy_name('email_cc'),
+ 'email_bcc': openupgrade.get_legacy_name('email_bcc'),
+ 'reply_to': openupgrade.get_legacy_name('reply_to'),
+ 'references': openupgrade.get_legacy_name('references'),
+ 'state': openupgrade.get_legacy_name('state'),
+ 'autodelete': openupgrade.get_legacy_name('autodelete'),
+ })
+
+ # Migrate m2o partner_id to m2m partner_ids
+ openupgrade.m2o_to_m2m(
+ cr, 'mail.message', 'mail_message', 'partner_ids',
+ openupgrade.get_legacy_name('partner_id'))
+
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ pool = pooler.get_pool(cr.dbname)
+ convert_mail_bodies(cr, pool)
+ create_mail_mail(cr, pool)
+ openupgrade.load_data(cr, 'mail', 'migrations/7.0.1.0/data.xml')
=== added file 'mail/migrations/7.0.1.0/pre-migration.py'
--- mail/migrations/7.0.1.0/pre-migration.py 1970-01-01 00:00:00 +0000
+++ mail/migrations/7.0.1.0/pre-migration.py 2013-07-23 18:20:38 +0000
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.openupgrade import openupgrade
+
+column_renames = {
+ 'mail.message': [
+ # Existing fields to ignore
+ ('subtype', None),
+ ('headers', None),
+ ('display_text', None),
+ ('original', None),
+ # Existing fields to transform
+ ('body_text', None),
+ ('body_html', None),
+ ('partner_id', None),
+ ('user_id', None),
+ # Existing fields to move to mail.mail
+ ('email_to', None),
+ ('email_cc', None),
+ ('email_bcc', None),
+ ('reply_to', None),
+ ('references', None),
+ ('state', None),
+ ('autodelete', None),
+ ]}
+
+@openupgrade.migrate()
+def migrate(cr, version):
+ openupgrade.rename_columns(cr, column_renames)
+
=== added file 'mail/migrations/7.0.1.0/user_notes.txt'
--- mail/migrations/7.0.1.0/user_notes.txt 1970-01-01 00:00:00 +0000
+++ mail/migrations/7.0.1.0/user_notes.txt 2013-07-23 18:20:38 +0000
@@ -0,0 +1,1 @@
+In OpenERP 7.0, regular emails and the new chatter functionality share a common base. Existing emails have been transformed on a technical level to fit to this new architecture.
Follow ups