diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 8df291a98d1..095d461ff3b 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -430,7 +430,7 @@ class account_bank_statement(osv.osv): 'name': st_number, 'balance_end_real': st.balance_end }, context=context) - self.message_append_note(cr, uid, [st.id], body=_('Statement %s is confirmed, journal items are created.') % (st_number,), context=context) + self.message_post(cr, uid, [st.id], body=_('Statement %s confirmed, journal items were created.') % (st_number,), context=context) return self.write(cr, uid, ids, {'state':'confirm'}, context=context) def button_cancel(self, cr, uid, ids, context=None): diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 78ef090ebbe..15027b7a8f6 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1045,7 +1045,7 @@ class account_invoice(osv.osv): if obj_inv.type in ('out_invoice', 'out_refund'): ctx = self.get_log_context(cr, uid, context=ctx) message = _("Invoice '%s' is validated.") % name - self.message_append_note(cr, uid, [inv_id], body=message, context=context) + self.message_post(cr, uid, [inv_id], body=message, context=context) return True def action_cancel(self, cr, uid, ids, *args): @@ -1275,7 +1275,7 @@ class account_invoice(osv.osv): # TODO: use currency's formatting function msg = _("Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining).") % \ (name, pay_amount, code, invoice.amount_total, code, total, code) - self.message_append_note(cr, uid, [inv_id], body=msg, context=context) + self.message_post(cr, uid, [inv_id], body=msg, context=context) self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context) # Update the stored value (fields.function), so we write to trigger recompute @@ -1288,24 +1288,25 @@ class account_invoice(osv.osv): def _get_document_type(self, type): type_dict = { - 'out_invoice': 'Customer invoice', - 'in_invoice': 'Supplier invoice', - 'out_refund': 'Customer Refund', - 'in_refund': 'Supplier Refund', + # Translation markers will have no effect at runtime, only used to properly flag export + 'out_invoice': _('Customer invoice'), + 'in_invoice': _('Supplier invoice'), + 'out_refund': _('Customer Refund'), + 'in_refund': _('Supplier Refund'), } return type_dict.get(type, 'Invoice') def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id],body=_("%s created.") % (self._get_document_type(obj.type)), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s created.") % (_(self._get_document_type(obj.type))), context=context) def confirm_paid_send_note(self, cr, uid, ids, context=None): - for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("%s paid.") % (self._get_document_type(obj.type)), context=context) + for obj in self.browse(cr, uid, ids, context=context): + self.message_post(cr, uid, [obj.id], body=_("%s paid.") % (_(self._get_document_type(obj.type))), context=context) def invoice_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("%s cancelled.") % (self._get_document_type(obj.type)), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s cancelled.") % (_(self._get_document_type(obj.type))), context=context) account_invoice() diff --git a/addons/account/edi/invoice_action_data.xml b/addons/account/edi/invoice_action_data.xml index 0eec6d27785..53fa03a6902 100644 --- a/addons/account/edi/invoice_action_data.xml +++ b/addons/account/edi/invoice_action_data.xml @@ -123,64 +123,6 @@ ]]> - '%(object.user_id.email) or ''} - -You can view the invoice document, download it and pay online using the following link: - ${ctx.get('edi_web_url_view') or 'n/a'} - -% if object.company_id.paypal_account and object.type in ('out_invoice', 'in_refund'): -<% -comp_name = quote(object.company_id.name) -inv_number = quote(object.number) -paypal_account = quote(object.company_id.paypal_account) -inv_amount = quote(str(object.amount_total)) -cur_name = quote(object.currency_id.name) -paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=%s&item_name=%s%%20Invoice%%20%s"\ - "&invoice=%s&amount=%s¤cy_code=%s&button_subtype=services&no_note=1&bn=OpenERP_Invoice_PayNow_%s" % \ - (paypal_account,comp_name,inv_number,inv_number,inv_amount,cur_name,cur_name) -%> -It is also possible to directly pay with Paypal: - ${paypal_url} -% endif - -If you have any question, do not hesitate to contact us. - - -Thank you for choosing ${object.company_id.name}! - - --- -${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} -${object.company_id.name} -% if object.company_id.street: -${object.company_id.street or ''} -% endif -% if object.company_id.street2: -${object.company_id.street2} -% endif -% if object.company_id.city or object.company_id.zip: -${object.company_id.zip or ''} ${object.company_id.city or ''} -% endif -% if object.company_id.country_id: -${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''} -% endif -% if object.company_id.phone: -Phone: ${object.company_id.phone} -% endif -% if object.company_id.website: -${object.company_id.website or ''} -% endif - ]]> diff --git a/addons/account/i18n/account.pot b/addons/account/i18n/account.pot index 174002a8d8d..0d5439719e2 100644 --- a/addons/account/i18n/account.pot +++ b/addons/account/i18n/account.pot @@ -9538,7 +9538,7 @@ msgid "Refund" msgstr "" #. module: account -#: model:email.template,body_text:account.email_template_edi_invoice +#: model:email.template,body:account.email_template_edi_invoice msgid "\n" "Hello${object.address_invoice_id.name and ' ' or ''}${object.address_invoice_id.name or ''},\n" "\n" diff --git a/addons/account_accountant/account_accountant_data.xml b/addons/account_accountant/account_accountant_data.xml index 383b53cf49e..5b563017c62 100644 --- a/addons/account_accountant/account_accountant_data.xml +++ b/addons/account_accountant/account_accountant_data.xml @@ -21,13 +21,14 @@ - - - - Module Accounting and Finance has been installed. - With OpenERP's accounting, you can get an instant access to all your financial data, setup your analytic accounting, forecast your taxes, control your budgets, easily create and send invoices, record bank statements, etc. + + mail.group + + notification + Accounting and Finance application installed! + With OpenERP's accounting, you get instant access to your financial data, and can setup analytic accounting, forecast taxes, control budgets, easily create and send invoices, record bank statements, etc. -The accounting features are fully integrated with others OpenERP applications to automate all your processes: creation of customer invoices, control of supplier invoices, point-of-sale integration, automated follow-ups, etc. - +The accounting features are fully integrated with other OpenERP applications to automate all your processes: creation of customer invoices, control of supplier invoices, point-of-sale integration, automated follow-ups, etc. + diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py index d151d2171a4..1e84681b1ea 100644 --- a/addons/account_followup/wizard/account_followup_print.py +++ b/addons/account_followup/wizard/account_followup_print.py @@ -213,8 +213,6 @@ class account_followup_print_all(osv.osv_memory): mod_obj = self.pool.get('ir.model.data') move_obj = self.pool.get('account.move.line') user_obj = self.pool.get('res.users') - line_obj = self.pool.get('account_followup.stat') - mail_message = self.pool.get('mail.message') if context is None: context = {} @@ -235,13 +233,7 @@ class account_followup_print_all(osv.osv_memory): total_amt += line.debit - line.credit dest = False if partner: - if partner.type=='contact': - if adr.email: - dest = [partner.email] - if (not dest) and partner.type=='default': - if partner.email: - dest = [partner.email] - src = tools.config.options['email_from'] + dest = [partner.email] if not data.partner_lang: body = data.email_body else: @@ -281,7 +273,12 @@ class account_followup_print_all(osv.osv_memory): msg = '' if dest: try: - mail_message.schedule_with_attach(cr, uid, src, dest, sub, body, context=context) + vals = {'state': 'outgoing', + 'subject': sub, + 'body_html': '
%s
' % body, + 'email_to': dest, + 'email_from': data_user.email or tools.config.options['email_from']} + self.pool.get('mail.mail').create(cr, uid, vals, context=context) msg_sent += partner.name + '\n' except Exception, e: raise osv.except_osv('Error !', e ) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 223705af85e..f75cda8cdde 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -1293,17 +1293,17 @@ class account_voucher(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s created." % self._document_type[obj.type or False] - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) def post_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s '%s' is posted." % (self._document_type[obj.type or False], obj.move_id.name) - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) def reconcile_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s reconciled." % self._document_type[obj.type or False] - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) account_voucher() diff --git a/addons/account_voucher/account_voucher_data.xml b/addons/account_voucher/account_voucher_data.xml index 8be2851a434..656d2c2cd91 100644 --- a/addons/account_voucher/account_voucher_data.xml +++ b/addons/account_voucher/account_voucher_data.xml @@ -2,15 +2,16 @@ - - - - Module eInvoicing & Payments has been installed. - OpenERP's electronic invoicing allows to ease and fasten the creation of invoices and collection of customer payments. Invoices are created in a few clicks and your customers receive them by email. They can pay online and/or import them in their own system. + + mail.group + + notification + eInvoicing & Payments application installed! + OpenERP's electronic invoicing accelerates the creation of invoices and collection of customer payments. Invoices are created in a few clicks and your customers receive them by email. They can pay online and/or import them in their own system. -You can track customer payments easily and automate the reminders. You get an overview of the discussion with your customers on each invoice to ensure a full traceability. +You can track customer payments easily and automate follow-ups. You get an overview of the discussion with your customers on each invoice for easier traceability. -If you want to use advanced accounting features, you should install the "Accounting and Finance" module. - +For advanced accounting features, you should install the "Accounting and Finance" module. + diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 7eeb9266e47..d90e2006a71 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -297,7 +297,7 @@ class account_analytic_account(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Contract for %s has been created.") % (obj.partner_id.name), context=context) + self.message_post(cr, uid, [obj.id], body=_("Contract for %s has been created.") % (obj.partner_id.name), context=context) account_analytic_account() diff --git a/addons/auth_reset_password/auth_reset_password.xml b/addons/auth_reset_password/auth_reset_password.xml index 26ea8878c45..b7d7e0baef6 100644 --- a/addons/auth_reset_password/auth_reset_password.xml +++ b/addons/auth_reset_password/auth_reset_password.xml @@ -9,16 +9,13 @@ ]]> Password reset - A password reset was requested the OpenERP account linked to this email on ${object._auth_reset_password_host()}

-You may change your password following this link: +

You may change your password following this link, +or by copy-pasting the following URL in your browser: ${object._auth_reset_password_link()}

-${object._auth_reset_password_link()} - -If you don't have asked for password reset, you can safely ignore this email. - -]]>
+

Note: If you did not ask for a password reset, you can safely ignore this email.

]]> diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index b6eacda63c0..7e9bbacab13 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -302,33 +302,27 @@ the rule to mark CC(mail to any other person defined in actions)."), return self.format_body(body % data) def email_send(self, cr, uid, obj, emails, body, emailfrom=None, context=None): - """ send email - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param email: pass the emails - @param emailfrom: Pass name the email From else False - @param context: A standard dictionary for contextual values """ - if not emailfrom: - emailfrom = tools.config.get('email_from', False) - - if context is None: - context = {} - - mail_message = self.pool.get('mail.message') + emailfrom = tools.config.get('email_from') body = self.format_mail(obj, body) - if not emailfrom: - if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: - emailfrom = obj.user_id.email - - name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) + if not emailfrom and hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: + emailfrom = obj.user_id.email emailfrom = tools.ustr(emailfrom) reply_to = emailfrom if not emailfrom: raise osv.except_osv(_('Error!'), - _("No email ID found for your company address.")) - return mail_message.schedule_with_attach(cr, uid, emailfrom, emails, name, body, model='base.action.rule', reply_to=reply_to, res_id=obj.id) + _("Missing default email address or missing email on responsible user")) + return self.pool.get('mail.mail').create(cr, uid, + { 'email_from': emailfrom, + 'email_to': emails.join(','), + 'reply_to': reply_to, + 'state': 'outgoing', + 'subject': '[%d] %s' % (obj.id, tools.ustr(obj.name)), + 'body_html': '
%s
' % body, + 'res_id': obj.id, + 'model': obj._table_name, + 'auto_delete': True + }, context=context) def do_check(self, cr, uid, action, obj, context=None): @@ -438,11 +432,8 @@ the rule to mark CC(mail to any other person defined in actions)."), if len(emails) and action.act_mail_body: emails = list(set(emails)) email_from = safe_eval(action.act_email_from, {}, locals_for_emails) - - def to_email(text): - return re.findall(r'([^ ,<@]+@[^> ,]+)', text or '') - emails = to_email(','.join(filter(None, emails))) - email_froms = to_email(email_from) + emails = tools.email_split(','.join(filter(None, emails))) + email_froms = tools.email_split(email_from) if email_froms: self.email_send(cr, uid, obj, emails, action.act_mail_body, emailfrom=email_froms[0]) return True diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index be3244f8a5b..a6d5f6859af 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -471,18 +471,10 @@ property or property parameter."), def _send_mail(self, cr, uid, ids, mail_to, email_from=tools.config.get('email_from', False), context=None): """ Send mail for event invitation to event attendees. - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of attendee’s IDs. @param email_from: Email address for user sending the mail - @param context: A standard dictionary for contextual values @return: True """ - if context is None: - context = {} - company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.name - mail_message = self.pool.get('mail.message') for att in self.browse(cr, uid, ids, context=context): sign = att.sent_by_uid and att.sent_by_uid.signature or '' sign = '
'.join(sign and sign.split('\n') or []) @@ -508,17 +500,18 @@ property or property parameter."), } body = html_invitation % body_vals if mail_to and email_from: - attach = self.get_ics_file(cr, uid, res_obj, context=context) - mail_message.schedule_with_attach(cr, uid, - email_from, - mail_to, - sub, - body, - attachments=attach and {'invitation.ics': attach} or None, - content_subtype='html', - reply_to=email_from, - context=context - ) + ics_file = self.get_ics_file(cr, uid, res_obj, context=context) + vals = {'email_from': email_from, + 'email_to': mail_to, + 'state': 'outgoing', + 'subject': sub, + 'body_html': body, + 'auto_delete': True} + if ics_file: + vals['attachment_ids'] = [(0,0,{'name': 'invitation.ics', + 'datas_fname': 'invitation.ics', + 'datas': str(ics_file).encode('base64')})] + self.pool.get('mail.mail').create(cr, uid, vals, context=context) return True def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv): @@ -812,7 +805,6 @@ class calendar_alarm(osv.osv): """ if context is None: context = {} - mail_message = self.pool.get('mail.message') current_datetime = datetime.now() alarm_ids = self.search(cr, uid, [('state', '!=', 'done')], context=context) @@ -849,36 +841,10 @@ class calendar_alarm(osv.osv): else: re_dates = [alarm.trigger_date] - for r_date in re_dates: - ref = alarm.model_id.model + ',' + str(alarm.res_id) - - # search for alreay sent requests - #if request_obj.search(cr, uid, [('trigger_date', '=', r_date), ('ref_doc1', '=', ref)], context=context): - #continue - - # Deactivated because of the removing of res.request - # TODO: when cleaning calendar module, re-add this in a new mechanism - #if alarm.action == 'display': - #value = { - #'name': alarm.name, - #'act_from': alarm.user_id.id, - #'act_to': alarm.user_id.id, - #'body': alarm.description, - #'trigger_date': r_date, - #'ref_doc1': ref - #} - #request_id = request_obj.create(cr, uid, value) - #request_ids = [request_id] - #for attendee in res_obj.attendee_ids: - #if attendee.user_id: - #value['act_to'] = attendee.user_id.id - #request_id = request_obj.create(cr, uid, value) - #request_ids.append(request_id) - #request_obj.request_send(cr, uid, request_ids) - + if re_dates: if alarm.action == 'email': - sub = '[Openobject Reminder] %s' % (alarm.name) - body = """ + sub = '[OpenERP Reminder] %s' % (alarm.name) + body = """
 Event: %s
 Event Date: %s
 Description: %s
@@ -888,20 +854,21 @@ From:
 
 ----
 %s
