A password reset was requested for the OpenERP account linked to this " +"email.
\n" +"\n" +"You may change your password by following this link.
\n" +"\n" +"Note: If you do not expect this, you can safely ignore this email.
" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:114 +#, python-format +msgid "Please enter a name." +msgstr "" + +#. module: auth_signup +#: model:ir.model,name:auth_signup.model_res_users +msgid "Users" +msgstr "" + +#. module: auth_signup +#: field:res.partner,signup_url:0 +msgid "Signup URL" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:117 +#, python-format +msgid "Please enter a username." +msgstr "" + +#. module: auth_signup +#: selection:res.users,state:0 +msgid "Active" +msgstr "" + +#. module: auth_signup +#: code:addons/auth_signup/res_users.py:270 +#, python-format +msgid "" +"Cannot send email: no outgoing email server configured.\n" +"You can configure it under Settings/General Settings." +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/xml/auth_signup.xml:12 +#, python-format +msgid "Username" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/xml/auth_signup.xml:8 +#, python-format +msgid "Name" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:173 +#, python-format +msgid "Please enter a username or email address." +msgstr "" + +#. module: auth_signup +#: selection:res.users,state:0 +msgid "Resetting Password" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/xml/auth_signup.xml:13 +#, python-format +msgid "Username (Email)" +msgstr "" + +#. module: auth_signup +#: field:res.partner,signup_expiration:0 +msgid "Signup Expiration" +msgstr "" + +#. module: auth_signup +#: help:base.config.settings,auth_signup_reset_password:0 +msgid "This allows users to trigger a password reset from the Login page." +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/xml/auth_signup.xml:25 +#, python-format +msgid "Log in" +msgstr "" + +#. module: auth_signup +#: field:res.partner,signup_valid:0 +msgid "Signup Token is Valid" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:111 +#: code:addons/auth_signup/static/src/js/auth_signup.js:114 +#: code:addons/auth_signup/static/src/js/auth_signup.js:117 +#: code:addons/auth_signup/static/src/js/auth_signup.js:120 +#: code:addons/auth_signup/static/src/js/auth_signup.js:123 +#: code:addons/auth_signup/static/src/js/auth_signup.js:170 +#: code:addons/auth_signup/static/src/js/auth_signup.js:173 +#, python-format +msgid "Login" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:97 +#, python-format +msgid "Invalid signup token" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:123 +#, python-format +msgid "Passwords do not match; please retype them." +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/js/auth_signup.js:111 +#: code:addons/auth_signup/static/src/js/auth_signup.js:170 +#, python-format +msgid "No database selected !" +msgstr "" + +#. module: auth_signup +#: view:res.users:0 +msgid "Reset Password" +msgstr "" + +#. module: auth_signup +#: field:base.config.settings,auth_signup_reset_password:0 +msgid "Enable password reset from Login page" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/xml/auth_signup.xml:30 +#, python-format +msgid "Back to Login" +msgstr "" + +#. module: auth_signup +#. openerp-web +#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22 +#, python-format +msgid "Sign up" +msgstr "" + +#. module: auth_signup +#: model:ir.model,name:auth_signup.model_res_partner +msgid "Partner" +msgstr "" + +#. module: auth_signup +#: field:res.partner,signup_token:0 +msgid "Signup Token" +msgstr "" diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index d4cd1e083b4..397bd193757 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -114,19 +114,6 @@ def real_id2base_calendar_id(real_id, recurrent_date): return '%d-%s' % (real_id, recurrent_date) return real_id -def _links_get(self, cr, uid, context=None): - """ - Get request link. - @param cr: the current row, from the database cursor - @param uid: the current user's ID for security checks - @param context: a standard dictionary for contextual values - @return: list of dictionary which contain object and name and id - """ - obj = self.pool.get('res.request.link') - ids = obj.search(cr, uid, []) - res = obj.read(cr, uid, ids, ['object', 'name'], context=context) - return [(r['object'], r['name']) for r in res] - html_invitation = """ @@ -307,19 +294,6 @@ class calendar_attendee(osv.osv): return result - def _links_get(self, cr, uid, context=None): - """ - Get request link for ref field in calendar attendee. - @param cr: the current row, from the database cursor - @param uid: the current user's id for security checks - @param context: A standard dictionary for contextual values - @return: list of dictionary which contain object and name and id - """ - obj = self.pool.get('res.request.link') - ids = obj.search(cr, uid, []) - res = obj.read(cr, uid, ids, ['object', 'name'], context=context) - return [(r['object'], r['name']) for r in res] - def _lang_get(self, cr, uid, context=None): """ Get language for language selection field. @@ -385,7 +359,7 @@ property or property parameter."), 'event_end_date': fields.function(_compute_data, \ string='Event End Date', type="datetime", \ multi='event_end_date'), - 'ref': fields.reference('Event Ref', selection=_links_get, size=128), + 'ref': fields.reference('Event Ref', selection=openerp.addons.base.res.res_request.referencable_models, size=128), 'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"), } _defaults = { @@ -1208,20 +1182,44 @@ rule or repeating pattern of time to exclude from the recurring rule."), new_rrule_str = ';'.join(new_rrule_str) rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule']) for r_date in rdates: - ok = True + # fix domain evaluation + # step 1: check date and replace expression by True or False, replace other expressions by True + # step 2: evaluation of & and | + # check if there are one False + pile = [] for arg in domain: - if arg[0] in ('date', 'date_deadline'): - if (arg[1]=='='): - ok = ok and r_date.strftime('%Y-%m-%d')==arg[2] - if (arg[1]=='>'): - ok = ok and r_date.strftime('%Y-%m-%d')>arg[2] - if (arg[1]=='<'): - ok = ok and r_date.strftime('%Y-%m-%d')Choose a template to display its values. diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py index d5feea9ebc4..ccc8a49b875 100644 --- a/addons/email_template/tests/test_mail.py +++ b/addons/email_template/tests/test_mail.py @@ -20,10 +20,10 @@ ############################################################################## import base64 -from openerp.addons.mail.tests.test_mail_base import TestMailBase +from openerp.addons.mail.tests.common import TestMail -class test_message_compose(TestMailBase): +class test_message_compose(TestMail): def setUp(self): super(test_message_compose, self).setUp() @@ -73,7 +73,7 @@ class test_message_compose(TestMailBase): # 1. Comment on pigs compose_id = mail_compose.create(cr, uid, - {'subject': 'Forget me subject', 'body': '
Dummy body
'}, + {'subject': 'Forget me subject', 'body': 'Dummy body
', 'post': True}, {'default_composition_mode': 'comment', 'default_model': 'mail.group', 'default_res_id': self.group_pigs_id, @@ -101,7 +101,7 @@ class test_message_compose(TestMailBase): 'default_template_id': email_template_id, 'active_ids': [self.group_pigs_id, self.group_bird_id] } - compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body'}, context) + compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body', 'post': True}, context) compose = mail_compose.browse(cr, uid, compose_id, context) onchange_res = compose.onchange_template_id(email_template_id, 'comment', 'mail.group', self.group_pigs_id)['value'] onchange_res['partner_ids'] = [(4, partner_id) for partner_id in onchange_res.pop('partner_ids', [])] @@ -145,7 +145,7 @@ class test_message_compose(TestMailBase): 'default_partner_ids': [p_a_id], 'active_ids': [self.group_pigs_id, self.group_bird_id] } - compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body'}, context) + compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body', 'post': True}, context) compose = mail_compose.browse(cr, uid, compose_id, context) onchange_res = compose.onchange_template_id(email_template_id, 'mass_mail', 'mail.group', self.group_pigs_id)['value'] onchange_res['partner_ids'] = [(4, partner_id) for partner_id in onchange_res.pop('partner_ids', [])] diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 0aab765efbf..bae7a0d8f9c 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -62,6 +62,7 @@ class mail_compose_message(osv.TransientModel): for wizard in self.browse(cr, uid, ids, context=context): if wizard.template_id: wizard_context['mail_notify_user_signature'] = False # template user_signature is added when generating body_html + wizard_context['mail_auto_delete'] = wizard.template_id.auto_delete # mass mailing: use template auto_delete value -> note, for emails mass mailing only if not wizard.attachment_ids or wizard.composition_mode == 'mass_mail' or not wizard.template_id: continue new_attachment_ids = [] @@ -81,7 +82,7 @@ class mail_compose_message(osv.TransientModel): template_values = self.pool.get('email.template').read(cr, uid, template_id, fields, context) values = dict((field, template_values[field]) for field in fields if template_values.get(field)) elif template_id: - values = self.generate_email_for_composer(cr, uid, template_id, res_id, context=context) + values = self.generate_email_for_composer_batch(cr, uid, template_id, [res_id], context=context)[res_id] # transform attachments into attachment_ids; not attached to the document because this will # be done further in the posting process, allowing to clean database if email not send values['attachment_ids'] = values.pop('attachment_ids', []) @@ -147,45 +148,55 @@ class mail_compose_message(osv.TransientModel): partner_ids.append(int(partner_id)) return partner_ids - def generate_email_for_composer(self, cr, uid, template_id, res_id, context=None): + def generate_email_for_composer_batch(self, cr, uid, template_id, res_ids, context=None): """ Call email_template.generate_email(), get fields relevant for mail.compose.message, transform email_cc and email_to into partner_ids """ - template_values = self.pool.get('email.template').generate_email(cr, uid, template_id, res_id, context=context) # filter template values fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'attachments', 'mail_server_id'] - values = dict((field, template_values[field]) for field in fields if template_values.get(field)) - values['body'] = values.pop('body_html', '') + values = dict.fromkeys(res_ids, False) - # transform email_to, email_cc into partner_ids - ctx = dict((k, v) for k, v in (context or {}).items() if not k.startswith('default_')) - partner_ids = self._get_or_create_partners_from_values(cr, uid, values, context=ctx) - # legacy template behavior: void values do not erase existing values and the - # related key is removed from the values dict - if partner_ids: - values['partner_ids'] = list(partner_ids) + template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, context=context) + for res_id in res_ids: + res_id_values = dict((field, template_values[res_id][field]) for field in fields if template_values[res_id].get(field)) + res_id_values['body'] = res_id_values.pop('body_html', '') + # transform email_to, email_cc into partner_ids + ctx = dict((k, v) for k, v in (context or {}).items() if not k.startswith('default_')) + partner_ids = self._get_or_create_partners_from_values(cr, uid, res_id_values, context=ctx) + # legacy template behavior: void values do not erase existing values and the + # related key is removed from the values dict + if partner_ids: + res_id_values['partner_ids'] = list(partner_ids) + + values[res_id] = res_id_values return values - def render_message(self, cr, uid, wizard, res_id, context=None): + def render_message_batch(self, cr, uid, wizard, res_ids, context=None): """ Override to handle templates. """ - # generate the composer email + # generate template-based values if wizard.template_id: - values = self.generate_email_for_composer(cr, uid, wizard.template_id.id, res_id, context=context) + template_values = self.generate_email_for_composer_batch(cr, uid, wizard.template_id.id, res_ids, context=context) else: - values = {} - # remove attachments as they should not be rendered - values.pop('attachment_ids', None) - # get values to return - email_dict = super(mail_compose_message, self).render_message(cr, uid, wizard, res_id, context) - # those values are not managed; they are readonly - email_dict.pop('email_to', None) - email_dict.pop('email_cc', None) - email_dict.pop('partner_to', None) - # update template values by wizard values - values.update(email_dict) - return values + template_values = dict.fromkeys(res_ids, dict()) + # generate composer values + composer_values = super(mail_compose_message, self).render_message_batch(cr, uid, wizard, res_ids, context) - def render_template(self, cr, uid, template, model, res_id, context=None): - return self.pool.get('email.template').render_template(cr, uid, template, model, res_id, context=context) + for res_id in res_ids: + # remove attachments from template values as they should not be rendered + template_values[res_id].pop('attachment_ids', None) + # remove some keys from composer that are readonly + composer_values[res_id].pop('email_to', None) + composer_values[res_id].pop('email_cc', None) + composer_values[res_id].pop('partner_to', None) + # update template values by composer values + template_values[res_id].update(composer_values[res_id]) + return template_values + + def render_template_batch(self, cr, uid, template, model, res_ids, context=None): + return self.pool.get('email.template').render_template_batch(cr, uid, template, model, res_ids, context=context) + + # Compatibility methods + def generate_email_for_composer(self, cr, uid, template_id, res_id, context=None): + return self.generate_email_for_composer_batch(cr, uid, template_id, [res_id], context)[res_id] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/email_template/wizard/mail_compose_message_view.xml b/addons/email_template/wizard/mail_compose_message_view.xml index 3cb83896ca2..b7c57af2679 100644 --- a/addons/email_template/wizard/mail_compose_message_view.xml +++ b/addons/email_template/wizard/mail_compose_message_view.xml @@ -11,7 +11,7 @@ -\n" +" Click to create a marketing campaign.\n" +"
\n" +" OpenERP's marketing campaign allows you to automate " +"communication\n" +" to your prospects. You can define a segment (set of conditions) " +"on\n" +" your leads and partners to fullfil the campaign.\n" +"
\n" +" A campaign can have many activities like sending an email, " +"printing\n" +" a letter, assigning to a team, etc. These activities are " +"triggered\n" +" from specific situations; contact form, 10 days after first\n" +" contact, if a lead is not closed yet, etc.\n" +"
\n" +" " +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.transition,interval_nbr:0 +msgid "Interval Value" +msgstr "" + +#. module: marketing_campaign +#: field:campaign.analysis,revenue:0 +#: field:marketing.campaign.activity,revenue:0 +msgid "Revenue" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "September" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "December" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign,partner_field_id:0 +msgid "" +"The generated workitems will be linked to the partner related to the record. " +"If the record is the partner itself leave this field empty. This is useful " +"for reporting purposes, via the Campaign Analysis or Campaign Follow-up " +"views." +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: field:campaign.analysis,month:0 +msgid "Month" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.transition,activity_to_id:0 +msgid "Next Activity" +msgstr "" + +#. module: marketing_campaign +#: model:ir.actions.act_window,name:marketing_campaign.act_marketing_campaing_stat +#: model:ir.actions.act_window,name:marketing_campaign.action_marketing_campaign_workitem +#: model:ir.ui.menu,name:marketing_campaign.menu_action_marketing_campaign_workitem +msgid "Campaign Follow-up" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign:0 +msgid "Test Mode" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign.segment,sync_mode:0 +msgid "Only records modified after last sync (no duplicates)" +msgstr "" + +#. module: marketing_campaign +#: model:ir.model,name:marketing_campaign.model_ir_actions_report_xml +msgid "ir.actions.report.xml" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign:0 +msgid "Campaign Statistics" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.activity,server_action_id:0 +msgid "The action to perform when this activity is activated" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign,partner_field_id:0 +msgid "Partner Field" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: model:ir.actions.act_window,name:marketing_campaign.action_campaign_analysis_all +#: model:ir.model,name:marketing_campaign.model_campaign_analysis +#: model:ir.ui.menu,name:marketing_campaign.menu_action_campaign_analysis_all +msgid "Campaign Analysis" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.segment,sync_mode:0 +msgid "" +"Determines an additional criterion to add to the filter when selecting new " +"records to inject in the campaign. \"No duplicates\" prevents selecting " +"records which have already entered the campaign previously.If the campaign " +"has a \"unique field\" set, \"no duplicates\" will also prevent selecting " +"records which have the same value for the unique field as other records that " +"already entered the campaign." +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign,mode:0 +msgid "Test in Realtime" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign,mode:0 +msgid "Test Directly" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,report_directory_id:0 +msgid "Directory" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign:0 +#: view:marketing.campaign.segment:0 +msgid "Draft" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.workitem:0 +msgid "Marketing Campaign Activity" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.workitem:0 +msgid "Preview" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: field:campaign.analysis,state:0 +#: view:marketing.campaign:0 +#: field:marketing.campaign,state:0 +#: view:marketing.campaign.segment:0 +#: field:marketing.campaign.segment,state:0 +#: view:marketing.campaign.workitem:0 +#: field:marketing.campaign.workitem,state:0 +msgid "Status" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "August" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign,mode:0 +msgid "Normal" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.activity,start:0 +msgid "This activity is launched when the campaign starts." +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.activity,signal:0 +msgid "" +"An activity with a signal can be called programmatically. Be careful, the " +"workitem is always created when a signal is sent" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: selection:campaign.analysis,state:0 +#: view:marketing.campaign.workitem:0 +#: selection:marketing.campaign.workitem,state:0 +msgid "To Do" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "June" +msgstr "" + +#. module: marketing_campaign +#: model:ir.model,name:marketing_campaign.model_email_template +msgid "Email Templates" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "Sync mode: all records" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign.segment,sync_mode:0 +msgid "All records (no duplicates)" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "Newly Created" +msgstr "" + +#. module: marketing_campaign +#: field:campaign.analysis,date:0 +msgid "Date" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "November" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,condition:0 +msgid "Condition" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.activity,report_id:0 +msgid "The report to generate when this activity is activated" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign,unique_field_id:0 +msgid "Unique Field" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,state:0 +#: view:marketing.campaign.workitem:0 +#: selection:marketing.campaign.workitem,state:0 +msgid "Exception" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "October" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,email_template_id:0 +msgid "Email Template" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "January" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.workitem:0 +#: field:marketing.campaign.workitem,date:0 +msgid "Execution Date" +msgstr "" + +#. module: marketing_campaign +#: model:ir.model,name:marketing_campaign.model_marketing_campaign_workitem +msgid "Campaign Workitem" +msgstr "" + +#. module: marketing_campaign +#: model:ir.model,name:marketing_campaign.model_marketing_campaign_activity +msgid "Campaign Activity" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.activity,report_directory_id:0 +msgid "This folder is used to store the generated reports" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:136 +#: code:addons/marketing_campaign/marketing_campaign.py:148 +#: code:addons/marketing_campaign/marketing_campaign.py:158 +#, python-format +msgid "Error" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,server_action_id:0 +msgid "Action" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:528 +#, python-format +msgid "Automatic transition" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,start:0 +msgid "Start" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:819 +#, python-format +msgid "No preview" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.workitem:0 +msgid "Process" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:530 +#: selection:marketing.campaign.transition,trigger:0 +#, python-format +msgid "Cosmetic" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.transition,trigger:0 +msgid "How is the destination workitem triggered" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: selection:campaign.analysis,state:0 +#: view:marketing.campaign:0 +#: selection:marketing.campaign,state:0 +#: selection:marketing.campaign.segment,state:0 +#: selection:marketing.campaign.workitem,state:0 +msgid "Done" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:214 +#, python-format +msgid "Operation not supported" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.workitem:0 +msgid "Cancel" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "Close" +msgstr "" + +#. module: marketing_campaign +#: constraint:marketing.campaign.segment:0 +msgid "Model of filter must be same as resource model of Campaign " +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "Synchronize Manually" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.workitem:0 +#: field:marketing.campaign.workitem,res_id:0 +msgid "Resource ID" +msgstr "" + +#. module: marketing_campaign +#: model:ir.model,name:marketing_campaign.model_marketing_campaign_transition +msgid "Campaign Transition" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "Marketing Campaign Segment" +msgstr "" + +#. module: marketing_campaign +#: model:ir.actions.act_window,name:marketing_campaign.act_marketing_campaing_segment_opened +#: model:ir.actions.act_window,name:marketing_campaign.action_marketing_campaign_segment_form +#: model:ir.ui.menu,name:marketing_campaign.menu_marketing_campaign_segment_form +#: view:marketing.campaign:0 +#: view:marketing.campaign.segment:0 +msgid "Segments" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,keep_if_condition_not_met:0 +msgid "Don't Delete Workitems" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.activity:0 +msgid "Incoming Transitions" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign.transition,interval_type:0 +msgid "Day(s)" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign:0 +#: field:marketing.campaign,activity_ids:0 +#: view:marketing.campaign.activity:0 +msgid "Activities" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign,mode:0 +msgid "With Manual Confirmation" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "May" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,type:0 +msgid "Type" +msgstr "" + +#. module: marketing_campaign +#: model:email.template,subject:marketing_campaign.email_template_3 +msgid "Congratulations! You are now one of our Gold Partners!" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign,unique_field_id:0 +msgid "" +"If set, this field will help segments that work in \"no duplicates\" mode to " +"avoid selecting similar records twice. Similar records are records that have " +"the same value for this unique field. For example by choosing the " +"\"email_from\" field for CRM Leads you would prevent sending the same " +"campaign to the same email address again. If not set, the \"no duplicates\" " +"segments will only avoid selecting the same record again if it entered the " +"campaign previously. Only easily comparable fields like textfields, " +"integers, selections or single relationships may be used." +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:529 +#, python-format +msgid "After %(interval_nbr)d %(interval_type)s" +msgstr "" + +#. module: marketing_campaign +#: model:ir.model,name:marketing_campaign.model_marketing_campaign +#: view:marketing.campaign:0 +msgid "Marketing Campaign" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.segment,date_done:0 +msgid "End Date" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "February" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: field:campaign.analysis,res_id:0 +#: view:marketing.campaign:0 +#: field:marketing.campaign,object_id:0 +#: field:marketing.campaign.segment,object_id:0 +#: view:marketing.campaign.workitem:0 +#: field:marketing.campaign.workitem,object_id:0 +msgid "Resource" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign,fixed_cost:0 +msgid "" +"Fixed cost for running this campaign. You may also specify variable cost and " +"revenue on each campaign activity. Cost and Revenue statistics are included " +"in Campaign Reporting." +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "Sync mode: only records updated after last sync" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:793 +#, python-format +msgid "Email Preview" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,signal:0 +msgid "Signal" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.workitem,date:0 +msgid "If date is not set, this workitem has to be run manually" +msgstr "" + +#. module: marketing_campaign +#: selection:campaign.analysis,month:0 +msgid "April" +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:158 +#, python-format +msgid "The campaign cannot be marked as done before all segments are closed." +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign:0 +#: field:marketing.campaign,mode:0 +msgid "Mode" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: field:campaign.analysis,activity_id:0 +#: view:marketing.campaign.workitem:0 +#: field:marketing.campaign.workitem,activity_id:0 +msgid "Activity" +msgstr "" + +#. module: marketing_campaign +#: help:marketing.campaign.segment,ir_filter_id:0 +msgid "" +"Filter to select the matching resource records that belong to this segment. " +"New filters can be created and saved using the advanced search on the list " +"view of the Resource. If no filter is set, all records are selected without " +"filtering. The synchronization mode may also add a criterion to the filter." +msgstr "" + +#. module: marketing_campaign +#: code:addons/marketing_campaign/marketing_campaign.py:136 +#, python-format +msgid "The campaign cannot be started. There are no activities in it." +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.segment,date_next_sync:0 +msgid "Next Synchronization" +msgstr "" + +#. module: marketing_campaign +#: model:email.template,body_html:marketing_campaign.email_template_2 +msgid "" +"Hi, we are delighted to welcome you among our Silver Partners as of today!" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.segment,ir_filter_id:0 +msgid "Filter" +msgstr "" + +#. module: marketing_campaign +#: view:marketing.campaign.segment:0 +msgid "All" +msgstr "" + +#. module: marketing_campaign +#: selection:marketing.campaign.segment,sync_mode:0 +msgid "Only records created after last sync" +msgstr "" + +#. module: marketing_campaign +#: field:marketing.campaign.activity,variable_cost:0 +msgid "Variable Cost" +msgstr "" + +#. module: marketing_campaign +#: model:email.template,subject:marketing_campaign.email_template_1 +msgid "Welcome to the OpenERP Partner Channel!" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: field:campaign.analysis,total_cost:0 +msgid "Cost" +msgstr "" + +#. module: marketing_campaign +#: view:campaign.analysis:0 +#: field:campaign.analysis,year:0 +msgid "Year" +msgstr "" diff --git a/addons/mass_mailing/__init__.py b/addons/mass_mailing/__init__.py new file mode 100644 index 00000000000..9dadc456842 --- /dev/null +++ b/addons/mass_mailing/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2013-today OpenERP SA (
+ Sent:
+ Campaign:
+
+ Sent
+
+
+ Delivered
+
+
+ Opened
+
+
+ Replied
+
+
+ Sent
+
+
+ Delivered
+
+
+ Opened
+
+
+ Replied
+
+ Click to define a new mass mailing campaign. +
+ Create a campaign to structure mass mailing and get analysis from email status. +
+
+ +Easily send mass mailing to your leads, opportunities or customers. Track +marketing campaigns performance to improve conversion rates. Design +professional emails and reuse templates in a few clicks. +
+ ++Import database of prospects or filter on +existing leads, opportunities and customers in just a few clicks. +
+Define email templates to reuse content or specific design for your newsletter. +Setup several email servers with their own IP/domain to optimise opening rates. +
+
+
+ + Get real time statistics on campaigns performance to improve your + conversion rate. Track mails sent, received, opened and + answered. +
+ Easily manage your marketing campaigns, discussion groups, + leads and opportunities in one simple and powerful platform. +
++Get access to mass mailing features from every OpenERP app to improve +the way your users communicate. +
+Send template of emails from CRM opportunities, select leads based on +marketing segments, send jobs offers and automate answers to applicants, reuse +email template in the lead automation marketing campaigns. +
+Answers to your emails appears automatically in the history of every document with the +social network module. +
+
+
+ + Get a clean lead database that improves over the time using the + performance of your mails. OpenERP handle bounce mails + efficiently, flag erroneous leads accordingly and gives you + statistics on the quality of your leads. +
++The marketing department will love working on campaigns. But you can also +give a one click mass mailing facility to all others users on their own +prospects or documents. +
+Select a few documents (e.g. leads, support tickets, suppliers, applicants, +...) and send emails to their contacts in one click, reusing existing emails +templates. +
+
+
+ +The chatter feature enables you to communicate faster and more efficiently with +your customer. Get documents created automatically (leads, opportunities, +tasks, ...) based on answers to your mass mailing campaigns Follow the +discussion directly on the business documents within OpenERP or via email. +
+Get all the negotiations and discussions attached to the right document +and relevent managers notified on specific events. +
++Get the insights you need to make smarter marketing campaign. Track statistics +per campaign: bounce rates, sent mails, best content, etc. The clear dashboards +gives you a direct overview of your campaign performance. +
+
+
+ + Define automated actions (e.g. ask a salesperson to call, send + an email, ...) based on triggers (no activity since 20 days, + answered a promotional email, etc.) +
+ Optimize campaigns from lead to close, on every channel. Make + smarter decisions about where to invest and show the impact of + your marketing activities on your company's bottom line. +
+
+ + Integrate a contact form in your website easily. Forms + submissions create leads automatically in OpenERP CRM. Leads + can be used in marketing campaigns. +
+
+ +Manage your sales funnel with no effort. Attract leads, follow-up on phone +calls and meetings. Analyse the quality of your leads to make informed +decisions and save time by integrating emails directly into the application. +
+Hardware Status
diff --git a/addons/point_of_sale/wizard/pos_session_opening.xml b/addons/point_of_sale/wizard/pos_session_opening.xml index a7dbe43c962..5aa3f8d4764 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.xml +++ b/addons/point_of_sale/wizard/pos_session_opening.xml @@ -15,7 +15,7 @@Hello ${object.partner_id.name},
\n" +" \n" +"Here is your ${object.state in ('draft', 'sent') and 'quotation' or " +"'order confirmation'} from ${object.company_id.name}:
\n" +"\n" +"\n"
+" REFERENCES
\n"
+" Order number: ${object.name}
\n"
+" Order total: ${object.amount_total} "
+"${object.pricelist_id.currency_id.name}
\n"
+" Order date: ${object.date_order}
\n"
+" % if object.origin:\n"
+" Order reference: ${object.origin}
\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" Your reference: ${object.client_order_ref}
\n"
+" % endif\n"
+" % if object.user_id:\n"
+" Your contact: ${object.user_id.name}\n"
+" % endif\n"
+"
\n" +" You can access this document and pay online via our Customer Portal:\n" +"
\n" +" View ${object.state in ('draft', 'sent') " +"and 'Quotation' or 'Order'}\n" +" % endif\n" +"\n" +" % if object.paypal_url:\n" +"It is also possible to directly pay with Paypal:
\n" +" \n" +"If you have any question, do not hesitate to contact us.
\n" +"Thank you for choosing ${object.company_id.name or 'us'}!
\n" +"Здравствуйте, ${object.partner_id.name}!
\n" +" \n" +"Направляем Вам ${object.state in ('draft', 'sent') and 'предложение' " +"or 'подтверждение заказа'} от ${object.company_id.name}:
\n" +"\n" +"\n"
+" СВОДКА
\n"
+" Заказ: ${object.name}
\n"
+" Итог: ${object.amount_total} "
+"${object.pricelist_id.currency_id.name}
\n"
+" Дата: ${object.date_order}
\n"
+" % if object.origin:\n"
+" Основание заказа: ${object.origin}
\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" Ваша ссылка: ${object.client_order_ref}
\n"
+" % endif\n"
+" % if object.user_id:\n"
+" Ваш контакт: ${object.user_id.name}\n"
+" % endif\n"
+"
\n" +" Вы можете ознакомиться с этим документом онлайн и узнать о вариантах " +"оплаты через наш Портал:\n" +"
\n" +" Посмотреть ${object.state in ('draft', " +"'sent') and 'Предложение' or 'Заказ'}\n" +" % endif\n" +"\n" +" % if object.paypal_url:\n" +"Также возможно произвести оплату непосредственно через Paypal:
\n" +" \n" +"Если у Вас есть вопросы - пожалуйста, свяжитесь с нами.
\n" +"Спасибо, что выбрали ${object.company_id.name or 'нас'}!
\n" +"Hello ${object.partner_id.name},
\n" +"\n" +"A new invoice is available for you:
\n" +" \n" +"\n"
+" REFERENCES
\n"
+" Invoice number: ${object.number}
\n"
+" Invoice total: ${object.amount_total} "
+"${object.currency_id.name}
\n"
+" Invoice date: ${object.date_invoice}
\n"
+" % if object.origin:\n"
+" Order reference: ${object.origin}
\n"
+" % endif\n"
+" % if object.user_id:\n"
+" Your contact: ${object.user_id.name}\n"
+" % endif\n"
+"
\n" +" You can access the invoice document and pay online via our Customer " +"Portal:\n" +"
\n" +" View Invoice\n" +" % endif\n" +" \n" +" % if object.paypal_url:\n" +"It is also possible to directly pay with Paypal:
\n" +" \n" +"If you have any question, do not hesitate to contact us.
\n" +"Thank you for choosing ${object.company_id.name or 'us'}!
\n" +"Здравствуйте, ${object.partner_id.name},
\n" +"\n" +"Вам выставлен счёт:
\n" +" \n" +"\n"
+" СВОДКА
\n"
+" Счёт: ${object.number}
\n"
+" Итог: ${object.amount_total} "
+"${object.currency_id.name}
\n"
+" Дата: ${object.date_invoice}
\n"
+" % if object.origin:\n"
+" Основание: ${object.origin}
\n"
+" % endif\n"
+" % if object.user_id:\n"
+" Ваш контакт: ${object.user_id.name}\n"
+" % endif\n"
+"
\n" +" Вы можете ознакомиться с документом онлайн и узнать о вариантах оплаты " +"через наш Портал:\n" +"
\n" +" Посмотреть счёт\n" +" % endif\n" +" \n" +" % if object.paypal_url:\n" +"Также возможно произвести оплату через Paypal:
\n" +" \n" +"Если у Вас есть вопросы - пожалуйста, свяжитесь с нами.
\n" +"Спасибо, что выбрали ${object.company_id.name or 'нас'}!
\n" +"