-
+
""" % (alarm.name, alarm.trigger_date, alarm.description, \ alarm.user_id.name, alarm.user_id.signature) mail_to = [alarm.user_id.email] for att in alarm.attendee_ids: mail_to.append(att.user_id.email) if mail_to: - mail_message.schedule_with_attach(cr, uid, - tools.config.get('email_from', False), - mail_to, - sub, - body, - context=context - ) + vals = { + 'state': 'outgoing', + 'subject': sub, + 'body_html': body, + 'email_to': mail_to, + 'email_from': tools.config.get('email_from', mail_to), + } + self.pool.get('mail.mail').create(cr, uid, vals, context=context) if next_trigger_date: update_vals.update({'trigger_date': next_trigger_date}) else: @@ -1616,36 +1583,6 @@ class calendar_todo(osv.osv): calendar_todo() -class ir_attachment(osv.osv): - _name = 'ir.attachment' - _inherit = 'ir.attachment' - - def search_count(self, cr, user, args, context=None): - new_args = [] - for domain_item in args: - if isinstance(domain_item, (list, tuple)) and len(domain_item) == 3 and domain_item[0] == 'res_id': - new_args.append((domain_item[0], domain_item[1], base_calendar_id2real_id(domain_item[2]))) - else: - new_args.append(domain_item) - return super(ir_attachment, self).search_count(cr, user, new_args, context) - - def create(self, cr, uid, vals, context=None): - if context: - id = context.get('default_res_id', False) - context.update({'default_res_id' : base_calendar_id2real_id(id)}) - return super(ir_attachment, self).create(cr, uid, vals, context=context) - - def search(self, cr, uid, args, offset=0, limit=None, order=None, - context=None, count=False): - new_args = [] - for domain_item in args: - if isinstance(domain_item, (list, tuple)) and len(domain_item) == 3 and domain_item[0] == 'res_id': - new_args.append((domain_item[0], domain_item[1], base_calendar_id2real_id(domain_item[2]))) - else: - new_args.append(domain_item) - return super(ir_attachment, self).search(cr, uid, new_args, offset=offset, - limit=limit, order=order, context=context, count=False) -ir_attachment() class ir_values(osv.osv): _inherit = 'ir.values' diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py index cb96ff2a4d0..e1c66148ae7 100644 --- a/addons/base_calendar/crm_meeting.py +++ b/addons/base_calendar/crm_meeting.py @@ -43,7 +43,7 @@ class crm_meeting(base_state, osv.Model): _name = 'crm.meeting' _description = "Meeting" _order = "id desc" - _inherit = ["calendar.event", 'ir.needaction_mixin', "mail.thread"] + _inherit = ["calendar.event", "mail.thread", 'ir.needaction_mixin'] _columns = { # base_state required fields 'create_date': fields.datetime('Creation Date', readonly=True), @@ -70,13 +70,17 @@ class crm_meeting(base_state, osv.Model): # OpenChatter # ---------------------------------------- + # shows events of the day for this user + def needaction_domain_get(self, cr, uid, domain=[], context={}): + return [('date','<=',time.strftime('%Y-%M-%D 23:59:59')), ('date_deadline','>=', time.strftime('%Y-%M-%D 00:00:00')), ('user_id','=',uid)] + def case_get_note_msg_prefix(self, cr, uid, id, context=None): return 'Meeting' def case_open_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Meeting has been confirmed."), context=context) + return self.message_post(cr, uid, ids, body=_("Meeting confirmed."), context=context) def case_close_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Meeting has been done."), context=context) + return self.message_post(cr, uid, ids, body=_("Meeting completed."), context=context) diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml index 6009251a460..928f8d94d5c 100644 --- a/addons/base_calendar/crm_meeting_view.xml +++ b/addons/base_calendar/crm_meeting_view.xml @@ -170,7 +170,8 @@ - - +
@@ -56,22 +47,11 @@ Template used to display the communication history in documents form view. --> -
+
-
-
- - - -
-
-

Followers

-
    -
    -
  • - +
    @@ -147,7 +127,7 @@
    ', message.body, 'mail.message body is incorrect') + # Test: mail.message: attachments + for attach in message.attachment_ids: + self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model incorrect') + self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.message attachment res_id incorrect') + self.assertIn((attach.name, attach.datas.decode('base64')), _attachments_test, + 'mail.message attachment name / data incorrect') + + # ---------------------------------------- + # CASE3: mass_mail on Pigs and Bird + # ---------------------------------------- + + # 1. mass_mail on pigs and bird + compose_id = mail_compose.create(cr, uid, + {'subject': _subject, 'body': '${object.description}'}, + {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': -1, + 'active_ids': [self.group_pigs_id, group_bird_id]}) + compose = mail_compose.browse(cr, uid, compose_id) + # Test: content_subtype is html + self.assertEqual(compose.content_subtype, 'html', 'mail.compose.message content_subtype incorrect') + + # 2. Post the comment, get created message for each group + mail_compose.send_mail(cr, uid, [compose_id], + context={'default_res_id': -1, 'active_ids': [self.group_pigs_id, group_bird_id]}) + group_pigs.refresh() + group_bird.refresh() + message1 = group_pigs.message_ids[0] + message2 = group_bird.message_ids[0] + # Test: Pigs and Bird did receive their message + test_msg_ids = self.mail_message.search(cr, uid, [], limit=2) + self.assertIn(message1.id, test_msg_ids, 'Pigs did not receive its mass mailing message') + self.assertIn(message2.id, test_msg_ids, 'Bird did not receive its mass mailing message') + # Test: mail.message: subject, body + self.assertEqual(message1.subject, _subject, 'mail.message subject incorrect') + self.assertEqual(message1.body, group_pigs.description, 'mail.message body incorrect') + self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect') + self.assertEqual(message2.body, group_bird.description, 'mail.message body incorrect') + + def test_30_message_read(self): + """ Tests designed for message_read. """ + # TDE NOTE: this test is not finished, as the message_read method is not fully specified. + # It will be updated as soon as we have fixed specs ! + cr, uid = self.cr, self.uid + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + def _compare_structures(struct1, struct2, n=0): + # print '%scompare structure' % ('\t' * n) + self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect') + for x in range(len(struct1)): + # print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or '' + self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject')) + _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1) + # print '%send compare' % ('\t' * n) + + # ---------------------------------------- + # CASE1: Flattening test + # ---------------------------------------- + + # Create dummy message structure + import copy + tree = [{'id': 2, 'child_ids': [ + {'id': 6, 'child_ids': [ + {'id': 8, 'child_ids': []}, + ]}, + ]}, + {'id': 1, 'child_ids':[ + {'id': 7, 'child_ids': [ + {'id': 9, 'child_ids': []}, + ]}, + {'id': 4, 'child_ids': [ + {'id': 10, 'child_ids': []}, + {'id': 5, 'child_ids': []}, + ]}, + {'id': 3, 'child_ids': []}, + ]}, + ] + # Test: completely flat + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 0) + self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat') + # Test: 1 thread level + tree_test = [{'id': 2, 'child_ids': [ + {'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []}, + ]}, + {'id': 1, 'child_ids': [ + {'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []}, + {'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []}, + {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []}, + ]}, + ] + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 1) + _compare_structures(new_tree, tree_test) + # Test: 2 thread levels + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 2) + _compare_structures(new_tree, tree) + + # ---------------------------------------- + # CASE2: message_read test + # ---------------------------------------- + + # 1. Add a few messages to pigs group + msgid1 = group_pigs.message_post(body='1', subject='1', parent_id=False) + msgid2 = group_pigs.message_post(body='2', subject='1-1', parent_id=msgid1) + msgid3 = group_pigs.message_post(body='3', subject='1-2', parent_id=msgid1) + msgid4 = group_pigs.message_post(body='4', subject='2', parent_id=False) + msgid5 = group_pigs.message_post(body='5', subject='1-1-1', parent_id=msgid2) + msgid6 = group_pigs.message_post(body='6', subject='2-1', parent_id=msgid4) + + # Test: read all messages flat + tree_test = [{'id': msgid6, 'child_ids': []}, {'id': msgid5, 'child_ids': []}, + {'id': msgid4, 'child_ids': []}, {'id': msgid3, 'child_ids': []}, + {'id': msgid2, 'child_ids': []}, {'id': msgid1, 'child_ids': []}] + tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=0, limit=10) + _compare_structures(tree, tree_test) + # Test: read with 1 level of thread + tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]}, + {'id': msgid1, 'child_ids': [ + {'id': msgid5, 'child_ids': []}, {'id': msgid3, 'child_ids': []}, + {'id': msgid2, 'child_ids': []}, + ]}, + ] + tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=1, limit=10) + _compare_structures(tree, tree_test) + # Test: read with 2 levels of thread + tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]}, + {'id': msgid1, 'child_ids': [ + {'id': msgid3, 'child_ids': []}, + {'id': msgid2, 'child_ids': [{'id': msgid5, 'child_ids': []}, ]}, + ]}, + ] + tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=2, limit=10) + _compare_structures(tree, tree_test) + + # 2. Test expandables + # TDE FIXME: add those tests when expandables are specified and implemented + + def test_40_needaction(self): + """ Tests for mail.message needaction. """ + cr, uid = self.cr, self.uid + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + user_admin = self.res_users.browse(cr, uid, uid) + + # Demo values: check unread notification = needaction on mail.message + notif_ids = self.mail_notification.search(cr, uid, [ + ('partner_id', '=', user_admin.partner_id.id), + ('read', '=', False) + ]) + na_count = self.mail_message._needaction_count(cr, uid, domain=[]) + self.assertEqual(len(notif_ids), na_count, 'unread notifications count does not match needaction count') + + # Post 4 message on group_pigs + for dummy in range(4): + group_pigs.message_post(body='My Body') + + # Check there are 4 new needaction on mail.message + notif_ids = self.mail_notification.search(cr, uid, [ + ('partner_id', '=', user_admin.partner_id.id), + ('read', '=', False) + ]) + na_count = self.mail_message._needaction_count(cr, uid, domain=[]) + self.assertEqual(len(notif_ids), na_count, 'unread notifications count does not match needaction count') + + # Check there are 4 needaction on mail.message with particular domain + na_count = self.mail_message._needaction_count(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)]) + self.assertEqual(na_count, 4, 'posted message count does not match needaction count') + + def test_50_thread_parent_resolution(self): + """Verify parent/child relationships are correctly established when processing incoming mails""" + cr, uid = self.cr, self.uid + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + msg1 = group_pigs.message_post(body='My Body', subject='1') + msg2 = group_pigs.message_post(body='My Body', subject='2') + msg1, msg2 = self.mail_message.browse(cr, uid, [msg1, msg2]) + self.assertTrue(msg1.message_id, "New message should have a proper message_id") + + # Reply to msg1, make sure the reply is properly attached using the various reply identification mechanisms + # 1. In-Reply-To header + reply_msg = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', subject='Re: 1', + extra='In-Reply-To: %s' % msg1.message_id) + self.mail_thread.message_process(cr, uid, None, reply_msg) + # 2. References header + reply_msg2 = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', subject='Re: Re: 1', + extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id) + self.mail_thread.message_process(cr, uid, None, reply_msg2) + # 3. Subject contains [] + model passed to message+process -> only attached to group, not to mail + reply_msg3 = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', + extra='', subject='Re: [%s] 1' % self.group_pigs_id) + self.mail_thread.message_process(cr, uid, 'mail.group', reply_msg3) + group_pigs.refresh() + msg1.refresh() + self.assertEqual(5, len(group_pigs.message_ids), 'group should contain 5 messages') + self.assertEqual(2, len(msg1.child_ids), 'msg1 should have 2 children now') diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index fe87b7584e0..3153ccc2069 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -19,417 +19,289 @@ # ############################################################################## -import ast +import base64 import re - import tools + from osv import osv from osv import fields from tools.safe_eval import safe_eval as eval from tools.translate import _ -from ..mail_message import to_email - # main mako-like expression pattern EXPRESSION_PATTERN = re.compile('(\$\{.+?\})') class mail_compose_message(osv.TransientModel): - """Generic Email composition wizard. This wizard is meant to be inherited - at model and view level to provide specific wizard features. + """ Generic message composition wizard. You may inherit from this wizard + at model and view levels to provide specific features. - The behavior of the wizard can be modified through the use of context - parameters, among which are: - - * mail.compose.message.mode: if set to 'reply', the wizard is in - reply to a previous message mode and pre-populated with the original - quote. If set to 'comment', it means you are writing a new message to - be attached to a document. If set to 'mass_mail', the wizard is in - mass mailing where the mail details can contain template placeholders - that will be merged with actual data before being sent to each - recipient. - * active_model: model name of the document to which the mail being - composed is related - * active_id: id of the document to which the mail being composed is - related, or id of the message to which user is replying, - in case ``mail.compose.message.mode == 'reply'`` - * active_ids: ids of the documents to which the mail being composed is - related, in case ``mail.compose.message.mode == 'mass_mail'``. + The behavior of the wizard depends on the composition_mode field: + - 'reply': reply to a previous message. The wizard is pre-populated + via ``get_message_data``. + - 'comment': new post on a record. The wizard is pre-populated via + ``get_record_data`` + - 'mass_mail': wizard in mass mailing mode where the mail details can + contain template placeholders that will be merged with actual data + before being sent to each recipient. """ _name = 'mail.compose.message' - _inherit = 'mail.message.common' + _inherit = 'mail.message' _description = 'Email composition wizard' + _log_access = True def default_get(self, cr, uid, fields, context=None): - """ Overridden to provide specific defaults depending on the context - parameters. - - Composition mode - - comment: default mode; active_model, active_id = model and ID of a - document we are commenting, - - reply: active_id = ID of a mail.message to which we are replying. - From this message we can find the related model and res_id, - - mass_mailing mode: active_model, active_id = model and ID of a - document we are commenting, - - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. + """ Handle composition mode. Some details about context keys: + - comment: default mode, model and ID of a record the user comments + - default_model or active_model + - default_res_id or active_id + - reply: active_id of a message the user replies to + - default_parent_id or message_id or active_id: ID of the + mail.message we reply to + - message.res_model or default_model + - message.res_id or default_res_id + - mass_mail: model and IDs of records the user mass-mails + - active_ids: record IDs + - default_model or active_model """ if context is None: context = {} - compose_mode = context.get('mail.compose.message.mode', 'comment') - active_model = context.get('active_model') - active_id = context.get('active_id') result = super(mail_compose_message, self).default_get(cr, uid, fields, context=context) + # get some important values from context + composition_mode = context.get('default_composition_mode', context.get('mail.compose.message.mode')) + model = context.get('default_model', context.get('active_model')) + res_id = context.get('default_res_id', context.get('active_id')) + message_id = context.get('default_parent_id', context.get('message_id', context.get('active_id'))) + active_ids = context.get('active_ids') + # get default values according to the composition mode - vals = {} - if compose_mode in ['reply']: - vals = self.get_message_data(cr, uid, int(context['active_id']), context=context) - elif compose_mode in ['comment', 'mass_mail'] and active_model and active_id: - vals = self.get_value(cr, uid, active_model, active_id, context) + if composition_mode == 'reply': + vals = self.get_message_data(cr, uid, message_id, context=context) + elif composition_mode == 'comment' and model and res_id: + vals = self.get_record_data(cr, uid, model, res_id, context=context) + elif composition_mode == 'mass_mail' and model and active_ids: + vals = {'model': model, 'res_id': res_id, 'content_subtype': 'html'} + else: + vals = {'model': model, 'res_id': res_id} + if composition_mode: + vals['composition_mode'] = composition_mode + for field in vals: if field in fields: result[field] = vals[field] - - # link to model and record if not done yet - if not result.get('model') and active_model: - result['model'] = active_model - if not result.get('res_id') and active_id: - result['res_id'] = active_id - - # Try to provide default email_from if not specified yet - if not result.get('email_from'): - current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - result['email_from'] = current_user.email or False return result + def _get_composition_mode_selection(self, cr, uid, context=None): + return [('comment', 'Comment a document'), ('reply', 'Reply to a message'), ('mass_mail', 'Mass mailing')] + _columns = { - 'dest_partner_ids': fields.many2many('res.partner', - 'email_message_send_partner_rel', - 'wizard_id', 'partner_id', 'Destination partners', - help="When sending emails through the social network composition wizard"\ - "you may choose to send a copy of the mail to partners."), - 'attachment_ids': fields.many2many('ir.attachment','email_message_send_attachment_rel', 'wizard_id', 'attachment_id', 'Attachments'), - 'auto_delete': fields.boolean('Auto Delete', help="Permanently delete emails after sending"), + 'composition_mode': fields.selection( + lambda s, *a, **k: s._get_composition_mode_selection(*a, **k), + string='Composition mode'), + 'partner_ids': fields.many2many('res.partner', + 'mail_compose_message_res_partner_rel', + 'wizard_id', 'partner_id', 'Additional contacts'), + 'attachment_ids': fields.many2many('ir.attachment', + 'mail_compose_message_ir_attachments_rel', + 'wizard_id', 'attachment_id', 'Attachments'), 'filter_id': fields.many2one('ir.filters', 'Filters'), + 'body_text': fields.text('Plain-text Contents'), + 'content_subtype': fields.char('Message content subtype', size=32, readonly=1, + help="Type of message, usually 'html' or 'plain', used to select "\ + "plain-text or rich-text contents accordingly"), } - def get_value(self, cr, uid, model, res_id, context=None): + _defaults = { + 'composition_mode': 'comment', + 'content_subtype': lambda self, cr, uid, ctx={}: 'plain', + 'body_text': lambda self, cr, uid, ctx={}: False, + 'body': lambda self, cr, uid, ctx={}: '', + 'subject': lambda self, cr, uid, ctx={}: False, + } + + def notify(self, cr, uid, newid, context=None): + """ Override specific notify method of mail.message, because we do + not want that feature in the wizard. """ + return + + def get_record_data(self, cr, uid, model, res_id, context=None): """ Returns a defaults-like dict with initial values for the composition wizard when sending an email related to the document record identified by ``model`` and ``res_id``. - The default implementation returns an empty dictionary, and is meant - to be overridden by subclasses. - :param str model: model name of the document record this mail is related to. - :param int res_id: id of the document record this mail is related to. - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. + :param int res_id: id of the document record this mail is related to """ - result = {} - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - result.update({ - 'model': model, - 'res_id': res_id, - 'email_from': user.email or tools.config.get('email_from', False), - 'body_html': False, - 'body_text': False, - 'subject': False, - 'dest_partner_ids': [], - }) - return result - - def onchange_email_mode(self, cr, uid, ids, value, model, res_id, context=None): - """ email_mode (values: True or False). This onchange on the email mode - allows to have some specific behavior when going in email mode, or - when going out of email mode. - Basically, dest_partner_ids is reset when going out of email - mode. - This method can be overridden for models that want to have their - specific behavior. - Note that currently, this onchange is used in mail.js and called - manually on the form instantiated in the Chatter. - """ - if not value: - return {'value': {'dest_partner_ids': []}} - return {'value': {}} - - def onchange_formatting(self, cr, uid, ids, value, model, res_id, context=None): - """ onchange_formatting (values: True or False). This onchange on the - formatting allows to have some specific behavior when going in - formatting mode, or when going out of formatting. - Basically, subject is reset when going out of formatting mode. - This method can be overridden for models that want to have their - specific behavior. - Note that currently, this onchange is used in mail.js and called - manually on the form instantiated in the Chatter. - """ - if not value: - return {'value': {'subject': False}} - return {'value': {}} + return {'model': model, 'res_id': res_id} def get_message_data(self, cr, uid, message_id, context=None): """ Returns a defaults-like dict with initial values for the composition wizard when replying to the given message (e.g. including the quote - of the initial message, and the correct recipient). It should not be - called unless ``context['mail.compose.message.mode'] == 'reply'``. + of the initial message, and the correct recipients). :param int message_id: id of the mail.message to which the user is replying. - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. """ + if not message_id: + return {} if context is None: context = {} - result = {} - if not message_id: - return result + message_data = self.pool.get('mail.message').browse(cr, uid, message_id, context=context) - current_user = self.pool.get('res.users').browse(cr, uid, uid, context) - message_data = self.pool.get('mail.message').browse(cr, uid, message_id, context) - # Form the subject - re_prefix = _("Re:") + # create subject + re_prefix = _('Re:') reply_subject = tools.ustr(message_data.subject or '') if not (reply_subject.startswith('Re:') or reply_subject.startswith(re_prefix)): reply_subject = "%s %s" % (re_prefix, reply_subject) - # Form the bodies (text and html). We use the plain text version of the - # original mail, by default, as it is easier to quote than the HTML - # version. TODO: make it possible to switch to HTML on the fly - sent_date = _('On %(date)s, ') % {'date': message_data.date} if message_data.date else '' - sender = _('%(sender_name)s wrote:') % {'sender_name': tools.ustr(message_data.email_from or _('You'))} - body_text = message_data.body_text or '' - body_html = message_data.body_html or '' - quoted_body_text = '> %s' % tools.ustr(body_text.replace('\n', "\n> ") or '') - quoted_body_html = '
    %s
    ' % (tools.ustr(body_html)), - reply_body_text = '\n%s%s\n%s\n%s' % (sent_date, sender, quoted_body_text, current_user.signature) - reply_body_html = '

    %s%s
    %s
    %s' % (sent_date, sender, quoted_body_html, current_user.signature) - # form dest_partner_ids - dest_partner_ids = [partner.id for partner in message_data.partner_ids] - # Update header and references - reply_headers = {} - reply_references = message_data.references and tools.ustr(message_data.references) or False - reply_message_id = message_data.message_id or False - if reply_message_id: - reply_references = (reply_references or '') + " " + message_data.message_id - reply_headers['In-Reply-To'] = message_data.message_id + # create the reply in the body + reply_body = _('
    On %(date)s, %(sender_name)s wrote:
    %(body)s
    ') % { + 'date': message_data.date if message_data.date else '', + 'sender_name': message_data.author_id.name, + 'body': message_data.body, + } + # get partner_ids from original message + partner_ids = [partner.id for partner in message_data.partner_ids] if message_data.partner_ids else [] + # update the result - result.update({ - 'body_text': reply_body_text, - 'body_html': reply_body_html, + result = { + 'model': message_data.model, + 'res_id': message_data.res_id, + 'parent_id': message_data.id, + 'body': reply_body, 'subject': reply_subject, - 'attachment_ids': [], - 'dest_partner_ids': dest_partner_ids, - 'model': message_data.model or False, - 'res_id': message_data.res_id or False, - 'email_from': current_user.email or message_data.email_to or False, - 'email_to': message_data.reply_to or message_data.email_from or False, - 'email_cc': message_data.email_cc or False, - 'user_id': uid, - # pass msg-id and references of mail we're replying to, to construct the - # new ones later when sending - 'message_id': reply_message_id, - 'references': reply_references, - 'headers': reply_headers, - }) + 'partner_ids': partner_ids, + 'content_subtype': 'html', + } return result - def send_mail(self, cr, uid, ids, context=None): - '''Process the wizard contents and proceed with sending the corresponding - email(s), rendering any template patterns on the fly if needed. - If the wizard is in mass-mail mode (context['mail.compose.message.mode'] is - set to ``'mass_mail'``), the resulting email(s) are scheduled for being - sent the next time the mail.message scheduler runs, or the next time - ``mail.message.process_email_queue`` is called. - Otherwise the new message is sent immediately. + def toggle_content_subtype(self, cr, uid, ids, context=None): + """ hit toggle formatting mode button: calls onchange_formatting to + emulate an on_change, then writes the value to update the form. """ + for record in self.browse(cr, uid, ids, context=context): + content_st_new_value = 'plain' if record.content_subtype == 'html' else 'html' + onchange_res = self.onchange_content_subtype(cr, uid, ids, content_st_new_value, record.model, record.res_id, context=context) + self.write(cr, uid, [record.id], onchange_res['value'], context=context) + return True - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. - ''' + def onchange_content_subtype(self, cr, uid, ids, value, model, res_id, context=None): + """ onchange_content_subtype (values: 'plain' or 'html'). This onchange + on the subtype allows to have some specific behavior when switching + between text or html mode. + This method can be overridden for models that want to have their + specific behavior. """ + return {'value': {'content_subtype': value}} + + def _verify_partner_email(self, cr, uid, partner_ids, context=None): + """ Verify that selected partner_ids have an email_address defined. + Otherwise throw a warning. """ + partner_wo_email_lst = [] + for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context): + if not partner.email: + partner_wo_email_lst.append(partner) + if not partner_wo_email_lst: + return {} + warning_msg = _('The following partners chosen as recipients for the email have no email address linked :') + for partner in partner_wo_email_lst: + warning_msg += '\n- %s' % (partner.name) + return {'warning': { + 'title': _('Partners email addresses not found'), + 'message': warning_msg, + } + } + + def onchange_partner_ids(self, cr, uid, ids, value, context=None): + """ onchange_partner_ids (value format: [[6, 0, [3, 4]]]). The + basic purpose of this method is to check that destination partners + effectively have email addresses. Otherwise a warning is thrown. + """ + res = {'value': {}} + if not value or not value[0] or not value[0][0] == 6: + return + res.update(self._verify_partner_email(cr, uid, value[0][2], context=context)) + return res + + def unlink(self, cr, uid, ids, context=None): + # Cascade delete all attachments, as they are owned by the composition wizard + for wizard in self.read(cr, uid, ids, ['attachment_ids'], context=context): + self.pool.get('ir.attachment').unlink(cr, uid, wizard['attachment_ids'], context=context) + return super(mail_compose_message, self).unlink(cr, uid, ids, context=context) + + def dummy(self, cr, uid, ids, context=None): + """ TDE: defined to have buttons that do basically nothing. It is + currently impossible to have buttons that do nothing special + in views (if type not specified, considered as 'object'). """ + return True + + #------------------------------------------------------ + # Wizard validation and send + #------------------------------------------------------ + + def send_mail(self, cr, uid, ids, context=None): + """ Process the wizard content and proceed with sending the related + email(s), rendering any template patterns on the fly if needed. """ if context is None: context = {} - # composition wizard options - email_mode = context.get('email_mode') - formatting = context.get('formatting') - mass_mail_mode = context.get('mail.compose.message.mode') == 'mass_mail' + active_ids = context.get('active_ids') - mail_message_obj = self.pool.get('mail.message') - for mail_wiz in self.browse(cr, uid, ids, context=context): - # attachments - attachment = {} - for attach in mail_wiz.attachment_ids: - attachment[attach.datas_fname] = attach.datas and attach.datas.decode('base64') + for wizard in self.browse(cr, uid, ids, context=context): + mass_mail_mode = wizard.composition_mode == 'mass_mail' + active_model_pool = self.pool.get(wizard.model if wizard.model else 'mail.thread') - # default values, according to the wizard options - subject = mail_wiz.subject if formatting else False - content_subtype = 'html' if formatting else 'plain' - type = 'email' if email_mode else 'comment' - state = 'outgoing' if email_mode else False - partner_ids = [partner.id for partner in mail_wiz.dest_partner_ids] - references = None - headers = {} - body = mail_wiz.body_html if content_subtype == 'html' else mail_wiz.body_text - - # get model, active_ids, and check if model is openchatter-enabled - if mass_mail_mode and context.get('active_ids') and context.get('active_model'): - active_ids = context['active_ids'] - active_model = context['active_model'] - elif mass_mail_mode: - active_model = mail_wiz.model - active_model_pool = self.pool.get(active_model) - active_ids = active_model_pool.search(cr, uid, ast.literal_eval(mail_wiz.filter_id.domain), context=ast.literal_eval(mail_wiz.filter_id.context)) - else: - active_model = mail_wiz.model - active_ids = [mail_wiz.res_id] - active_model_pool = self.pool.get(active_model) - mail_thread_enabled = hasattr(active_model_pool, 'message_append') - - if context.get('mail.compose.message.mode') == 'mass_mail': - # Mass mailing: must render the template patterns - for active_id in active_ids: - rendered_subject = self.render_template(cr, uid, subject, active_model, active_id) - rendered_body_html = self.render_template(cr, uid, mail_wiz.body_html, active_model, active_id) - rendered_body_text = self.render_template(cr, uid, mail_wiz.body_text, active_model, active_id) - email_from = self.render_template(cr, uid, mail_wiz.email_from, active_model, active_id) - email_to = self.render_template(cr, uid, mail_wiz.email_to, active_model, active_id) - email_cc = self.render_template(cr, uid, mail_wiz.email_cc, active_model, active_id) - email_bcc = self.render_template(cr, uid, mail_wiz.email_bcc, active_model, active_id) - reply_to = self.render_template(cr, uid, mail_wiz.reply_to, active_model, active_id) - - # in mass-mailing mode we only schedule the mail for sending, it will be - # processed as soon as the mail scheduler runs. - if mail_thread_enabled: - active_model_pool.message_append(cr, uid, [active_id], rendered_subject, rendered_body_text, rendered_body_html, - type=type, content_subtype=content_subtype, state=state, partner_ids=partner_ids, - email_from=email_from, email_to=email_to, email_cc=email_cc, email_bcc=email_bcc, - reply_to=reply_to, references=references, attachments=attachment, headers=headers, context=context) - else: - mail_message_obj.schedule_with_attach(cr, uid, email_from, to_email(email_to), subject, rendered_body_text, - model=mail_wiz.model, email_cc=to_email(email_cc), email_bcc=to_email(email_bcc), reply_to=reply_to, - attachments=attachment, references=references, res_id=active_id, partner_ids=partner_ids, - content_subtype=mail_wiz.content_subtype, headers=headers, context=context) - else: - # normal mode - no mass-mailing - if mail_thread_enabled: - msg_ids = active_model_pool.message_append(cr, uid, active_ids, subject, mail_wiz.body_text, mail_wiz.body_html, - type=type, content_subtype=content_subtype, state=state, partner_ids=partner_ids, - email_from=mail_wiz.email_from, email_to=mail_wiz.email_to, email_cc=mail_wiz.email_cc, email_bcc=mail_wiz.email_bcc, - reply_to=mail_wiz.reply_to, references=references, attachments=attachment, headers=headers, context=context) - else: - msg_ids = [mail_message_obj.schedule_with_attach(cr, uid, mail_wiz.email_from, to_email(mail_wiz.email_to), subject, mail_wiz.body_text, - type=type, model=mail_wiz.model, email_cc=to_email(mail_wiz.email_cc), email_bcc=to_email(mail_wiz.email_bcc), reply_to=mail_wiz.reply_to, - attachments=attachment, references=references, res_id=int(mail_wiz.res_id), partner_ids=partner_ids, - content_subtype=mail_wiz.content_subtype, headers=headers, context=context)] - # in normal mode, we send the email immediately, as the user expects us to (delay should be sufficiently small) - if type == 'email': - mail_message_obj.send(cr, uid, msg_ids, context=context) + # wizard works in batch mode: [res_id] or active_ids + res_ids = active_ids if mass_mail_mode and wizard.model and active_ids else [wizard.res_id] + for res_id in res_ids: + # default values, according to the wizard options + post_values = { + 'subject': wizard.subject if wizard.content_subtype == 'html' else False, + 'body': wizard.body if wizard.content_subtype == 'html' else '
    %s
    ' % tools.ustr(wizard.body_text), + 'partner_ids': [(4, partner.id) for partner in wizard.partner_ids], + 'attachments': [(attach.datas_fname or attach.name, base64.b64decode(attach.datas)) for attach in wizard.attachment_ids], + } + # mass mailing: render and override default values + if mass_mail_mode and wizard.model: + email_dict = self.render_message(cr, uid, wizard, res_id, context=context) + new_partner_ids = email_dict.pop('partner_ids', []) + post_values['partner_ids'] += [(4, partner_id) for partner_id in new_partner_ids] + new_attachments = email_dict.pop('attachments', []) + post_values['attachments'] += new_attachments + post_values.update(email_dict) + # post the message + active_model_pool.message_post(cr, uid, [res_id], type='comment', context=context, **post_values) return {'type': 'ir.actions.act_window_close'} + def render_message(self, cr, uid, wizard, res_id, context=None): + """ Generate an email from the template for given (wizard.model, res_id) + pair. This method is meant to be inherited by email_template that + will produce a more complete dictionary. """ + return { + 'subject': self.render_template(cr, uid, wizard.subject, wizard.model, res_id, context), + 'body': self.render_template(cr, uid, wizard.body, wizard.model, res_id, context), + } + def render_template(self, cr, uid, template, model, res_id, context=None): - """Render the given template text, replace mako-like expressions ``${expr}`` - with the result of evaluating these expressions with an evaluation context - containing: + """ Render the given template text, replace mako-like expressions ``${expr}`` + with the result of evaluating these expressions with an evaluation context + containing: * ``user``: browse_record of the current user * ``object``: browse_record of the document record this mail is related to * ``context``: the context passed to the mail composition wizard - :param str template: the template text to render - :param str model: model name of the document record this mail is related to. - :param int res_id: id of the document record this mail is related to. + :param str template: the template text to render + :param str model: model name of the document record this mail is related to. + :param int res_id: id of the document record this mail is related to. """ if context is None: context = {} def merge(match): exp = str(match.group()[2:-1]).strip() - result = eval(exp, - { - 'user' : self.pool.get('res.users').browse(cr, uid, uid, context=context), - 'object' : self.pool.get(model).browse(cr, uid, res_id, context=context), - 'context': dict(context), # copy context to prevent side-effects of eval - }) - if result in (None, False): - return "" - return tools.ustr(result) + result = eval(exp, { + 'user': self.pool.get('res.users').browse(cr, uid, uid, context=context), + 'object': self.pool.get(model).browse(cr, uid, res_id, context=context), + 'context': dict(context), # copy context to prevent side-effects of eval + }) + return result and tools.ustr(result) or '' return template and EXPRESSION_PATTERN.sub(merge, template) - - -class mail_compose_message_extended(osv.TransientModel): - """ Extension of 'mail.compose.message' to support default field values related - to CRM-like models that follow the following conventions: - - 1. The model object must have an attribute '_mail_compose_message' equal to True. - - 2. The model should define the following fields: - - 'name' as subject of the message (required); - - 'email_from' as destination email address (required); - - 'email_cc' as cc email addresses (required); - - 'section_id.reply_to' as reply-to address (optional). - """ - _inherit = 'mail.compose.message' - - def get_value(self, cr, uid, model, res_id, context=None): - """ Overrides the default implementation to provide more default field values - related to the corresponding CRM case. - """ - result = super(mail_compose_message_extended, self).get_value(cr, uid, model, res_id, context=context) - model_obj = self.pool.get(model) - if getattr(model_obj, '_mail_compose_message', False) and res_id: - data = model_obj.browse(cr, uid , res_id, context) - result.update({ - 'email_to': data.email_from or False, - 'email_cc': tools.ustr(data.email_cc or ''), - 'subject': data.name or False, - }) - if hasattr(data, 'section_id'): - result['reply_to'] = data.section_id and data.section_id.reply_to or False - return result - - def onchange_email_mode(self, cr, uid, ids, value, model, res_id, context=None): - """ Overrides the default implementation to provide default values for - dest_partner_ids. This method checks that a partner maching the - ``email_from`` of the record exists. It it does not exist, it - creates a new partner. The found or created partner is then added - in dest_partner_ids. - Partner check/creation valid inly if the value is True, and if - the model has the ``_mail_compose_message`` attribute. - """ - result = super(mail_compose_message_extended, self).onchange_email_mode(cr, uid, ids, value, model, res_id, context=context) - model_obj = self.pool.get(model) - if not value or not (getattr(model_obj, '_mail_compose_message', False) and res_id): - return result - data = model_obj.browse(cr, uid , res_id, context=context) - partner_obj = self.pool.get('res.partner') - partner_ids = partner_obj.search(cr, uid, [('email', '=', data.email_from)], context=context) - if partner_ids: - partner_id = partner_ids[0] - else: - partner_id = partner_obj.name_create(cr, uid, data.email_from, context=context)[0] - result['value'].update({ - 'dest_partner_ids': [partner_id], - 'email_cc': tools.ustr(data.email_cc or ''), - }) - if hasattr(data, 'section_id'): - result['value']['reply_to'] = data.section_id and data.section_id.reply_to or False - return result - - def onchange_formatting(self, cr, uid, ids, value, model, res_id, context=None): - """ Overrides the default implementation to provide default values for - the subject. - Subject re-creation valid only if the value is True, and if the - model has the ``_mail_compose_message`` attribute. - """ - result = super(mail_compose_message_extended, self).onchange_formatting(cr, uid, ids, value, model, res_id, context=context) - model_obj = self.pool.get(model) - if not value or not (getattr(model_obj, '_mail_compose_message', False) and res_id): - return result - data = model_obj.browse(cr, uid , res_id, context=context) - result['value'].update({ - 'subject': data.name or False, - }) - return result - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml index 73fb03cdc28..70b50c154ac 100644 --- a/addons/mail/wizard/mail_compose_message_view.xml +++ b/addons/mail/wizard/mail_compose_message_view.xml @@ -6,73 +6,87 @@ mail.compose.message
    + + + + + - - - - - - - - - - - + + - + - + +
    -
    - mail.compose.message.form + mail.compose.message.form.chatter mail.compose.message 18
    + + + + + + + + class="oe_mail_compose_message_subject" + attrs="{'invisible':[('content_subtype', '=', 'plain')]}"/> - - + class="oe_mail_compose_message_body" + attrs="{'invisible':[('content_subtype', '=', 'html')]}"/> + + + + +
    +
    - - - Checklist - - - Attachment - - - Formatting - +
    @@ -97,6 +111,6 @@ target="new" key2="client_action_multi" id="base.action_partner_mass_mail" - context="{'mail.compose.message.mode':'mass_mail'}"/> + context="{'default_composition_mode': 'mass_mail'}"/> diff --git a/addons/marketing_campaign/marketing_campaign_demo.xml b/addons/marketing_campaign/marketing_campaign_demo.xml index 54897cd111a..92443fe987d 100644 --- a/addons/marketing_campaign/marketing_campaign_demo.xml +++ b/addons/marketing_campaign/marketing_campaign_demo.xml @@ -3,29 +3,29 @@ - Template for New Partner + welcome new partner info@openerp.com - Welcome in OpenERP Partner Channel! + Welcome to the OpenERP Partner Channel! ${object.email or ''} - Hello, We are very happy to send Welcome message. + Hello, you will receive your welcome pack via email shortly. - Template for Silver Partner + congrats silver partner info@openerp.com - Congratulation! You become now our Silver Partner. + Congratulations! You are now a Silver Partner! ${object.email or ''} - Hello, We are happy to announce that you now become our Silver Partner. + Hi, we are delighted to welcome you among our Silver Partners as of today! - Template for Gold Partner + congrats gold partner info@openerp.com - Congratulation! You become our Gold Partner. + Congratulations! You are now one of our Gold Partners! ${object.email or ''} - Hello, We are happy to announce that you become our Gold Partner. + Hi, we are delighted to let you know that you have entered the select circle of our Gold Partners @@ -64,7 +64,7 @@ - + diff --git a/addons/marketing_campaign/test/marketing_campaign.yml b/addons/marketing_campaign/test/marketing_campaign.yml index 04063a6fbc1..3d540b4ccb7 100644 --- a/addons/marketing_campaign/test/marketing_campaign.yml +++ b/addons/marketing_campaign/test/marketing_campaign.yml @@ -42,7 +42,7 @@ record = self.browse(cr, uid, ids[0]) assert record.state == 'todo' or record.state == 'done' , 'Marketing Workitem shoud be in draft state.' - - I check follow-up detail of first activity. + I process follow-up of first activity. - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), @@ -50,12 +50,6 @@ assert ids, 'Follow-up item is not created for first activity.' work_item_id = self.browse(cr ,uid ,ids[0] ,context) assert work_item_id.res_name, 'Resource Name is not defined.' -- - I process follow-up of first activity. -- - !python {model: marketing.campaign.workitem}: | - ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), - ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_0'))]) self.process(cr, uid, ids) record = self.browse(cr, uid, ids)[0] assert record.state == "done", "Follow-up item should be closed after process." diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml index 0946ff6e129..141981a21d6 100644 --- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml +++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml @@ -40,7 +40,10 @@ - Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team, + Hello,

    +

    Thanks for the genuine interest you have shown in OpenERP.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    For OpenERP OnDemand Free Trial 2010
    @@ -50,11 +53,11 @@ - Hello,We have very good offer that might suit you. - We propose you to subscribe to the OpenERP Discovery Day on May 2010. - If any further information required kindly revert back. - We really appreciate your co-operation on this. - Regards,OpenERP Team, + Hello,

    +

    We have very good offer that might suit you. + We suggest you subscribe to the OpenERP Discovery Day on May 2010.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    For OpenERP Discovery Day on May 2010
    @@ -65,10 +68,10 @@ - Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, + Hello,

    +

    Thanks for showing interest and for subscribing to the OpenERP Discovery Day.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    For OpenERP Discovery Day @@ -79,10 +82,10 @@ - Hello,Thanks for showing intrest and buying the OpenERP book. + Hello,

    +

    Thanks for showing interest and buying the OpenERP book.

    If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team,
    +

    Regards,OpenERP Team,

    ]]>
    For OpenERP book @@ -92,12 +95,12 @@ - Hello, We have very good offer that might suit you. - For our gold partners,We are arranging free technical training on june,2010. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, - For technical training to Gold partners + Hello,

    +

    We have very good offer that might suit you. + For our gold partners,We are arranging free technical training on june,2010.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    + technical training to gold partners @@ -107,12 +110,12 @@ - Hello, We have very good offer that might suit you. - For our silver partners,We are paid technical training on june,2010. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, - For training to Silver partners + Hello,

    +

    We have very good offer that might suit you. + For our silver partners,We are paid technical training on june,2010.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    + training to silver partners
    @@ -122,12 +125,12 @@ - Hello, We have very good offer that might suit you. - For our silver partners,We are offering Gold partnership. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, - For gold partnership to silver partners + Hello,

    +

    We have very good offer that might suit you. + For our silver partners, we are offering Gold partnership.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    + gold partnership to silver partners
    @@ -137,9 +140,12 @@ - Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this. - Regards,OpenERP Team, - For subscribing to technical training + Hello,

    +

    Thanks for showing interest and for subscribing to technical training.

    + If any further information required kindly revert back.I really appreciate your co-operation on this.

    +

    If any further information is required, do not hesitate to reply to this message.

    +

    Regards,OpenERP Team,

    ]]>
    + subscribing to technical training
    diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 7b8442b4c46..c667daadbec 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -369,7 +369,7 @@ class mrp_bom(osv.osv): prod_obj = self.pool.get('product.product') for obj in self.browse(cr, uid, ids, context=context): for prod in prod_obj.browse(cr, uid, [obj.product_id], context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Bill of Material has been created for %s product.") % (prod.id.name_template), context=context) + self.message_post(cr, uid, [obj.id], body=_("Bill of Material has been created for %s product.") % (prod.id.name_template), context=context) return True mrp_bom() @@ -407,7 +407,7 @@ class mrp_production(osv.osv): _name = 'mrp.production' _description = 'Manufacturing Order' _date_name = 'date_planned' - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] def _production_calc(self, cr, uid, ids, prop, unknow_none, context=None): """ Calculates total hours and total no. of cycles for a production order. @@ -1046,33 +1046,28 @@ class mrp_production(osv.osv): # OpenChatter methods and notifications # --------------------------------------------------- - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'user_id' to the monitored fields """ - res = super(mrp_production, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['user_id'] - def create_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Manufacturing order has been created."), context=context) + self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been canceled.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_ready_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is ready to produce.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_in_production_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is in production.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been done.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_confirm_send_note(self, cr, uid, ids, context=None): @@ -1082,7 +1077,7 @@ class mrp_production(osv.osv): obj_datetime = fields.DT.datetime.strptime(obj.date_planned, DEFAULT_SERVER_DATETIME_FORMAT) obj_date_str = fields.datetime.context_timestamp(cr, uid, obj_datetime, context=context).strftime(DATETIME_FORMATS_MAP['%+'] + " (%Z)") message = _("Manufacturing order has been confirmed and is scheduled for the %s.") % (obj_date_str) - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) return True diff --git a/addons/mrp/mrp_data.xml b/addons/mrp/mrp_data.xml index e5d5380f96a..0bbf2d3b64c 100644 --- a/addons/mrp/mrp_data.xml +++ b/addons/mrp/mrp_data.xml @@ -2,14 +2,16 @@ - - - - Module MRP has been installed - Manage your manufacturing process in OpenERP by defining bill of materials (BoM), routings and work centers. This module supports complete integration and planification of stockable goods, consumable, and services. + + mail.group + + notification + MRP application installed! + Manage your manufacturing process with OpenERP by defining your bills of materials (BoM), routings and work centers. +This application supports complete integration and production scheduling for stockable goods, consumables, and services. -From the Manufacturing Settings, you can choose to compute production schedules periodically or just-in-time. - +From the Manufacturing Settings, you can choose to compute production schedules periodically or just-in-time.
    + Production order diff --git a/addons/mrp/mrp_demo.xml b/addons/mrp/mrp_demo.xml index d0f05a2aaff..952a5e0e3de 100644 --- a/addons/mrp/mrp_demo.xml +++ b/addons/mrp/mrp_demo.xml @@ -49,7 +49,7 @@ 0.05 - + diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index acb51ea6388..8121f6e84d1 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -579,8 +579,8 @@ mrp.production.tree mrp.production - - + + diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py index 363f98e35d1..7f417dc18b1 100644 --- a/addons/mrp/procurement.py +++ b/addons/mrp/procurement.py @@ -43,7 +43,7 @@ class procurement_order(osv.osv): cr.execute('update procurement_order set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id)) for (id, name) in self.name_get(cr, uid, procurement.id): message = _("Procurement '%s' has an exception: 'No BoM defined for this product !'") % name - self.message_append_note(cr, uid, [procurement.id], body=message, context=context) + self.message_post(cr, uid, [procurement.id], body=message, context=context) return False return True diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index 8692dab5c87..ee2547bc7df 100644 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -224,7 +224,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been created for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_start_send_note(self, cr, uid, ids, context=None): @@ -232,7 +232,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been started for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): @@ -240,7 +240,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been done for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_pending_send_note(self, cr, uid, ids, context=None): @@ -248,7 +248,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order is pending for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): @@ -256,7 +256,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been cancelled for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True mrp_production_workcenter_line() diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py index f41abb58c08..c1ac8f809ce 100644 --- a/addons/mrp_repair/mrp_repair.py +++ b/addons/mrp_repair/mrp_repair.py @@ -571,40 +571,40 @@ class mrp_repair(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been created." % (repair.product_id.name)) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_start_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been started." % (repair.product_id.name)) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_toinvoiced_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Draft Invoice of %s %s waiting for validation.") % (repair.invoice_id.amount_total, repair.invoice_id.currency_id.symbol) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_confirm_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _( "Repair Order for %s has been accepted." % (repair.product_id.name)) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Repair has been cancelled.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def set_ready_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is now ready to repair.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def set_done_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is closed.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True mrp_repair() diff --git a/addons/note/note_demo.xml b/addons/note/note_demo.xml index e322f362ef5..e6ab25198a6 100644 --- a/addons/note/note_demo.xml +++ b/addons/note/note_demo.xml @@ -58,7 +58,7 @@ @@ -93,7 +93,7 @@ @@ -104,7 +104,7 @@ @@ -115,7 +115,7 @@ @@ -127,7 +127,7 @@ @@ -139,7 +139,7 @@ diff --git a/addons/plugin/plugin_handler.py b/addons/plugin/plugin_handler.py index e497f902dc2..9c582a8e3bf 100644 --- a/addons/plugin/plugin_handler.py +++ b/addons/plugin/plugin_handler.py @@ -44,7 +44,7 @@ class plugin_handler(osv.osv_memory): res_id = 0 url = "" name = "" - msg = mail_message_obj.parse_message(email) + msg = self.pool.get('mail.thread').parse_message(cr, uid, email) references = [msg.get('message-id')] refs = msg.get('references',False) if refs: @@ -91,7 +91,7 @@ class plugin_handler(osv.osv_memory): """ mail_message = self.pool.get('mail.message') model_obj = self.pool.get(model) - msg = mail_message.parse_message(email) + msg = self.pool.get('mail.thread').parse_message(cr, uid, email) message_id = msg.get('message-id') mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)]) @@ -101,16 +101,15 @@ class plugin_handler(osv.osv_memory): notify = "Email already pushed" elif res_id == 0: if model == 'res.partner': - notify = 'User the button Partner to create a new partner' + notify = 'User the Partner button to create a new partner' else: res_id = model_obj.message_new(cr, uid, msg) - notify = "Mail succefully pushed, a new %s has been created " % model + notify = "Mail succesfully pushed, a new %s has been created " % model else: if model == 'res.partner': model_obj = self.pool.get('mail.thread') - res = self.pool.get(model).browse(cr, uid, [res_id]) - model_obj.message_append_dict(cr, uid, res, msg) - notify = "Mail succefully pushed" + model_obj.message_post(cr, uid, [res_id], body=msg) + notify = "Mail succesfully pushed" url = self._make_url(cr, uid, res_id, model) return (model, res_id, url, notify) @@ -133,7 +132,7 @@ class plugin_handler(osv.osv_memory): return ('res.partner', partner_id, url) # Specific to outlook rfc822 is not available so we split in arguments headerd,body,attachemnts - def push_message_outlook(self, cr, uid, model, headers,res_id=0 ,body_text=False, body_html=False, attachments=False): + def push_message_outlook(self, cr, uid, model, headers,res_id=0 ,body=False, body_html=False, attachments=False): # ---------------------------------------- # solution 1 # construct a fake rfc822 from the separated arguement @@ -147,7 +146,7 @@ class plugin_handler(osv.osv_memory): mail_message = self.pool.get('mail.message') ir_attachment_obj = self.pool.get('ir.attachment') attach_ids = [] - msg = mail_message.parse_message(headers) + msg = self.pool.get('mail.thread').parse_message(cr, uid, headers) message_id = msg.get('message-id') push_mail = self.push_message(cr, uid, model, headers, res_id) res_id = push_mail[1] @@ -161,6 +160,6 @@ class plugin_handler(osv.osv_memory): attach_ids.append(ir_attachment_obj.create(cr, uid, vals)) mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)]) if mail_ids: - ids = mail_message.write(cr, uid,mail_ids[0],{ 'attachment_ids': [(6, 0, attach_ids)],'body_text':body_text,'body_html':body_html}) + ids = mail_message.write(cr, uid,mail_ids[0],{ 'attachment_ids': [(6, 0, attach_ids)],'body':body,'body_html':body_html}) url = self._make_url(cr, uid, res_id, model) return (model, res_id, url) diff --git a/addons/point_of_sale/point_of_sale_data.xml b/addons/point_of_sale/point_of_sale_data.xml index dda0b78e952..35a2516da02 100644 --- a/addons/point_of_sale/point_of_sale_data.xml +++ b/addons/point_of_sale/point_of_sale_data.xml @@ -24,14 +24,15 @@ - - - - Module Point of Sale has been installed - Encode sale orders, register payments, compute money to return, create invoices, and manage refunds of former sales through a specific, web-based, touch-screen user interface. + + mail.group + + notification + Point of Sale application installed! + Record sale orders, register payments, compute change to return, create invoices, and manage refunds through a specific web touch-screen interface. -If you install the PoS proxy, you will be able to interface OpenERP with retail materials; barcode scanners, printers, cash registers, weighing machine, credit card payments. - +If you install the PoS proxy you will be able to interface OpenERP with retail hardware: barcode scanners, printers, cash registers, weighing machines, credit card payment terminals. + 1.00 diff --git a/addons/portal/portal_demo.xml b/addons/portal/portal_demo.xml index a07709cd0d5..1ace02f3d7d 100644 --- a/addons/portal/portal_demo.xml +++ b/addons/portal/portal_demo.xml @@ -22,8 +22,7 @@ Our first company's blogpost ! mail.group - html - sit amet, consectetur adipiscing elit. Pellentesque et quam sapien, in sagittis tellus. Praesent vel massa sed massa consequat egestas in tristique orci. Praesent iaculis libero et neque vehicula iaculis. Vivamus placerat tincidunt orci ac ornare. Proin ut dolor fringilla velit ultricies consequat. Maecenas sit amet ipsum non leo interdum imperdiet. Donec sapien mi. @@ -32,27 +31,25 @@ Fusce tempus elit volutpat mi auctor adipiscing. Nam congue luctus suscipit. Sed Nulla turpis leo, rhoncus ut egestas sit amet, consectetur vitae urna. Mauris in dolor in sapien tempus vehicula.]]> comment - + mail.group - html - + comment - + mail.group - html - + comment - +
    diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py index 0260ce338fc..85f6566eba6 100644 --- a/addons/portal/wizard/portal_wizard.py +++ b/addons/portal/wizard/portal_wizard.py @@ -171,7 +171,7 @@ class wizard(osv.osv_memory): 'url': wiz.portal_id.url or _("(missing url)"), 'db': cr.dbname, } - mail_message_obj = self.pool.get('mail.message') + mail_mail_obj = self.pool.get('mail.mail') dest_uids = user_obj.search(cr, ROOT_UID, login_cond) dest_users = user_obj.browse(cr, ROOT_UID, dest_uids) for dest_user in dest_users: @@ -184,10 +184,12 @@ class wizard(osv.osv_memory): email_to = dest_user.email subject = _(WELCOME_EMAIL_SUBJECT) % data body = _(WELCOME_EMAIL_BODY) % data - res = mail_message_obj.schedule_with_attach(cr, uid, email_from , [email_to], subject, body, context=context) - if not res: - _logger.warning( - 'Failed to send email from %s to %s', email_from, email_to) + mail_id = mail_mail_obj.create(cr, uid, { + 'email_from': email_from , + 'email_to': email_to, + 'subject': subject, + 'state': 'outgoing', + 'body_html': '
    %s
    ' % body}, context=context) return {'type': 'ir.actions.act_window_close'} diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index d1fb3f8a395..db50ebd94fd 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -289,14 +289,14 @@ class procurement_order(osv.osv): return False if not procurement.product_id.seller_ids: message = _('No supplier defined for this product !') - self.message_append_note(cr, uid, [procurement.id], body=message) + self.message_post(cr, uid, [procurement.id], body=message) cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id)) return False partner = procurement.product_id.seller_id #Taken Main Supplier of Product of Procurement. if not partner: message = _('No default supplier defined for this product') - self.message_append_note(cr, uid, [procurement.id], body=message) + self.message_post(cr, uid, [procurement.id], body=message) cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id)) return False if user.company_id and user.company_id.partner_id: @@ -306,7 +306,7 @@ class procurement_order(osv.osv): address_id = partner_obj.address_get(cr, uid, [partner.id], ['delivery'])['delivery'] if not address_id: message = _('No address defined for the supplier') - self.message_append_note(cr, uid, [procurement.id], body=message) + self.message_post(cr, uid, [procurement.id], body=message) cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id)) return False return True @@ -365,7 +365,7 @@ class procurement_order(osv.osv): message = _('From stock: products assigned.') self.write(cr, uid, ids, {'state': 'running', 'message': message}, context=context) - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) self.running_send_note(cr, uid, ids, context=context) return True @@ -389,7 +389,7 @@ class procurement_order(osv.osv): ok = ok and self.pool.get('stock.move').action_assign(cr, uid, [id]) order_point_id = self.pool.get('stock.warehouse.orderpoint').search(cr, uid, [('product_id', '=', procurement.product_id.id)], context=context) if not order_point_id and not ok: - message = _("Not enough stock and no minimum orderpoint rule defined.") + message = _("Not enough stock and no minimum orderpoint rule defined.") elif not order_point_id: message = _("No minimum orderpoint rule defined.") elif not ok: @@ -398,7 +398,7 @@ class procurement_order(osv.osv): if message: message = _("Procurement '%s' is in exception: ") % (procurement.name) + message cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id)) - self.message_append_note(cr, uid, [procurement.id], body=message, context=context) + self.message_post(cr, uid, [procurement.id], body=message, context=context) return ok def action_produce_assign_service(self, cr, uid, ids, context=None): @@ -496,22 +496,22 @@ class procurement_order(osv.osv): return obj_id def create_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Procurement has been created."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been created."), context=context) def confirm_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Procurement has been confirmed."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been confirmed."), context=context) def running_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Procurement has been set to running."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been set to running."), context=context) def ready_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Procurement has been set to ready."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been set to ready."), context=context) def cancel_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Procurement has been cancelled."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), context=context) def done_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Procurement has been done."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been done."), context=context) procurement_order() diff --git a/addons/procurement/schedulers.py b/addons/procurement/schedulers.py index 7a87697f5c8..1c8ac5934fc 100644 --- a/addons/procurement/schedulers.py +++ b/addons/procurement/schedulers.py @@ -54,7 +54,6 @@ class procurement_order(osv.osv): ''' if context is None: context = {} - try: if use_new_cursor: cr = pooler.get_db(use_new_cursor).cursor() @@ -119,19 +118,6 @@ class procurement_order(osv.osv): offset += len(ids) if not ids: break end_date = fields.datetime.now() - if uid: - # Chatter: old res.request is now a chatter on res.users, id=uid - summary = _("""Here is the procurement scheduling report. - - Start Time: %s - End Time: %s - Total Procurements processed: %d - Procurements with exceptions: %d - Skipped Procurements (scheduled date outside of scheduler range) %d - - Exceptions:\n""") % (start_date, end_date, report_total, report_except, report_later) - summary += '\n'.join(report) - procurement_obj.message_append_note(cr, uid, ids, body=summary, context=context) if use_new_cursor: cr.commit() diff --git a/addons/product/product.py b/addons/product/product.py index 1b8c69b7d5b..16b08e67cee 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -580,7 +580,7 @@ class product_product(osv.osv): return obj_id def create_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Product has been created."), context=context) + return self.message_post(cr, uid, ids, body=_("Product has been created."), context=context) def unlink(self, cr, uid, ids, context=None): unlink_ids = [] diff --git a/addons/project/project.py b/addons/project/project.py index f16cb905807..241e3a24dc5 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -67,7 +67,7 @@ class project(osv.osv): _description = "Project" _inherits = {'account.analytic.account': "analytic_account_id", "mail.alias": "alias_id"} - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False): if user == 1: @@ -187,23 +187,6 @@ class project(osv.osv): """Overriden in project_issue to offer more options""" return [('project.task', "Tasks")] - def _get_followers(self, cr, uid, ids, name, arg, context=None): - ''' - Functional field that computes the users that are 'following' a thread. - ''' - res = {} - for project in self.browse(cr, uid, ids, context=context): - l = set() - for message in project.message_ids: - l.add(message.user_id and message.user_id.id or False) - res[project.id] = list(filter(None, l)) - return res - - def _search_followers(self, cr, uid, obj, name, args, context=None): - project_obj = self.pool.get('project.project') - project_ids = project_obj.search(cr, uid, [('message_ids.user_id.id', 'in', args[0][2])], context=context) - return [('id', 'in', project_ids)] - # Lambda indirection method to avoid passing a copy of the overridable method when declaring the field _alias_models = lambda self, *args, **kwargs: self._get_alias_models(*args, **kwargs) @@ -247,8 +230,6 @@ class project(osv.osv): help="The kind of document created when an email is received on this project's email alias"), 'privacy_visibility': fields.selection([('public','Public'), ('followers','Followers Only')], 'Privacy / Visibility', required=True), 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,), - 'followers': fields.function(_get_followers, method=True, fnct_search=_search_followers, - type='many2many', relation='res.users', string='Followers'), } def _get_type_common(self, cr, uid, context): @@ -512,11 +493,6 @@ def Project(): # OpenChatter methods and notifications # ------------------------------------------------ - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'user_id' to the monitored fields """ - res = super(project, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['user_id'] - def create(self, cr, uid, vals, context=None): if context is None: context = {} # Prevent double project creation when 'use_tasks' is checked! @@ -537,23 +513,23 @@ def Project(): return project_id def create_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Project has been created."), context=context) + return self.message_post(cr, uid, ids, body=_("Project has been created."), context=context) def set_open_send_note(self, cr, uid, ids, context=None): message = _("Project has been opened.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def set_pending_send_note(self, cr, uid, ids, context=None): message = _("Project is now pending.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Project has been cancelled.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def set_close_send_note(self, cr, uid, ids, context=None): message = _("Project has been closed.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def write(self, cr, uid, ids, vals, context=None): # if alias_model has been changed, update alias_model_id accordingly @@ -566,7 +542,7 @@ class task(base_stage, osv.osv): _name = "project.task" _description = "Task" _date_name = "date_start" - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] def _get_default_project_id(self, cr, uid, context=None): """ Gives default section by checking if present in the context """ @@ -1179,6 +1155,45 @@ class task(base_stage, osv.osv): result += "\n" return result + # --------------------------------------------------- + # mail gateway + # --------------------------------------------------- + + def message_new(self, cr, uid, msg, custom_values=None, context=None): + """ Override to updates the document according to the email. """ + if custom_values is None: custom_values = {} + custom_values.update({ + 'name': subject, + 'planned_hours': 0.0, + 'subject': msg.get('subject'), + }) + return super(project_tasks,self).message_new(cr, uid, msg, custom_values=custom_values, context=context) + + def message_update(self, cr, uid, ids, msg, update_vals=None, context=None): + """ Override to update the task according to the email. """ + if update_vals is None: update_vals = {} + act = False + maps = { + 'cost':'planned_hours', + } + for line in msg['body'].split('\n'): + line = line.strip() + res = tools.misc.command_re.match(line) + if res: + match = res.group(1).lower() + field = maps.get(match) + if field: + try: + update_vals[field] = float(res.group(2).lower()) + except (ValueError, TypeError): + pass + elif match.lower() == 'state' \ + and res.group(2).lower() in ['cancel','close','draft','open','pending']: + act = 'do_%s' % res.group(2).lower() + if act: + getattr(self,act)(cr, uid, ids, context=context) + return super(project_tasks,self).message_update(cr, uid, msg, update_vals=update_vals, context=context) + # --------------------------------------------------- # OpenChatter methods and notifications # --------------------------------------------------- @@ -1207,19 +1222,19 @@ class task(base_stage, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_append_note(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) def create_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Task has been created."), context=context) + return self.message_post(cr, uid, ids, body=_("Task has been created."), context=context) def case_draft_send_note(self, cr, uid, ids, context=None): msg = _('Task has been set as draft.') - return self.message_append_note(cr, uid, ids, body=msg, context=context) + return self.message_post(cr, uid, ids, body=msg, context=context) def do_delegation_send_note(self, cr, uid, ids, context=None): for task in self.browse(cr, uid, ids, context=context): msg = _('Task has been delegated to %s.') % (task.user_id.name) - self.message_append_note(cr, uid, [task.id], body=msg, context=context) + self.message_post(cr, uid, [task.id], body=msg, context=context) return True diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml index c2d37f7943d..5cc4c99df1b 100644 --- a/addons/project/project_data.xml +++ b/addons/project/project_data.xml @@ -85,13 +85,15 @@ - - - - Module Project Management has been installed - Manage multi-level projects and tasks. You can delegate tasks, track the work done on tasks, and review your planning based on the entered data. + + mail.group + + notification + Project Management application installed! + Manage multi-level projects and tasks. You can delegate tasks, track task work, and review your planning. -You can manage todo lists on tasks by installing the module "Todo Lists", which supports the methodology Getting Things Done (GTD). You can also manage issues/bugs in projects by installing the module "Issues Tracker." - +You can manage todo lists on tasks by installing the "Todo Lists" application, supporting the Getting Things Done (GTD) methodology. +You can also manage issues/bugs in projects by installing the "Issue Tracker" application. + diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml index 0f0af017e0c..cd22bad67d4 100644 --- a/addons/project/project_demo.xml +++ b/addons/project/project_demo.xml @@ -396,36 +396,30 @@ project.task - plain - Hello Quentin, + Hello Demo, There is a change in customer requirement. Can you check the document from customer again. Thanks, comment - + - project.task - plain - Ok, I have checked the mail, + Ok, I have checked the mail, I will update the document and let you know. comment - + - - project.task - plain - Fine! + Fine! Send it ASAP, its urgent. comment - + diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index a204669f714..d359cdbf458 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -163,7 +163,7 @@ - + @@ -188,9 +188,9 @@ project.project child_ids - + - + @@ -529,7 +529,7 @@ - + @@ -594,8 +594,8 @@ project.task - - + + @@ -655,7 +655,7 @@ - + diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml index f867285138a..3afe0f14e7a 100644 --- a/addons/project/security/project_security.xml +++ b/addons/project/security/project_security.xml @@ -45,7 +45,7 @@ public Members - ['|','|',('privacy_visibility','in',[False,'public']),('members','in',[user.id]),('followers','in',[user.id])] + ['|','|',('privacy_visibility','in',[False,'public']),('members','in',[user.id]),('follower_ids','in',[user.partner_id.id])] diff --git a/addons/project_gtd/project_gtd_data.xml b/addons/project_gtd/project_gtd_data.xml index dc1df93dc46..61b2468329c 100644 --- a/addons/project_gtd/project_gtd_data.xml +++ b/addons/project_gtd/project_gtd_data.xml @@ -26,11 +26,14 @@ - - - - Module Todo Lists has been installed - Add todo items on project tasks, to help you organize your work. This module supports the methodology Getting Things Done (GTD), created by David Allen, and described in the book of the same name. - + + mail.group + + notification + Todo Lists application installed! + Add todo items on project tasks, to help you organize your work. +This application supports the Getting Things Done (GTD) methodology, based on David Allen's book. + + diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py index 07e453af885..3d005f3fad6 100644 --- a/addons/project_issue/__openerp__.py +++ b/addons/project_issue/__openerp__.py @@ -21,11 +21,11 @@ ############################################################################## { - 'name': 'Issues Tracker', + 'name': 'Issue Tracker', 'version': '1.0', 'category': 'Project Management', 'sequence': 22, - 'summary': 'Support, Bug Traker, Helpdesk', + 'summary': 'Support, Bug Tracker, Helpdesk', 'description': """ This module provides Issues/Bugs Management in Project. ======================================================= diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index c2ff76d05a6..22384a12a10 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -46,8 +46,7 @@ class project_issue(base_stage, osv.osv): _name = "project.issue" _description = "Project Issue" _order = "priority, create_date desc" - _inherit = ['ir.needaction_mixin', 'mail.thread'] - _mail_compose_message = True + _inherit = ['mail.thread', 'ir.needaction_mixin'] def _get_default_project_id(self, cr, uid, context=None): """ Gives default project by checking if present in the context """ @@ -364,7 +363,6 @@ class project_issue(base_stage, osv.osv): return super(project_issue, self).write(cr, uid, ids, vals, context) def onchange_task_id(self, cr, uid, ids, task_id, context=None): - result = {} if not task_id: return {'value':{}} task = self.pool.get('project.task').browse(cr, uid, task_id, context=context) @@ -454,14 +452,13 @@ class project_issue(base_stage, osv.osv): custom_values.update({ 'name': msg.get('subject') or _("No Subject"), - 'description': msg.get('body_text'), + 'description': msg.get('body'), 'email_from': msg.get('from'), 'email_cc': msg.get('cc'), 'user_id': False, }) if msg.get('priority'): custom_values['priority'] = msg.get('priority') - custom_values.update(self.message_partner_by_email(cr, uid, msg.get('from'), context=context)) res_id = super(project_issue, self).message_new(cr, uid, msg, custom_values=custom_values, context=context) # self.convert_to_bug(cr, uid, [res_id], context=context) @@ -477,16 +474,16 @@ class project_issue(base_stage, osv.osv): if update_vals is None: update_vals = {} # Update doc values according to the message - update_vals['description'] = msg.get('body_text', '') + update_vals['description'] = msg.get('body', '') if msg.get('priority'): update_vals['priority'] = msg.get('priority') - # Parse 'body_text' to find values to update + # Parse 'body' to find values to update maps = { 'cost': 'planned_cost', 'revenue': 'planned_revenue', 'probability': 'probability', } - for line in msg.get('body_text', '').split('\n'): + for line in msg.get('body', '').split('\n'): line = line.strip() res = tools.misc.command_re.match(line) if res and maps.get(res.group(1).lower(), False): @@ -499,36 +496,31 @@ class project_issue(base_stage, osv.osv): # OpenChatter methods and notifications # ------------------------------------------------------- - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'user_id' to the monitored fields """ - res = super(project_issue, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['user_id'] - def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_append_note(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): """ Override of default prefix for notifications. """ return 'Project issue' def convert_to_task_send_note(self, cr, uid, ids, context=None): - message = _("Project issue has been converted into task.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + message = _("Project issue converted to task.") + return self.message_post(cr, uid, ids, body=message, context=context) def create_send_note(self, cr, uid, ids, context=None): - message = _("Project issue has been created.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + message = _("Project issue created.") + return self.message_post(cr, uid, ids, body=message, context=context) def case_escalate_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): if obj.project_id: - message = _("has been escalated to '%s'.") % (obj.project_id.name) - obj.message_append_note(body=message, context=context) + message = _("escalated to '%s'.") % (obj.project_id.name) + obj.message_post(body=message) else: - message = _("has been escalated.") - obj.message_append_note(body=message, context=context) + message = _("escalated.") + obj.message_post(body=message) return True project_issue() diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index a191cb4454f..ddb0d575e63 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -32,13 +32,15 @@ - - - - Module Issues Tracker has been installed. - Manage the issues you might face in a project, like bugs in a system, client complaints or material breakdowns. You can record issues, assign them to some responsible person, and keep track of their status as they evolve over time. + + mail.group + + notification + Issue Tracker application installed! + Manage the issues you might face in a project, such as bugs in a system, client complaints or material breakdowns. +You can record issues, assign them to a responsible person, and keep track of their status as they evolve over time. +Access all issues from the top Project menu, and access the issues of a specific project via the projects gallery view. + -You can access issues from the top menu Project, and access the issues of a specific project from the projects gallery view. - diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 564060e3f08..5096779545b 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -170,8 +170,8 @@ Project Issue Tracker Tree project.issue - - + + @@ -196,7 +196,7 @@ - + @@ -311,9 +311,9 @@ Project Issue- Feature Tracker Tree project.issue - + - + diff --git a/addons/project_mailgate/__openerp__.py b/addons/project_mailgate/__openerp__.py deleted file mode 100644 index 05eacb782cc..00000000000 --- a/addons/project_mailgate/__openerp__.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# 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 . -# -############################################################################## - - -{ - 'name': 'Tasks-Mail Integration', - 'version': '1.1', - 'author': 'OpenERP SA', - 'website': 'http://www.openerp.com', - 'category': 'Project Management', - 'images': ['images/project_mailgate_task.jpeg'], - 'depends': ['project', 'mail'], - 'description': """ -This module can automatically create Project Tasks based on incoming emails. -============================================================================ - -Allows creating tasks based on new emails arriving at a given mailbox, -similarly to what the CRM application has for Leads/Opportunities. - -There are two common alternatives to configure the mailbox integration: ------------------------------------------------------------------------ - * Install the ``fetchmail`` module and configure a new mailbox, then select - ``Project Tasks`` as the target for incoming emails. - * Set it up manually on your mail server based on the 'mail gateway' script - provided in the ``mail`` module - and connect it to the `project.task` model. - """, - 'data': [], - 'demo': [], - 'installable': True, - 'auto_install': False, - 'certificate': '001075048780413258261', -} - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_mailgate/i18n/ar.po b/addons/project_mailgate/i18n/ar.po deleted file mode 100644 index 42b0945e3a8..00000000000 --- a/addons/project_mailgate/i18n/ar.po +++ /dev/null @@ -1,102 +0,0 @@ -# Arabic translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-01-12 21:12+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Arabic \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "معلومات المحفوظات" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "مهمة" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "خطأ ! لا يمكنك انشاء مهام رجعية." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "الرسائل" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "مسودة" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "خطأ! يجب ان يكون تاريخ انتهاء المهمة اكبر من تاريخ البداية" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "إلغاء" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "تم" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "فتح" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "معلّق" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "محفوظات" - -#~ msgid "Attachments" -#~ msgstr "مرفقات" - -#~ msgid "Details" -#~ msgstr "تفاصيل" - -#~ msgid "Project MailGateWay" -#~ msgstr "مدخل بريد المشروع" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "هذه الوحدة هي تفاعل التي تتزامن البريد مع مهام مشروع OpenERP .\n" -#~ "وهي تسمح بإنشاء المهام في اقرب وقت كما يصل البريد الجديد في خادم البريد الذي " -#~ "تم ضبطه.\n" -#~ "علاوة على ذلك, تستمر في تعقب المزيد من كل الاتصالات وحالات المهمة.\n" -#~ " " diff --git a/addons/project_mailgate/i18n/ca.po b/addons/project_mailgate/i18n/ca.po deleted file mode 100644 index 622d0a55ac1..00000000000 --- a/addons/project_mailgate/i18n/ca.po +++ /dev/null @@ -1,106 +0,0 @@ -# Catalan translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-02-06 21:57+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Catalan \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Informació històrica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tasca" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Error! No podeu crear tasques recursives." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Missatges" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Esborrany" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Error ! La data final de la tasca ha de ser major que la data d'inici" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Canceŀla" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Realitzat" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Obre" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Pendent" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Històric" - -#~ msgid "Project MailGateWay" -#~ msgstr "Ruta d'enllaç del projecte" - -#~ msgid "Attachments" -#~ msgstr "Adjunts" - -#~ msgid "Details" -#~ msgstr "Detalls" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Aquest mòdul proporciona una interfície per sincronitzar correus amb les " -#~ "tasques de projectes d'OpenERP.\n" -#~ "\n" -#~ "Permet crear tasques tan aviat com arriba un nou correu en el nostre " -#~ "servidor de correu prèviament configurat.\n" -#~ "A més realitza un seguiment de totes les comunicacions addicionals i estats " -#~ "de la tasca.\n" -#~ " " diff --git a/addons/project_mailgate/i18n/cs.po b/addons/project_mailgate/i18n/cs.po deleted file mode 100644 index b65ae7910f5..00000000000 --- a/addons/project_mailgate/i18n/cs.po +++ /dev/null @@ -1,78 +0,0 @@ -# Czech translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-04-06 06:41+0000\n" -"Last-Translator: Jiří Hajda \n" -"Language-Team: Czech \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Informace historie" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Úkol" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Chyba ! Nemůžete vytvořit rekurzivní úkoly." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Zprávy" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Koncept" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "Chyba ! Datum ukončení úkolu musí být větší než počáteční datum" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Zrušit" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Dokončené" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Otevřené" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Čekající" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historie" diff --git a/addons/project_mailgate/i18n/da.po b/addons/project_mailgate/i18n/da.po deleted file mode 100644 index 43aeba4c665..00000000000 --- a/addons/project_mailgate/i18n/da.po +++ /dev/null @@ -1,78 +0,0 @@ -# Danish translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-01-27 06:33+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Danish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "" diff --git a/addons/project_mailgate/i18n/de.po b/addons/project_mailgate/i18n/de.po deleted file mode 100644 index a8f8bfa17c6..00000000000 --- a/addons/project_mailgate/i18n/de.po +++ /dev/null @@ -1,106 +0,0 @@ -# German translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2010-12-31 10:37+0000\n" -"Last-Translator: Thorsten Vocks (OpenBig.org) \n" -"Language-Team: German \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Information Historie" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Aufgabe" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Fehler ! Sie können keine rekursiven Aufgaben definieren." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Nachrichten" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Entwurf" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "Fehler! Aufgaben End-Datum muss größer als Aufgaben-Beginn sein" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Abbrechen" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Erledigt" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Offen" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Im Wartezustand" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historie" - -#~ msgid "Project MailGateWay" -#~ msgstr "Projekte Mailgateway" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Dieses Modul ermöglicht die Synchronisation von Email mit openERP " -#~ "Projektaufgaben.\n" -#~ "\n" -#~ "Es ermöglicht die Erstellung einer neuen Aufgabe sobald eine neue EMail von " -#~ "Ihrem Mailserver empfangen wird.\n" -#~ "Ausserdem können Sie dann alle weitere Korrespondenz und Kommunikation " -#~ "rückverfolgen sowie den Status der Aufgabe überwachen.\n" -#~ " " - -#~ msgid "Details" -#~ msgstr "Details" - -#~ msgid "Attachments" -#~ msgstr "Anhänge" diff --git a/addons/project_mailgate/i18n/es.po b/addons/project_mailgate/i18n/es.po deleted file mode 100644 index e5aab3c52b1..00000000000 --- a/addons/project_mailgate/i18n/es.po +++ /dev/null @@ -1,106 +0,0 @@ -# Spanish translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2010-12-28 08:35+0000\n" -"Last-Translator: Jordi Esteve (www.zikzakmedia.com) " -"\n" -"Language-Team: Spanish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Información histórica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarea" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "¡Error! No puede crear tareas recursivas." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensajes" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Borrador" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"¡ Error ! La fecha final de la tarea debe ser mayor que la fecha de inicio" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Realizado" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Pendiente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historial" - -#~ msgid "Project MailGateWay" -#~ msgstr "Ruta de enlace del proyecto" - -#~ msgid "Details" -#~ msgstr "Detalles" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Este módulo proporciona una interfaz para sincronizar correos con las tareas " -#~ "de proyectos de OpenERP.\n" -#~ "Permite crear tareas tan pronto como llega un nuevo correo en nuestro " -#~ "servidor de correo previamente configurado.\n" -#~ "Además realiza un seguimiento de todas las comunicaciones adicionales y " -#~ "estados de la tarea.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Adjuntos" diff --git a/addons/project_mailgate/i18n/es_CR.po b/addons/project_mailgate/i18n/es_CR.po deleted file mode 100644 index 4e420fa49fa..00000000000 --- a/addons/project_mailgate/i18n/es_CR.po +++ /dev/null @@ -1,107 +0,0 @@ -# Spanish translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-02-17 00:30+0000\n" -"Last-Translator: Carlos Vásquez (CLEARCORP) " -"\n" -"Language-Team: Spanish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" -"Language: es\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Información histórica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarea" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "¡Error! No puede crear tareas recursivas." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensajes" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Borrador" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"¡ Error ! La fecha final de la tarea debe ser mayor que la fecha de inicio" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Realizado" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Pendiente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historial" - -#~ msgid "Project MailGateWay" -#~ msgstr "Ruta de enlace del proyecto" - -#~ msgid "Details" -#~ msgstr "Detalles" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Este módulo proporciona una interfaz para sincronizar correos con las tareas " -#~ "de proyectos de OpenERP.\n" -#~ "Permite crear tareas tan pronto como llega un nuevo correo en nuestro " -#~ "servidor de correo previamente configurado.\n" -#~ "Además realiza un seguimiento de todas las comunicaciones adicionales y " -#~ "estados de la tarea.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Adjuntos" diff --git a/addons/project_mailgate/i18n/es_MX.po b/addons/project_mailgate/i18n/es_MX.po deleted file mode 100644 index 2736d2572ac..00000000000 --- a/addons/project_mailgate/i18n/es_MX.po +++ /dev/null @@ -1,108 +0,0 @@ -# Spanish translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2010-12-28 08:35+0000\n" -"Last-Translator: Jordi Esteve (www.zikzakmedia.com) " -"\n" -"Language-Team: Spanish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:56+0000\n" -"X-Generator: Launchpad (build 13830)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Información histórica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarea" - -#. module: project_mailgate -#: model:ir.module.module,description:project_mailgate.module_meta_information -msgid "" -"This module is an interface that synchronises mails with OpenERP Project " -"Task.\n" -"\n" -"It allows creating tasks as soon as a new mail arrives in our configured " -"mail server.\n" -"Moreover, it keeps track of all further communications and task states.\n" -" " -msgstr "" -"Este módulo proporciona una interfaz para sincronizar correos con las tareas " -"de proyectos de OpenERP.\n" -"Permite crear tareas tan pronto como llega un nuevo correo en nuestro " -"servidor de correo previamente configurado.\n" -"Además realiza un seguimiento de todas las comunicaciones adicionales y " -"estados de la tarea.\n" -" " - -#. module: project_mailgate -#: view:project.task:0 -msgid "Attachments" -msgstr "Adjuntos" - -#. module: project_mailgate -#: model:ir.module.module,shortdesc:project_mailgate.module_meta_information -msgid "Project MailGateWay" -msgstr "Ruta de enlace del proyecto" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "¡Error! No puede crear tareas recursivas." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensajes" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:123 -#, python-format -msgid "Draft" -msgstr "Borrador" - -#. module: project_mailgate -#: view:project.task:0 -msgid "Details" -msgstr "Detalles" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:149 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:143 -#, python-format -msgid "Done" -msgstr "Realizado" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:129 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:135 -#, python-format -msgid "Pending" -msgstr "Pendiente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historial" diff --git a/addons/project_mailgate/i18n/es_VE.po b/addons/project_mailgate/i18n/es_VE.po deleted file mode 100644 index 2736d2572ac..00000000000 --- a/addons/project_mailgate/i18n/es_VE.po +++ /dev/null @@ -1,108 +0,0 @@ -# Spanish translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2010-12-28 08:35+0000\n" -"Last-Translator: Jordi Esteve (www.zikzakmedia.com) " -"\n" -"Language-Team: Spanish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:56+0000\n" -"X-Generator: Launchpad (build 13830)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Información histórica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarea" - -#. module: project_mailgate -#: model:ir.module.module,description:project_mailgate.module_meta_information -msgid "" -"This module is an interface that synchronises mails with OpenERP Project " -"Task.\n" -"\n" -"It allows creating tasks as soon as a new mail arrives in our configured " -"mail server.\n" -"Moreover, it keeps track of all further communications and task states.\n" -" " -msgstr "" -"Este módulo proporciona una interfaz para sincronizar correos con las tareas " -"de proyectos de OpenERP.\n" -"Permite crear tareas tan pronto como llega un nuevo correo en nuestro " -"servidor de correo previamente configurado.\n" -"Además realiza un seguimiento de todas las comunicaciones adicionales y " -"estados de la tarea.\n" -" " - -#. module: project_mailgate -#: view:project.task:0 -msgid "Attachments" -msgstr "Adjuntos" - -#. module: project_mailgate -#: model:ir.module.module,shortdesc:project_mailgate.module_meta_information -msgid "Project MailGateWay" -msgstr "Ruta de enlace del proyecto" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "¡Error! No puede crear tareas recursivas." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensajes" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:123 -#, python-format -msgid "Draft" -msgstr "Borrador" - -#. module: project_mailgate -#: view:project.task:0 -msgid "Details" -msgstr "Detalles" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:149 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:143 -#, python-format -msgid "Done" -msgstr "Realizado" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:129 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:135 -#, python-format -msgid "Pending" -msgstr "Pendiente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historial" diff --git a/addons/project_mailgate/i18n/fi.po b/addons/project_mailgate/i18n/fi.po deleted file mode 100644 index 76677ae237a..00000000000 --- a/addons/project_mailgate/i18n/fi.po +++ /dev/null @@ -1,88 +0,0 @@ -# Finnish translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-06-22 10:01+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Finnish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Historiatiedot" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tehtävä" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Virhe ! Et voi luoda rekursiivisiä tehtäviä." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Viestit" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Luonnos" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Virhe! Tehtävän lopetuspäivän tulee olla myöhäisempi kuin aloituspäivä" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Peruuta" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Valmis" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Auki" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Odottava" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historia" - -#~ msgid "Project MailGateWay" -#~ msgstr "Projektin sähköpostivälittäjä" - -#~ msgid "Attachments" -#~ msgstr "Liitteet" - -#~ msgid "Details" -#~ msgstr "Yksityiskohdat" diff --git a/addons/project_mailgate/i18n/fr.po b/addons/project_mailgate/i18n/fr.po deleted file mode 100644 index e763eca65a3..00000000000 --- a/addons/project_mailgate/i18n/fr.po +++ /dev/null @@ -1,106 +0,0 @@ -# French translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-01-13 23:14+0000\n" -"Last-Translator: lholivier \n" -"Language-Team: French \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Historique" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tâche" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Erreur ! Vous ne pouvez pas créer de tâches récursives." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Messages" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Brouillon" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Erreur ! La date de fin de la tâche doit être postérieure à la date de " -"démarrage" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Annuler" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Terminé" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Ouvert" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "En attente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historique" - -#~ msgid "Attachments" -#~ msgstr "Pièces jointes" - -#~ msgid "Details" -#~ msgstr "Détails" - -#~ msgid "Project MailGateWay" -#~ msgstr "Messagerie de Projet" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Ce module est un interface de synchronisation des emails avec la gestion de " -#~ "projet d'OpenERP.\n" -#~ "\n" -#~ "Il permet la création de tâches sur l'arrivée de nouveaux emails dans le " -#~ "serveur de messagerie configuré.\n" -#~ "De plus, il conserve les échanges ultérieurs et l'état des tâches.\n" -#~ " " diff --git a/addons/project_mailgate/i18n/gl.po b/addons/project_mailgate/i18n/gl.po deleted file mode 100644 index 0e7334b1116..00000000000 --- a/addons/project_mailgate/i18n/gl.po +++ /dev/null @@ -1,105 +0,0 @@ -# Galician translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-05-10 08:39+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Galician \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Información histórica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarefa" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Erro! Non pode crear tarefas recorrentes." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensaxes" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Borrador" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Erro! A data de remate da tarefa debe ser posterior á data de inicio da " -"tarefa" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Anular" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Feito" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Pendente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historial" - -#~ msgid "Project MailGateWay" -#~ msgstr "Ruta de enlace do proxecto" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Este módulo proporciona unha interface para sincronizar correos coas tarefas " -#~ "de proxectos de OpenERP. Permite crear tarefas tan pronto como chegue un " -#~ "novo correo no noso servidor de correo previamente configurado. Ademais " -#~ "realiza un seguimento de tódalas comunicacións adicionais e dos estados da " -#~ "tarefa.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Anexos" - -#~ msgid "Details" -#~ msgstr "Detalles" diff --git a/addons/project_mailgate/i18n/hr.po b/addons/project_mailgate/i18n/hr.po deleted file mode 100644 index 15952d948a1..00000000000 --- a/addons/project_mailgate/i18n/hr.po +++ /dev/null @@ -1,104 +0,0 @@ -# Croatian translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-12-12 08:56+0000\n" -"Last-Translator: Tomislav Bosnjakovic \n" -"Language-Team: Croatian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Informacije o povjesti" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Zadatak" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Greška! Ne možete kreirati rekurzivne zadatke." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Poruke" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Nacrt" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Odustani" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Izvršeno" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Otvoreno" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Na čekanju" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Povijest" - -#~ msgid "Project MailGateWay" -#~ msgstr "MailGateWay projekta" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Ovaj modul je sučelje za sinhronizaciju poruka sa OpenERP projektnim " -#~ "zadacima.\n" -#~ "\n" -#~ "Omogućava kreiranje zadataka čim stigne novi e-mail na naš konfigurirani " -#~ "mail poslužitelj.\n" -#~ "Štoviše, čuva zapise o svim kasnijim komunikacijama i statusima zadataka.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Privici" - -#~ msgid "Details" -#~ msgstr "Pojedinosti" diff --git a/addons/project_mailgate/i18n/hu.po b/addons/project_mailgate/i18n/hu.po deleted file mode 100644 index b1d551f476e..00000000000 --- a/addons/project_mailgate/i18n/hu.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * project_mailgate -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-01-25 13:21+0000\n" -"Last-Translator: NOVOTRADE RENDSZERHÁZ ( novotrade.hu ) " -"\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Előzmény" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Feladat" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Hiba! Nem hozhat létre rekurzív feladatokat." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Üzenetek" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Tervezet" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Mégsem" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Kész" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Nyitott" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Függőben lévő" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Előzmény" - -#~ msgid "Attachments" -#~ msgstr "Mellékletek" - -#~ msgid "Details" -#~ msgstr "Részletek" diff --git a/addons/project_mailgate/i18n/it.po b/addons/project_mailgate/i18n/it.po deleted file mode 100644 index a6d56020918..00000000000 --- a/addons/project_mailgate/i18n/it.po +++ /dev/null @@ -1,106 +0,0 @@ -# Italian translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-04-22 09:54+0000\n" -"Last-Translator: simone.sandri \n" -"Language-Team: Italian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Storico informazioni" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Attività" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Errore ! Non è possibile creare attività ricorsive." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Messaggi" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Bozza" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Errore ! La data finale della mansione deve essere più vecchia di quella " -"iniziale" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Annulla" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Completato" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Apri" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "In sospeso" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Storico" - -#~ msgid "Attachments" -#~ msgstr "Allegati" - -#~ msgid "Details" -#~ msgstr "Dettagli" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Questo modulo è una infertaccia che sincronizza mail con le attività di " -#~ "progetto di OpenERP.\n" -#~ "\n" -#~ "Esso permette di creare attività non appena una nuova mail arriva nel mail " -#~ "server configurato.\n" -#~ "Inoltre, tiene traccia di tutte le comunicazioni e lo stato delle attività.\n" -#~ " " - -#~ msgid "Project MailGateWay" -#~ msgstr "Ingresso Mail di Progetto" diff --git a/addons/project_mailgate/i18n/ja.po b/addons/project_mailgate/i18n/ja.po deleted file mode 100644 index 2370edbec6d..00000000000 --- a/addons/project_mailgate/i18n/ja.po +++ /dev/null @@ -1,78 +0,0 @@ -# Japanese translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-06-10 03:13+0000\n" -"Last-Translator: Akira Hiyama \n" -"Language-Team: Japanese \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "履歴情報" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "タスク" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "エラー。再帰的なタスクを作成することはできません。" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "メッセージ" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "ドラフト" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "エラー。タスクの終了日は開始日以降の日付に設定しなければなりません。" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "キャンセル" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "完了" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "開く" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "保留中" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "履歴" diff --git a/addons/project_mailgate/i18n/lv.po b/addons/project_mailgate/i18n/lv.po deleted file mode 100644 index 4bb1683a2f2..00000000000 --- a/addons/project_mailgate/i18n/lv.po +++ /dev/null @@ -1,87 +0,0 @@ -# Latvian translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2010-12-31 10:38+0000\n" -"Last-Translator: OpenERP Administrators \n" -"Language-Team: Latvian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Vēstures informācija" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Uzdevums" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Kļūda! Nedrīkst veidot rekursīvus uzdevumus." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Ziņojumi" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Melnraksts" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Atcelt" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Pabeigts" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Atvērt" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Neizlemts" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Vēsture" - -#~ msgid "Project MailGateWay" -#~ msgstr "Projekta MailGateWay" - -#~ msgid "Attachments" -#~ msgstr "Piesaistnes" - -#~ msgid "Details" -#~ msgstr "Sīkāka informācija" diff --git a/addons/project_mailgate/i18n/mn.po b/addons/project_mailgate/i18n/mn.po deleted file mode 100644 index 157b726d3bd..00000000000 --- a/addons/project_mailgate/i18n/mn.po +++ /dev/null @@ -1,85 +0,0 @@ -# Mongolian translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2010-12-21 13:53+0000\n" -"Last-Translator: OpenERP Administrators \n" -"Language-Team: Mongolian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Түүх" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Ажил" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Алдаа ! Та рекурсив цэс үүсгэж болохгүй!" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Мессежүүд" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Ноорог" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Алдаа ! Даалгаврын дуусах хугацаа нь эхлэх хугацаанаасаа хойно байх ёстой" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Болих" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Хийсэн" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Нээх" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Хүлээгдэж буй" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Түүх" - -#~ msgid "Project MailGateWay" -#~ msgstr "MailGateWay Төсөл" - -#~ msgid "Details" -#~ msgstr "Нарийвчлал" diff --git a/addons/project_mailgate/i18n/nl.po b/addons/project_mailgate/i18n/nl.po deleted file mode 100644 index 1fffc910a74..00000000000 --- a/addons/project_mailgate/i18n/nl.po +++ /dev/null @@ -1,104 +0,0 @@ -# Dutch translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-01-18 20:55+0000\n" -"Last-Translator: Douwe Wullink (Dypalio) \n" -"Language-Team: Dutch \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Historie informatie" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Taak" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Fout! U kunt geen recursieve taken aanmaken." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Berichten" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Concept" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "Fout! Einddatum taak moet groter zijn dat begindatum taak" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Annuleren" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Gereed" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Open" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Wachtend" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Geschiedenis" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Deze module is een interface dat mail synchroniseert met OpenERP Project " -#~ "taak.\n" -#~ "\n" -#~ "Het maakt nieuwe taken aan zodra mail binnenkomt op de ingestelde " -#~ "mailserver.\n" -#~ "Daarbij houdt het alle verdere communicaties en taak statussen bij.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Bijlagen" - -#~ msgid "Details" -#~ msgstr "Details" - -#~ msgid "Project MailGateWay" -#~ msgstr "Project MailGateWay" diff --git a/addons/project_mailgate/i18n/nl_BE.po b/addons/project_mailgate/i18n/nl_BE.po deleted file mode 100644 index 40124ec1928..00000000000 --- a/addons/project_mailgate/i18n/nl_BE.po +++ /dev/null @@ -1,105 +0,0 @@ -# Dutch (Belgium) translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-03-01 15:19+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Dutch (Belgium) \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Historiekinformatie" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Taak" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "U kunt niet dezelfde taken maken." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Berichten" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Voorlopig" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Let op: de einddatum van de taak moet na de begindatum van de taak liggen" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Annuleren" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Gereed" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Open" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Wachtend" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historiek" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Deze module is een interface waarmee mails met OpenERP-projecttaken worden " -#~ "gesynchroniseerd.\n" -#~ "\n" -#~ "Hiermee worden taken gemaakt zodra een nieuwe mail binnenkomt via de " -#~ "ingestelde mailserver.\n" -#~ "Bovendien worden alle communicatie en taakstatussen bijgehouden.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Bijlagen" - -#~ msgid "Project MailGateWay" -#~ msgstr "Projectmailgateway" - -#~ msgid "Details" -#~ msgstr "Details" diff --git a/addons/project_mailgate/i18n/pl.po b/addons/project_mailgate/i18n/pl.po deleted file mode 100644 index 448e4b44ad9..00000000000 --- a/addons/project_mailgate/i18n/pl.po +++ /dev/null @@ -1,102 +0,0 @@ -# Polish translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2010-11-28 12:29+0000\n" -"Last-Translator: OpenERP Administrators \n" -"Language-Team: Polish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Informacja o historii" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Zadanie" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Wiadomosći" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Projekt" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Anuluj" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Wykonano" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Otwórz" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Oczekujące" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historia" - -#~ msgid "Project MailGateWay" -#~ msgstr "MailGateWay dla projektu" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Ten moduł jest interfejsem do synchronizacji poczty z zadaniami w projektach " -#~ "OpenERP.\n" -#~ "\n" -#~ "Pozwala tworzyć projekty po otrzymaniu wiadomości przez odpowiednio " -#~ "skonfigurowany\n" -#~ "server pocztowy. Co więcej, utrzymuje on w jednym miejscu dalszą komunikację " -#~ "i stany zadań.\n" -#~ " " - -#~ msgid "Details" -#~ msgstr "Szczegóły" diff --git a/addons/project_mailgate/i18n/project_mailgate.pot b/addons/project_mailgate/i18n/project_mailgate.pot deleted file mode 100644 index acb1e4e981c..00000000000 --- a/addons/project_mailgate/i18n/project_mailgate.pot +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * project_mailgate -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.1rc1\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-02-08 00:37+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "" - diff --git a/addons/project_mailgate/i18n/pt.po b/addons/project_mailgate/i18n/pt.po deleted file mode 100644 index 8a907a4d013..00000000000 --- a/addons/project_mailgate/i18n/pt.po +++ /dev/null @@ -1,84 +0,0 @@ -# Portuguese translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2010-12-12 10:12+0000\n" -"Last-Translator: OpenERP Administrators \n" -"Language-Team: Portuguese \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Informação do Histórico" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarefa" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Erro ! Não se pode criar tarefas recursivas" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensagens" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Rascunho" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "Erro !Data final da tarefa dever ser posterior à data inicial" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Concluído" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Pendente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Histórico" - -#~ msgid "Details" -#~ msgstr "Detalhes" - -#~ msgid "Attachments" -#~ msgstr "Anexos" diff --git a/addons/project_mailgate/i18n/pt_BR.po b/addons/project_mailgate/i18n/pt_BR.po deleted file mode 100644 index cd084a2e1e2..00000000000 --- a/addons/project_mailgate/i18n/pt_BR.po +++ /dev/null @@ -1,105 +0,0 @@ -# Brazilian Portuguese translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-01-17 11:53+0000\n" -"Last-Translator: Emerson \n" -"Language-Team: Brazilian Portuguese \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Informação Histórica" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Tarefa" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Erro! Você não pode criar tarefas recursivas." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mensagens" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Provisório" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "Erro ! A data final deve ser maior do que a data inicial" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Concluído" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Abrir" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Pendente" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Histórico" - -#~ msgid "Details" -#~ msgstr "Detalhes" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Este módulo é uma interface que sincroniza emails com as Tarefas de Projetos " -#~ "OpenERP.\n" -#~ "\n" -#~ "Permite a criação de tarefas tão logo um novo email chegue no nosso servidor " -#~ "de email configurado.\n" -#~ "Além disso, mantém o controle de todas as demais comunicações e estados das " -#~ "tarefas.\n" -#~ " " - -#~ msgid "Project MailGateWay" -#~ msgstr "Projeto Gateway de Email" - -#~ msgid "Attachments" -#~ msgstr "Anexos" diff --git a/addons/project_mailgate/i18n/ro.po b/addons/project_mailgate/i18n/ro.po deleted file mode 100644 index dacd3b477f8..00000000000 --- a/addons/project_mailgate/i18n/ro.po +++ /dev/null @@ -1,107 +0,0 @@ -# Romanian translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-01-13 11:48+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Romanian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Istoric Informatii" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Sarcina" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Eroare ! Nu puteti crea sarcini recursive." - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mesaje" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Ciorna" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" -"Eroare ! Data de sfarsit a sarcinii trebuie sa fie mai mare decat data de " -"inceput" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Anulati" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Efectuat" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Deschideti" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "In asteptare" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Istoric" - -#~ msgid "Project MailGateWay" -#~ msgstr "MailGAteWay Proiect" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "Acest modul este o interfată care sincronizează email-urile cu Activitatea " -#~ "de Proiect OpenERP.\n" -#~ "\n" -#~ "Permite crearea de sarcini de indată ce un nou email soseste in serverul de " -#~ "mail configurat.\n" -#~ "In plus, tine evidenta tuturor comunicatiilor viitoare si a stărilor " -#~ "activitătilor.\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "Atașamente" - -#~ msgid "Details" -#~ msgstr "Detalii" diff --git a/addons/project_mailgate/i18n/sv.po b/addons/project_mailgate/i18n/sv.po deleted file mode 100644 index 02d5c55be00..00000000000 --- a/addons/project_mailgate/i18n/sv.po +++ /dev/null @@ -1,78 +0,0 @@ -# Swedish translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-06-18 23:27+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Swedish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "Historikinformation" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Aktivitet" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "Fel ! Du kan inte skapa rekursiva aktiviteter" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Meddelanden" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Preliminär" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "Fel ! Aktivitetens slutdatum måste komma efter startdatumet" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "Avbryt" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Färdig" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Öppen" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Väntande" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "Historik" diff --git a/addons/project_mailgate/i18n/tr.po b/addons/project_mailgate/i18n/tr.po deleted file mode 100644 index 1f8a351bcbc..00000000000 --- a/addons/project_mailgate/i18n/tr.po +++ /dev/null @@ -1,78 +0,0 @@ -# Turkish translation for openobject-addons -# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2012-01-25 17:33+0000\n" -"Last-Translator: Ahmet Altınışık \n" -"Language-Team: Turkish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "Görev" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "Mesajlar" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "Taslak" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "İptal" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "Tamamlandı" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "Açık" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "Bekleyen" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "" diff --git a/addons/project_mailgate/i18n/zh_CN.po b/addons/project_mailgate/i18n/zh_CN.po deleted file mode 100644 index c1b8ea02d5a..00000000000 --- a/addons/project_mailgate/i18n/zh_CN.po +++ /dev/null @@ -1,101 +0,0 @@ -# Chinese (Simplified) translation for openobject-addons -# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2012-02-08 00:37+0000\n" -"PO-Revision-Date: 2011-06-28 16:25+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Chinese (Simplified) \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History Information" -msgstr "日志信息" - -#. module: project_mailgate -#: model:ir.model,name:project_mailgate.model_project_task -msgid "Task" -msgstr "任务" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! You cannot create recursive tasks." -msgstr "错误!不能创建循环引用的任务" - -#. module: project_mailgate -#: field:project.task,message_ids:0 -msgid "Messages" -msgstr "消息" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:90 -#, python-format -msgid "Draft" -msgstr "草稿" - -#. module: project_mailgate -#: constraint:project.task:0 -msgid "Error ! Task end-date must be greater then task start-date" -msgstr "错误!任务结束日期必须大于任务开始日期" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:116 -#, python-format -msgid "Cancel" -msgstr "取消" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:110 -#, python-format -msgid "Done" -msgstr "完成" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:96 -#, python-format -msgid "Open" -msgstr "未结" - -#. module: project_mailgate -#: code:addons/project_mailgate/project_mailgate.py:102 -#, python-format -msgid "Pending" -msgstr "等待中" - -#. module: project_mailgate -#: view:project.task:0 -msgid "History" -msgstr "日志" - -#~ msgid "Project MailGateWay" -#~ msgstr "Project MailGateWay" - -#~ msgid "" -#~ "This module is an interface that synchronises mails with OpenERP Project " -#~ "Task.\n" -#~ "\n" -#~ "It allows creating tasks as soon as a new mail arrives in our configured " -#~ "mail server.\n" -#~ "Moreover, it keeps track of all further communications and task states.\n" -#~ " " -#~ msgstr "" -#~ "此模块是邮件和任务的接口。\n" -#~ "允许在特定邮件服务器收到邮件后马上创建任务。\n" -#~ "还能跟踪进一步的沟通和任务阶段\n" -#~ " " - -#~ msgid "Attachments" -#~ msgstr "附件" - -#~ msgid "Details" -#~ msgstr "详细信息" diff --git a/addons/project_mailgate/project_mailgate.py b/addons/project_mailgate/project_mailgate.py deleted file mode 100644 index ba3cd702760..00000000000 --- a/addons/project_mailgate/project_mailgate.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# 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 . -# -############################################################################## - -import binascii -from osv import fields, osv -from tools.translate import _ -import tools - -class project_tasks(osv.osv): - _inherit = 'project.task' - - def message_new(self, cr, uid, msg, custom_values=None, context=None): - """ Overrides mail_thread message_new that is called by the mailgateway - through message_process. - This override updates the document according to the email. - """ - if custom_values is None: custom_values = {} - custom_values.update({ - 'name': subject, - 'planned_hours': 0.0, - 'subject': msg.get('subject'), - }) - custom_values.update(self.message_partner_by_email(cr, uid, msg.get('from', False), context=context)) - return super(project_tasks,self).message_new(cr, uid, msg, custom_values=custom_values, context=context) - - def message_update(self, cr, uid, ids, msg, update_vals=None, context=None): - """ Overrides mail_thread message_update that is called by the mailgateway - through message_process. - This method updates the task according to the email. - """ - if update_vals is None: update_vals = {} - act = False - maps = { - 'cost':'planned_hours', - } - for line in msg['body_text'].split('\n'): - line = line.strip() - res = tools.misc.command_re.match(line) - if res: - match = res.group(1).lower() - field = maps.get(match) - if field: - try: - update_vals[field] = float(res.group(2).lower()) - except (ValueError, TypeError): - pass - elif match.lower() == 'state' \ - and res.group(2).lower() in ['cancel','close','draft','open','pending']: - act = 'do_%s' % res.group(2).lower() - if act: - getattr(self,act)(cr, uid, ids, context=context) - return super(project_tasks,self).message_update(cr, uid, msg, update_vals=update_vals, context=context) - - def message_thread_followers(self, cr, uid, ids, context=None): - followers = super(project_tasks,self).message_thread_followers(cr, uid, ids, context=context) - for task in self.browse(cr, uid, followers.keys(), context=context): - task_followers = set(followers[task.id]) - task_followers.add(task.user_id.email) - followers[task.id] = filter(None, task_followers) - return followers - - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/purchase/edi/purchase_order_action_data.xml b/addons/purchase/edi/purchase_order_action_data.xml index b97da91fa1d..daad4467929 100644 --- a/addons/purchase/edi/purchase_order_action_data.xml +++ b/addons/purchase/edi/purchase_order_action_data.xml @@ -108,51 +108,6 @@
    ]]> - - % endif - | Your contact: ${object.validator.name} ${object.validator.email and '<%s>'%(object.validator.email) or ''} - -You can view the ${object.state in ('draft', 'sent') and 'request for quotation' or 'order confirmation'} and download it using the following link: - ${ctx.get('edi_web_url_view') or 'n/a'} - -If you have any question, do not hesitate to contact us. - -Thank you! - - --- -${object.validator.name} ${object.validator.email and '<%s>'%(object.validator.email) or ''} -${object.company_id.name} -% if object.company_id.street: -${object.company_id.street or ''} -% endif -% if object.company_id.street2: -${object.company_id.street2} -% endif -% if object.company_id.city or object.company_id.zip: -${object.company_id.zip or ''} ${object.company_id.city or ''} -% endif -% if object.company_id.country_id: -${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''} -% endif -% if object.company_id.phone: -Phone: ${object.company_id.phone} -% endif -% if object.company_id.website: -${object.company_id.website or ''} -% endif - ]]> diff --git a/addons/purchase/i18n/purchase.pot b/addons/purchase/i18n/purchase.pot index 44355e26cea..a7fd4cfaab8 100644 --- a/addons/purchase/i18n/purchase.pot +++ b/addons/purchase/i18n/purchase.pot @@ -1767,7 +1767,7 @@ msgid "" msgstr "" #. module: purchase -#: model:email.template,body_text:purchase.email_template_edi_purchase +#: model:email.template,body:purchase.email_template_edi_purchase msgid "" "\n" "Hello${object.partner_address_id.name and ' ' or ''}${object." diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 756016d39e2..592bf783a64 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -220,7 +220,7 @@ class purchase_order(osv.osv): ('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'), ] _name = "purchase.order" - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] _description = "Purchase Order" _order = "name desc" @@ -731,24 +731,15 @@ class purchase_order(osv.osv): # OpenChatter methods and notifications # -------------------------------------- - def get_needaction_user_ids(self, cr, uid, ids, context=None): - result = super(purchase_order, self).get_needaction_user_ids(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.state == 'approved': - result[obj.id].append(obj.validator.id) - return result - - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'validator' to the monitored fields """ - res = super(purchase_order, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['validator'] + def needaction_domain_get(self, cr, uid, ids, context=None): + return [('state', '=', 'draft')] def create_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Request for quotation created."), context=context) + return self.message_post(cr, uid, ids, body=_("Request for quotation created."), context=context) def confirm_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Quotation for %s converted to a Purchase Order of %s %s.") % (obj.partner_id.name, obj.amount_total, obj.pricelist_id.currency_id.symbol), context=context) + self.message_post(cr, uid, [obj.id], body=_("Quotation for %s converted to a Purchase Order of %s %s.") % (obj.partner_id.name, obj.amount_total, obj.pricelist_id.currency_id.symbol), context=context) def shipment_send_note(self, cr, uid, ids, picking_id, context=None): for order in self.browse(cr, uid, ids, context=context): @@ -757,25 +748,25 @@ class purchase_order(osv.osv): # convert it to the user TZ and re-render it with %Z to add the timezone picking_datetime = fields.DT.datetime.strptime(picking.min_date, DEFAULT_SERVER_DATETIME_FORMAT) picking_date_str = fields.datetime.context_timestamp(cr, uid, picking_datetime, context=context).strftime(DATETIME_FORMATS_MAP['%+'] + " (%Z)") - self.message_append_note(cr, uid, [order.id], body=_("Shipment %s scheduled for %s.") % (picking.name, picking_date_str), context=context) + self.message_post(cr, uid, [order.id], body=_("Shipment %s scheduled for %s.") % (picking.name, picking_date_str), context=context) def invoice_send_note(self, cr, uid, ids, invoice_id, context=None): for order in self.browse(cr, uid, ids, context=context): for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id): - self.message_append_note(cr, uid, [order.id], body=_("Draft Invoice of %s %s is waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), context=context) + self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s is waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), context=context) def shipment_done_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("""Shipment received."""), context=context) + self.message_post(cr, uid, ids, body=_("""Shipment received."""), context=context) def invoice_done_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Invoice paid."), context=context) + self.message_post(cr, uid, ids, body=_("Invoice paid."), context=context) def draft_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Purchase Order has been set to draft."), context=context) + return self.message_post(cr, uid, ids, body=_("Purchase Order has been set to draft."), context=context) def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), context=context) + self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), context=context) purchase_order() diff --git a/addons/purchase/purchase_data.xml b/addons/purchase/purchase_data.xml index 75074d4cedf..693d18eb1ba 100644 --- a/addons/purchase/purchase_data.xml +++ b/addons/purchase/purchase_data.xml @@ -3,14 +3,15 @@ - - - - Module Purchase Management has been installed. - From the top menu Purchases, create purchase orders to buy products from your suppliers, encode supplier invoices and manage your payments. + + mail.group + + notification + Purchase Management application installed! + From the top menu Purchases, create purchase orders to buy products from your suppliers, enter supplier invoices and manage payments. -You can also manage purchase requisitions, see the Purchase Settings. - +You can also manage purchase requisitions, see also the Purchase Settings. + Purchase Order diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml index d133e4a3805..ab5df67f52d 100644 --- a/addons/purchase/purchase_view.xml +++ b/addons/purchase/purchase_view.xml @@ -302,7 +302,7 @@ - + @@ -327,8 +327,8 @@ purchase.order.tree purchase.order - - + + diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index cf0294730a7..90a5244e66f 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -31,7 +31,7 @@ import decimal_precision as dp class purchase_requisition(osv.osv): _name = "purchase.requisition" _description="Purchase Requisition" - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] _columns = { 'name': fields.char('Requisition Reference', size=32,required=True), 'origin': fields.char('Source', size=32), @@ -91,16 +91,16 @@ class purchase_requisition(osv.osv): return True def in_progress_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Draft Requisition has been sent to suppliers."), context=context) + self.message_post(cr, uid, ids, body=_("Draft Requisition has been sent to suppliers."), context=context) def reset_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Purchase Requisition has been set to draft."), context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been set to draft."), context=context) def done_to_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Purchase Requisition has been done."), context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been done."), context=context) def cancel_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Purchase Requisition has been cancelled."), context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been cancelled."), context=context) def _planned_date(self, requisition, delay=0.0): company = requisition.company_id @@ -184,7 +184,7 @@ class purchase_requisition(osv.osv): return res def create_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Purchase Requisition has been created."), context=context) + return self.message_post(cr, uid, ids, body=_("Purchase Requisition has been created."), context=context) def create(self, cr, uid, vals, context=None): requisition = super(purchase_requisition, self).create(cr, uid, vals, context=context) @@ -194,27 +194,6 @@ class purchase_requisition(osv.osv): purchase_requisition() -class mail_message(osv.osv): - _inherit = 'mail.message' - - def schedule_with_attach(self, cr, uid, email_from, email_to, subject, body, model=False, email_cc=None, - email_bcc=None, reply_to=False, attachments=None, message_id=False, references=False, - res_id=False, content_subtype='plain', headers=None, mail_server_id=False, auto_delete=False, - context=None): - result = super(mail_message, self).schedule_with_attach(cr, uid, email_from, email_to, subject, body, model=model, email_cc=email_cc, - email_bcc=email_bcc, reply_to=reply_to, attachments=attachments, message_id=message_id, references=references, - res_id=res_id, content_subtype=content_subtype, headers=headers, mail_server_id=mail_server_id, auto_delete=auto_delete, - context=context) - # check model is purchase.order - if model and model == 'purchase.order' and res_id: - requisition_id = self.pool.get('purchase.order').browse(cr, uid, res_id, context=context).requisition_id - if requisition_id: - result = self.schedule_with_attach(cr, uid, email_from, email_to, subject, body, model='purchase.requisition', email_cc=email_cc, - email_bcc=email_bcc, reply_to=reply_to, attachments=attachments, message_id=message_id, references=references, - res_id=requisition_id.id, content_subtype=content_subtype, headers=headers, mail_server_id=mail_server_id, auto_delete=auto_delete, - context=context) - return result - class purchase_requisition_line(osv.osv): _name = "purchase.requisition.line" diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml index d4e8e3e20a9..1fafec92bc7 100644 --- a/addons/purchase_requisition/purchase_requisition_view.xml +++ b/addons/purchase_requisition/purchase_requisition_view.xml @@ -112,8 +112,8 @@ purchase.requisition.tree purchase.requisition - - + + diff --git a/addons/sale/edi/sale_order_action_data.xml b/addons/sale/edi/sale_order_action_data.xml index 181bd8183d7..49ebe6053e6 100644 --- a/addons/sale/edi/sale_order_action_data.xml +++ b/addons/sale/edi/sale_order_action_data.xml @@ -126,67 +126,6 @@
  • ]]> - - % endif - | Your contact: ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} - -You can view the ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'}, download it and even pay online using the following link: - ${ctx.get('edi_web_url_view') or 'n/a'} - -% if object.order_policy in ('prepaid','manual') and object.company_id.paypal_account and object.state not in ('draft', 'sent'): -<% -comp_name = quote(object.company_id.name) -order_name = quote(object.name) -paypal_account = quote(object.company_id.paypal_account) -order_amount = quote(str(object.amount_total)) -cur_name = quote(object.pricelist_id.currency_id.name) -paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=%s&item_name=%s%%20Order%%20%s&invoice=%s&amount=%s" \ - "¤cy_code=%s&button_subtype=services&no_note=1&bn=OpenERP_Order_PayNow_%s" % \ - (paypal_account,comp_name,order_name,order_name,order_amount,cur_name,cur_name) -%> -It is also possible to directly pay with Paypal: - ${paypal_url} -% endif - -If you have any question, do not hesitate to contact us. - - -Thank you for choosing ${object.company_id.name}! - - --- -${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''} -${object.company_id.name} -% if object.company_id.street: -${object.company_id.street or ''} -% endif -% if object.company_id.street2: -${object.company_id.street2} -% endif -% if object.company_id.city or object.company_id.zip: -${object.company_id.zip or ''} ${object.company_id.city or ''} -% endif -% if object.company_id.country_id: -${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''} -% endif -% if object.company_id.phone: -Phone: ${object.company_id.phone} -% endif -% if object.company_id.website: -${object.company_id.website or ''} -% endif - ]]> diff --git a/addons/sale/i18n/sale.pot b/addons/sale/i18n/sale.pot index 2c477d1d7a0..393b3e59db3 100644 --- a/addons/sale/i18n/sale.pot +++ b/addons/sale/i18n/sale.pot @@ -1112,7 +1112,7 @@ msgid "Document of the move to the output or to the customer." msgstr "" #. module: sale -#: model:email.template,body_text:sale.email_template_edi_sale +#: model:email.template,body:sale.email_template_edi_sale msgid "" "\n" "Hello${object.partner_order_id.name and ' ' or ''}${object.partner_order_id." diff --git a/addons/sale/sale.py b/addons/sale/sale.py index c525ba04df1..6a6678d6163 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -48,7 +48,7 @@ sale_shop() class sale_order(osv.osv): _name = "sale.order" - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] _description = "Sales Order" @@ -1022,24 +1022,20 @@ class sale_order(osv.osv): # OpenChatter methods and notifications # ------------------------------------------------ - def get_needaction_user_ids(self, cr, uid, ids, context=None): - result = super(sale_order, self).get_needaction_user_ids(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if (obj.state == 'manual' or obj.state == 'progress'): - result[obj.id].append(obj.user_id.id) - return result + def needaction_domain_get(self, cr, uid, ids, context=None): + return [('state', '=', 'draft'), ('user_id','=',uid)] def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Quotation for %s has been created.") % (obj.partner_id.name), context=context) + self.message_post(cr, uid, [obj.id], body=_("Quotation for %s created.") % (obj.partner_id.name), context=context) def confirm_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Quotation for %s converted to Sale Order of %s %s.") % (obj.partner_id.name, obj.amount_total, obj.pricelist_id.currency_id.symbol), context=context) + self.message_post(cr, uid, [obj.id], body=_("Quotation for %s converted to Sale Order of %s %s.") % (obj.partner_id.name, obj.amount_total, obj.pricelist_id.currency_id.symbol), context=context) def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), context=context) + self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), context=context) def delivery_send_note(self, cr, uid, ids, picking_id, context=None): for order in self.browse(cr, uid, ids, context=context): @@ -1048,21 +1044,21 @@ class sale_order(osv.osv): # convert it to the user TZ and re-render it with %Z to add the timezone picking_datetime = fields.DT.datetime.strptime(picking.min_date, DEFAULT_SERVER_DATETIME_FORMAT) picking_date_str = fields.datetime.context_timestamp(cr, uid, picking_datetime, context=context).strftime(DATETIME_FORMATS_MAP['%+'] + " (%Z)") - self.message_append_note(cr, uid, [order.id], body=_("Delivery Order %s scheduled for %s.") % (picking.name, picking_date_str), context=context) + self.message_post(cr, uid, [order.id], body=_("Delivery Order %s scheduled for %s.") % (picking.name, picking_date_str), context=context) def delivery_end_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Order delivered."), context=context) + self.message_post(cr, uid, ids, body=_("Order delivered."), context=context) def invoice_paid_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Invoice paid."), context=context) + self.message_post(cr, uid, ids, body=_("Invoice paid."), context=context) def invoice_send_note(self, cr, uid, ids, invoice_id, context=None): for order in self.browse(cr, uid, ids, context=context): for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id): - self.message_append_note(cr, uid, [order.id], body=_("Draft Invoice of %s %s waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), context=context) + self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), context=context) def action_cancel_draft_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body='Sale order has been set in draft.', context=context) + return self.message_post(cr, uid, ids, body=_('Sale order set to draft.'), context=context) sale_order() diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml index bbee9ca7455..a2ef6ddd802 100644 --- a/addons/sale/sale_data.xml +++ b/addons/sale/sale_data.xml @@ -41,13 +41,14 @@ - - - - The Sales Management application has been installed. - This modules allows you to create and send easily quotations and process your sales orders; from the delivery to the invoicing. + + mail.group + + notification + Sales Management application installed! + This application lets you create and send quotations and process your sales orders; from delivery to invoicing. -If you need to manage your sales pipeline (leads, opportunities, phonecalls), you can install the module <i>CRM</i> from the top menu Settings. - +If you need to manage your sales pipeline (leads, opportunities, phonecalls), the <i>CRM</i> application may be useful. Use the Settings menu to install it. + diff --git a/addons/sale/sale_demo.xml b/addons/sale/sale_demo.xml index 192d73472c4..c8a3bb74774 100644 --- a/addons/sale/sale_demo.xml +++ b/addons/sale/sale_demo.xml @@ -304,36 +304,33 @@ sale.order - plain - Hi, + Hi, I have a confusion for pricing of Services, I have heard there is a discount above 25 hours. Can you clarify please? comment - + sale.order - plain - Hello, + Hello, Sorry but that scheme is not available for now, We would like to know if you confirm the quotation with pricing we sent to you. Thanks, Sales Department comment - + sale.order - plain - Ok, fine, we will intimate you after discussing with our team. + Ok, fine, we will intimate you after discussing with our team. comment - + diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 95af6803391..2c2acff227e 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -133,8 +133,8 @@ sale.order 2 - - + + @@ -377,7 +377,7 @@ - + diff --git a/addons/sale_crm/wizard/crm_make_sale.py b/addons/sale_crm/wizard/crm_make_sale.py index 6ca9ac8230f..2597c1db56c 100644 --- a/addons/sale_crm/wizard/crm_make_sale.py +++ b/addons/sale_crm/wizard/crm_make_sale.py @@ -106,7 +106,7 @@ class crm_make_sale(osv.osv_memory): case_obj.write(cr, uid, [case.id], {'ref': 'sale.order,%s' % new_id}) new_ids.append(new_id) message = _("Opportunity has been converted to the quotation %s.") % (sale_order.name) - case.message_append_note(body=message) + case.message_post(body=message) if make.close: case_obj.case_close(cr, uid, data) if not new_ids: diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index 204ca1e92e1..375c33b1e8c 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -775,8 +775,8 @@ class share_wizard(osv.TransientModel): if res_id <= 0: raise osv.except_osv(_('Record id not found'), _('The share engine has not been able to fetch a record_id for your invitation.')) self.pool.get(model.model).message_subscribe(cr, uid, [res_id], new_ids + existing_ids, context=context) - self.send_invite_email(cr, uid, wizard_data, context=context) - self.send_invite_note(cr, uid, model.model, res_id, wizard_data, context=context) + # self.send_invite_email(cr, uid, wizard_data, context=context) + # self.send_invite_note(cr, uid, model.model, res_id, wizard_data, context=context) # CLOSE # A. Not invite: as before @@ -820,9 +820,10 @@ class share_wizard(osv.TransientModel): elif tmp_idx == len(wizard_data.result_line_ids)-2: body += ' and' body += '.' - return self.pool.get(model_name).message_append_note(cr, uid, [res_id], _('System Notification'), body, context=context) + return self.pool.get(model_name).message_post(cr, uid, [res_id], body=body, context=context) def send_invite_email(self, cr, uid, wizard_data, context=None): + # TDE Note: not updated because will disappear message_obj = self.pool.get('mail.message') notification_obj = self.pool.get('mail.notification') user = self.pool.get('res.users').browse(cr, UID_ROOT, uid) @@ -855,13 +856,13 @@ class share_wizard(osv.TransientModel): def send_emails(self, cr, uid, wizard_data, context=None): _logger.info('Sending share notifications by email...') - mail_message = self.pool.get('mail.message') + mail_mail = self.pool.get('mail.mail') user = self.pool.get('res.users').browse(cr, UID_ROOT, uid) if not user.email: raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.')) # TODO: also send an HTML version of this mail - msg_ids = [] + mail_ids = [] for result_line in wizard_data.result_line_ids: email_to = result_line.user_id.email if not email_to: @@ -884,10 +885,14 @@ class share_wizard(osv.TransientModel): body += "--\n" body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n" "It is open source and can be found on http://www.openerp.com.") - msg_ids.append(mail_message.schedule_with_attach(cr, uid, user.email, [email_to], subject, body, model='share.wizard', context=context)) + mail_ids.append(mail_mail.create(cr, uid, { + 'email_from': user.email, + 'email_to': email_to, + 'subject': subject, + 'body_html': '
    %s
    ' % body}, context=context)) # force direct delivery, as users expect instant notification - mail_message.send(cr, uid, msg_ids, context=context) - _logger.info('%d share notification(s) sent.', len(msg_ids)) + mail_mail.send(cr, uid, mail_ids, context=context) + _logger.info('%d share notification(s) sent.', len(mail_ids)) def onchange_embed_options(self, cr, uid, ids, opt_title, opt_search, context=None): wizard = self.browse(cr, uid, ids[0], context) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 7f0a744a62e..006af587c1f 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1379,13 +1379,13 @@ class stock_picking(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("%s has been created.") % (self._get_document_type(obj.type)), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been created.") % (self._get_document_type(obj.type)), context=context) def scrap_send_note(self, cr, uid, ids, quantity, uom, name, context=None): - return self.message_append_note(cr, uid, ids, body= _("%s %s %s has been moved to scrap.") % (quantity, uom, name), context=context) + return self.message_post(cr, uid, ids, body= _("%s %s %s has been moved to scrap.") % (quantity, uom, name), context=context) def back_order_send_note(self, cr, uid, ids, back_name, context=None): - return self.message_append_note(cr, uid, ids, body=_("Back order %s has been created.") % (back_name), context=context) + return self.message_post(cr, uid, ids, body=_("Back order %s has been created.") % (back_name), context=context) def ship_done_send_note(self, cr, uid, ids, context=None): type_dict = { @@ -1394,11 +1394,11 @@ class stock_picking(osv.osv): 'internal': 'moved', } for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), context=context) + self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), context=context) def ship_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), context=context) stock_picking() @@ -2542,7 +2542,7 @@ class stock_move(osv.osv): product_obj = self.pool.get('product.product') for new_move in self.browse(cr, uid, res, context=context): message = _("Product has been consumed with '%s' quantity.") % (new_move.product_qty) - product_obj.message_append_note(cr, uid, [new_move.product_id.id], body=message, context=context) + product_obj.message_post(cr, uid, [new_move.product_id.id], body=message, context=context) self.action_done(cr, uid, res, context=context) diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index f4b3ab90d9c..77c82989a21 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -2,12 +2,14 @@ - - - - Module Warehouse Management has been installed - Manage your product inventoy and stock locations. You can control your stock moves history and planning, perform stock valuation, and trace product lots upstream and downstream (based on serial numbers.) - + + mail.group + + notification + Warehouse Management application installed! + Manage your product inventoy and stock locations: you can control stock moves history and planning, +watch your stock valuation, and track production lots upstream and downstream (based on serial numbers). + Stock Journal Sequence diff --git a/addons/stock/wizard/stock_change_product_qty.py b/addons/stock/wizard/stock_change_product_qty.py index 0cc97e10298..5aa4649af02 100644 --- a/addons/stock/wizard/stock_change_product_qty.py +++ b/addons/stock/wizard/stock_change_product_qty.py @@ -113,7 +113,7 @@ class stock_change_product_qty(osv.osv_memory): for data in self.browse(cr, uid, ids, context=context): location_name = location_obj.browse(cr, uid, data.location_id.id, context=context).name message = _("Quantity has been changed to %s %s for %s location.") % (data.new_quantity, data.product_id.uom_id.name, location_name) - prod_obj.message_append_note(cr, uid, [data.product_id.id], body=message, context=context) + prod_obj.message_post(cr, uid, [data.product_id.id], body=message, context=context) stock_change_product_qty() diff --git a/addons/survey/wizard/survey_answer.py b/addons/survey/wizard/survey_answer.py index 66098b45fa8..e2216ea8389 100644 --- a/addons/survey/wizard/survey_answer.py +++ b/addons/survey/wizard/survey_answer.py @@ -420,7 +420,17 @@ class survey_question_wiz(osv.osv_memory): if user_email and resp_email: user_name = user_obj.browse(cr, uid, uid, context=context).name mail = "Hello " + survey_data.responsible_id.name + ",\n\n " + str(user_name) + " has given the Response Of " + survey_data.title + " Survey.\nThe Response has been attached herewith.\n\n Thanks." - mail_message.schedule_with_attach(cr, uid, user_email, [resp_email], "Survey Answer Of " + str(user_name) , mail, attachments=attachments, context=context) + vals = {'state': 'outgoing', + 'subject': "Survey Answer Of " + user_name, + 'body_html': '
    %s
    ' % mail, + 'email_to': [resp_email], + 'email_from': user_email} + if attachments: + vals['attachment_ids'] = [(0,0,{'name': a_name, + 'datas_fname': a_name, + 'datas': str(a_content).encode('base64')}) + for a_name, a_content in attachments] + self.pool.get('mail.mail').create(cr, uid, vals, context=context) xml_form = etree.Element('form', {'string': _('Complete Survey Answer')}) etree.SubElement(xml_form, 'separator', {'string': 'Complete Survey', 'colspan': "4"}) diff --git a/addons/survey/wizard/survey_send_invitation.py b/addons/survey/wizard/survey_send_invitation.py index da439959ec5..5677a985e09 100644 --- a/addons/survey/wizard/survey_send_invitation.py +++ b/addons/survey/wizard/survey_send_invitation.py @@ -116,7 +116,6 @@ class survey_send_invitation(osv.osv_memory): existing = "" created = "" error = "" - user_exists = False new_user = [] attachments = {} current_sur = survey_ref.browse(cr, uid, context.get('active_id'), context=context) @@ -150,8 +149,14 @@ class survey_send_invitation(osv.osv_memory): mail = record['mail']%{'login':partner.email, 'passwd':user.password, \ 'name' : partner.name} if record['send_mail_existing']: - mail_message.schedule_with_attach(cr, uid, record['mail_from'], [partner.email] , \ - record['mail_subject_existing'] , mail, context=context) + vals = { + 'state': 'outgoing', + 'subject': record['mail_subject_existing'], + 'body_html': '
    %s
    ' % mail, + 'email_to': partner.email, + 'email_from': record['mail_from'], + } + self.pool.get('mail.mail').create(cr, uid, vals, context=context) existing+= "- %s (Login: %s, Password: %s)\n" % (user.name, partner.email, \ user.password) continue @@ -160,8 +165,19 @@ class survey_send_invitation(osv.osv_memory): out+= partner.email + ',' + passwd + '\n' mail= record['mail'] % {'login' : partner.email, 'passwd' : passwd, 'name' : partner.name} if record['send_mail']: - ans = mail_message.schedule_with_attach(cr, uid, record['mail_from'], [partner.email], \ - record['mail_subject'], mail, attachments=attachments, context=context) + vals = { + 'state': 'outgoing', + 'subject': record['mail_subject'], + 'body_html': '
    %s
    ' % mail, + 'email_to': partner.email, + 'email_from': record['mail_from'], + } + if attachments: + vals['attachment_ids'] = [(0,0,{'name': a_name, + 'datas_fname': a_name, + 'datas': str(a_content).encode('base64')}) + for a_name, a_content in attachments] + ans = self.pool.get('mail.mail').create(cr, uid, vals, context=context) if ans: res_data = {'name': partner.name or _('Unknown'), 'login': partner.email,