- State:
+ State:
- PRO-FORMA [[ ((voucher.state == 'proforma') or removeParentNode('para')) and '' ]]
- Draft[[ ((voucher.state == 'draft') or removeParentNode('para')) and '' ]]
- Canceled [[ ((voucher.state == 'cancel') or removeParentNode('para')) and '' ]]
- Posted [[ ((voucher.state == 'posted') or removeParentNode('para')) and '' ]]
+ PRO-FORMA [[ ((voucher.state == 'proforma') or removeParentNode('para')) and '' ]]
+ Draft[[ ((voucher.state == 'draft') or removeParentNode('para')) and '' ]]
+ Canceled [[ ((voucher.state == 'cancel') or removeParentNode('para')) and '' ]]
+ Posted [[ ((voucher.state == 'posted') or removeParentNode('para')) and '' ]]
- Ref. :
+ Ref. :
- [[ voucher.reference or '' ]]
+ [[ voucher.reference or '' ]]
- Date:
+ Date:
[[ formatLang(voucher.date , date=True) or '' ]]
@@ -226,7 +231,7 @@
- [[ (move_ids.partner_id and move_ids.partner_id.name) or 'Account']]
+ [[ (move_ids.partner_id and move_ids.partner_id.name) or 'Account']]
[[ formatLang(move_ids.debit) ]]
@@ -237,7 +242,7 @@
- [[ move_ids.account_id.name ]]
+ [[ move_ids.account_id.name ]]
@@ -252,7 +257,7 @@
- [[ move_ids.name ]] - [[ voucher.reference or '' ]]
+ [[ move_ids.name ]] - [[ get_ref(voucher.id,move_ids) ]]
@@ -371,7 +376,7 @@
-
+
diff --git a/addons/account_voucher/report/report_voucher_print.py b/addons/account_voucher/report/report_voucher_print.py
new file mode 100644
index 00000000000..6f405bbe975
--- /dev/null
+++ b/addons/account_voucher/report/report_voucher_print.py
@@ -0,0 +1,94 @@
+# -*- 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 time
+from report import report_sxw
+from tools import amount_to_text_en
+
+class report_voucher_print(report_sxw.rml_parse):
+ def __init__(self, cr, uid, name, context):
+ super(report_voucher_print, self).__init__(cr, uid, name, context)
+ self.localcontext.update({
+ 'time': time,
+ 'get_title': self.get_title,
+ 'get_lines':self.get_lines,
+ 'get_on_account':self.get_on_account,
+ 'convert':self.convert
+ })
+
+ def convert(self, amount, cur):
+ amt_en = amount_to_text_en.amount_to_text(amount, 'en', cur);
+ return amt_en
+
+ def get_lines(self,voucher):
+ result = []
+ if voucher.type in ('payment','receipt'):
+ type = voucher.line_ids and voucher.line_ids[0].type or False
+ for move in voucher.move_ids:
+ res = {}
+ amount = move.credit
+ if type == 'dr':
+ amount = move.debit
+ if amount > 0.0:
+ res['pname'] = move.partner_id.name
+ res['ref'] = 'Agst Ref'+" "+str(move.name)
+ res['aname'] = move.account_id.name
+ res['amount'] = amount
+ result.append(res)
+ else:
+ type = voucher.line_ids and voucher.line_ids[0].type or False
+ for move in voucher.move_ids:
+ res = {}
+ amount = move.credit
+ if type == 'dr':
+ amount = move.debit
+ if amount > 0.0:
+ res['pname'] = move.partner_id.name
+ res['ref'] = move.name
+ res['aname'] = move.account_id.name
+ res['amount'] = amount
+ result.append(res)
+ return result
+
+ def get_title(self, type):
+ title = ''
+ if type:
+ title = type[0].swapcase() + type[1:] + " Voucher"
+ return title
+
+ def get_on_account(self, voucher):
+ name = ""
+ if voucher.type == 'receipt':
+ name = "Received cash from "+str(voucher.partner_id.name)
+ elif voucher.type == 'payment':
+ name = "Payment from "+str(voucher.partner_id.name)
+ elif voucher.type == 'sale':
+ name = "Sale to "+str(voucher.partner_id.name)
+ elif voucher.type == 'purchase':
+ name = "Purchase from "+str(voucher.partner_id.name)
+ return name
+
+report_sxw.report_sxw(
+ 'report.voucher.print',
+ 'account.voucher',
+ 'addons/account_voucher/report/report_voucher_print.rml',
+ parser=report_voucher_print,header="external"
+)
diff --git a/addons/account_voucher/report/report_voucher_amount.rml b/addons/account_voucher/report/report_voucher_print.rml
similarity index 71%
rename from addons/account_voucher/report/report_voucher_amount.rml
rename to addons/account_voucher/report/report_voucher_print.rml
index e2dccc05e74..358f28b87d5 100755
--- a/addons/account_voucher/report/report_voucher_amount.rml
+++ b/addons/account_voucher/report/report_voucher_print.rml
@@ -1,6 +1,6 @@
-
+
@@ -10,51 +10,17 @@
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -65,7 +31,7 @@
-
+
@@ -92,9 +58,8 @@
-
-
-
+
+
@@ -108,16 +73,16 @@
-
-
+
+
-
+
-
-
-
+
+
+
@@ -149,71 +114,87 @@
-
+
+
- [[ repeatIn(objects,'voucher') ]]
-
+ [[ repeatIn(objects,'voucher') ]]
+
- Type:
-
-
- [[ voucher.journal_id.nme ]]
-
-
- Number:
-
-
- [[ voucher.number ]]
-
-
- Date:
-
-
- [[ formatLang(voucher.date , date=True) or '' ]]
-
-
-
-
-
-
- State:
-
-
- PRO-FORMA [[ ((voucher.state == 'proforma') or removeParentNode('para')) and '' ]]
- Draft[[ ((voucher.state == 'draft') or removeParentNode('para')) and '' ]]
- Canceled [[ ((voucher.state == 'cancel') or removeParentNode('para')) and '' ]]
- Posted [[ ((voucher.state == 'posted') or removeParentNode('para')) and '' ]]
-
-
- Ref:
-
-
- [[ voucher.reference ]]
-
-
- Account:
-
-
- [[ voucher.account_id.name ]]
+ [[ get_title(voucher.type) ]]
+
+
+
+ Number:
+
+
+ [[ voucher.number ]]
+
+
+
+
+
+
+
+
+
+
+
+
+ Date:
+
+
+ [[ formatLang(voucher.date , date=True) or '' ]]
+
+
+
+
+
+
+ State:
+
+
+ PRO-FORMA [[ ((voucher.state == 'proforma') or removeParentNode('para')) and '' ]]
+ Draft[[ ((voucher.state == 'draft') or removeParentNode('para')) and '' ]]
+ Canceled [[ ((voucher.state == 'cancel') or removeParentNode('para')) and '' ]]
+ Posted [[ ((voucher.state == 'posted') or removeParentNode('para')) and '' ]]
+
+
+
+
+
+
+
+
+
+
+
+
+ Currency:
+
+
+ [[ voucher.currency_id.code ]]
+
+
+
- Particulars
+ Particulars
- Amount
+ Amount
@@ -221,29 +202,29 @@
- [[ repeatIn(voucher.payment_ids,'payment_ids') ]]
-
+ [[ repeatIn(get_lines(voucher),'p') ]]
+
- [[ payment_ids.partner_id and payment_ids.partner_id.name or '' ]]
+ Account :
- [[ payment_ids.amount ]]
-
-
-
-
- [[ payment_ids.account_id.name ]]
-
-
-
+
- [[ payment_ids.ref ]] [[ payment_ids.amount ]]
+ [[ p['pname'] ]]
+
+
+ [[ p['amount'] ]] [[ voucher.currency_id.symbol ]]
+
+
+
+
+ [[ p['ref'] ]]
@@ -253,7 +234,7 @@
- [[ payment_ids.type ]]
+ Account : [[ p['aname'] ]]
@@ -282,7 +263,7 @@
- [[ voucher.narration or '' ]]
+ [[ voucher.journal_id.name or '' ]]
@@ -302,7 +283,7 @@
- [[ voucher.name ]]
+ [[ get_on_account(voucher) ]]
@@ -322,7 +303,7 @@
- [[ convert(voucher.amount,voucher.currency_id.name) ]]
+ [[ convert(voucher.amount,voucher.currency_id.name) ]]
@@ -337,12 +318,12 @@
-
+
- [[ voucher.amount ]]
+ [[ voucher.amount ]] [[ voucher.currency_id.symbol ]]
@@ -358,9 +339,6 @@
-
-
-
diff --git a/addons/account_voucher/test/account_voucher_report.yml b/addons/account_voucher/test/account_voucher_report.yml
index eddb313c776..39e9c2144a2 100644
--- a/addons/account_voucher/test/account_voucher_report.yml
+++ b/addons/account_voucher/test/account_voucher_report.yml
@@ -15,15 +15,6 @@
name: Voucher Axelor
period_id: account.period_6
--
- In order to test the PDF reports defined on a account_voucher, we will print account voucher amount Report
--
- !python {model: account.voucher}: |
- import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.voucher.cash_amount').create(cr, uid, [ref("account_voucher_voucheraxelor0")], {}, {})
- if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'account_voucher-amount.'+format), 'wb+').write(data)
-
-
In order to test the PDF reports defined on a account_voucher, we will print account voucher Report
-
diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py
index ebc709e3ff6..6ef093cc935 100644
--- a/addons/account_voucher/voucher.py
+++ b/addons/account_voucher/voucher.py
@@ -143,7 +143,7 @@ class account_voucher(osv.osv):
'reference': fields.char('Ref #', size=64, readonly=True, states={'draft':[('readonly',False)]}, help="Transaction reference number."),
'number': fields.related('move_id', 'name', type="char", readonly=True, string='Number'),
'move_id':fields.many2one('account.move', 'Account Entry'),
- 'move_ids': fields.related('move_id','line_id', type='many2many', relation='account.move.line', string='Journal Items', readonly=True),
+ 'move_ids': fields.related('move_id','line_id', type='one2many', relation='account.move.line', string='Journal Items', readonly=True),
'partner_id':fields.many2one('res.partner', 'Partner', change_default=1, readonly=True, states={'draft':[('readonly',False)]}),
'audit': fields.related('move_id','to_check', type='boolean', relation='account.move', string='Audit Complete ?'),
'pay_now':fields.selection([
@@ -375,7 +375,6 @@ class account_voucher(osv.osv):
else:
total_credit = price or 0.0
account_type = 'receivable'
-
ids = move_line_pool.search(cr, uid, [('account_id.type','=', account_type), ('reconcile_id','=', False), ('partner_id','=',partner_id)], context=context)
ids.reverse()
moves = move_line_pool.browse(cr, uid, ids)
@@ -467,8 +466,8 @@ class account_voucher(osv.osv):
vals['value'].update({'currency_id':currency_id})
return vals
- def proforma_voucher(self, cr, uid, ids):
- self.action_move_line_create(cr, uid, ids)
+ def proforma_voucher(self, cr, uid, ids, context=None):
+ self.action_move_line_create(cr, uid, ids, context=context)
return True
def action_cancel_draft(self, cr, uid, ids, context={}):
@@ -529,7 +528,7 @@ class account_voucher(osv.osv):
res['account_id'] = account_id
return {'value':res}
- def action_move_line_create(self, cr, uid, ids, *args):
+ def action_move_line_create(self, cr, uid, ids, context=None):
def _get_payment_term_lines(term_id, amount):
term_pool = self.pool.get('account.payment.term')
@@ -537,18 +536,20 @@ class account_voucher(osv.osv):
terms = term_pool.compute(cr, uid, term_id, amount)
return terms
return False
-
+ if not context:
+ context = {}
move_pool = self.pool.get('account.move')
move_line_pool = self.pool.get('account.move.line')
analytic_pool = self.pool.get('account.analytic.line')
currency_pool = self.pool.get('res.currency')
invoice_pool = self.pool.get('account.invoice')
-
for inv in self.browse(cr, uid, ids):
if inv.move_id:
continue
- if inv.journal_id.sequence_id:
+ if 'force_name' in context and context['force_name']:
+ name = context['force_name']
+ elif inv.journal_id.sequence_id:
name = self.pool.get('ir.sequence').get_id(cr, uid, inv.journal_id.sequence_id.id)
else:
raise osv.except_osv(_('Error !'), _('Please define a sequence on the journal !'))
@@ -815,9 +816,14 @@ account_voucher_line()
class account_bank_statement(osv.osv):
_inherit = 'account.bank.statement'
- def create_move_from_st_line(self, cr, uid, st_line, company_currency_id, next_number, context=None):
+ def create_move_from_st_line(self, cr, uid, st_line_id, company_currency_id, next_number, context=None):
+ st_line = self.pool.get('account.bank.statement.line').browse(cr, uid, st_line_id, context=context)
if st_line.voucher_id:
- return self.pool.get('account.voucher').proforma_voucher(cr, uid, [st_line.voucher_id.id])
+ res = self.pool.get('account.voucher').proforma_voucher(cr, uid, [st_line.voucher_id.id], context={'force_name': next_number})
+ #force refresh of the cache
+ #st_line = self.pool.get('account.bank.statement.line').browse(cr, uid, st_line.id, context=context)
+
+ return self.pool.get('account.move.line').write(cr, uid, [x.id for x in st_line.voucher_id.move_ids], {'statement_id': st_line.statement_id.id}, context=context)
return super(account_bank_statement, self).create_move_from_st_line(cr, uid, st_line, company_currency_id, next_number, context=context)
account_bank_statement()
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 6cca62c0d57..5fc9b510151 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -105,8 +105,8 @@
-
-
+
+
-
-
-
+
+
diff --git a/addons/account_voucher/voucher_report.xml b/addons/account_voucher/voucher_report.xml
index 273fc53de5f..04bcb5254ba 100644
--- a/addons/account_voucher/voucher_report.xml
+++ b/addons/account_voucher/voucher_report.xml
@@ -6,8 +6,19 @@
model="account.voucher"
name="voucher.cash_receipt.drcr"
rml="account_voucher/report/report_voucher.rml"
+ groups="base.group_extended"
auto="False"
header = "False"
menu="True"/>
+
+
+
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index dc7fef3ca70..5de8de6de68 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -85,7 +85,6 @@ Create dashboard for CRM that includes:
'wizard/crm_send_email_view.xml',
'wizard/crm_add_note_view.xml',
- 'wizard/crm_forward_to_partner_view.xml',
'wizard/crm_merge_opportunities_view.xml',
'crm_view.xml',
diff --git a/addons/crm/board_crm_demo.xml b/addons/crm/board_crm_demo.xml
index 9151d787af9..fd8bb480d68 100644
--- a/addons/crm/board_crm_demo.xml
+++ b/addons/crm/board_crm_demo.xml
@@ -1,14 +1,14 @@
-
+
-
-
-
-
+
+
+
+
-
+
diff --git a/addons/crm/board_crm_view.xml b/addons/crm/board_crm_view.xml
index f0cd7cfdefb..8aa1d96d403 100644
--- a/addons/crm/board_crm_view.xml
+++ b/addons/crm/board_crm_view.xml
@@ -1,23 +1,23 @@
-
-
- CRM Configuration
-
+
+
+ CRM Configuration
+
-
- crm.opportunity.user.graph1
- crm.lead.report
- graph
-
-
-
-
-
-
-
-
-
+
+ crm.opportunity.user.graph1
+ crm.lead.report
+ graph
+
+
+
+
+
+
+
+
+
crm.lead.report.graph
crm.lead.report
@@ -31,7 +31,7 @@
- My Open Opportunities
+ Opportunities
crm.lead
tree
@@ -64,13 +64,13 @@
-
- My Open Opportunities
- crm.lead
- form
- tree,form
+
+ My Open Opportunities
+ crm.lead
+ form
+ tree,form
[('user_id','=',uid),('state','=','open'), ('type', '=', 'opportunity')]
-
+
@@ -86,52 +86,52 @@
-
- crm.meeting
- form
- tree,form
-
+
+ crm.meeting
+ form
+ tree,form
+
[('user_id','=',uid),('state','not in',('cancel','done'))]
-
+
-
- crm.lead.report
- form
- graph,tree,form
-
+
+ crm.lead.report
+ form
+ graph,tree,form
+
['&', '&', ('user_id','=',uid), ('type', '=', 'opportunity'), '!' , '&', ('state', '=', 'done'), ('date_closed','>',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%Y-%m-%d'))]
-
+
-
- crm.lead.report
- form
- graph,tree,form
-
- ['&', ('user_id', '=', uid),'&', ('state', '=', 'done') , '&', ('create_date','>',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%Y-%m-%d')), ('type', '=', 'opportunity')]
-
+
+ crm.lead.report
+ form
+ graph,tree,form
+
+ ['&', ('user_id', '=', uid),'&', ('state', '=', 'done') , '&', ('create_date','>',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%Y-%m-%d')), ('type', '=', 'opportunity')]
+
-
- CRM - Dashboard Form
- board.board
- form
-
-
-
+
Telesales
-
- Mail
+ Mail Campaign 1
-
- Email
+ Mail Campaign 2
-
- Print
+ Twitter Ads
-
- Web
+ Google Adwords
-
- Radio
+ Google Adwords 2
-
Television
-
Newsletter
-
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index 7783c7be1b5..d0bdaee5b62 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -85,7 +85,7 @@
-
+
@@ -146,7 +146,8 @@
-
+
+
@@ -168,11 +169,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -213,9 +214,6 @@
name="%(crm.action_crm_send_mail)d"
context="{'mail':'new', 'model': 'crm.lead'}"
icon="terp-mail-message-new" type="action" />
-
@@ -241,6 +239,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml
index a3556653516..55ef2c7d5e3 100644
--- a/addons/crm/crm_meeting_view.xml
+++ b/addons/crm/crm_meeting_view.xml
@@ -306,8 +306,8 @@
+ string="Meeting Type" widget="selection"
+ domain="[('object_id.model', '=', 'crm.meeting')]" />
diff --git a/addons/crm/crm_opportunity.py b/addons/crm/crm_opportunity.py
index c6a0ae3c370..84e1392168f 100644
--- a/addons/crm/crm_opportunity.py
+++ b/addons/crm/crm_opportunity.py
@@ -152,19 +152,6 @@ class crm_opportunity(osv.osv):
return {'value':{}}
return {'value':{'probability': stage.probability}}
- def onchange_assign_id(self, cr, uid, ids, partner_assigned_id, context={}):
- """This function updates the "assignation date" automatically, when manually assign a partner in the geo assign tab
- @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 ids: List of stage’s IDs
- @stage_id: change state id on run time """
-
- if not partner_assigned_id:
- return {'value':{'date_assign': False}}
- else:
- return {'value':{'date_assign': time.strftime('%Y-%m-%d')}}
-
_defaults = {
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
'priority': crm.AVAILABLE_PRIORITIES[2][0],
diff --git a/addons/crm/crm_opportunity_data.xml b/addons/crm/crm_opportunity_data.xml
index 59e0828d0ee..3ab446440f2 100644
--- a/addons/crm/crm_opportunity_data.xml
+++ b/addons/crm/crm_opportunity_data.xml
@@ -44,14 +44,12 @@
- Existing Business
+ Campaign 2
-
- New Business
+ Campaign 1
-
diff --git a/addons/crm/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml
index 632cb2510c8..a621ea1ddf0 100644
--- a/addons/crm/crm_opportunity_view.xml
+++ b/addons/crm/crm_opportunity_view.xml
@@ -29,7 +29,7 @@
-
+
@@ -116,6 +116,11 @@
+
+
+
+
+
@@ -174,9 +179,6 @@
name="%(crm.action_crm_send_mail)d"
context="{'mail':'new', 'model': 'crm.lead'}"
icon="terp-mail-message-new" type="action" />
-
@@ -197,21 +199,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -234,6 +221,8 @@
+
+
+
+
diff --git a/addons/crm/crm_phonecall.py b/addons/crm/crm_phonecall.py
index 18a6daa0c3c..afa153fb662 100644
--- a/addons/crm/crm_phonecall.py
+++ b/addons/crm/crm_phonecall.py
@@ -36,7 +36,7 @@ class crm_phonecall(crm_case, osv.osv):
_columns = {
# From crm.case
'id': fields.integer('ID'),
- 'name': fields.char('Name', size=64),
+ 'name': fields.char('Call Summary', size=64),
'active': fields.boolean('Active', required=False),
'date_action_last': fields.datetime('Last Action', readonly=1),
'date_action_next': fields.datetime('Next Action', readonly=1),
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index ae243b8cfb0..205e0ff2e76 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -19,16 +19,14 @@
- Phonecall Resource Type
+ Phonecall Campaigns
crm.case.resource.type
form
- [('object_id.model', '=', 'crm.phonecall')]
- {'object_id':'crm.phonecall'}
-
+
@@ -39,9 +37,9 @@
tree
-
-
-
+
+
+
@@ -71,12 +69,12 @@
-
+
-
+
-
@@ -147,7 +145,7 @@
-
+
-
+
-
@@ -207,12 +205,12 @@
tree
-
-
+
+
-
@@ -277,7 +275,7 @@
/>
-
+
crm.case.resource.type
tree
-
+
-
@@ -184,10 +183,9 @@
crm.case.resource.type
form
-
+
-
@@ -195,14 +193,14 @@
- Resource Type
+ Campaigns
crm.case.resource.type
form
- Cases by section
+ Cases by Sales Team
crm.case.section
[('parent_id','=',False)]
tree
@@ -436,7 +434,7 @@
crm.case.section.custom
tree
-
+
@@ -527,7 +525,7 @@
-
+
@@ -576,9 +574,6 @@
name="%(crm.action_crm_send_mail)d"
context="{'mail':'new', 'model': 'crm.case.custom'}"
icon="terp-mail-message-new" type="action" />
-
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
index 4f6f39e0690..2f10922a947 100644
--- a/addons/crm/report/crm_lead_report.py
+++ b/addons/crm/report/crm_lead_report.py
@@ -77,7 +77,9 @@ class crm_lead_report(osv.osv):
'name': fields.char('Year', size=64, required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'country_id':fields.many2one('res.country', 'Country', readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
+ 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True),
+ 'channel_id':fields.many2one('res.partner.canal', 'Channel', readonly=True),
+ 'type_id':fields.many2one('crm.case.resource.type', 'Campaign', readonly=True),
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
'avg_answers': fields.function(_get_data, string='Avg. Answers', method=True, type="integer"),
'perc_done': fields.function(_get_data, string='%Done', method=True, type="float"),
@@ -99,8 +101,7 @@ class crm_lead_report(osv.osv):
'planned_revenue': fields.float('Planned Revenue',digits=(16,2),readonly=True),
'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True),
'categ_id': fields.many2one('crm.case.categ', 'Category',\
- domain="[('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.lead')]" , readonly=True),
+ domain="[('section_id','=',section_id)]" , readonly=True),
'stage_id': fields.many2one ('crm.case.stage', 'Stage', \
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.lead')]", readonly=True),
@@ -141,6 +142,8 @@ class crm_lead_report(osv.osv):
c.company_id,
c.priority,
c.section_id,
+ c.channel_id,
+ c.type_id,
c.categ_id,
c.partner_id,
c.country_id,
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index e6b2f6af4f1..42adda76dbe 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -14,6 +14,8 @@
+
+
@@ -69,9 +71,17 @@
-
-
+
+
+
@@ -111,6 +121,10 @@
context="{'group_by':'section_id'}" />
+
+
@@ -135,7 +149,9 @@
-
+
+
+
@@ -166,6 +182,8 @@
+
+
@@ -186,9 +204,9 @@
Leads Analysis
crm.lead.report
form
- {'search_default_lead':1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_filter_lead': 1, 'search_default_lead':1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]}
tree,graph
- [('type', '=', 'lead')]
+ []
Leads Analysis allows you to consult different informations relative to CRM. Check for treatments delays, number of responses given and emails send. You can sort out your leads analysis on different groups to get fine grained analysis.
@@ -210,9 +228,9 @@
Opportunities Analysis
crm.lead.report
form
- {"search_default_opportunity": 1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]}
+ {"search_default_filter_opportunity":1, "search_default_opportunity": 1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]}
tree,graph
- [('type', '=', 'opportunity')]
+ []
Opportunities Analysis menu gives you an instant access to your opportunities like expected revenue, planned cost, overpassed deadline or the number of exchanges by opportunity.
diff --git a/addons/crm/res_partner.py b/addons/crm/res_partner.py
index db7069af4db..c2651b14c8e 100644
--- a/addons/crm/res_partner.py
+++ b/addons/crm/res_partner.py
@@ -31,8 +31,6 @@ class res_partner(osv.osv):
'Meetings'),
'phonecall_ids': fields.one2many('crm.phonecall', 'partner_id',\
'Phonecalls'),
- 'opportunity_assigned_ids': fields.one2many('crm.lead', 'partner_assigned_id',\
- 'Assigned Opportunities'),
}
res_partner()
diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml
index 4dad9f3dfdd..6ca978ea153 100644
--- a/addons/crm/res_partner_view.xml
+++ b/addons/crm/res_partner_view.xml
@@ -44,39 +44,6 @@
icon="gtk-cancel" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm/wizard/__init__.py b/addons/crm/wizard/__init__.py
index 7b23d0eac3d..9730b8d1d55 100644
--- a/addons/crm/wizard/__init__.py
+++ b/addons/crm/wizard/__init__.py
@@ -20,7 +20,6 @@
##############################################################################
import crm_send_email
-import crm_forward_to_partner
import crm_add_note
import crm_lead_to_partner
diff --git a/addons/partner_geo_assign/__init__.py b/addons/crm_partner_assign/__init__.py
similarity index 97%
rename from addons/partner_geo_assign/__init__.py
rename to addons/crm_partner_assign/__init__.py
index e1957dfb286..3bb196d3193 100644
--- a/addons/partner_geo_assign/__init__.py
+++ b/addons/crm_partner_assign/__init__.py
@@ -20,3 +20,5 @@
##############################################################################
import partner_geo_assign
+import wizard
+import report
diff --git a/addons/partner_geo_assign/__openerp__.py b/addons/crm_partner_assign/__openerp__.py
similarity index 92%
rename from addons/partner_geo_assign/__openerp__.py
rename to addons/crm_partner_assign/__openerp__.py
index e5ef5b5dd9d..3068bf25fbe 100644
--- a/addons/partner_geo_assign/__openerp__.py
+++ b/addons/crm_partner_assign/__openerp__.py
@@ -30,9 +30,11 @@ based on geolocalization.
""",
'author': 'OpenERP SA',
'depends': ['crm'],
- 'data': [
+ 'update_xml': [
'res_partner_view.xml',
+ 'wizard/crm_forward_to_partner_view.xml',
'crm_lead_view.xml',
+ 'report/crm_lead_report_view.xml',
],
'installable': True,
'active': False,
diff --git a/addons/crm_partner_assign/crm_lead_view.xml b/addons/crm_partner_assign/crm_lead_view.xml
new file mode 100644
index 00000000000..fe6b997cc6e
--- /dev/null
+++ b/addons/crm_partner_assign/crm_lead_view.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ crm.lead.geo_assign.inherit
+ crm.lead
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/partner_geo_assign/i18n/en_US.po b/addons/crm_partner_assign/i18n/en_US.po
similarity index 100%
rename from addons/partner_geo_assign/i18n/en_US.po
rename to addons/crm_partner_assign/i18n/en_US.po
diff --git a/addons/partner_geo_assign/i18n/fr.po b/addons/crm_partner_assign/i18n/fr.po
similarity index 100%
rename from addons/partner_geo_assign/i18n/fr.po
rename to addons/crm_partner_assign/i18n/fr.po
diff --git a/addons/partner_geo_assign/i18n/partner_geo_assign.pot b/addons/crm_partner_assign/i18n/partner_geo_assign.pot
similarity index 100%
rename from addons/partner_geo_assign/i18n/partner_geo_assign.pot
rename to addons/crm_partner_assign/i18n/partner_geo_assign.pot
diff --git a/addons/partner_geo_assign/partner_geo_assign.py b/addons/crm_partner_assign/partner_geo_assign.py
similarity index 84%
rename from addons/partner_geo_assign/partner_geo_assign.py
rename to addons/crm_partner_assign/partner_geo_assign.py
index d53aa461db6..9a761740c8d 100644
--- a/addons/partner_geo_assign/partner_geo_assign.py
+++ b/addons/crm_partner_assign/partner_geo_assign.py
@@ -41,6 +41,20 @@ def geo_find(addr):
_('Could not contact geolocation servers, please make sure you have a working internet connection (%s)') % e)
+class res_partner_grade(osv.osv):
+ _order = 'sequence'
+ _name = 'res.partner.grade'
+ _columns = {
+ 'sequence': fields.integer('Sequence'),
+ 'active': fields.boolean('Active'),
+ 'name': fields.char('Grade Name', size=32)
+ }
+ _defaults = {
+ 'active': lambda *args: 1
+ }
+res_partner_grade()
+
+
class res_partner(osv.osv):
_inherit = "res.partner"
_columns = {
@@ -49,6 +63,9 @@ class res_partner(osv.osv):
'date_localization': fields.date('Geo Localization Date'),
'partner_weight': fields.integer('Weight',
help="Gives the probability to assign a lead to this partner. (0 means no assignation.)"),
+ 'opportunity_assigned_ids': fields.one2many('crm.lead', 'partner_assigned_id',\
+ 'Assigned Opportunities'),
+ 'grade_id': fields.many2one('res.partner.grade', 'Partner Grade')
}
_defaults = {
'partner_weight': lambda *args: 0
@@ -74,7 +91,21 @@ class crm_lead(osv.osv):
_columns = {
'partner_latitude': fields.float('Geo Latitude'),
'partner_longitude': fields.float('Geo Longitude'),
+ 'partner_assigned_id': fields.many2one('res.partner', 'Assigned Partner', help="Partner this case has been forwarded/assigned to.", select=True),
+ 'date_assign': fields.date('Assignation Date', help="Last date this case was forwarded/assigned to a partner"),
}
+ def onchange_assign_id(self, cr, uid, ids, partner_assigned_id, context={}):
+ """This function updates the "assignation date" automatically, when manually assign a partner in the geo assign tab
+ @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 ids: List of stage’s IDs
+ @stage_id: change state id on run time """
+
+ if not partner_assigned_id:
+ return {'value':{'date_assign': False}}
+ else:
+ return {'value':{'date_assign': time.strftime('%Y-%m-%d')}}
def assign_partner(self, cr, uid, ids, context=None):
ok = False
diff --git a/addons/account_voucher/report/report_voucher_amount.py b/addons/crm_partner_assign/report/__init__.py
similarity index 58%
rename from addons/account_voucher/report/report_voucher_amount.py
rename to addons/crm_partner_assign/report/__init__.py
index b691ca638f0..9b7860b8de4 100644
--- a/addons/account_voucher/report/report_voucher_amount.py
+++ b/addons/crm_partner_assign/report/__init__.py
@@ -19,26 +19,5 @@
#
##############################################################################
-import time
-from report import report_sxw
-from tools import amount_to_text_en
+import crm_lead_report
-class report_voucher_amount(report_sxw.rml_parse):
- def __init__(self, cr, uid, name, context):
- super(report_voucher_amount, self).__init__(cr, uid, name, context)
- self.localcontext.update({
- 'time': time,
- 'convert':self.convert
- })
-
- def convert(self, amount, cur):
- amt_en = amount_to_text_en.amount_to_text(amount, 'en', cur);
- return amt_en
-
-
-report_sxw.report_sxw(
- 'report.voucher.cash_amount',
- 'account.voucher',
- 'addons/account_voucher/report/report_voucher_amount.rml',
- parser=report_voucher_amount,header="external"
-)
diff --git a/addons/crm_partner_assign/report/crm_lead_report.py b/addons/crm_partner_assign/report/crm_lead_report.py
new file mode 100644
index 00000000000..ac4c7684d9e
--- /dev/null
+++ b/addons/crm_partner_assign/report/crm_lead_report.py
@@ -0,0 +1,127 @@
+# -*- 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 .
+#
+##############################################################################
+
+from osv import fields,osv
+import tools
+from crm import crm
+
+AVAILABLE_STATES = [
+ ('draft','Draft'),
+ ('open','Open'),
+ ('cancel', 'Cancelled'),
+ ('done', 'Closed'),
+ ('pending','Pending')
+]
+
+class crm_lead_report_assign(osv.osv):
+ """ CRM Lead Report """
+ _name = "crm.lead.report.assign"
+ _auto = False
+ _description = "CRM Lead Report"
+ _columns = {
+ 'name': fields.char('Year', size=64, required=False, readonly=True),
+ 'partner_assigned_id':fields.many2one('res.partner', 'Partner', readonly=True),
+ 'grade_id':fields.many2one('res.partner.grade', 'Grade', readonly=True),
+ 'user_id':fields.many2one('res.users', 'User', readonly=True),
+ 'country_id':fields.many2one('res.country', 'Country', readonly=True),
+ 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True),
+ 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
+ 'month':fields.selection([('01', 'January'), ('02', 'February'), \
+ ('03', 'March'), ('04', 'April'),\
+ ('05', 'May'), ('06', 'June'), \
+ ('07', 'July'), ('08', 'August'),\
+ ('09', 'September'), ('10', 'October'),\
+ ('11', 'November'), ('12', 'December')], 'Month', readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ 'partner_date': fields.date('Partner Date', readonly=True),
+ 'create_date': fields.datetime('Create Date', readonly=True),
+ 'day': fields.char('Day', size=128, readonly=True),
+ 'delay_open': fields.float('Delay to Open',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"),
+ 'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
+ 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"),
+ 'probability': fields.float('Avg Probability',digits=(16,2),readonly=True, group_operator="avg"),
+ 'probability_max': fields.float('Max Probability',digits=(16,2),readonly=True, group_operator="max"),
+ 'planned_revenue': fields.float('Planned Revenue',digits=(16,2),readonly=True),
+ 'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category',\
+ domain="[('section_id','=',section_id)]" , readonly=True),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', \
+ domain="[('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.lead')]", readonly=True),
+ 'partner_id': fields.many2one('res.partner', 'Customer' , readonly=True),
+ 'opening_date': fields.date('Opening Date', readonly=True),
+ 'creation_date': fields.date('Creation Date', readonly=True),
+ 'date_closed': fields.date('Close Date', readonly=True),
+ 'nbr': fields.integer('# of Cases', readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company', readonly=True),
+ 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
+ 'type':fields.selection([
+ ('lead','Lead'),
+ ('opportunity','Opportunity'),
+ ],'Type', help="Type is used to separate Leads and Opportunities"),
+ }
+ def init(self, cr):
+
+ """
+ CRM Lead Report
+ @param cr: the current row, from the database cursor
+ """
+ tools.drop_view_if_exists(cr, 'crm_lead_report_assign')
+ cr.execute("""
+ CREATE OR REPLACE VIEW crm_lead_report_assign AS (
+ SELECT
+ c.id,
+ to_char(c.create_date, 'YYYY') as name,
+ to_char(c.create_date, 'MM') as month,
+ to_char(c.create_date, 'YYYY-MM-DD') as day,
+ to_char(c.create_date, 'YYYY-MM-DD') as creation_date,
+ to_char(c.date_open, 'YYYY-MM-DD') as opening_date,
+ to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
+ c.state,
+ c.user_id,
+ c.probability,
+ c.probability as probability_max,
+ c.stage_id,
+ c.type,
+ c.company_id,
+ c.priority,
+ c.section_id,
+ c.categ_id,
+ c.partner_id,
+ c.country_id,
+ c.planned_revenue,
+ c.partner_assigned_id,
+ p.grade_id,
+ p.date as partner_date,
+ c.planned_revenue*(c.probability/100) as probable_revenue,
+ 1 as nbr,
+ date_trunc('day',c.create_date) as create_date,
+ extract('epoch' from (c.date_closed-c.create_date))/(3600*24) as delay_close,
+ extract('epoch' from (c.date_deadline - c.date_closed))/(3600*24) as delay_expected,
+ extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open
+ FROM
+ crm_lead c
+ left join res_partner p on (c.partner_assigned_id=p.id)
+ )""")
+
+crm_lead_report_assign()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/report/crm_lead_report_view.xml b/addons/crm_partner_assign/report/crm_lead_report_view.xml
new file mode 100644
index 00000000000..3424fc44fbe
--- /dev/null
+++ b/addons/crm_partner_assign/report/crm_lead_report_view.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+ crm.lead.report.assign.select
+ crm.lead.report.assign
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ crm.lead.assign.report.tree
+ crm.lead.report.assign
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Opp. Assignment Analysis
+ crm.lead.report.assign
+ form
+ {"search_default_group_partner_date": 1, "search_default_group_grade":1,'group_by_no_leaf':1,'group_by':[]}
+ tree
+ [('type', '=', 'opportunity')]
+
+
+
+
+ tree
+
+
+
+
+
+
+
+
diff --git a/addons/crm_partner_assign/res_partner_view.xml b/addons/crm_partner_assign/res_partner_view.xml
new file mode 100644
index 00000000000..ab14e7ca7b0
--- /dev/null
+++ b/addons/crm_partner_assign/res_partner_view.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+ res.partner.grade.tree
+ res.partner.grade
+ tree
+
+
+
+
+
+
+
+
+ res.partner.grade.form
+ res.partner.grade
+ form
+
+
+
+
+
+
+
+
+
+
+
+ Partner Grade
+ res.partner.grade
+ form
+
+
+
+
+
+ res.partner.geo.inherit.tree
+ res.partner
+ tree
+
+
+
+
+
+
+
+
+
+ res.partner.geo.inherit.search
+ res.partner
+ search
+
+
+
+
+
+
+
+
+
+ res.partner.geo.inherit
+ res.partner
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm_partner_assign/wizard/__init__.py b/addons/crm_partner_assign/wizard/__init__.py
new file mode 100644
index 00000000000..9224173145b
--- /dev/null
+++ b/addons/crm_partner_assign/wizard/__init__.py
@@ -0,0 +1,22 @@
+# -*- 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 crm_forward_to_partner
diff --git a/addons/crm/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
similarity index 100%
rename from addons/crm/wizard/crm_forward_to_partner.py
rename to addons/crm_partner_assign/wizard/crm_forward_to_partner.py
diff --git a/addons/crm/wizard/crm_forward_to_partner_view.xml b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml
similarity index 94%
rename from addons/crm/wizard/crm_forward_to_partner_view.xml
rename to addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml
index d2705c8f0db..9ee2870335a 100644
--- a/addons/crm/wizard/crm_forward_to_partner_view.xml
+++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml
@@ -5,7 +5,7 @@
crm_lead_forward_to_partner
crm.lead.forward.to.partner
form
-
+
@@ -31,7 +31,7 @@
crm_lead_forward_to_partner1
crm.lead.forward.to.partner
form
-
+
diff --git a/addons/decimal_precision/decimal_precision.py b/addons/decimal_precision/decimal_precision.py
index 463dbf67cee..6a0f8ffa424 100644
--- a/addons/decimal_precision/decimal_precision.py
+++ b/addons/decimal_precision/decimal_precision.py
@@ -20,6 +20,9 @@
##############################################################################
from osv import osv, fields
+from tools import cache
+import pooler
+
class decimal_precision(osv.osv):
_name = 'decimal.precision'
@@ -30,23 +33,33 @@ class decimal_precision(osv.osv):
_defaults = {
'digits': lambda *a : 2,
}
+
+ _sql_constraints = [
+ ('name_uniq', 'unique (name)', """The Usage of the decimal precision must be unique!"""),
+ ]
+
+ @cache(skiparg=3)
def precision_get(self, cr, uid, application):
cr.execute('select digits from decimal_precision where name=%s', (application,))
res = cr.fetchone()
return res and res[0] or 2
def write(self, cr, uid, ids, data, *args, **argv):
+ self.precision_get.clear_cache(cr.dbname)
res = super(decimal_precision, self).write(cr, uid, ids, data, *args, **argv)
for obj in self.pool.obj_list():
for colname,col in self.pool.get(obj)._columns.items():
if isinstance(col, fields.float):
col.digits_change(cr)
return res
+
decimal_precision()
+
def get_precision(application):
def change_digit(cr):
- cr.execute('select digits from decimal_precision where name=%s', (application,))
- res = cr.fetchone()
- return (16,res and res[0] or 2)
+ res = pooler.get_pool(cr.dbname).get('decimal.precision').precision_get(cr, 1, application)
+ return (16, res)
return change_digit
+
+
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index cd25a5f1883..7d527442391 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -154,7 +154,7 @@ class email_server(osv.osv):
for num in range(1, numMsgs + 1):
(header, msges, octets) = pop_server.retr(num)
msg = '\n'.join(msges)
- res_id = email_tool.process_email(cr, uid, server.object_id.model, data[0][1], attach=server.attach, context=context)
+ res_id = email_tool.process_email(cr, uid, server.object_id.model, msg, attach=server.attach, context=context)
if res_id and server.action_id:
action_pool = self.pool.get('ir.actions.server')
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index 624ce72d659..a4049242c22 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -27,28 +27,39 @@ from mx import DateTime
from tools.translate import _
class one2many_mod2(fields.one2many):
- def get(self, cr, obj, ids, name, user=None, offset=0, context={}, values={}):
- res = {}
- for id in ids:
- res[id] = []
+ def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
+ if context is None:
+ context = {}
- res5 = obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)
- res6 = {}
- for r in res5:
- res6[r['id']] = (r['date_current'], r['user_id'][0])
+ if values is None:
+ values = {}
- ids2 = []
- for id in ids:
- dom = []
+ res = {}.fromkeys(ids, [])
+
+ # dict:
+ # {idn: (date_current, user_id), ...
+ # 1: ('2010-08-15', 1)}
+ res6 = dict([(rec['id'], (rec['date_current'], rec['user_id'][0]))
+ for rec
+ in obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)])
+
+ # eg: ['|', '|',
+ # '&', '&', ('name', '>=', '2011-03-01'), ('name', '<=', '2011-03-01'), ('employee_id.user_id', '=', 1),
+ # '&', '&', ('name', '>=', '2011-02-01'), ('name', '<=', '2011-02-01'), ('employee_id.user_id', '=', 1)]
+ dom = []
+ for c, id in enumerate(ids):
if id in res6:
- dom = [('name', '>=', res6[id][0] + ' 00:00:00'),
- ('name', '<=', res6[id][0] + ' 23:59:59'),
- ('employee_id.user_id', '=', res6[id][1])]
- ids2.extend(obj.pool.get(self._obj).search(cr, user,
- dom, limit=self._limit))
+ if c: # skip first
+ dom.insert(0 ,'|')
+ dom.append('&')
+ dom.append('&')
+ dom.append(('name', '>=', res6[id][0]))
+ dom.append(('name', '<=', res6[id][0]))
+ dom.append(('employee_id.user_id', '=', res6[id][1]))
- for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2,
- [self._fields_id], context=context, load='_classic_write'):
+ ids2 = obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit)
+
+ for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
if r[self._fields_id]:
res.setdefault(r[self._fields_id][0], []).append(r['id'])
@@ -57,17 +68,21 @@ class one2many_mod2(fields.one2many):
def set(self, cr, obj, id, field, values, user=None, context=None):
if context is None:
context = {}
+
context = context.copy()
context['sheet_id'] = id
- return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user,
- context=context)
+ return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user, context=context)
class one2many_mod(fields.one2many):
- def get(self, cr, obj, ids, name, user=None, offset=0, context={}, values={}):
- res = {}
- for id in ids:
- res[id] = []
+ def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
+ if context is None:
+ context = {}
+
+ if values is None:
+ values = {}
+
+ res = {}.fromkeys(ids, [])
res5 = obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)
res6 = {}
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 5ad90bf25d6..87dfe8dd670 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -378,7 +378,6 @@ class one2many_domain(fields.one2many):
move_obj = obj.pool.get('stock.move')
res = {}.fromkeys(ids, [])
- key = operator.itemgetter(0)
move_ids = move_obj.search(cr, user, self._domain+[('production_id', 'in', tuple(ids))], context=context)
related_move_dict = dict([(o.production_id.id, [o.id]) for o in move_obj.browse(cr, user, move_ids, context=context)])
res.update(related_move_dict)
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/addin.py b/addons/outlook/plugin/openerp-outlook-plugin/addin.py
index 3aa4a39574c..f8f96dcb962 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/addin.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/addin.py
@@ -1,5 +1,27 @@
- #!/usr/bin/python
- #-*- encoding: utf-8 -*-
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
+# -*- 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 .
+#
+##############################################################################
from win32com import universal
from win32com.server.exception import COMException
@@ -40,8 +62,12 @@ def GetConn():
class ButtonEvent:
def OnClick(self, button, cancel):
- mngr = manager.GetManager()
- mngr.ShowManager()
+ import win32ui
+ try:
+ mngr = manager.GetManager()
+ mngr.ShowManager()
+ except Exception,e:
+ win32ui.MessageBox("Fail to Initialize dialog.\n"+str(e),"OpenERP Configuration", win32con.MB_ICONERROR)
return cancel
#
class ViewPartners:
@@ -55,12 +81,12 @@ class ViewPartners:
if ex:
is_login = str(data['login'])
if is_login == 'False':
- win32ui.MessageBox("Please login to the database first", "Database Connection", win32con.MB_ICONEXCLAMATION)
+ win32ui.MessageBox("Please login to the database first", "OpenERP Connection", win32con.MB_ICONEXCLAMATION)
elif ex.Selection.Count == 1 or ex.Selection.Count == 0:
mngr = manager.GetManager()
mngr.ShowManager("IDD_VIEW_PARTNER_DIALOG")
elif ex.Selection.Count > 1:
- win32ui.MessageBox("Multiple selection not allowed. Please select only one mail at a time.","",win32con.MB_ICONINFORMATION)
+ win32ui.MessageBox("Multiple selection not allowed. Please select only one mail at a time.","Open Contact",win32con.MB_ICONINFORMATION)
return cancel
#
class ArchiveEvent:
@@ -74,14 +100,14 @@ class ArchiveEvent:
if ex:
is_login = str(data['login'])
if is_login == 'False':
- win32ui.MessageBox("Please login to the database first", "Database Connection", win32con.MB_ICONEXCLAMATION)
+ win32ui.MessageBox("Please login to the database first", "OpenERP Connection", win32con.MB_ICONEXCLAMATION)
elif ex.Selection.Count == 1:
mngr = manager.GetManager()
mngr.ShowManager("IDD_SYNC")
elif ex.Selection.Count == 0:
- win32ui.MessageBox("No mail selected to archive to OpenERP","",win32con.MB_ICONINFORMATION)
+ win32ui.MessageBox("No mail selected to push to OpenERP","Push to OpenERP",win32con.MB_ICONINFORMATION)
elif ex.Selection.Count > 1:
- win32ui.MessageBox("Multiple selection not allowed. Please select only one mail at a time.","",win32con.MB_ICONINFORMATION)
+ win32ui.MessageBox("Multiple selection not allowed. Please select only one mail at a time.","Push to OpenERP",win32con.MB_ICONINFORMATION)
return cancel
#
class OutlookAddin:
@@ -111,8 +137,8 @@ class OutlookAddin:
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.menu_bar_arch_Button = DispatchWithEvents(item, ArchiveEvent)
- item.Caption="Archive to OpenERP"
- item.TooltipText = "Click to archive to OpenERP"
+ item.Caption="Push to OpenERP"
+ item.TooltipText = "Click to push to OpenERP"
item.Enabled = True
toolbar = bars.Item("Standard")
@@ -120,8 +146,8 @@ class OutlookAddin:
item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.toolbarButton = DispatchWithEvents(item, ArchiveEvent)
- item.Caption="Archive to OpenERP"
- item.TooltipText = "Click to archive to OpenERP"
+ item.Caption="Push to OpenERP"
+ item.TooltipText = "Click to push to OpenERP"
item.Enabled = True
# Adding Menu in Menu Bar to the Web Menu of the Outlook
@@ -196,9 +222,11 @@ if __name__ == '__main__':
if "--unregister" in sys.argv:
UnregisterAddin(OutlookAddin)
UnregisterXMLConn(NewConn)
+ print "\n \tPlug In Un-registered Successfully.\n\tThank You for Using PlugIn."
else:
RegisterAddin(OutlookAddin)
RegisterXMLConn(NewConn)
+ print "\n \tPlug In Registered Successfully.\n\tEnjoy Archiving with OpenERP.\n\tSee UserGuide for More. "
#mngr = manager.GetManager()
#mngr.ShowManager("IDD_MANAGER")
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/chilkat.py b/addons/outlook/plugin/openerp-outlook-plugin/chilkat.py
index cc515f98959..14e9741d09b 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/chilkat.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/chilkat.py
@@ -218,6 +218,7 @@ class CkHtmlToXml(_object):
__del__ = lambda self : None;
def get_Utf8(self): return _chilkat.CkHtmlToXml_get_Utf8(self)
def put_Utf8(self, *args): return _chilkat.CkHtmlToXml_put_Utf8(self, *args)
+ def SetHtmlBytes(self, *args): return _chilkat.CkHtmlToXml_SetHtmlBytes(self, *args)
def UnlockComponent(self, *args): return _chilkat.CkHtmlToXml_UnlockComponent(self, *args)
def IsUnlocked(self): return _chilkat.CkHtmlToXml_IsUnlocked(self)
def SaveLastError(self, *args): return _chilkat.CkHtmlToXml_SaveLastError(self, *args)
@@ -630,6 +631,10 @@ class CkSocket(_object):
def put_HttpProxyHostname(self, *args): return _chilkat.CkSocket_put_HttpProxyHostname(self, *args)
def get_HttpProxyPort(self): return _chilkat.CkSocket_get_HttpProxyPort(self)
def put_HttpProxyPort(self, *args): return _chilkat.CkSocket_put_HttpProxyPort(self, *args)
+ def get_NumSslAcceptableClientCAs(self): return _chilkat.CkSocket_get_NumSslAcceptableClientCAs(self)
+ def GetSslAcceptableClientCaDn(self, *args): return _chilkat.CkSocket_GetSslAcceptableClientCaDn(self, *args)
+ def getSslAcceptableClientCaDn(self, *args): return _chilkat.CkSocket_getSslAcceptableClientCaDn(self, *args)
+ def AddSslAcceptableClientCaDn(self, *args): return _chilkat.CkSocket_AddSslAcceptableClientCaDn(self, *args)
def UnlockComponent(self, *args): return _chilkat.CkSocket_UnlockComponent(self, *args)
def IsUnlocked(self): return _chilkat.CkSocket_IsUnlocked(self)
def AsyncSendBytes(self, *args): return _chilkat.CkSocket_AsyncSendBytes(self, *args)
@@ -1241,6 +1246,8 @@ class CkRsa(_object):
def signHashENC(self, *args): return _chilkat.CkRsa_signHashENC(self, *args)
def get_VerboseLogging(self): return _chilkat.CkRsa_get_VerboseLogging(self)
def put_VerboseLogging(self, *args): return _chilkat.CkRsa_put_VerboseLogging(self, *args)
+ def get_NoUnpad(self): return _chilkat.CkRsa_get_NoUnpad(self)
+ def put_NoUnpad(self, *args): return _chilkat.CkRsa_put_NoUnpad(self, *args)
def UnlockComponent(self, *args): return _chilkat.CkRsa_UnlockComponent(self, *args)
def SaveLastError(self, *args): return _chilkat.CkRsa_SaveLastError(self, *args)
def LastErrorXml(self, *args): return _chilkat.CkRsa_LastErrorXml(self, *args)
@@ -1338,7 +1345,6 @@ class CkEmail(_object):
def ComputeGlobalKey(self, *args): return _chilkat.CkEmail_ComputeGlobalKey(self, *args)
def computeGlobalKey(self, *args): return _chilkat.CkEmail_computeGlobalKey(self, *args)
def get_NumDaysOld(self): return _chilkat.CkEmail_get_NumDaysOld(self)
- def UnwrapSecurity(self): return _chilkat.CkEmail_UnwrapSecurity(self)
def get_PreferredCharset(self, *args): return _chilkat.CkEmail_get_PreferredCharset(self, *args)
def preferredCharset(self): return _chilkat.CkEmail_preferredCharset(self)
def put_PreferredCharset(self, *args): return _chilkat.CkEmail_put_PreferredCharset(self, *args)
@@ -1349,6 +1355,22 @@ class CkEmail(_object):
def AddEncryptCert(self, *args): return _chilkat.CkEmail_AddEncryptCert(self, *args)
def UnpackHtml(self, *args): return _chilkat.CkEmail_UnpackHtml(self, *args)
def SetFromMimeBytes(self, *args): return _chilkat.CkEmail_SetFromMimeBytes(self, *args)
+ def SetAttachmentDisposition(self, *args): return _chilkat.CkEmail_SetAttachmentDisposition(self, *args)
+ def RemoveHtmlAlternative(self): return _chilkat.CkEmail_RemoveHtmlAlternative(self)
+ def RemovePlainTextAlternative(self): return _chilkat.CkEmail_RemovePlainTextAlternative(self)
+ def AddHeaderField2(self, *args): return _chilkat.CkEmail_AddHeaderField2(self, *args)
+ def get_PrependHeaders(self): return _chilkat.CkEmail_get_PrependHeaders(self)
+ def put_PrependHeaders(self, *args): return _chilkat.CkEmail_put_PrependHeaders(self, *args)
+ def CreateDsn(self, *args): return _chilkat.CkEmail_CreateDsn(self, *args)
+ def CreateMdn(self, *args): return _chilkat.CkEmail_CreateMdn(self, *args)
+ def get_SigningHashAlg(self, *args): return _chilkat.CkEmail_get_SigningHashAlg(self, *args)
+ def signingHashAlg(self): return _chilkat.CkEmail_signingHashAlg(self)
+ def put_SigningHashAlg(self, *args): return _chilkat.CkEmail_put_SigningHashAlg(self, *args)
+ def get_Pkcs7CryptAlg(self, *args): return _chilkat.CkEmail_get_Pkcs7CryptAlg(self, *args)
+ def pkcs7CryptAlg(self): return _chilkat.CkEmail_pkcs7CryptAlg(self)
+ def put_Pkcs7CryptAlg(self, *args): return _chilkat.CkEmail_put_Pkcs7CryptAlg(self, *args)
+ def get_Pkcs7KeyLength(self): return _chilkat.CkEmail_get_Pkcs7KeyLength(self)
+ def put_Pkcs7KeyLength(self, *args): return _chilkat.CkEmail_put_Pkcs7KeyLength(self, *args)
def SetTextBody(self, *args): return _chilkat.CkEmail_SetTextBody(self, *args)
def getRelatedStringCrLf(self, *args): return _chilkat.CkEmail_getRelatedStringCrLf(self, *args)
def getRelatedContentID(self, *args): return _chilkat.CkEmail_getRelatedContentID(self, *args)
@@ -1664,7 +1686,20 @@ class CkCert(_object):
__del__ = lambda self : None;
def CheckRevoked(self): return _chilkat.CkCert_CheckRevoked(self)
def get_Sha1Thumbprint(self, *args): return _chilkat.CkCert_get_Sha1Thumbprint(self, *args)
- def TestCert(self): return _chilkat.CkCert_TestCert(self)
+ def ExportCertXml(self, *args): return _chilkat.CkCert_ExportCertXml(self, *args)
+ def exportCertXml(self): return _chilkat.CkCert_exportCertXml(self)
+ def get_VerboseLogging(self): return _chilkat.CkCert_get_VerboseLogging(self)
+ def put_VerboseLogging(self, *args): return _chilkat.CkCert_put_VerboseLogging(self, *args)
+ def get_CertVersion(self): return _chilkat.CkCert_get_CertVersion(self)
+ def SetPrivateKey(self, *args): return _chilkat.CkCert_SetPrivateKey(self, *args)
+ def get_OcspUrl(self, *args): return _chilkat.CkCert_get_OcspUrl(self, *args)
+ def ocspUrl(self): return _chilkat.CkCert_ocspUrl(self)
+ def FindIssuer(self): return _chilkat.CkCert_FindIssuer(self)
+ def LoadByIssuerAndSerialNumber(self, *args): return _chilkat.CkCert_LoadByIssuerAndSerialNumber(self, *args)
+ def get_SelfSigned(self): return _chilkat.CkCert_get_SelfSigned(self)
+ def SetPrivateKeyPem(self, *args): return _chilkat.CkCert_SetPrivateKeyPem(self, *args)
+ def GetPrivateKeyPem(self, *args): return _chilkat.CkCert_GetPrivateKeyPem(self, *args)
+ def getPrivateKeyPem(self): return _chilkat.CkCert_getPrivateKeyPem(self)
def getEncoded(self): return _chilkat.CkCert_getEncoded(self)
def issuerE(self): return _chilkat.CkCert_issuerE(self)
def issuerC(self): return _chilkat.CkCert_issuerC(self)
@@ -1781,6 +1816,8 @@ class CkCertStore(_object):
def OpenOutlookStore(self, *args): return _chilkat.CkCertStore_OpenOutlookStore(self, *args)
def OpenRegistryStore(self, *args): return _chilkat.CkCertStore_OpenRegistryStore(self, *args)
def FindCertBySha1Thumbprint(self, *args): return _chilkat.CkCertStore_FindCertBySha1Thumbprint(self, *args)
+ def get_VerboseLogging(self): return _chilkat.CkCertStore_get_VerboseLogging(self)
+ def put_VerboseLogging(self, *args): return _chilkat.CkCertStore_put_VerboseLogging(self, *args)
def lastErrorText(self): return _chilkat.CkCertStore_lastErrorText(self)
def lastErrorXml(self): return _chilkat.CkCertStore_lastErrorXml(self)
def lastErrorHtml(self): return _chilkat.CkCertStore_lastErrorHtml(self)
@@ -1875,6 +1912,23 @@ class CkMime(_object):
def AddContentLength(self): return _chilkat.CkMime_AddContentLength(self)
def get_VerboseLogging(self): return _chilkat.CkMime_get_VerboseLogging(self)
def put_VerboseLogging(self, *args): return _chilkat.CkMime_put_VerboseLogging(self, *args)
+ def DecryptUsingPfxData(self, *args): return _chilkat.CkMime_DecryptUsingPfxData(self, *args)
+ def DecryptUsingPfxFile(self, *args): return _chilkat.CkMime_DecryptUsingPfxFile(self, *args)
+ def AddPfxSourceData(self, *args): return _chilkat.CkMime_AddPfxSourceData(self, *args)
+ def AddPfxSourceFile(self, *args): return _chilkat.CkMime_AddPfxSourceFile(self, *args)
+ def get_Pkcs7CryptAlg(self, *args): return _chilkat.CkMime_get_Pkcs7CryptAlg(self, *args)
+ def pkcs7CryptAlg(self): return _chilkat.CkMime_pkcs7CryptAlg(self)
+ def put_Pkcs7CryptAlg(self, *args): return _chilkat.CkMime_put_Pkcs7CryptAlg(self, *args)
+ def get_Pkcs7KeyLength(self): return _chilkat.CkMime_get_Pkcs7KeyLength(self)
+ def put_Pkcs7KeyLength(self, *args): return _chilkat.CkMime_put_Pkcs7KeyLength(self, *args)
+ def get_SigningHashAlg(self, *args): return _chilkat.CkMime_get_SigningHashAlg(self, *args)
+ def signingHashAlg(self): return _chilkat.CkMime_signingHashAlg(self)
+ def put_SigningHashAlg(self, *args): return _chilkat.CkMime_put_SigningHashAlg(self, *args)
+ def GetHeaderFieldAttribute(self, *args): return _chilkat.CkMime_GetHeaderFieldAttribute(self, *args)
+ def getHeaderFieldAttribute(self, *args): return _chilkat.CkMime_getHeaderFieldAttribute(self, *args)
+ def HasSignatureSigningTime(self, *args): return _chilkat.CkMime_HasSignatureSigningTime(self, *args)
+ def GetSignatureSigningTime(self, *args): return _chilkat.CkMime_GetSignatureSigningTime(self, *args)
+ def RemoveHeaderField(self, *args): return _chilkat.CkMime_RemoveHeaderField(self, *args)
def entireHead(self): return _chilkat.CkMime_entireHead(self)
def entireBody(self): return _chilkat.CkMime_entireBody(self)
def xml(self): return _chilkat.CkMime_xml(self)
@@ -2111,6 +2165,14 @@ class CkMailMan(_object):
def put_HttpProxyPassword(self, *args): return _chilkat.CkMailMan_put_HttpProxyPassword(self, *args)
def get_HttpProxyPort(self): return _chilkat.CkMailMan_get_HttpProxyPort(self)
def put_HttpProxyPort(self, *args): return _chilkat.CkMailMan_put_HttpProxyPort(self, *args)
+ def get_AutoFix(self): return _chilkat.CkMailMan_get_AutoFix(self)
+ def put_AutoFix(self, *args): return _chilkat.CkMailMan_put_AutoFix(self, *args)
+ def get_VerboseLogging(self): return _chilkat.CkMailMan_get_VerboseLogging(self)
+ def put_VerboseLogging(self, *args): return _chilkat.CkMailMan_put_VerboseLogging(self, *args)
+ def get_Pop3Stls(self): return _chilkat.CkMailMan_get_Pop3Stls(self)
+ def put_Pop3Stls(self, *args): return _chilkat.CkMailMan_put_Pop3Stls(self, *args)
+ def AddPfxSourceData(self, *args): return _chilkat.CkMailMan_AddPfxSourceData(self, *args)
+ def AddPfxSourceFile(self, *args): return _chilkat.CkMailMan_AddPfxSourceFile(self, *args)
def lastErrorText(self): return _chilkat.CkMailMan_lastErrorText(self)
def lastErrorXml(self): return _chilkat.CkMailMan_lastErrorXml(self)
def lastErrorHtml(self): return _chilkat.CkMailMan_lastErrorHtml(self)
@@ -2183,8 +2245,6 @@ class CkMailMan(_object):
def put_ReadTimeout(self, *args): return _chilkat.CkMailMan_put_ReadTimeout(self, *args)
def get_ConnectTimeout(self): return _chilkat.CkMailMan_get_ConnectTimeout(self)
def put_ConnectTimeout(self, *args): return _chilkat.CkMailMan_put_ConnectTimeout(self, *args)
- def get_AutoUnwrapSecurity(self): return _chilkat.CkMailMan_get_AutoUnwrapSecurity(self)
- def put_AutoUnwrapSecurity(self, *args): return _chilkat.CkMailMan_put_AutoUnwrapSecurity(self, *args)
def get_ResetDateOnLoad(self): return _chilkat.CkMailMan_get_ResetDateOnLoad(self)
def put_ResetDateOnLoad(self, *args): return _chilkat.CkMailMan_put_ResetDateOnLoad(self, *args)
def get_OpaqueSigning(self): return _chilkat.CkMailMan_get_OpaqueSigning(self)
@@ -2197,8 +2257,6 @@ class CkMailMan(_object):
def put_StartTLS(self, *args): return _chilkat.CkMailMan_put_StartTLS(self, *args)
def get_EmbedCertChain(self): return _chilkat.CkMailMan_get_EmbedCertChain(self)
def put_EmbedCertChain(self, *args): return _chilkat.CkMailMan_put_EmbedCertChain(self, *args)
- def get_AutoSaveCerts(self): return _chilkat.CkMailMan_get_AutoSaveCerts(self)
- def put_AutoSaveCerts(self, *args): return _chilkat.CkMailMan_put_AutoSaveCerts(self, *args)
def get_PopSsl(self): return _chilkat.CkMailMan_get_PopSsl(self)
def put_PopSsl(self, *args): return _chilkat.CkMailMan_put_PopSsl(self, *args)
def get_SmtpSsl(self): return _chilkat.CkMailMan_get_SmtpSsl(self)
@@ -2320,6 +2378,8 @@ class CkGzip(_object):
def xfdlToXml(self, *args): return _chilkat.CkGzip_xfdlToXml(self, *args)
def Encode(self, *args): return _chilkat.CkGzip_Encode(self, *args)
def encode(self, *args): return _chilkat.CkGzip_encode(self, *args)
+ def get_VerboseLogging(self): return _chilkat.CkGzip_get_VerboseLogging(self)
+ def put_VerboseLogging(self, *args): return _chilkat.CkGzip_put_VerboseLogging(self, *args)
def lastErrorText(self): return _chilkat.CkGzip_lastErrorText(self)
def lastErrorXml(self): return _chilkat.CkGzip_lastErrorXml(self)
def lastErrorHtml(self): return _chilkat.CkGzip_lastErrorHtml(self)
@@ -2471,6 +2531,11 @@ class CkCrypt2(_object):
def put_UuFilename(self, *args): return _chilkat.CkCrypt2_put_UuFilename(self, *args)
def get_VerboseLogging(self): return _chilkat.CkCrypt2_get_VerboseLogging(self)
def put_VerboseLogging(self, *args): return _chilkat.CkCrypt2_put_VerboseLogging(self, *args)
+ def AddPfxSourceData(self, *args): return _chilkat.CkCrypt2_AddPfxSourceData(self, *args)
+ def AddPfxSourceFile(self, *args): return _chilkat.CkCrypt2_AddPfxSourceFile(self, *args)
+ def get_Pkcs7CryptAlg(self, *args): return _chilkat.CkCrypt2_get_Pkcs7CryptAlg(self, *args)
+ def pkcs7CryptAlg(self): return _chilkat.CkCrypt2_pkcs7CryptAlg(self)
+ def put_Pkcs7CryptAlg(self, *args): return _chilkat.CkCrypt2_put_Pkcs7CryptAlg(self, *args)
def get_FirstChunk(self): return _chilkat.CkCrypt2_get_FirstChunk(self)
def put_FirstChunk(self, *args): return _chilkat.CkCrypt2_put_FirstChunk(self, *args)
def get_LastChunk(self): return _chilkat.CkCrypt2_get_LastChunk(self)
@@ -2847,6 +2912,16 @@ class CkFtp2(_object):
def get_SslProtocol(self, *args): return _chilkat.CkFtp2_get_SslProtocol(self, *args)
def sslProtocol(self): return _chilkat.CkFtp2_sslProtocol(self)
def put_SslProtocol(self, *args): return _chilkat.CkFtp2_put_SslProtocol(self, *args)
+ def get_AutoGetSizeForProgress(self): return _chilkat.CkFtp2_get_AutoGetSizeForProgress(self)
+ def put_AutoGetSizeForProgress(self, *args): return _chilkat.CkFtp2_put_AutoGetSizeForProgress(self, *args)
+ def get_SyncPreview(self, *args): return _chilkat.CkFtp2_get_SyncPreview(self, *args)
+ def syncPreview(self): return _chilkat.CkFtp2_syncPreview(self)
+ def SyncRemoteTree2(self, *args): return _chilkat.CkFtp2_SyncRemoteTree2(self, *args)
+ def get_AutoFix(self): return _chilkat.CkFtp2_get_AutoFix(self)
+ def put_AutoFix(self, *args): return _chilkat.CkFtp2_put_AutoFix(self, *args)
+ def get_ClientIpAddress(self, *args): return _chilkat.CkFtp2_get_ClientIpAddress(self, *args)
+ def clientIpAddress(self): return _chilkat.CkFtp2_clientIpAddress(self)
+ def put_ClientIpAddress(self, *args): return _chilkat.CkFtp2_put_ClientIpAddress(self, *args)
CkFtp2_swigregister = _chilkat.CkFtp2_swigregister
CkFtp2_swigregister(CkFtp2)
@@ -3060,6 +3135,40 @@ class CkHttp(_object):
def PostUrlEncoded(self, *args): return _chilkat.CkHttp_PostUrlEncoded(self, *args)
def PostBinary(self, *args): return _chilkat.CkHttp_PostBinary(self, *args)
def postBinary(self, *args): return _chilkat.CkHttp_postBinary(self, *args)
+ def QuickGetObj(self, *args): return _chilkat.CkHttp_QuickGetObj(self, *args)
+ def get_SessionLogFilename(self, *args): return _chilkat.CkHttp_get_SessionLogFilename(self, *args)
+ def sessionLogFilename(self): return _chilkat.CkHttp_sessionLogFilename(self)
+ def put_SessionLogFilename(self, *args): return _chilkat.CkHttp_put_SessionLogFilename(self, *args)
+ def get_BgLastErrorText(self, *args): return _chilkat.CkHttp_get_BgLastErrorText(self, *args)
+ def bgLastErrorText(self): return _chilkat.CkHttp_bgLastErrorText(self)
+ def get_BgResultData(self, *args): return _chilkat.CkHttp_get_BgResultData(self, *args)
+ def get_BgResultInt(self): return _chilkat.CkHttp_get_BgResultInt(self)
+ def get_BgResultString(self, *args): return _chilkat.CkHttp_get_BgResultString(self, *args)
+ def bgResultString(self): return _chilkat.CkHttp_bgResultString(self)
+ def get_BgTaskFinished(self): return _chilkat.CkHttp_get_BgTaskFinished(self)
+ def get_BgTaskRunning(self): return _chilkat.CkHttp_get_BgTaskRunning(self)
+ def get_BgTaskSuccess(self): return _chilkat.CkHttp_get_BgTaskSuccess(self)
+ def get_EventLogCount(self): return _chilkat.CkHttp_get_EventLogCount(self)
+ def get_KeepEventLog(self): return _chilkat.CkHttp_get_KeepEventLog(self)
+ def put_KeepEventLog(self, *args): return _chilkat.CkHttp_put_KeepEventLog(self, *args)
+ def get_UseBgThread(self): return _chilkat.CkHttp_get_UseBgThread(self)
+ def put_UseBgThread(self, *args): return _chilkat.CkHttp_put_UseBgThread(self, *args)
+ def BgResponseObject(self): return _chilkat.CkHttp_BgResponseObject(self)
+ def BgTaskAbort(self): return _chilkat.CkHttp_BgTaskAbort(self)
+ def ClearEventLog(self): return _chilkat.CkHttp_ClearEventLog(self)
+ def EventLogName(self, *args): return _chilkat.CkHttp_EventLogName(self, *args)
+ def eventLogName(self, *args): return _chilkat.CkHttp_eventLogName(self, *args)
+ def EventLogValue(self, *args): return _chilkat.CkHttp_EventLogValue(self, *args)
+ def eventLogValue(self, *args): return _chilkat.CkHttp_eventLogValue(self, *args)
+ def SleepMs(self, *args): return _chilkat.CkHttp_SleepMs(self, *args)
+ def get_ClientIpAddress(self, *args): return _chilkat.CkHttp_get_ClientIpAddress(self, *args)
+ def clientIpAddress(self): return _chilkat.CkHttp_clientIpAddress(self)
+ def put_ClientIpAddress(self, *args): return _chilkat.CkHttp_put_ClientIpAddress(self, *args)
+ def get_ProxyAuthMethod(self, *args): return _chilkat.CkHttp_get_ProxyAuthMethod(self, *args)
+ def proxyAuthMethod(self): return _chilkat.CkHttp_proxyAuthMethod(self)
+ def put_ProxyAuthMethod(self, *args): return _chilkat.CkHttp_put_ProxyAuthMethod(self, *args)
+ def AddQuickHeader(self, *args): return _chilkat.CkHttp_AddQuickHeader(self, *args)
+ def RemoveQuickHeader(self, *args): return _chilkat.CkHttp_RemoveQuickHeader(self, *args)
def SetSslClientCert(self, *args): return _chilkat.CkHttp_SetSslClientCert(self, *args)
def get_LastHeader(self, *args): return _chilkat.CkHttp_get_LastHeader(self, *args)
def lastHeader(self): return _chilkat.CkHttp_lastHeader(self)
@@ -3210,6 +3319,10 @@ class CkHttpRequest(_object):
def UsePostMultipartForm(self): return _chilkat.CkHttpRequest_UsePostMultipartForm(self)
def GetUrlEncodedParams(self, *args): return _chilkat.CkHttpRequest_GetUrlEncodedParams(self, *args)
def getUrlEncodedParams(self): return _chilkat.CkHttpRequest_getUrlEncodedParams(self)
+ def AddStringForUpload(self, *args): return _chilkat.CkHttpRequest_AddStringForUpload(self, *args)
+ def AddFileForUpload2(self, *args): return _chilkat.CkHttpRequest_AddFileForUpload2(self, *args)
+ def AddStringForUpload2(self, *args): return _chilkat.CkHttpRequest_AddStringForUpload2(self, *args)
+ def AddBytesForUpload2(self, *args): return _chilkat.CkHttpRequest_AddBytesForUpload2(self, *args)
def path(self): return _chilkat.CkHttpRequest_path(self)
def charset(self): return _chilkat.CkHttpRequest_charset(self)
def httpVersion(self): return _chilkat.CkHttpRequest_httpVersion(self)
@@ -3290,6 +3403,7 @@ class CkHttpResponse(_object):
def get_Header(self, *args): return _chilkat.CkHttpResponse_get_Header(self, *args)
def get_Body(self, *args): return _chilkat.CkHttpResponse_get_Body(self, *args)
def get_BodyStr(self, *args): return _chilkat.CkHttpResponse_get_BodyStr(self, *args)
+ def get_BodyQP(self, *args): return _chilkat.CkHttpResponse_get_BodyQP(self, *args)
def get_StatusLine(self, *args): return _chilkat.CkHttpResponse_get_StatusLine(self, *args)
def get_StatusCode(self): return _chilkat.CkHttpResponse_get_StatusCode(self)
def get_Charset(self, *args): return _chilkat.CkHttpResponse_get_Charset(self, *args)
@@ -3386,6 +3500,11 @@ class CkImap(_object):
def put_HttpProxyHostname(self, *args): return _chilkat.CkImap_put_HttpProxyHostname(self, *args)
def get_HttpProxyPort(self): return _chilkat.CkImap_get_HttpProxyPort(self)
def put_HttpProxyPort(self, *args): return _chilkat.CkImap_put_HttpProxyPort(self, *args)
+ def get_UidNext(self): return _chilkat.CkImap_get_UidNext(self)
+ def get_AutoFix(self): return _chilkat.CkImap_get_AutoFix(self)
+ def put_AutoFix(self, *args): return _chilkat.CkImap_put_AutoFix(self, *args)
+ def AddPfxSourceData(self, *args): return _chilkat.CkImap_AddPfxSourceData(self, *args)
+ def AddPfxSourceFile(self, *args): return _chilkat.CkImap_AddPfxSourceFile(self, *args)
def Connect(self, *args): return _chilkat.CkImap_Connect(self, *args)
def Disconnect(self): return _chilkat.CkImap_Disconnect(self)
def IsConnected(self): return _chilkat.CkImap_IsConnected(self)
@@ -3447,8 +3566,6 @@ class CkImap(_object):
def GetMailNumAttach(self, *args): return _chilkat.CkImap_GetMailNumAttach(self, *args)
def GetMailAttachSize(self, *args): return _chilkat.CkImap_GetMailAttachSize(self, *args)
def GetMailAttachFilename(self, *args): return _chilkat.CkImap_GetMailAttachFilename(self, *args)
- def get_AutoUnwrapSecurity(self): return _chilkat.CkImap_get_AutoUnwrapSecurity(self)
- def put_AutoUnwrapSecurity(self, *args): return _chilkat.CkImap_put_AutoUnwrapSecurity(self, *args)
def get_PeekMode(self): return _chilkat.CkImap_get_PeekMode(self)
def put_PeekMode(self, *args): return _chilkat.CkImap_put_PeekMode(self, *args)
def get_SessionLog(self, *args): return _chilkat.CkImap_get_SessionLog(self, *args)
@@ -4557,6 +4674,12 @@ class CkSFtp(_object):
def get_HttpProxyUsername(self, *args): return _chilkat.CkSFtp_get_HttpProxyUsername(self, *args)
def httpProxyUsername(self): return _chilkat.CkSFtp_httpProxyUsername(self)
def put_HttpProxyUsername(self, *args): return _chilkat.CkSFtp_put_HttpProxyUsername(self, *args)
+ def get_TcpNoDelay(self): return _chilkat.CkSFtp_get_TcpNoDelay(self)
+ def put_TcpNoDelay(self, *args): return _chilkat.CkSFtp_put_TcpNoDelay(self, *args)
+ def get_AccumulateBuffer(self, *args): return _chilkat.CkSFtp_get_AccumulateBuffer(self, *args)
+ def ClearAccumulateBuffer(self): return _chilkat.CkSFtp_ClearAccumulateBuffer(self)
+ def AccumulateBytes(self, *args): return _chilkat.CkSFtp_AccumulateBytes(self, *args)
+ def AuthenticatePwPk(self, *args): return _chilkat.CkSFtp_AuthenticatePwPk(self, *args)
CkSFtp_swigregister = _chilkat.CkSFtp_swigregister
CkSFtp_swigregister(CkSFtp)
@@ -4683,6 +4806,8 @@ class CkSsh(_object):
def httpProxyUsername(self): return _chilkat.CkSsh_httpProxyUsername(self)
def put_HttpProxyUsername(self, *args): return _chilkat.CkSsh_put_HttpProxyUsername(self, *args)
def ChannelReceiveUntilMatchN(self, *args): return _chilkat.CkSsh_ChannelReceiveUntilMatchN(self, *args)
+ def ChannelReadAndPoll2(self, *args): return _chilkat.CkSsh_ChannelReadAndPoll2(self, *args)
+ def AuthenticatePwPk(self, *args): return _chilkat.CkSsh_AuthenticatePwPk(self, *args)
def SaveLastError(self, *args): return _chilkat.CkSsh_SaveLastError(self, *args)
def LastErrorXml(self, *args): return _chilkat.CkSsh_LastErrorXml(self, *args)
def LastErrorHtml(self, *args): return _chilkat.CkSsh_LastErrorHtml(self, *args)
@@ -5271,6 +5396,7 @@ class CkSshTunnel(_object):
def put_SocksVersion(self, *args): return _chilkat.CkSshTunnel_put_SocksVersion(self, *args)
def get_ConnectTimeoutMs(self): return _chilkat.CkSshTunnel_get_ConnectTimeoutMs(self)
def put_ConnectTimeoutMs(self, *args): return _chilkat.CkSshTunnel_put_ConnectTimeoutMs(self, *args)
+ def get_ListenPort(self): return _chilkat.CkSshTunnel_get_ListenPort(self)
CkSshTunnel_swigregister = _chilkat.CkSshTunnel_swigregister
CkSshTunnel_swigregister(CkSshTunnel)
@@ -5352,6 +5478,7 @@ class CkNtlm(_object):
def get_ServerChallenge(self, *args): return _chilkat.CkNtlm_get_ServerChallenge(self, *args)
def serverChallenge(self): return _chilkat.CkNtlm_serverChallenge(self)
def put_ServerChallenge(self, *args): return _chilkat.CkNtlm_put_ServerChallenge(self, *args)
+ def LoadType3(self, *args): return _chilkat.CkNtlm_LoadType3(self, *args)
CkNtlm_swigregister = _chilkat.CkNtlm_swigregister
CkNtlm_swigregister(CkNtlm)
@@ -5415,6 +5542,8 @@ class CkDkim(_object):
def NumDomainKeySignatures(self, *args): return _chilkat.CkDkim_NumDomainKeySignatures(self, *args)
def AddDkimSignature(self, *args): return _chilkat.CkDkim_AddDkimSignature(self, *args)
def AddDomainKeySignature(self, *args): return _chilkat.CkDkim_AddDomainKeySignature(self, *args)
+ def LoadDkimPkBytes(self, *args): return _chilkat.CkDkim_LoadDkimPkBytes(self, *args)
+ def LoadDomainKeyPkBytes(self, *args): return _chilkat.CkDkim_LoadDomainKeyPkBytes(self, *args)
def SaveLastError(self, *args): return _chilkat.CkDkim_SaveLastError(self, *args)
def LastErrorXml(self, *args): return _chilkat.CkDkim_LastErrorXml(self, *args)
def LastErrorHtml(self, *args): return _chilkat.CkDkim_LastErrorHtml(self, *args)
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/__init__.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/__init__.py
index 535fe1cb58e..3b3d8973497 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/__init__.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/__init__.py
@@ -1,4 +1,8 @@
# This package defines dialog boxes used by the main
+
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
import os, sys, stat
#import dialog_map
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py
index 1583ec7a458..455f447af06 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dialog_map.py
@@ -1,1412 +1,1427 @@
- #!/usr/bin/python
- #-*- encoding: utf-8 -*-
-
-from processors import *
-from opt_processors import *
-import sys
-import os
-import addin
-from dialogs import ShowDialog, MakePropertyPage
-import win32ui
-import commctrl
-import win32con
-import win32gui
-import win32gui_struct
-import xmlrpclib
-from manager import ustr
-import chilkat
-
-try:
- enumerate
-except NameError: # enumerate new in 2.3
- def enumerate(seq):
- return [(i, seq[i]) for i in xrange(len(seq))]
-
-BIF_NEWDIALOGSTYLE = 0x00000040
-BIF_NONEWFOLDERBUTTON = 0x0000200
-CSIDL_COMMONMYPICTURES = 0x00000036
-
-class _WIN32MASKEDSTRUCT:
- def __init__(self, **kw):
- full_fmt = ""
- for name, fmt, default, mask in self._struct_items_:
- self.__dict__[name] = None
- if fmt == "z":
- full_fmt += "pi"
- else:
- full_fmt += fmt
- for name, val in kw.iteritems():
- if name not in self.__dict__:
- raise ValueError("LVITEM structures do not have an item '%s'" % (name,))
- self.__dict__[name] = val
-
- def __setattr__(self, attr, val):
- if not attr.startswith("_") and attr not in self.__dict__:
- raise AttributeError(attr)
- self.__dict__[attr] = val
-
- def toparam(self):
- self._buffs = []
- full_fmt = ""
- vals = []
- mask = 0
- # calc the mask
- for name, fmt, default, this_mask in self._struct_items_:
- if this_mask is not None and self.__dict__.get(name) is not None:
- mask |= this_mask
- self.mask = mask
- for name, fmt, default, this_mask in self._struct_items_:
- val = self.__dict__[name]
- if fmt == "z":
- fmt = "Pi"
- if val is None:
- vals.append(0)
- vals.append(0)
- else:
- # Note this demo still works with byte strings. An
- # alternate strategy would be to use unicode natively
- # and use the 'W' version of the messages - eg,
- # LVM_SETITEMW etc.
- val = val + "\0"
- if isinstance(val, unicode):
- val = val.encode("mbcs")
- str_buf = array.array("b", val)
- vals.append(str_buf.buffer_info()[0])
- vals.append(len(val))
- self._buffs.append(str_buf) # keep alive during the call.
- else:
- if val is None:
- val = default
- vals.append(val)
- full_fmt += fmt
- return struct.pack(*(full_fmt,) + tuple(vals))
-
-
-# NOTE: See the win32gui_struct module for an alternative way of dealing
-# with these structures
-class LVITEM(_WIN32MASKEDSTRUCT):
- _struct_items_ = [
- ("mask", "I", 0, None),
- ("iItem", "i", 0, None),
- ("iSubItem", "i", 0, None),
- ("state", "I", 0, commctrl.LVIF_STATE),
- ("stateMask", "I", 0, None),
- ("text", "z", None, commctrl.LVIF_TEXT),
- ("iImage", "i", 0, commctrl.LVIF_IMAGE),
- ("lParam", "i", 0, commctrl.LVIF_PARAM),
- ("iIdent", "i", 0, None),
- ("cchTextMax", "i", 0, 255),
- ("pszText", "i", 0, None),
- ("flags", "i", 0, None),
- ]
-
-class LVCOLUMN(_WIN32MASKEDSTRUCT):
- _struct_items_ = [
- ("mask", "I", 0, None),
- ("fmt", "i", 0, commctrl.LVCF_FMT),
- ("cx", "i", 0, commctrl.LVCF_WIDTH),
- ("text", "z", None, commctrl.LVCF_TEXT),
- ("iSubItem", "i", 0, commctrl.LVCF_SUBITEM),
- ("iImage", "i", 0, commctrl.LVCF_IMAGE),
- ("iOrder", "i", 0, commctrl.LVCF_ORDER),
- ]
-
-global flag_stop
-flag_stop=win32con.MB_ICONSTOP
-
-global flag_error
-flag_error=win32con.MB_ICONERROR
-
-global flag_info
-flag_info=win32con.MB_ICONINFORMATION
-
-global flag_excl
-flag_excl=win32con.MB_ICONEXCLAMATION
-
-#global NewConn
-NewConn=addin.GetConn()
-## Retrieves current registered XMLRPC connection
-def GetConn():
- return NewConn
-
-global objects_with_match
-objects_with_match=[]
-
-global hwndChk_list
-hwndChk_list=[]
-
-global search_text
-search_text='search_text'
-
-global name
-name=''
-global email
-email=''
-
-def check():
- server = NewConn.getitem('_server')
- port = NewConn.getitem('_port')
- NewConn.GetDBList()
- if str(NewConn.getitem('_running')) == 'False':
- win32ui.MessageBox("No server running on host "+ server+" at port "+str(port), "Server Connection", flag_excl)
- return False
- if str(NewConn.getitem('_login')) == 'False':
- win32ui.MessageBox("Please login to the database first", "Database Connection", flag_excl)
- return False
- return True
-def resetConnAttribs(window):
- config = window.manager.LoadConfig()
- NewConn.setitem('_server', config['server'])
- NewConn.setitem('_port', config['port'])
- NewConn.setitem('protocol', config['protocol'])
- NewConn.setitem('_uri', "http://" + config['server'] + ":" + str(config['port']))
- NewConn.setitem('_obj_list', config['objects'])
- NewConn.setitem('_dbname', config['database'])
- NewConn.setitem('_uname', config['uname'])
- NewConn.setitem('_pwd', config['pwd'])
- NewConn.setitem('_login', str(config['login']))
- return
-
-def setConnAttribs(server, port, manager):
- protocol = NewConn.getitem('protocol')
- if protocol=='XML-RPCS':
- protocol='https://'
- else:
- protocol='http://'
- uri = protocol + server + ":" + str(port)
- NewConn.setitem('_server',server)
- NewConn.setitem('_port',port)
- NewConn.setitem('_uri',uri)
- NewConn.GetDBList()
- manager.config = manager.LoadConfig()
- NewConn.setitem('_dbname',manager.config['database'])
- NewConn.setitem('_uname', manager.config['uname'])
- NewConn.setitem('_pwd', manager.config['pwd'])
- NewConn.setitem('_login', str(manager.config['login']))
- NewConn.setitem('_obj_list', manager.config['objects'])
- return
-
-def getConnAttributes(manager):
- manager.config['server'] = NewConn.getitem('_server')
- manager.config['port'] = NewConn.getitem('_port')
- manager.config['protocol'] = NewConn.getitem('protocol')
- manager.config['objects'] = eval(NewConn.getitem('_obj_list'))
- manager.config['database'] = NewConn.getitem('_dbname')
- manager.config['uname'] = NewConn.getitem('_uname')
- manager.config['pwd'] = NewConn.getitem('_pwd')
- manager.config['login'] = NewConn.getitem('_login')
- return
-
-def getMessage(e):
- import pywintypes
- print "Exception %s: %s"%(type(e),str(e))
- msg = str(e)
- if type(e) == pywintypes.com_error:
- msg=str(e)
- elif type(e) == xmlrpclib.Fault:
- msg = str(e.faultCode) or e.faultString or e.message or str(e)
- else:
- if hasattr(e, 'faultCode') and e.faultCode:
- msg = str(e.faultCode)
- elif hasattr(e, 'faultString') and e.faultString:
- msg = e.faultString
- elif hasattr(e, 'message') and e.message:
- msg = e.message
- return msg
-
-class OKButtonProcessor(ButtonProcessor):
- def __init__(self, window, control_ids):
- self.mngr = window.manager
- ControlProcessor.__init__(self, window, control_ids)
-
- def OnClicked(self, id):
- server = win32gui.GetDlgItemText(self.window.hwnd, self.other_ids[0])
- try:
- port = int(win32gui.GetDlgItemText(self.window.hwnd, self.other_ids[1]))
- except ValueError, e:
- print "Exception : %s"%str(e)
- win32ui.MessageBox("Port should be an integer", "Error", flag_excl)
- return
- except Exception,e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Error", flag_excl)
- return
- setConnAttribs(server, port, self.mngr)
- if str(NewConn.getitem('_running')) == 'False':
- msg = "No server running on host '%s' at port '%d'. Press ignore to still continue with this configuration?"%(server,port)
- r=win32ui.MessageBox(msg, "Server Connection", win32con.MB_ABORTRETRYIGNORE | win32con.MB_ICONQUESTION)
- if r==3:
- resetConnAttribs(self.window)
- return
- elif r==4:
- self.OnClicked(id)
- elif r==5:
- setConnAttribs(server, port, self.mngr)
- win32gui.EndDialog(self.window.hwnd, id)
-
-class DoneButtonProcessor(ButtonProcessor):
- def OnClicked(self, id):
- getConnAttributes(self.window.manager)
- self.window.manager.SaveConfig()
- win32gui.EndDialog(self.window.hwnd, id)
-
-class MessageProcessor(ControlProcessor):
- def Init(self):
- text = "This Outlook Plugin for OpenERP s.a. has been developed by TinyERP \n\n \
- For more information, please visit our website \n \
- http://www.openerp.com \n\n \
- Contact Us :\n \
- sales@openerp.com \n\n \
- 2001-TODAY OpenERP s.a.. All rights reserved. \n"
- win32gui.SendMessage(self.GetControl(), win32con.WM_SETTEXT, 0, text)
-
- def GetPopupHelpText(self, cid):
- return "Displays details on this plugin"
-
-class TabProcessor(ControlProcessor):
- def __init__(self, window, control_ids, page_ids):
- ControlProcessor.__init__(self, window, control_ids)
- self.page_ids = page_ids.split()
-
- def Init(self):
- self.pages = {}
- self.currentPage = None
- self.currentPageIndex = -1
- self.currentPageHwnd = None
- for index, page_id in enumerate(self.page_ids):
- template = self.window.manager.dialog_parser.dialogs[page_id]
- self.addPage(index, page_id, template[0][0])
- server = self.window.manager.config['server']
- port = self.window.manager.config['port']
- setConnAttribs(server, port, self.window.manager)
- self.switchToPage(0)
-
- def Done(self):
- if self.currentPageHwnd is not None:
- if not self.currentPage.SaveAllControls():
- win32gui.SendMessage(self.GetControl(), commctrl.TCM_SETCURSEL, self.currentPageIndex,0)
- return False
- return True
-
- def OnNotify(self, nmhdr, wparam, lparam):
- selChangedCode = 5177342
- code = nmhdr[2]
- if code==selChangedCode:
- index = win32gui.SendMessage(self.GetControl(), commctrl.TCM_GETCURSEL, 0,0)
- if index!=self.currentPageIndex:
- self.switchToPage(index)
-
- def switchToPage(self, index):
- if self.currentPageHwnd is not None:
- if not self.currentPage.SaveAllControls():
- win32gui.SendMessage(self.GetControl(), commctrl.TCM_SETCURSEL, self.currentPageIndex,0)
- return 1
- win32gui.DestroyWindow(self.currentPageHwnd)
- self.currentPage = MakePropertyPage(self.GetControl(), self.window.manager, self.window.config, self.pages[index])
- self.currentPageHwnd = self.currentPage.CreateWindow()
- self.currentPageIndex = index
- return 0
-#
- def addPage(self, item, idName, label):
- format = "iiiiiii"
- lbuf = win32gui.PyMakeBuffer(len(label)+1)
- address,l = win32gui.PyGetBufferAddressAndLen(lbuf)
- win32gui.PySetString(address, label)
-
- buf = struct.pack(format,
- commctrl.TCIF_TEXT, # mask
- 0, # state
- 0, # state mask
- address,
- 0, #unused
- 0, #image
- item
- )
- item = win32gui.SendMessage(self.GetControl(),
- commctrl.TCM_INSERTITEM,
- item,
- buf)
- self.pages[item] = idName
-
-class DialogCommand(ButtonProcessor):
- def __init__(self, window, control_ids, idd, func=None, args=()):
- self.idd = idd
- self.func = func
- self.args = args
- ButtonProcessor.__init__(self, window, control_ids)
-
- def OnClicked(self, id):
- self.id = id
- if self.func:
- args = (self, ) + self.args
- self.func(*args)
- parent = self.window.hwnd
- self.window.SaveAllControls()
- ShowDialog(parent, self.window.manager, self.window.config, self.idd)
- self.window.LoadAllControls()
-
- def GetPopupHelpText(self, id):
- dd = self.window.manager.dialog_parser.dialogs[self.idd]
- return "Displays the %s dialog" % dd.caption
-
-def ReloadAllControls(btnProcessor,*args):
- server = NewConn.getitem('_server')
- port = NewConn.getitem('_port')
- btnProcessor.window.LoadAllControls()
- if str(NewConn.getitem('_running')) == 'False':
- win32ui.MessageBox("No server running on host "+ server+" at port "+str(port), "Server Connection", flag_excl)
- return
-
-def TestConnection(btnProcessor,*args):
- server = NewConn.getitem('_server')
- port = NewConn.getitem('_port')
- url = NewConn.getitem('_uri')
- NewConn.GetDBList()
- if str(NewConn.getitem('_running')) == 'False':
- btnProcessor.window.LoadAllControls()
- win32ui.MessageBox("No server running on host "+ server+" at port "+str(port), "OpenERP Connection", flag_excl)
- return
- try:
- dbname = win32gui.GetDlgItemText(btnProcessor.window.hwnd, 7000)
- if not dbname:
- win32ui.MessageBox("Authentication Error !\nBad Database Name !", "OpenERP Connection", flag_excl)
- return
- except Exception,e:
- print "Exception %s: %s"%(type(e),str(e))
- dbname = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- if not dbname:
- win32ui.MessageBox("No database found on host "+ server+" at port "+str(port), "OpenERP Connection", flag_excl)
- return
-
- uname = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- pwd = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
-
- if not uname:
- win32ui.MessageBox("Authentication Error !\nBad User Name !", "OpenERP Connection", flag_excl)
- return
- if not pwd:
- win32ui.MessageBox("Authentication Error !\nBad Password !", "OpenERP Connection", flag_excl)
- return
-
- #Establish Connection
- try:
- uid = NewConn.login(dbname, uname, pwd)
- if uid:
- msg = "Connection Successful"
- NewConn.setitem('_login', 'True')
- NewConn.setitem('_uname', uname)
- NewConn.setitem('_pwd', pwd)
- NewConn.setitem('_uid', uid)
- flag = flag_info
- if not NewConn.IsCRMInstalled():
- msg+= '\n\n'+" 'CRM' module is not installed. So CRM cases cannot be created."
- NewConn.setitem('_iscrm', 'False')
- else:
- NewConn.setitem('_iscrm', 'True')
- else:
- msg = "Authentication Error !\nBad UserName or Password"
- flag = flag_stop
- NewConn.setitem('_login', 'False')
- except Exception,e:
- msg = "Authentication Error !\n\n" + getMessage(e)
- flag = flag_error
- win32ui.MessageBox(msg, "OpenERP Connection", flag)
- return
-
-def BrowseCallbackProc(hwnd, msg, lp, data):
- from win32com.shell import shell, shellcon
- if msg== shellcon.BFFM_INITIALIZED:
- win32gui.SendMessage(hwnd, shellcon.BFFM_SETSELECTION, 1, data)
- win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 0)
- elif msg == shellcon.BFFM_SELCHANGED:
- # Set the status text of the
- # For this message, 'lp' is the address of the PIDL.
- pidl = shell.AddressAsPIDL(lp)
- try:
- path = shell.SHGetPathFromIDList(pidl)
- if os.path.isdir(path):
- win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 0)
- else:
- ext = path.split('.')[-1]
- if ext not in ['gif', 'bmp', 'jpg', 'tif', 'ico', 'png']:
- win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 0)
-
- else:
- win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 1)
- except shell.error:
- # No path for this PIDL
- pass
-
-def GetImagePath(btnProcessor,*args):
- from win32com.shell import shell, shellcon
- ulFlags = shellcon.BIF_BROWSEINCLUDEFILES | BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON
- pidl, display_name, image_list=shell.SHBrowseForFolder(btnProcessor.window.hwnd, # parent HWND
- None, # root PIDL.
- "Get the image path", # title
- ulFlags, # flags
- BrowseCallbackProc, # callback function
- os.getcwd() # 'data' param for the callback
- )
- if (pidl, display_name, image_list) == (None, None, None):
- return
- else:
- path = shell.SHGetPathFromIDList (pidl)
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], path)
-
-def AddNewObject(btnProcessor,*args):
- #Check if server running or user logged in
- b = check()
- if not b:
- return
-
- #Check if title or object not specified
- obj_title = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- obj_name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- if not obj_title:
- win32ui.MessageBox("No Title specified", "Documents Setting", flag_excl)
- return
- if not obj_name:
- win32ui.MessageBox("No Document specified", "Documents Setting", flag_excl)
- return
-
- #Check if object does not exist in the database or it already exist in the list
- try:
- all_obj_list = NewConn.GetAllObjects()
- curr_obj_list = [obj[1] for obj in NewConn.GetObjList()]
- curr_title_list = [obj[0] for obj in NewConn.GetObjList()]
- if obj_name not in all_obj_list:
- win32ui.MessageBox("No such Document exists", "Documents Setting", flag_excl)
- return
- elif obj_name in curr_obj_list:
- win32ui.MessageBox("Document already in the list", "Documents Setting", flag_info)
- return
- elif obj_title in curr_title_list:
- win32ui.MessageBox("Title already in the list. Please give different title", "Documents Setting", flag_excl)
- return
-
- #extract image path and load the image
- image_path=''
- image_path = os.path.join(btnProcessor.window.manager.application_directory, "dialogs\\resources\\openerp_logo1.bmp")
- path=win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
- if path:
- image_path = path
- load_bmp_flags=win32con.LR_LOADFROMFILE | win32con.LR_LOADTRANSPARENT
- try:
- hicon = win32gui.LoadImage(0, image_path,win32con.IMAGE_BITMAP, 40, 40, load_bmp_flags)
- except Exception,e:
- msg=getMessage(e)
- hicon=None
- win32ui.MessageBox(msg, "Load Image", flag_error)
-
- #Add the object in the list
- win32gui.ImageList_Add(il,hicon,0)
- cnt = win32gui.ImageList_GetImageCount(il)
-
- hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[3])
- num_items = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMCOUNT)
-
- item = LVITEM(text=obj_title, iImage=cnt-2, iItem = num_items)
- new_index = win32gui.SendMessage(hwndList, commctrl.LVM_INSERTITEM, 0, item.toparam())
-
- win32gui.SendMessage(hwndList, commctrl.LVM_SETIMAGELIST, commctrl.LVSIL_SMALL, il)
-
- item = LVITEM(text=obj_name, iItem = new_index, iSubItem = 1)
- win32gui.SendMessage(hwndList, commctrl.LVM_SETITEM, 0, item.toparam())
-
- NewConn.InsertObj(obj_title,obj_name,image_path)
- except Exception, e:
- msg = "Document not added\n\n" + getMessage(e)
- win32ui.MessageBox(msg,"Documents Setting",flag_excl)
- return
-
- #Empty all the text controls
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], '')
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1], '')
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2], '')
-
-def DeleteSelectedObjects(btnProcessor,*args):
- #Check if server running or user logged in
- b = check()
- if not b:
- return
-
- #Delete selected items
- hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- sel_count = win32gui.SendMessage(hwndList, commctrl.LVM_GETSELECTEDCOUNT)
- for i in range(0,sel_count):
- sel = win32gui.SendMessage(hwndList, commctrl.LVM_GETNEXTITEM, -1, commctrl.LVNI_SELECTED)
- buf,extra = win32gui_struct.EmptyLVITEM(1, 0)
- r = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMTEXT, sel, buf)
- sel_text = ''
- for n in extra:
- nombre = n.tostring()
- sel_text = nombre[0:r]
- s = win32gui.SendMessage(hwndList, commctrl.LVM_DELETEITEM, sel)
- try:
- NewConn.DeleteObject(sel_text)
- except Exception,e:
- msg = "Documents '%s' not deleted\n\n"%sel_text + getMessage(e)
- win32ui.MessageBox(msg,"Documents Setting",flag_excl)
-
-def GetMail(processor):
- ex = processor.window.manager.outlook.ActiveExplorer()
- assert ex.Selection.Count == 1
- mail = ex.Selection.Item(1)
- return mail
-#get selected records from list
-def GetSelectedItems(hwndList):
- r=[]
- sel_count = win32gui.SendMessage(hwndList, commctrl.LVM_GETSELECTEDCOUNT)
- sel=-1
- for i in range(0,sel_count):
- sel = win32gui.SendMessage(hwndList, commctrl.LVM_GETNEXTITEM, sel, commctrl.LVNI_SELECTED)
- buf,extra = win32gui_struct.EmptyLVITEM(1, 0)
- size = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMTEXT, sel, buf)
- sel_text = ''
- for n in extra:
- nombre = n.tostring()
- sel_text = nombre[0:size]
- for item in objects_with_match:
- if item[2] == sel_text:
- r.append(item)
- return r
-
-def MakeAttachment(btnProcessor,*args):
- #Check if server running or user logged in
- b = check()
- if not b:
- return
- ex = btnProcessor.window.manager.outlook.ActiveExplorer()
- assert ex.Selection.Count == 1
- mail = ex.Selection.Item(1)
- mail = GetMail(btnProcessor)
-
- #get selected records
- hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- r = GetSelectedItems(hwndList)
- if not r:
- win32ui.MessageBox("No records selected", "Make Attachment", flag_info)
- return
- try:
- flg = NewConn.ArchiveToOpenERP(r,mail)
- if flg:
- win32gui.EndDialog(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- return
- except Exception,e:
- msg = "Attachment not created \n\n" + getMessage(e)
- flag = flag_error
- win32ui.MessageBox(msg, "Make Attachment", flag)
- return
-
-def CreateCase(btnProcessor,*args):
- try:
- #Check if server running or user logged in
- b = check()
- if not b:
- return
-
- if str(NewConn.getitem('_iscrm')) == 'True':
- # Get the selected mail
- ex = btnProcessor.window.manager.outlook.ActiveExplorer()
- assert ex.Selection.Count == 1
- mail = ex.Selection.Item(1)
- section = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- section = str(section)
- section=section.lower().replace(' ','.')
- if not section:
- win32ui.MessageBox("Documents can not be created.", "Documents Setting", flag_excl)
- return
-
- hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- partner_ids=[]
- r = GetSelectedItems(hwndList)
- for rec in r:
- if rec[0] == 'res.partner':
- partner_ids.append(rec[1])
-
- #Create new case
- try:
-
-# if mail.Attachments.Count > 0:
-# msg="The mail contains attachments. Do you want to create case with attachments?"
-# r=win32ui.MessageBox(msg, "Create Case", win32con.MB_YESNOCANCEL | win32con.MB_ICONQUESTION)
-# if r == 2:
-# return
-# elif r == 7:
-# with_attachments=False
-
- NewConn.CreateCase(str(section), mail, partner_ids)
- msg="New Document created."
- flag=flag_info
- except Exception,e:
- msg="New Document not created \n\n"+str(e)
- flag=flag_error
- win32ui.MessageBox(msg, "Create Document", flag)
- return
- else:
- win32ui.MessageBox("Document can not be created. CRM not installed", "Create Object", flag_info)
- except Exception, e:
- win32ui.MessageBox(str(e), 'New Document')
-
-def GetSearchText(txtProcessor,*args):
- #Check if server running or user logged in
- b = check()
- if not b:
- return
-
- search_box = txtProcessor.GetControl()
- global search_text
- if txtProcessor.init_done:
- win32gui.SendMessage(search_box, win32con.WM_SETTEXT, 0,search_text)
- return
-
- # Get the selected mail and set the default value for search_text_control to mail.SenderEmailAddress
- ex = txtProcessor.window.manager.outlook.ActiveExplorer()
- assert ex.Selection.Count == 1
- mail = ex.Selection.Item(1)
- try:
- search_text = ustr(mail.SenderEmailAddress).encode('iso-8859-1')
- except Exception,e:
- pass
- win32gui.SendMessage(search_box, win32con.WM_SETTEXT, 0, search_text)
- txtProcessor.init_done=True
-
-def SetNameColumn(listProcessor,*args):
- hwndList = listProcessor.GetControl()
- child_ex_style = win32gui.SendMessage(hwndList, commctrl.LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
- child_ex_style |= commctrl.LVS_EX_FULLROWSELECT
- win32gui.SendMessage(hwndList, commctrl.LVM_SETEXTENDEDLISTVIEWSTYLE, 0, child_ex_style)
-
- # set header row
- lvc = LVCOLUMN(
- mask = commctrl.LVCF_FMT | commctrl.LVCF_WIDTH | \
- commctrl.LVCF_TEXT | commctrl.LVCF_SUBITEM
- )
- lvc.fmt = commctrl.LVCFMT_LEFT
- lvc.iSubItem = 1
- lvc.text = "Document Type"
- lvc.cx = 100
- win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
- lvc.iSubItem = 0
- lvc.text = "Name"
- lvc.cx = 240
- win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
- listProcessor.init_done = True
-
-def setList(list_hwnd):
- # Set default list of objects
- win32gui.SendMessage(list_hwnd, commctrl.LVM_DELETEALLITEMS)
- for obj in objects_with_match:
- num_items = win32gui.SendMessage(list_hwnd, commctrl.LVM_GETITEMCOUNT)
- item = LVITEM(text=obj[2],iItem = num_items)
- new = win32gui.SendMessage(list_hwnd, commctrl.LVM_INSERTITEM, 0, item.toparam())
- item = LVITEM(text=obj[3],iItem = new, iSubItem = 1)
- win32gui.SendMessage(list_hwnd, commctrl.LVM_SETITEM, 0, item.toparam())
-
-def SearchObjectsForText(btnProcessor,*args):
- #Check if server running or user logged in
- b = check()
- if not b:
- return
-
- search_txt = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- if not search_txt:
- win32ui.MessageBox("Enter text to search for", "Archive to OpenERP", flag_info)
- return
- # Get titles from list
- obj_titles=[]
- for ch in hwndChk_list:
- id = ch[0]
- hwnd = ch[1]
- chk = win32gui.SendMessage(hwnd, win32con.BM_GETCHECK)
- if chk:
- txt = win32gui.GetDlgItemText(btnProcessor.window.hwnd,id)
- obj_titles.append(txt)
-
- # Prepare list of objects to search for the seach_keyword
- obj_list = btnProcessor.window.manager.config['objects']
- search_list = []
- try:
- all_obj_list = NewConn.GetAllObjects()
- for title in obj_titles:
- objname = [obj[1] for obj in obj_list if obj[0] == title]
- if objname:
- assert len(objname) == 1
- if objname[0] in all_obj_list:
- search_list.append(objname[0])
- else:
- win32ui.MessageBox("Module %s (%s) not installed. Please install it." \
- %(title,objname[0]), "Archive to OpenERP", flag_excl)
- return
-
- # Get the records by searching the objects in search_list for the search_keyword as objects_with_match
- global objects_with_match
- list_hwnd = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- if search_list:
- objects_with_match = NewConn.GetObjectItems(search_list, search_txt)
- if not objects_with_match:
- win32ui.MessageBox("No matching records found in checked objects", "Archive to OpenERP", flag_info)
- else:
- win32ui.MessageBox("No object selected", "Archive to OpenERP", flag_info)
- objects_with_match=[]
- # Display the objects_with_match records in list
- setList(list_hwnd)
- except Exception,e:
- msg=getMessage(e)
- win32ui.MessageBox(msg, "Search Text", flag_error)
-
-def CreateContact(btnProcessor,*args):
- b = check()
- if not b:
- return
-
- partner = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[9])
- combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[9])
- sel = win32gui.SendMessage(combo, win32con.CB_GETCURSEL)
- state_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[10])
- state_sel = win32gui.SendMessage(state_combo, win32con.CB_GETCURSEL)
- coun_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[11])
- country_sel = win32gui.SendMessage(coun_combo, win32con.CB_GETCURSEL)
- name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- email = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- office_no = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
- mobile_no = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[3])
- fax = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[4])
- street = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[5])
- street2 = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[6])
- city = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[7])
- zip = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[8])
- if not name:
- win32ui.MessageBox("Please enter name.", "Create Contact", flag_stop)
- return
-
- res = {
- 'name':ustr(name),
- 'email':ustr(email),
- 'phone':ustr(office_no),
- 'mobile':ustr(mobile_no),
- 'fax':ustr(fax),
- 'street':ustr(street),
- 'street2':ustr(street2),
- 'city':ustr(city),
- 'zip':ustr(zip)
- }
-
- fs_id = c_id = -1
- if not state_sel == -1 :
- try:
- temp = NewConn.GetAllState()
- i = -1
- for t in temp:
- i+=1
- if i == state_sel:
- fs_id = t[0]
- break;
- res ['state_id'] = fs_id
- except Exception, e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "New Partner", flag_error)
- pass
- if not country_sel == -1 :
- try:
- temp = NewConn.GetAllCountry()
- i = -1
- for t in temp:
- i+=1
- if i == country_sel:
- c_id = t[0]
- break;
- res ['country_id'] = c_id
- except Exception, e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Open Contact", flag_error)
- pass
- try:
- id = NewConn.CreateContact(sel, str(res))
- if not partner:
- msg="New contact created."
- else:
- msg="New contact created for partner '%s'."%partner
- except Exception,e:
- msg="Contact not created \n\n" + getMessage(e)
- win32ui.MessageBox(msg, "Create Contact", flag_error)
- return
- win32ui.MessageBox(msg, "Create Contact", flag_info)
- for i in range(0,9):
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[i], '')
- win32gui.SendMessage(combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(state_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(coun_combo, win32con.CB_SETCURSEL, -1 )
-
-def SetAllText(txtProcessor,*args):
- # Set values for url, uname, pwd from config file
- url = NewConn.getitem('_uri')
- tbox = txtProcessor.GetControl()
- win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(url))
- k=win32gui.GetDlgItemText(txtProcessor.window.hwnd, txtProcessor.control_id)
- uname = NewConn.getitem('_uname')
- tbox = txtProcessor.GetControl(txtProcessor.other_ids[0])
- win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(uname))
-
-def SetDefaultList(listProcessor,*args):
- import win32api
- hwndList = listProcessor.GetControl()
-
- # set full row select style
- child_ex_style = win32gui.SendMessage(hwndList, commctrl.LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
- child_ex_style |= commctrl.LVS_EX_FULLROWSELECT
- win32gui.SendMessage(hwndList, commctrl.LVM_SETEXTENDEDLISTVIEWSTYLE, 0, child_ex_style)
-
- # set header row
- lvc = LVCOLUMN(
- mask = commctrl.LVCF_FMT | commctrl.LVCF_WIDTH | \
- commctrl.LVCF_TEXT | commctrl.LVCF_SUBITEM
- )
- lvc.fmt = commctrl.LVCFMT_LEFT
- lvc.iSubItem = 1
- lvc.text = "Object Name"
- lvc.cx = 315
- win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
- lvc.iSubItem = 0
- lvc.text = "Document Title"
- lvc.cx = 315
- win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
-
- #create imagelist
- global il
- il = win32gui.ImageList_Create(
- win32api.GetSystemMetrics(win32con.SM_CXSMICON),
- win32api.GetSystemMetrics(win32con.SM_CYSMICON),
- commctrl.ILC_COLOR32 | commctrl.ILC_MASK,
- 1, # initial size
- 0) # cGrow
-
- win32gui.SendMessage(hwndList, commctrl.LVM_SETIMAGELIST,\
- commctrl.LVSIL_SMALL, il)
- # Set objects from config
- objs = eval(NewConn.getitem('_obj_list'))
- load_bmp_flags=win32con.LR_LOADFROMFILE | win32con.LR_LOADTRANSPARENT
- for obj in objs:
- image_path = os.path.join(listProcessor.window.manager.application_directory, "dialogs\\resources\\openerp_logo1.bmp")
- path=obj[2]
- if path:
- image_path = path
- try:
- hicon = win32gui.LoadImage(0, image_path,win32con.IMAGE_BITMAP, 40, 40, load_bmp_flags)
- except Exception, e:
- msg = "Problem loading the image \n\n" + getMessage(e)
- hicon = None
- win32ui.MessageBox(msg, "Load Image", flag_error)
-
- #Add the object in the list
- win32gui.ImageList_Add(il,hicon,0)
- cnt = win32gui.ImageList_GetImageCount(il)
- num_items = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMCOUNT)
- item = LVITEM(text=obj[0],iImage=cnt-2, iItem = num_items)
- new_index = win32gui.SendMessage(hwndList, commctrl.LVM_INSERTITEM, 0, item.toparam())
- item = LVITEM(text=obj[1], iItem = new_index, iSubItem = 1)
- win32gui.SendMessage(hwndList, commctrl.LVM_SETITEM, 0, item.toparam())
-
-def SetDefaultContact(txtProcessor,*args):
- # Acquiring the control of the text box
- txt_name = txtProcessor.GetControl()
- txt_email = txtProcessor.GetControl(txtProcessor.other_ids[0])
-
- global name
- global email
- if txtProcessor.init_done:
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.control_id,name)
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[0],email)
- return
- #
- try:
- mail = GetMail(txtProcessor)
- name = ustr(mail.SenderName).encode('iso-8859-1')
- email = ustr(mail.SenderEmailAddress).encode('iso-8859-1')
- except Exception,e:
- pass
-
- fs_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[1])
- c_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[2])
- win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.control_id,name)
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[0],email)
- txtProcessor.init_done = True
-
-def setCheckList(groupProcessor,*args):
- try:
- child_style = win32con.BS_AUTOCHECKBOX | win32con.WS_TABSTOP
- hinst = win32gui.dllhandle
- objs = groupProcessor.window.manager.config['objects']
- ins_objs = NewConn.GetAllObjects()
- left = 20
- top = 60
- cnt=0
- id=4001
- id1=6001
- load_bmp_flags=win32con.LR_LOADFROMFILE | win32con.LR_LOADTRANSPARENT
- if groupProcessor.init_done:
- return
- else:
- for obj in objs:
- if obj[1] in ins_objs:
- groupProcessor.init_done = True
- #Add image
- hwndImg = win32gui.CreateWindowEx(0, "STATIC","",
- win32con.SS_CENTERIMAGE | win32con.SS_REALSIZEIMAGE | win32con.SS_BITMAP | win32con.WS_CHILD | win32con.WS_VISIBLE,
- left,top+3,13,13,
- groupProcessor.window.hwnd,
- id,
- 0,
- None
- );
- image_path = os.path.join(groupProcessor.window.manager.application_directory, "dialogs\\resources\\openerp_logo1.bmp")
- if obj[2]:
- image_path = obj[2]
- try:
- hicon = win32gui.LoadImage(0, image_path, win32con.IMAGE_BITMAP, 40, 40, load_bmp_flags)
- except Exception,e:
- msg="Problem loading the image \n\n" + getMessage(e)
- hicon = None
- win32ui.MessageBox(msg, "Load Image", flag_error)
-
- win32gui.SendMessage(hwndImg, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, hicon);
- #Add Checkbox
- left+= 17
- hwndChk = win32gui.CreateWindowEx(
- 0,"BUTTON",obj[0],win32con.WS_VISIBLE | win32con.WS_CHILD | \
- win32con.BS_AUTOCHECKBOX | win32con.WS_TABSTOP | win32con.BST_CHECKED, \
- left, top, 130,20,groupProcessor.window.hwnd,id1,hinst,None
- )
- if obj[1] in ['res.partner','res.partner.address']:
- win32gui.SendMessage(hwndChk , win32con.BM_SETCHECK, 1, 0);
- hwndChk_list.append((id1,hwndChk))
-
- cnt=cnt+1
- id+=1
- id1+=1
- left+=17
- win32gui.UpdateWindow(hwndImg)
- left+=140
- if cnt > 1:
- left = 20
- top+=18
- cnt=0
- except Exception, e:
- win32ui.MessageBox(str(e), 'Document List')
-
-def CreatePartner(btnProcessor,*args):
- #Check if server running or user logged in
- b = check()
- if not b:
- return
-
- partner_name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- if not partner_name:
- win32ui.MessageBox("Please enter Partner name.", "Create Partner", flag_excl)
- return
- res = {'name':ustr(partner_name)}
- try:
- id = NewConn.CreatePartner(str(res))
- except Exception,e:
- msg="Partner not created \n\n" + getMessage(e)
- win32ui.MessageBox(msg, "Create Partner", flag_error)
- return
- if id:
- win32ui.MessageBox("New Partner '%s' created."%partner_name, "Create Partner", flag_info)
- win32gui.EndDialog(btnProcessor.window.hwnd, btnProcessor.id)
- else:
- win32ui.MessageBox("Partner '%s' already Exists."%partner_name, "Create Partner", flag_info)
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0],'')
-
-def set_search_text(dialogProcessor,*args):
- global search_text
- search_text = win32gui.GetDlgItemText(dialogProcessor.window.hwnd, dialogProcessor.other_ids[0])
- return
-
-def set_name_email(dialogProcessor,*args):
- global name
- global email
- name = win32gui.GetDlgItemText(dialogProcessor.window.hwnd, dialogProcessor.other_ids[0])
- email = win32gui.GetDlgItemText(dialogProcessor.window.hwnd, dialogProcessor.other_ids[1])
-
-def GetDefaultEmail(txtProcessor,*args):
-
- from win32com.client import Dispatch
- import win32con
- b = check()
- if not b:
- return
- #Acquiring control of the text box
- search_partner_box = txtProcessor.GetControl()
- global search_partner_text
- if txtProcessor.init_done:
- win32gui.SendMessage(search_partner_box, win32con.WM_SETTEXT, 0,search_partner_text)
- return
- #Reading Current Selected Email.
- ex = txtProcessor.window.manager.outlook.ActiveExplorer()
- assert ex.Selection.Count == 1
- mail = ex.Selection.Item(1)
- #Fetching Sender MailID from Selected Mail
- try:
- search_partner_text = ustr(mail.SenderEmailAddress).encode('iso-8859-1')
- except Exception,e:
- win32ui.MessageBox("Error In reading email ID from Email ","Open Contact", flag_error)
- pass
- win32gui.SendMessage(search_partner_box, win32con.WM_SETTEXT, 0, search_partner_text)
-
- fs_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[10])
- c_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[11])
- partner_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[0])
- vals = []
- #Searching the res.partner.address for contact based on Sender Mail ID.
- vals = NewConn.SearchPartnerDetail(search_partner_text)
- #If no user Found.
- if vals == None:
- for i in range(1,10):
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[i], "")
- win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
- win32ui.MessageBox("No matching records found for : "+str(search_partner)+".","Open Contact", flag_excl)
- return
- else:
- #If user Found than Setting the Value for the contact in fields.
- for i in range(1,10):
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[i], "")
- win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
-
- for val in vals:
-
- if val[0] == 'partner_id':
- temp = list (NewConn.GetPartners())
- i = -1
- for t in temp:
- i+=1
- if t[1] == val[1][1] :
- win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, i )
- if val[0] == 'name' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[1], str(val[1]))
-
- if val[0] == 'street' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[2], str(val[1]))
-
- if val[0] == 'street2' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[3], str(val[1]))
-
- if val[0] == 'zip' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[9], str(val[1]))
-
- if val[0] == 'city' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[4], str(val[1]))
-
- if val[0] == 'state_id' and val[1] != False :
- id = i = -1
- temp = list(NewConn.GetAllState())
- for t in temp:
- i+=1
- if str(t[1]) == str(val[1][1]):
- id = i
- break;
- sel = win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, id )
-
- if val[0] == 'country_id' and val[1] != False :
- id = i = -1
- temp = list(NewConn.GetAllCountry())
- for t in temp:
- i+=1
- if str(t[1]) == str(val[1][1]):
- id = i
- break;
- sel = win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, id )
-
- if val[0] == 'phone' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[5], str(val[1]))
-
- if val[0] == 'mobile' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[6], str(val[1]))
-
- if val[0] == 'fax' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[7], str(val[1]))
-
- if val[0] == 'email' and val[1] != False :
- win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[8], str(val[1]))
-
- txtProcessor.init_done=True
-
-def SearchPartner(btnProcessor,*args):
- b = check()
- if not b:
- return
- #hwnd For the List box
- fs_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[11])
- c_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[12])
- partner_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- try :
- search_partner = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- if not search_partner:
- win32ui.MessageBox("Please enter email id to search for.", "Open Contact", flag_excl)
- return
- vals = []
- #Searching the contact.
- vals = NewConn.SearchPartnerDetail(search_partner)
- #if contact not found resetting all field to blank
- if vals == None:
- for i in range(2,11):
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[i], "")
- win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
- win32ui.MessageBox("No matching records found for : "+str(search_partner)+".","Open Contact", flag_excl)
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], "")
- return
- #if contact found than setting the values for the contact.
- else:
- for i in range(2,11):
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[i], "")
- win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
- win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
- for val in vals:
- if val[0] == 'partner_id':
- #Finding the partner index in list and setting it.
- temp = list (NewConn.GetPartners())
- i = -1
- for t in temp:
- i+=1
- if t[1] == val[1][1] :
- win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, i )
-
- if val[0] == 'name' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2], str(val[1]))
-
- if val[0] == 'street' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[3], str(val[1]))
-
- if val[0] == 'street2' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[4], str(val[1]))
-
- if val[0] == 'zip' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[10], str(val[1]))
-
- if val[0] == 'city' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[5], str(val[1]))
-
- if val[0] == 'state_id' and val[1] != False :
- #Finding the state index in list and setting it.
- id = i = -1
- temp = list(NewConn.GetAllState())
- for t in temp:
- i+=1
- if str(t[1]) == str(val[1][1]):
- id = i
- break;
- sel = win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, id )
-
- if val[0] == 'country_id' and val[1] != False :
- #Finding the country index in list and setting it.
- id = i = -1
- temp = list(NewConn.GetAllCountry())
- for t in temp:
- i+=1
- if str(t[1]) == str(val[1][1]):
- id = i
- break;
- sel = win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, id )
-
- if val[0] == 'phone' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[6], str(val[1]))
-
- if val[0] == 'mobile' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[7], str(val[1]))
-
- if val[0] == 'fax' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[8], str(val[1]))
-
- if val[0] == 'email' and val[1] != False :
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[9], str(val[1]))
-
- win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], "")
- except Exception,e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Open Contact", flag_error)
- pass
-
-def WritePartner(btnProcessor,*args):
- new_vals=[]
- #Reading new value of the fields.
- contect_name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
- street = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
- street2 = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[3])
- city = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[4])
- phone = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[7])
- mobile = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[8])
- fax = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[9])
- email = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[10])
- zip = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[11])
- country_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[6])
- country_sel = win32gui.SendMessage(country_combo, win32con.CB_GETCURSEL)
- state_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[5])
- state_sel = win32gui.SendMessage(state_combo, win32con.CB_GETCURSEL)
- partner_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
- partner_sel = win32gui.SendMessage(partner_combo, win32con.CB_GETCURSEL)
- #Checking that record not being saved without name or Partner
- if contect_name.strip() == "":
- win32ui.MessageBox("Please enter partner Contact Name name.", "Open Contact", flag_excl)
- return
- if partner_sel < 1:
- win32ui.MessageBox("Please Select Partner From list.", "Open Contact", flag_excl)
- return
- fs_id = c_id = p_id = -1
- #Finding the partner index in list finding it record ID.
- if not partner_sel < 0 :
- try:
- temp = NewConn.GetPartners()
- i = -1
- for t in temp:
- i+=1
- if i == partner_sel:
- p_id = t[0]
- break;
- except Exception, e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Open Contact", flag_error)
- pass
- #Finding the State index in list finding it record ID.
- if not state_sel == -1 :
- try:
- temp = NewConn.GetAllState()
- i = -1
- for t in temp:
- i+=1
- if i == state_sel:
- fs_id = t[0]
- break;
- except Exception, e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Open Contact", flag_error)
- pass
- #Finding the country index in list finding it record ID.
- if not country_sel == -1 :
- try:
- temp = NewConn.GetAllCountry()
- i = -1
- for t in temp:
- i+=1
- if i == country_sel:
- c_id = t[0]
- break;
- except Exception, e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Open Contact", flag_error)
- pass
- # Creating a list to write the values to the OpenERP
- new_vals.append(['partner_id',p_id])
- new_vals.append(['name',contect_name])
- new_vals.append(['street',street])
- new_vals.append(['street2',street2])
- new_vals.append(['city',city])
- new_vals.append(['state_id',fs_id])
- new_vals.append(['country_id',c_id])
- new_vals.append(['phone',phone])
- new_vals.append(['mobile',mobile])
- new_vals.append(['email',email])
- new_vals.append(['fax',fax])
- new_vals.append(['zip',zip])
- flag = 0
- try:
- #writing the updated values to the Server.
- flag = NewConn.WritePartnerValues(new_vals)
- except Exception,e:
- msg = getMessage(e)
- win32ui.MessageBox(msg, "Open Contact", flag_error)
- pass
- if flag == 1:
- win32ui.MessageBox("Changes have been Updated Successfully.", "Open Contact", flag_info)
- elif flag == 0:
- win32ui.MessageBox("Error in Updating the Changes.\n Please check the Database Connection.", "Open Contact", flag_error)
- elif flag == -1:
- win32ui.MessageBox("Contact can not be Save.\nFirst select contact using Search.","Open Contact", flag_info)
-
-
-
-dialog_map = {
- "IDD_MANAGER" : (
- (CancelButtonProcessor, "IDCANCEL", resetConnAttribs, ()),
- (TabProcessor, "IDC_TAB IDC_LIST",
- """IDD_GENERAL IDD_OBJECT_SETTINGS IDD_ABOUT"""),
- (DoneButtonProcessor, "ID_DONE"),
- ),
-
- "IDD_GENERAL": (
- (DBComboProcessor, "ID_DB_DROPDOWNLIST", GetConn, ()),
- (TextProcessor, "ID_SERVER_PORT ID_USERNAME ID_PASSWORD", SetAllText, ()),
- (CommandButtonProcessor, "ID_BUT_TESTCONNECTION ID_DB_DROPDOWNLIST ID_USERNAME \
- ID_PASSWORD", TestConnection, ()),
- (CommandButtonProcessor, "IDC_RELOAD", ReloadAllControls, ()),
- (DialogCommand, "IDC_BUT_SET_SERVER_PORT", "IDD_SERVER_PORT_DIALOG"),
- ),
-
- "IDD_OBJECT_SETTINGS" : (
- (CommandButtonProcessor, "IDC_BUT_LOAD_IMAGE IDC_IMAGE_PATH", GetImagePath, ()),
- (CommandButtonProcessor, "IDC_BUT_SAVE_OBJECT IDC_OBJECT_TITLE IDC_OBJECT_NAME \
- IDC_IMAGE_PATH IDC_LIST", AddNewObject, ()),
- (CommandButtonProcessor, "IDC_BUT_DEL_OBJECT IDC_LIST", DeleteSelectedObjects, ()),
- (ListBoxProcessor, "IDC_LIST", SetDefaultList, ())
- ),
-
- "IDD_ABOUT" : (
- (ImageProcessor, "IDB_OPENERPLOGO"),
- (MessageProcessor, "IDC_ABOUT"),
- ),
-
- "IDD_SERVER_PORT_DIALOG" : (
- (CloseButtonProcessor, "IDCANCEL"),
- (OKButtonProcessor, "IDOK ID_SERVER ID_PORT IDR_XML_PROTOCOL"),
- (RadioButtonProcessor, "IDR_XML_PROTOCOL", GetConn, ()),
- (RadioButtonProcessor, "IDR_XMLS_PROTOCOL", GetConn, ()),
- (RadioButtonProcessor, "IDR_NETRPC_PROTOCOL", GetConn, ()),
- ),
-
- "IDD_SYNC" : (
- (CommandButtonProcessor, "ID_SEARCH ID_SEARCH_TEXT IDC_NAME_LIST", SearchObjectsForText,()),
- (GroupProcessor, "IDC_STATIC_GROUP", setCheckList, ()),
- (CSComboProcessor, "ID_ATT_METHOD_DROPDOWNLIST", GetConn,()),
- (TextProcessor, "ID_SEARCH_TEXT", GetSearchText, ()),
- (DialogCommand, "ID_CREATE_CONTACT ID_SEARCH_TEXT", "IDD_NEW_CONTACT_DIALOG", set_search_text, ()),
- (CloseButtonProcessor, "IDCANCEL"),
- (CommandButtonProcessor, "ID_MAKE_ATTACHMENT IDC_NAME_LIST IDD_SYNC", MakeAttachment, ()),
- (CommandButtonProcessor, "ID_CREATE_CASE ID_ATT_METHOD_DROPDOWNLIST IDC_NAME_LIST", CreateCase, ()),
- (ListBoxProcessor, "IDC_NAME_LIST", SetNameColumn, ())
- ),
-
- "IDD_NEW_CONTACT_DIALOG" : (
- (PartnersComboProcessor, "ID_PARTNER_DROPDOWNLIST", GetConn, ()),
- (CountryComboProcessor, "ID_COUNTRY_DROPLIST", GetConn, ()),
- (StateComboProcessor, "ID_FED_STATE_DROPLIST", GetConn, ()),
- (CloseButtonProcessor, "IDCANCEL"),
- (CommandButtonProcessor, "ID_CONTACT_SAVE_BUTTON ID_CONTACT_NAME_TEXT ID_CONTACT_EMAIL_TEXT ID_CONTACT_OFFICE_TEXT ID_CONTACT_MOBILE_TEXT ID_FAX_TEXT ID_STREET_TEXT ID_STREET2_TEXT ID_PARTNER_CITY_TEXT ID_ZIP_TEXT ID_PARTNER_DROPDOWNLIST ID_FED_STATE_DROPLIST ID_COUNTRY_DROPLIST", CreateContact, ()),
- (TextProcessor, "ID_CONTACT_NAME_TEXT ID_CONTACT_EMAIL_TEXT ID_FED_STATE_DROPLIST ID_COUNTRY_DROPLIST" , SetDefaultContact, ()),
- (DialogCommand, "ID_NEW_PARTNER_BUTTON ID_CONTACT_NAME_TEXT ID_CONTACT_EMAIL_TEXT", "IDD_NEW_PARTNER_DIALOG", set_name_email, ()),
- ),
-
- "IDD_NEW_PARTNER_DIALOG" : (
- (CloseButtonProcessor, "IDCANCEL"),
- (CommandButtonProcessor, "ID_SAVE_PARTNER_BUTTON ID_PARTNER_NAME_TEXT", CreatePartner, ()),
- ),
-
- "IDD_VIEW_PARTNER_DIALOG" : (
- (PartnersComboProcessor, "ID_PARTNER_DROPLIST", GetConn, ()),
- (StateComboProcessor, "ID_ALL_STATE_DROPDOWNLIST", GetConn, ()),
- (CountryComboProcessor, "ID_ALL_COUNTRY_DROPDOWNLIST", GetConn, ()),
- (TextProcessor, "IDET_SEARCH_PARTNER ID_PARTNER_DROPLIST IDET_PARTNER_CONTACT_NAME IDET_PARTNER_STREET IDET_PARTNER_STREET2 IDET_PARTNER_CITY IDET_PARTNER_OFFICENO IDET_PARTNER_MOBILENO IDET_PARTNER_EMAIL IDET_PARTNER_FAX IDET_ZIP ID_ALL_STATE_DROPDOWNLIST ID_ALL_COUNTRY_DROPDOWNLIST", GetDefaultEmail, ()),
- (CommandButtonProcessor, "IDPB_SEARCH_PARTNER IDET_SEARCH_PARTNER ID_PARTNER_DROPLIST IDET_PARTNER_CONTACT_NAME IDET_PARTNER_STREET IDET_PARTNER_STREET2 IDET_PARTNER_CITY IDET_PARTNER_OFFICENO IDET_PARTNER_MOBILENO IDET_PARTNER_EMAIL IDET_PARTNER_FAX IDET_ZIP ID_ALL_STATE_DROPDOWNLIST ID_ALL_COUNTRY_DROPDOWNLIST", SearchPartner, ()),
- (CommandButtonProcessor, "IDPB_WRITE_CHANGES ID_PARTNER_DROPLIST IDET_PARTNER_CONTACT_NAME IDET_PARTNER_STREET IDET_PARTNER_STREET2 IDET_PARTNER_CITY ID_ALL_STATE_DROPDOWNLIST ID_ALL_COUNTRY_DROPDOWNLIST IDET_PARTNER_OFFICENO IDET_PARTNER_MOBILENO IDET_PARTNER_EMAIL IDET_PARTNER_FAX IDET_ZIP", WritePartner, ()),
- (CloseButtonProcessor, "IDCANCEL"),
- (DialogCommand, "ID_NEW_PART_BUTTON", "IDD_NEW_PARTNER_DIALOG" ),
- (DialogCommand, "IDPB_NEWPARTNER_BUTTON" , "IDD_NEW_CONTACT_DIALOG")
- ),
-}
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
+# -*- 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 .
+#
+##############################################################################
+
+from processors import *
+from opt_processors import *
+import sys
+import os
+import addin
+from dialogs import ShowDialog, MakePropertyPage
+
+import win32ui
+
+import commctrl
+import win32con
+import win32gui
+
+import win32gui_struct
+import xmlrpclib
+
+from manager import ustr
+
+try:
+ enumerate
+except NameError: # enumerate new in 2.3
+ def enumerate(seq):
+ return [(i, seq[i]) for i in xrange(len(seq))]
+
+BIF_NEWDIALOGSTYLE = 0x00000040
+BIF_NONEWFOLDERBUTTON = 0x0000200
+CSIDL_COMMONMYPICTURES = 0x00000036
+
+class _WIN32MASKEDSTRUCT:
+ def __init__(self, **kw):
+ full_fmt = ""
+ for name, fmt, default, mask in self._struct_items_:
+ self.__dict__[name] = None
+ if fmt == "z":
+ full_fmt += "pi"
+ else:
+ full_fmt += fmt
+ for name, val in kw.iteritems():
+ if name not in self.__dict__:
+ raise ValueError("LVITEM structures do not have an item '%s'" % (name,))
+ self.__dict__[name] = val
+
+ def __setattr__(self, attr, val):
+ if not attr.startswith("_") and attr not in self.__dict__:
+ raise AttributeError(attr)
+ self.__dict__[attr] = val
+
+ def toparam(self):
+ self._buffs = []
+ full_fmt = ""
+ vals = []
+ mask = 0
+ # calc the mask
+ for name, fmt, default, this_mask in self._struct_items_:
+ if this_mask is not None and self.__dict__.get(name) is not None:
+ mask |= this_mask
+ self.mask = mask
+ for name, fmt, default, this_mask in self._struct_items_:
+ val = self.__dict__[name]
+ if fmt == "z":
+ fmt = "Pi"
+ if val is None:
+ vals.append(0)
+ vals.append(0)
+ else:
+ # Note this demo still works with byte strings. An
+ # alternate strategy would be to use unicode natively
+ # and use the 'W' version of the messages - eg,
+ # LVM_SETITEMW etc.
+ val = val + "\0"
+ if isinstance(val, unicode):
+ val = val.encode("mbcs")
+ str_buf = array.array("b", val)
+ vals.append(str_buf.buffer_info()[0])
+ vals.append(len(val))
+ self._buffs.append(str_buf) # keep alive during the call.
+ else:
+ if val is None:
+ val = default
+ vals.append(val)
+ full_fmt += fmt
+ return struct.pack(*(full_fmt,) + tuple(vals))
+
+
+# NOTE: See the win32gui_struct module for an alternative way of dealing
+# with these structures
+class LVITEM(_WIN32MASKEDSTRUCT):
+ _struct_items_ = [
+ ("mask", "I", 0, None),
+ ("iItem", "i", 0, None),
+ ("iSubItem", "i", 0, None),
+ ("state", "I", 0, commctrl.LVIF_STATE),
+ ("stateMask", "I", 0, None),
+ ("text", "z", None, commctrl.LVIF_TEXT),
+ ("iImage", "i", 0, commctrl.LVIF_IMAGE),
+ ("lParam", "i", 0, commctrl.LVIF_PARAM),
+ ("iIdent", "i", 0, None),
+ ("cchTextMax", "i", 0, 255),
+ ("pszText", "i", 0, None),
+ ("flags", "i", 0, None),
+ ]
+
+class LVCOLUMN(_WIN32MASKEDSTRUCT):
+ _struct_items_ = [
+ ("mask", "I", 0, None),
+ ("fmt", "i", 0, commctrl.LVCF_FMT),
+ ("cx", "i", 0, commctrl.LVCF_WIDTH),
+ ("text", "z", None, commctrl.LVCF_TEXT),
+ ("iSubItem", "i", 0, commctrl.LVCF_SUBITEM),
+ ("iImage", "i", 0, commctrl.LVCF_IMAGE),
+ ("iOrder", "i", 0, commctrl.LVCF_ORDER),
+ ]
+
+global flag_stop
+flag_stop=win32con.MB_ICONSTOP
+
+global flag_error
+flag_error=win32con.MB_ICONERROR
+
+global flag_info
+flag_info=win32con.MB_ICONINFORMATION
+
+global flag_excl
+flag_excl=win32con.MB_ICONEXCLAMATION
+
+#global NewConn
+NewConn=addin.GetConn()
+## Retrieves current registered XMLRPC connection
+def GetConn():
+ return NewConn
+
+global objects_with_match
+objects_with_match=[]
+
+global hwndChk_list
+hwndChk_list=[]
+
+global search_text
+search_text='search_text'
+
+global name
+name=''
+global email
+email=''
+
+def check():
+ server = NewConn.getitem('_server')
+ port = NewConn.getitem('_port')
+ NewConn.GetDBList()
+ if str(NewConn.getitem('_running')) == 'False':
+ win32ui.MessageBox("No server running on host "+ server+" at port "+str(port), "OpenERP Connection", flag_excl)
+ return False
+ if str(NewConn.getitem('_login')) == 'False':
+ win32ui.MessageBox("Please login to the database first", "OpenERP Connection", flag_excl)
+ return False
+ return True
+
+def resetConnAttribs(window):
+ config = window.manager.LoadConfig()
+ NewConn.setitem('_server', config['server'])
+ NewConn.setitem('_port', config['port'])
+# NewConn.setitem('protocol', config['protocol'])
+ NewConn.setitem('_uri', "http://" + config['server'] + ":" + str(config['port']))
+ NewConn.setitem('_obj_list', config['objects'])
+ NewConn.setitem('_dbname', config['database'])
+ NewConn.setitem('_uname', config['uname'])
+ NewConn.setitem('_pwd', config['pwd'])
+ NewConn.setitem('_login', str(config['login']))
+ return
+
+def setConnAttribs(server, port, manager):
+ protocol = NewConn.getitem('protocol')
+ if protocol=='XML-RPCS':
+ protocol='https://'
+ else:
+ protocol='http://'
+ uri = protocol + server + ":" + str(port)
+ NewConn.setitem('_server',server)
+ NewConn.setitem('_port',port)
+ NewConn.setitem('_uri',uri)
+ NewConn.GetDBList()
+ manager.config = manager.LoadConfig()
+ NewConn.setitem('_dbname',manager.config['database'])
+ NewConn.setitem('_uname', manager.config['uname'])
+ NewConn.setitem('_pwd', manager.config['pwd'])
+ NewConn.setitem('_login', str(manager.config['login']))
+ NewConn.setitem('_obj_list', manager.config['objects'])
+ return
+
+def getConnAttributes(manager):
+ manager.config['server'] = NewConn.getitem('_server')
+ manager.config['port'] = NewConn.getitem('_port')
+ manager.config['protocol'] = NewConn.getitem('protocol')
+ manager.config['objects'] = eval(NewConn.getitem('_obj_list'))
+ manager.config['database'] = NewConn.getitem('_dbname')
+ manager.config['uname'] = NewConn.getitem('_uname')
+ manager.config['pwd'] = NewConn.getitem('_pwd')
+ manager.config['login'] = NewConn.getitem('_login')
+ return
+
+def getMessage(e):
+ import pywintypes
+ print "Exception %s: %s"%(type(e),str(e))
+ msg = str(e)
+ if type(e) == pywintypes.com_error:
+ msg=str(e)
+ elif type(e) == xmlrpclib.Fault:
+ msg = str(e.faultCode) or e.faultString or e.message or str(e)
+ else:
+ if hasattr(e, 'faultCode') and e.faultCode:
+ msg = str(e.faultCode)
+ elif hasattr(e, 'faultString') and e.faultString:
+ msg = e.faultString
+ elif hasattr(e, 'message') and e.message:
+ msg = e.message
+ return msg
+
+class OKButtonProcessor(ButtonProcessor):
+ def __init__(self, window, control_ids):
+ self.mngr = window.manager
+ ControlProcessor.__init__(self, window, control_ids)
+
+ def OnClicked(self, id):
+ server = win32gui.GetDlgItemText(self.window.hwnd, self.other_ids[0])
+ try:
+ port = int(win32gui.GetDlgItemText(self.window.hwnd, self.other_ids[1]))
+ except ValueError, e:
+ print "Exception : %s"%str(e)
+ win32ui.MessageBox("Port should be an integer", "OpenERP Connection", flag_excl)
+ return
+ except Exception,e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "OpenERP Connection", flag_excl)
+ return
+ setConnAttribs(server, port, self.mngr)
+ if str(NewConn.getitem('_running')) == 'False':
+ msg = "No server running on host '%s' at port '%d'. Press ignore to still continue with this configuration?"%(server,port)
+ r=win32ui.MessageBox(msg, "OpenERP Connection", win32con.MB_ABORTRETRYIGNORE | win32con.MB_ICONQUESTION)
+ if r==3:
+ resetConnAttribs(self.window)
+ return
+ elif r==4:
+ self.OnClicked(id)
+ elif r==5:
+ setConnAttribs(server, port, self.mngr)
+ win32gui.EndDialog(self.window.hwnd, id)
+
+class DoneButtonProcessor(ButtonProcessor):
+ def OnClicked(self, id):
+ getConnAttributes(self.window.manager)
+ self.window.manager.SaveConfig()
+ win32gui.EndDialog(self.window.hwnd, id)
+
+class MessageProcessor(ControlProcessor):
+ def Init(self):
+ text = " This Outlook Plugin for OpenERP has been developed by OpenERP s.a.\n\n \
+ For more information, please visit our website \n\n \
+ http://www.openerp.com \n\n\n \
+ Copyright @ 2005-Today. All rights reserved.\n\n\
+OpenERP is a trademark of OpenERP s.a. The software is released under AGPL."
+ win32gui.SendMessage(self.GetControl(), win32con.WM_SETTEXT, 0, text)
+
+ def GetPopupHelpText(self, cid):
+ return "Displays details on this plugin"
+
+class TabProcessor(ControlProcessor):
+ def __init__(self, window, control_ids, page_ids):
+ ControlProcessor.__init__(self, window, control_ids)
+ self.page_ids = page_ids.split()
+
+ def Init(self):
+ self.pages = {}
+ self.currentPage = None
+ self.currentPageIndex = -1
+ self.currentPageHwnd = None
+ for index, page_id in enumerate(self.page_ids):
+ template = self.window.manager.dialog_parser.dialogs[page_id]
+ self.addPage(index, page_id, template[0][0])
+ server = self.window.manager.config['server']
+ port = self.window.manager.config['port']
+ setConnAttribs(server, port, self.window.manager)
+ self.switchToPage(0)
+
+ def Done(self):
+ if self.currentPageHwnd is not None:
+ if not self.currentPage.SaveAllControls():
+ win32gui.SendMessage(self.GetControl(), commctrl.TCM_SETCURSEL, self.currentPageIndex,0)
+ return False
+ return True
+
+ def OnNotify(self, nmhdr, wparam, lparam):
+ selChangedCode = 5177342
+ code = nmhdr[2]
+ if code==selChangedCode:
+ index = win32gui.SendMessage(self.GetControl(), commctrl.TCM_GETCURSEL, 0,0)
+ if index!=self.currentPageIndex:
+ self.switchToPage(index)
+
+ def switchToPage(self, index):
+ if self.currentPageHwnd is not None:
+ if not self.currentPage.SaveAllControls():
+ win32gui.SendMessage(self.GetControl(), commctrl.TCM_SETCURSEL, self.currentPageIndex,0)
+ return 1
+ win32gui.DestroyWindow(self.currentPageHwnd)
+ self.currentPage = MakePropertyPage(self.GetControl(), self.window.manager, self.window.config, self.pages[index])
+ self.currentPageHwnd = self.currentPage.CreateWindow()
+ self.currentPageIndex = index
+ return 0
+#
+ def addPage(self, item, idName, label):
+ format = "iiiiiii"
+ lbuf = win32gui.PyMakeBuffer(len(label)+1)
+ address,l = win32gui.PyGetBufferAddressAndLen(lbuf)
+ win32gui.PySetString(address, label)
+
+ buf = struct.pack(format,
+ commctrl.TCIF_TEXT, # mask
+ 0, # state
+ 0, # state mask
+ address,
+ 0, #unused
+ 0, #image
+ item
+ )
+ item = win32gui.SendMessage(self.GetControl(),
+ commctrl.TCM_INSERTITEM,
+ item,
+ buf)
+ self.pages[item] = idName
+
+class DialogCommand(ButtonProcessor):
+ def __init__(self, window, control_ids, idd, func=None, args=()):
+ self.idd = idd
+ self.func = func
+ self.args = args
+ ButtonProcessor.__init__(self, window, control_ids)
+
+ def OnClicked(self, id):
+ self.id = id
+ if self.func:
+ args = (self, ) + self.args
+ self.func(*args)
+ parent = self.window.hwnd
+ self.window.SaveAllControls()
+ ShowDialog(parent, self.window.manager, self.window.config, self.idd)
+ self.window.LoadAllControls()
+
+ def GetPopupHelpText(self, id):
+ dd = self.window.manager.dialog_parser.dialogs[self.idd]
+ return "Displays the %s dialog" % dd.caption
+
+def ReloadAllControls(btnProcessor,*args):
+ server = NewConn.getitem('_server')
+ port = NewConn.getitem('_port')
+ btnProcessor.window.LoadAllControls()
+ if str(NewConn.getitem('_running')) == 'False':
+ win32ui.MessageBox("No server running on host "+ server+" at port "+str(port), "OpenERP Connection", flag_excl)
+ return
+
+def TestConnection(btnProcessor,*args):
+ server = NewConn.getitem('_server')
+ port = NewConn.getitem('_port')
+ url = NewConn.getitem('_uri')
+ NewConn.GetDBList()
+ if str(NewConn.getitem('_running')) == 'False':
+ btnProcessor.window.LoadAllControls()
+ win32ui.MessageBox("No server running on host "+ server+" at port "+str(port), "OpenERP Connection", flag_excl)
+ return
+ try:
+ dbname = win32gui.GetDlgItemText(btnProcessor.window.hwnd, 7000)
+ if not dbname:
+ win32ui.MessageBox("Authentication Error !\nBad Database Name !", "OpenERP Connection", flag_excl)
+ return
+ except Exception,e:
+ print "Exception %s: %s"%(type(e),str(e))
+ dbname = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ if not dbname:
+ win32ui.MessageBox("No database found on host "+ server+" at port "+str(port), "OpenERP Connection", flag_excl)
+ return
+
+ uname = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ pwd = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
+
+ if not uname:
+ win32ui.MessageBox("Authentication Error !\nBad User Name !", "OpenERP Connection", flag_excl)
+ return
+ if not pwd:
+ win32ui.MessageBox("Authentication Error !\nBad Password !", "OpenERP Connection", flag_excl)
+ return
+
+ #Establish Connection
+ try:
+ uid = NewConn.login(dbname, uname, pwd)
+ if uid:
+ msg = "Connection Successful"
+ NewConn.setitem('_login', 'True')
+ NewConn.setitem('_uname', uname)
+ NewConn.setitem('_pwd', pwd)
+ NewConn.setitem('_uid', uid)
+ flag = flag_info
+ if not NewConn.IsCRMInstalled():
+ msg+= '\n\n'+" 'CRM' module is not installed. So CRM cases cannot be created."
+ NewConn.setitem('_iscrm', False)
+ else:
+ NewConn.setitem('_iscrm', True)
+ else:
+ msg = "Authentication Error !\nBad UserName or Password"
+ flag = flag_stop
+ NewConn.setitem('_login', 'False')
+ except Exception,e:
+ msg = "Authentication Error !\n\n" + getMessage(e)
+ flag = flag_error
+ win32ui.MessageBox(msg, "OpenERP Connection", flag)
+ return
+
+def BrowseCallbackProc(hwnd, msg, lp, data):
+ from win32com.shell import shell, shellcon
+ if msg== shellcon.BFFM_INITIALIZED:
+ win32gui.SendMessage(hwnd, shellcon.BFFM_SETSELECTION, 1, data)
+ win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 0)
+ elif msg == shellcon.BFFM_SELCHANGED:
+ # Set the status text of the
+ # For this message, 'lp' is the address of the PIDL.
+ pidl = shell.AddressAsPIDL(lp)
+ try:
+ path = shell.SHGetPathFromIDList(pidl)
+ if os.path.isdir(path):
+ win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 0)
+ else:
+ ext = path.split('.')[-1]
+ if ext not in ['gif', 'bmp', 'jpg', 'tif', 'ico', 'png']:
+ win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 0)
+ else:
+ win32gui.SendMessage(hwnd, shellcon.BFFM_ENABLEOK, 0, 1)
+ except shell.error:
+ # No path for this PIDL
+ pass
+
+def GetImagePath(btnProcessor,*args):
+ from win32com.shell import shell, shellcon
+ ulFlags = shellcon.BIF_BROWSEINCLUDEFILES | BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON
+ pidl, display_name, image_list=shell.SHBrowseForFolder(btnProcessor.window.hwnd, # parent HWND
+ None, # root PIDL.
+ "Get the image path", # title
+ ulFlags, # flags
+ BrowseCallbackProc, # callback function
+ os.getcwd() # 'data' param for the callback
+ )
+ if (pidl, display_name, image_list) == (None, None, None):
+ return
+ else:
+ path = shell.SHGetPathFromIDList (pidl)
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], path)
+
+def AddNewObject(btnProcessor,*args):
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+
+ #Check if title or object not specified
+ obj_title = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ obj_name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ if not obj_title:
+ win32ui.MessageBox("No Title specified", "Documents Setting", flag_excl)
+ return
+ if not obj_name:
+ win32ui.MessageBox("No Document specified", "Documents Setting", flag_excl)
+ return
+
+ #Check if object does not exist in the database or it already exist in the list
+ try:
+ all_obj_list = NewConn.GetAllObjects()
+ curr_obj_list = [obj[1] for obj in NewConn.GetObjList()]
+ curr_title_list = [obj[0] for obj in NewConn.GetObjList()]
+ if obj_name not in all_obj_list:
+ win32ui.MessageBox("No such Document exists", "Documents Setting", flag_excl)
+ return
+ elif obj_name in curr_obj_list:
+ win32ui.MessageBox("Document already in the list", "Documents Setting", flag_info)
+ return
+ elif obj_title in curr_title_list:
+ win32ui.MessageBox("Title already in the list. Please give different title", "Documents Setting", flag_excl)
+ return
+
+ #extract image path and load the image
+ image_path=''
+ image_path = os.path.join(btnProcessor.window.manager.application_directory, "dialogs\\resources\\openerp_logo1.bmp")
+ path=win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
+ if path:
+ image_path = path
+ load_bmp_flags=win32con.LR_LOADFROMFILE | win32con.LR_LOADTRANSPARENT
+ try:
+ hicon = win32gui.LoadImage(0, image_path,win32con.IMAGE_BITMAP, 40, 40, load_bmp_flags)
+ except Exception,e:
+ msg=getMessage(e)
+ hicon=None
+ win32ui.MessageBox(msg, "Load Image", flag_error)
+
+ #Add the object in the list
+ win32gui.ImageList_Add(il,hicon,0)
+ cnt = win32gui.ImageList_GetImageCount(il)
+
+ hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[3])
+ num_items = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMCOUNT)
+
+ item = LVITEM(text=obj_title, iImage=cnt-2, iItem = num_items)
+ new_index = win32gui.SendMessage(hwndList, commctrl.LVM_INSERTITEM, 0, item.toparam())
+ win32gui.SendMessage(hwndList, commctrl.LVM_SETIMAGELIST, commctrl.LVSIL_SMALL, il)
+ item = LVITEM(text=obj_name, iItem = new_index, iSubItem = 1)
+ win32gui.SendMessage(hwndList, commctrl.LVM_SETITEM, 0, item.toparam())
+
+ NewConn.InsertObj(obj_title,obj_name,image_path)
+ except Exception, e:
+ msg = "Object not added\n\n" + getMessage(e)
+ win32ui.MessageBox(msg,"",flag_excl)
+ return
+
+ #Empty all the text controls
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], '')
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1], '')
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2], '')
+
+def DeleteSelectedObjects(btnProcessor,*args):
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+
+ #Delete selected items
+ hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ sel_count = win32gui.SendMessage(hwndList, commctrl.LVM_GETSELECTEDCOUNT)
+ for i in range(0,sel_count):
+ sel = win32gui.SendMessage(hwndList, commctrl.LVM_GETNEXTITEM, -1, commctrl.LVNI_SELECTED)
+ buf,extra = win32gui_struct.EmptyLVITEM(1, 0)
+ r = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMTEXT, sel, buf)
+ sel_text = ''
+ for n in extra:
+ nombre = n.tostring()
+ sel_text = nombre[0:r]
+ s = win32gui.SendMessage(hwndList, commctrl.LVM_DELETEITEM, sel)
+ try:
+ NewConn.DeleteObject(sel_text)
+ except Exception,e:
+ msg = "Documents '%s' not deleted\n\n"%sel_text + getMessage(e)
+ win32ui.MessageBox(msg,"Documents Setting",flag_excl)
+
+def GetMail(processor):
+ ex = processor.window.manager.outlook.ActiveExplorer()
+ assert ex.Selection.Count == 1
+ mail = ex.Selection.Item(1)
+ return mail
+#get selected records from list
+def GetSelectedItems(hwndList):
+ r=[]
+ sel_count = win32gui.SendMessage(hwndList, commctrl.LVM_GETSELECTEDCOUNT)
+ sel=-1
+ for i in range(0,sel_count):
+ sel = win32gui.SendMessage(hwndList, commctrl.LVM_GETNEXTITEM, sel, commctrl.LVNI_SELECTED)
+ buf,extra = win32gui_struct.EmptyLVITEM(1, 0)
+ size = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMTEXT, sel, buf)
+ sel_text = ''
+ for n in extra:
+ nombre = n.tostring()
+ sel_text = nombre[0:size]
+ for item in objects_with_match:
+ if item[2] == sel_text:
+ r.append(item)
+ return r
+
+def MakeAttachment(btnProcessor,*args):
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+ ex = btnProcessor.window.manager.outlook.ActiveExplorer()
+ assert ex.Selection.Count == 1
+ mail = ex.Selection.Item(1)
+ mail = GetMail(btnProcessor)
+
+ #get selected records
+ hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ r = GetSelectedItems(hwndList)
+ if not r:
+ win32ui.MessageBox("No records selected", "Push to OpenERP", flag_info)
+ return
+ try:
+ flg = NewConn.ArchiveToOpenERP(r,mail)
+ if flg:
+ win32gui.EndDialog(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ return
+ except Exception,e:
+ msg = "Attachment not created \n\n" + getMessage(e)
+ flag = flag_error
+ win32ui.MessageBox(msg, "Push to OpenERP", flag)
+ return
+
+def CreateCase(btnProcessor,*args):
+ try:
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+
+ if str(NewConn.getitem('_iscrm')) == 'True':
+ # Get the selected mail
+ ex = btnProcessor.window.manager.outlook.ActiveExplorer()
+ assert ex.Selection.Count == 1
+ mail = ex.Selection.Item(1)
+ section = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ section = str(section)
+ section=section.lower().replace(' ','.')
+ if not section:
+ win32ui.MessageBox("Documents can not be created.", "Documents Setting", flag_excl)
+ return
+
+ hwndList = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ partner_ids=[]
+ r = GetSelectedItems(hwndList)
+ for rec in r:
+ if rec[0] == 'res.partner':
+ partner_ids.append(rec[1])
+
+ #Create new case
+ try:
+ NewConn.CreateCase(str(section), mail, partner_ids)
+ msg="New Document created."
+ flag=flag_info
+ except Exception,e:
+ msg="New Document not created \n\n"+str(e)
+ flag=flag_error
+ win32ui.MessageBox(msg, "Create Document", flag)
+ return
+ else:
+ win32ui.MessageBox("Document can not be created. CRM not installed", "Create Object", flag_info)
+ except Exception, e:
+ win32ui.MessageBox(str(e), 'New Document')
+
+def GetSearchText(txtProcessor,*args):
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+
+ search_box = txtProcessor.GetControl()
+ global search_text
+ if txtProcessor.init_done:
+ win32gui.SendMessage(search_box, win32con.WM_SETTEXT, 0,search_text)
+ return
+
+ # Get the selected mail and set the default value for search_text_control to mail.SenderEmailAddress
+ ex = txtProcessor.window.manager.outlook.ActiveExplorer()
+ assert ex.Selection.Count == 1
+ mail = ex.Selection.Item(1)
+ try:
+ search_text = ustr(mail.SenderEmailAddress).encode('iso-8859-1')
+ except Exception,e:
+ pass
+ win32gui.SendMessage(search_box, win32con.WM_SETTEXT, 0, search_text)
+ txtProcessor.init_done=True
+
+def SetNameColumn(listProcessor,*args):
+ hwndList = listProcessor.GetControl()
+ child_ex_style = win32gui.SendMessage(hwndList, commctrl.LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
+ child_ex_style |= commctrl.LVS_EX_FULLROWSELECT
+ win32gui.SendMessage(hwndList, commctrl.LVM_SETEXTENDEDLISTVIEWSTYLE, 0, child_ex_style)
+
+ # set header row
+ lvc = LVCOLUMN(
+ mask = commctrl.LVCF_FMT | commctrl.LVCF_WIDTH | \
+ commctrl.LVCF_TEXT | commctrl.LVCF_SUBITEM
+ )
+ lvc.fmt = commctrl.LVCFMT_LEFT
+ lvc.iSubItem = 1
+ lvc.text = "Document Type"
+ lvc.cx = 100
+ win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
+ lvc.iSubItem = 0
+ lvc.text = "Name"
+ lvc.cx = 240
+ win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
+ listProcessor.init_done = True
+
+def setList(list_hwnd):
+ # Set default list of objects
+ win32gui.SendMessage(list_hwnd, commctrl.LVM_DELETEALLITEMS)
+ for obj in objects_with_match:
+ num_items = win32gui.SendMessage(list_hwnd, commctrl.LVM_GETITEMCOUNT)
+ item = LVITEM(text=obj[2],iItem = num_items)
+ new = win32gui.SendMessage(list_hwnd, commctrl.LVM_INSERTITEM, 0, item.toparam())
+ item = LVITEM(text=obj[3],iItem = new, iSubItem = 1)
+ win32gui.SendMessage(list_hwnd, commctrl.LVM_SETITEM, 0, item.toparam())
+
+def SearchObjectsForText(btnProcessor,*args):
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+
+ search_txt = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ if not search_txt:
+ win32ui.MessageBox("Enter text to search for", "Push to OpenERP", flag_info)
+ return
+ # Get titles from list
+ obj_titles=[]
+ for ch in hwndChk_list:
+ id = ch[0]
+ hwnd = ch[1]
+ chk = win32gui.SendMessage(hwnd, win32con.BM_GETCHECK)
+ if chk:
+ txt = win32gui.GetDlgItemText(btnProcessor.window.hwnd,id)
+ obj_titles.append(txt)
+
+ # Prepare list of objects to search for the seach_keyword
+ obj_list = btnProcessor.window.manager.config['objects']
+ search_list = []
+ try:
+ all_obj_list = NewConn.GetAllObjects()
+ for title in obj_titles:
+ objname = [obj[1] for obj in obj_list if obj[0] == title]
+ if objname:
+ assert len(objname) == 1
+ if objname[0] in all_obj_list:
+ search_list.append(objname[0])
+ else:
+ win32ui.MessageBox("Module %s (%s) not installed. Please install it." \
+ %(title,objname[0]), "Push to OpenERP", flag_excl)
+ return
+
+ # Get the records by searching the objects in search_list for the search_keyword as objects_with_match
+ global objects_with_match
+ list_hwnd = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ if search_list:
+ objects_with_match = NewConn.GetObjectItems(search_list, search_txt)
+ if not objects_with_match:
+ win32ui.MessageBox("No matching records found in checked objects", "Push to OpenERP", flag_info)
+ else:
+ win32ui.MessageBox("No object selected", "Push to OpenERP", flag_info)
+ objects_with_match=[]
+ # Display the objects_with_match records in list
+ setList(list_hwnd)
+ except Exception,e:
+ msg=getMessage(e)
+ win32ui.MessageBox(msg, "Search Text", flag_error)
+
+def CreateContact(btnProcessor,*args):
+ b = check()
+ if not b:
+ return
+
+ partner = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[9])
+ combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[9])
+ sel = win32gui.SendMessage(combo, win32con.CB_GETCURSEL)
+
+ state_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[10])
+ state_sel = win32gui.SendMessage(state_combo, win32con.CB_GETCURSEL)
+ coun_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[11])
+ country_sel = win32gui.SendMessage(coun_combo, win32con.CB_GETCURSEL)
+ name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ email = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ office_no = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
+ mobile_no = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[3])
+ fax = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[4])
+ street = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[5])
+ street2 = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[6])
+ city = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[7])
+ zip = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[8])
+ if not name:
+ win32ui.MessageBox("Please enter name.", "Create Contact", flag_stop)
+ return
+
+ res = {
+ 'name':ustr(name),
+ 'email':ustr(email),
+ 'phone':ustr(office_no),
+ 'mobile':ustr(mobile_no),
+ 'fax':ustr(fax),
+ 'street':ustr(street),
+ 'street2':ustr(street2),
+ 'city':ustr(city),
+ 'zip':ustr(zip)
+ }
+
+ fs_id = c_id = -1
+ if not state_sel == -1 :
+ try:
+ temp = NewConn.GetAllState()
+ i = -1
+ for t in temp:
+ i+=1
+ if i == state_sel:
+ fs_id = t[0]
+ break;
+ res ['state_id'] = fs_id
+ except Exception, e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "New Partner", flag_error)
+ pass
+ if not country_sel == -1 :
+ try:
+ temp = NewConn.GetAllCountry()
+ i = -1
+ for t in temp:
+ i+=1
+ if i == country_sel:
+ c_id = t[0]
+ break;
+ res ['country_id'] = c_id
+ except Exception, e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "Open Contact", flag_error)
+ pass
+ try:
+ id = NewConn.CreateContact(sel, str(res))
+ if not partner:
+ msg="New contact created."
+ else:
+ msg="New contact created for partner '%s'."%partner
+ except Exception,e:
+ msg="Contact not created \n\n" + getMessage(e)
+ win32ui.MessageBox(msg, "Create Contact", flag_error)
+ return
+ win32ui.MessageBox(msg, "Create Contact", flag_info)
+ for i in range(0,9):
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[i], '')
+ win32gui.SendMessage(combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(state_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(coun_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.EndDialog(btnProcessor.window.hwnd, btnProcessor.id)
+
+def SetAllText(txtProcessor,*args):
+ # Set values for url, uname, pwd from config file
+ url = NewConn.getitem('_uri')
+ tbox = txtProcessor.GetControl()
+ win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(url))
+ k=win32gui.GetDlgItemText(txtProcessor.window.hwnd, txtProcessor.control_id)
+ uname = NewConn.getitem('_uname')
+ tbox = txtProcessor.GetControl(txtProcessor.other_ids[0])
+ win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(uname))
+
+def SetDefaultList(listProcessor,*args):
+ import win32api
+ hwndList = listProcessor.GetControl()
+
+ # set full row select style
+ child_ex_style = win32gui.SendMessage(hwndList, commctrl.LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
+ child_ex_style |= commctrl.LVS_EX_FULLROWSELECT
+ win32gui.SendMessage(hwndList, commctrl.LVM_SETEXTENDEDLISTVIEWSTYLE, 0, child_ex_style)
+
+ # set header row
+ lvc = LVCOLUMN(
+ mask = commctrl.LVCF_FMT | commctrl.LVCF_WIDTH | \
+ commctrl.LVCF_TEXT | commctrl.LVCF_SUBITEM
+ )
+ lvc.fmt = commctrl.LVCFMT_LEFT
+ lvc.iSubItem = 1
+ lvc.text = "Object Name"
+ lvc.cx = 315
+ win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
+ lvc.iSubItem = 0
+ lvc.text = "Document Title"
+ lvc.cx = 315
+ win32gui.SendMessage(hwndList, commctrl.LVM_INSERTCOLUMN, 0, lvc.toparam())
+
+ #create imagelist
+ global il
+ il = win32gui.ImageList_Create(
+ win32api.GetSystemMetrics(win32con.SM_CXSMICON),
+ win32api.GetSystemMetrics(win32con.SM_CYSMICON),
+ commctrl.ILC_COLOR32 | commctrl.ILC_MASK,
+ 1, # initial size
+ 0) # cGrow
+
+ win32gui.SendMessage(hwndList, commctrl.LVM_SETIMAGELIST,\
+ commctrl.LVSIL_SMALL, il)
+ # Set objects from config
+ objs = eval(NewConn.getitem('_obj_list'))
+ load_bmp_flags=win32con.LR_LOADFROMFILE | win32con.LR_LOADTRANSPARENT
+ for obj in objs:
+ image_path = os.path.join(listProcessor.window.manager.application_directory, "dialogs\\resources\\openerp_logo1.bmp")
+ path=obj[2]
+ if path:
+ image_path = path
+ try:
+ hicon = win32gui.LoadImage(0, image_path,win32con.IMAGE_BITMAP, 40, 40, load_bmp_flags)
+ except Exception, e:
+ msg = "Problem loading the image \n\n" + getMessage(e)
+ hicon = None
+ win32ui.MessageBox(msg, "Load Image", flag_error)
+
+ #Add the object in the list
+ win32gui.ImageList_Add(il,hicon,0)
+ cnt = win32gui.ImageList_GetImageCount(il)
+ num_items = win32gui.SendMessage(hwndList, commctrl.LVM_GETITEMCOUNT)
+ item = LVITEM(text=obj[0],iImage=cnt-2, iItem = num_items)
+ new_index = win32gui.SendMessage(hwndList, commctrl.LVM_INSERTITEM, 0, item.toparam())
+ item = LVITEM(text=obj[1], iItem = new_index, iSubItem = 1)
+ win32gui.SendMessage(hwndList, commctrl.LVM_SETITEM, 0, item.toparam())
+
+def SetDefaultContact(txtProcessor,*args):
+ # Acquiring the control of the text box
+ txt_name = txtProcessor.GetControl()
+ txt_email = txtProcessor.GetControl(txtProcessor.other_ids[0])
+
+ global name
+ global email
+ if txtProcessor.init_done:
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.control_id,name)
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[0],email)
+ return
+ #
+ try:
+ mail = GetMail(txtProcessor)
+ name = ustr(mail.SenderName).encode('iso-8859-1')
+ email = ustr(mail.SenderEmailAddress).encode('iso-8859-1')
+ except Exception,e:
+ pass
+
+ fs_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[1])
+ c_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[2])
+ win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.control_id,name)
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[0],email)
+ txtProcessor.init_done = True
+
+def setCheckList(groupProcessor,*args):
+ try:
+ child_style = win32con.BS_AUTOCHECKBOX | win32con.WS_TABSTOP
+ hinst = win32gui.dllhandle
+ objs = groupProcessor.window.manager.config['objects']
+ ins_objs = NewConn.GetAllObjects()
+ left = 20
+ top = 60
+ cnt=0
+ id=4001
+ id1=6001
+ load_bmp_flags=win32con.LR_LOADFROMFILE | win32con.LR_LOADTRANSPARENT
+ if groupProcessor.init_done:
+ return
+ else:
+ for obj in objs:
+ if obj[1] in ins_objs:
+ groupProcessor.init_done = True
+ #Add image
+ hwndImg = win32gui.CreateWindowEx(0, "STATIC","",
+ win32con.SS_CENTERIMAGE | win32con.SS_REALSIZEIMAGE | win32con.SS_BITMAP | win32con.WS_CHILD | win32con.WS_VISIBLE,
+ left,top+3,13,13,
+ groupProcessor.window.hwnd,
+ id,
+ 0,
+ None
+ );
+ image_path = os.path.join(groupProcessor.window.manager.application_directory, "dialogs\\resources\\openerp_logo1.bmp")
+ if obj[2]:
+ image_path = obj[2]
+ try:
+ hicon = win32gui.LoadImage(0, image_path, win32con.IMAGE_BITMAP, 40, 40, load_bmp_flags)
+ except Exception,e:
+ msg="Problem loading the image \n\n" + getMessage(e)
+ hicon = None
+ win32ui.MessageBox(msg, "Load Image", flag_error)
+
+ win32gui.SendMessage(hwndImg, win32con.STM_SETIMAGE, win32con.IMAGE_BITMAP, hicon);
+ #Add Checkbox
+ left+= 17
+ hwndChk = win32gui.CreateWindowEx(
+ 0,"BUTTON",obj[0],win32con.WS_VISIBLE | win32con.WS_CHILD | \
+ win32con.BS_AUTOCHECKBOX | win32con.WS_TABSTOP | win32con.BST_CHECKED, \
+ left, top, 130,20,groupProcessor.window.hwnd,id1,hinst,None
+ )
+ if obj[1] in ['res.partner','res.partner.address']:
+ win32gui.SendMessage(hwndChk , win32con.BM_SETCHECK, 1, 0);
+ hwndChk_list.append((id1,hwndChk))
+
+ cnt=cnt+1
+ id+=1
+ id1+=1
+ left+=17
+ win32gui.UpdateWindow(hwndImg)
+ left+=140
+ if cnt > 1:
+ left = 20
+ top+=18
+ cnt=0
+ except Exception, e:
+ win32ui.MessageBox(str(e), 'Push to OpenERP')
+
+def CreatePartner(btnProcessor,*args):
+ #Check if server running or user logged in
+ b = check()
+ if not b:
+ return
+
+ partner_name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ if not partner_name:
+ win32ui.MessageBox("Please enter Partner name.", "Create Partner", flag_excl)
+ return
+ res = {'name':ustr(partner_name)}
+ try:
+ id = NewConn.CreatePartner(str(res))
+ except Exception,e:
+ msg="Partner not created \n\n" + getMessage(e)
+ win32ui.MessageBox(msg, "Create Partner", flag_error)
+ return
+ if id:
+ win32ui.MessageBox("New Partner '%s' created."%partner_name, "Create Partner", flag_info)
+ win32gui.EndDialog(btnProcessor.window.hwnd, btnProcessor.id)
+ else:
+ win32ui.MessageBox("Partner '%s' already Exists."%partner_name, "Create Partner", flag_info)
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0],'')
+
+def set_search_text(dialogProcessor,*args):
+ global search_text
+ search_text = win32gui.GetDlgItemText(dialogProcessor.window.hwnd, dialogProcessor.other_ids[0])
+ return
+
+def set_name_email(dialogProcessor,*args):
+ global name
+ global email
+ name = win32gui.GetDlgItemText(dialogProcessor.window.hwnd, dialogProcessor.other_ids[0])
+ email = win32gui.GetDlgItemText(dialogProcessor.window.hwnd, dialogProcessor.other_ids[1])
+
+def GetDefaultEmail(txtProcessor,*args):
+
+ from win32com.client import Dispatch
+ import win32con
+ b = check()
+ if not b:
+ return
+ #Acquiring control of the text box
+ search_partner_box = txtProcessor.GetControl()
+ global search_partner_text
+ if txtProcessor.init_done:
+ win32gui.SendMessage(search_partner_box, win32con.WM_SETTEXT, 0,search_partner_text)
+ return
+ #Reading Current Selected Email.
+ ex = txtProcessor.window.manager.outlook.ActiveExplorer()
+ assert ex.Selection.Count == 1
+ mail = ex.Selection.Item(1)
+ #Fetching Sender MailID from Selected Mail
+ try:
+ search_partner_text = ustr(mail.SenderEmailAddress).encode('iso-8859-1')
+ except Exception,e:
+ win32ui.MessageBox("Error In reading email ID from Email ","Open Contact", flag_error)
+ pass
+ win32gui.SendMessage(search_partner_box, win32con.WM_SETTEXT, 0, search_partner_text)
+
+ fs_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[10])
+ c_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[11])
+ partner_combo = win32gui.GetDlgItem(txtProcessor.window.hwnd, txtProcessor.other_ids[0])
+ vals = []
+ #Searching the res.partner.address for contact based on Sender Mail ID.
+ vals = NewConn.SearchPartnerDetail(search_partner_text)
+ #If no user Found.
+ if vals == None:
+ for i in range(1,10):
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[i], "")
+ win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
+ win32ui.MessageBox("No matching records found for : "+str(search_partner)+".","Open Contact", flag_excl)
+ return
+ else:
+ #If user Found than Setting the Value for the contact in fields.
+ for i in range(1,10):
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[i], "")
+ win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
+
+ for val in vals:
+
+ if val[0] == 'partner_id':
+ temp = list (NewConn.GetPartners())
+ i = -1
+ for t in temp:
+ i+=1
+ if t[1] == val[1][1] :
+ win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, i )
+ if val[0] == 'name' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[1], str(val[1]))
+
+ if val[0] == 'street' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[2], str(val[1]))
+
+ if val[0] == 'street2' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[3], str(val[1]))
+
+ if val[0] == 'zip' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[9], str(val[1]))
+
+ if val[0] == 'city' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[4], str(val[1]))
+
+ if val[0] == 'state_id' and val[1] != False :
+ id = i = -1
+ temp = list(NewConn.GetAllState())
+ for t in temp:
+ i+=1
+ if str(t[1]) == str(val[1][1]):
+ id = i
+ break;
+ sel = win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, id )
+
+ if val[0] == 'country_id' and val[1] != False :
+ id = i = -1
+ temp = list(NewConn.GetAllCountry())
+ for t in temp:
+ i+=1
+ if str(t[1]) == str(val[1][1]):
+ id = i
+ break;
+ sel = win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, id )
+
+ if val[0] == 'phone' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[5], str(val[1]))
+
+ if val[0] == 'mobile' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[6], str(val[1]))
+
+ if val[0] == 'fax' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[7], str(val[1]))
+
+ if val[0] == 'email' and val[1] != False :
+ win32gui.SetDlgItemText(txtProcessor.window.hwnd, txtProcessor.other_ids[8], str(val[1]))
+
+ txtProcessor.init_done=True
+
+def SearchPartner(btnProcessor,*args):
+ b = check()
+ if not b:
+ return
+ #hwnd For the List box
+ fs_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[11])
+ c_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[12])
+ partner_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ try :
+ search_partner = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ if not search_partner:
+ win32ui.MessageBox("Please enter email id to search for.", "Open Contact", flag_excl)
+ return
+ vals = []
+ #Searching the contact.
+ vals = NewConn.SearchPartnerDetail(search_partner)
+ #if contact not found resetting all field to blank
+ if vals == None:
+ for i in range(2,11):
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[i], "")
+ win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
+ win32ui.MessageBox("No matching records found for : "+str(search_partner)+".","Open Contact", flag_excl)
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], "")
+ return
+ #if contact found than setting the values for the contact.
+ else:
+ for i in range(2,11):
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[i], "")
+ win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, -1 )
+ win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, -1 )
+ for val in vals:
+ if val[0] == 'partner_id':
+ #Finding the partner index in list and setting it.
+ temp = list (NewConn.GetPartners())
+ i = -1
+ for t in temp:
+ i+=1
+ if t[1] == val[1][1] :
+ win32gui.SendMessage(partner_combo, win32con.CB_SETCURSEL, i )
+
+ if val[0] == 'name' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2], str(val[1]))
+
+ if val[0] == 'street' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[3], str(val[1]))
+
+ if val[0] == 'street2' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[4], str(val[1]))
+
+ if val[0] == 'zip' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[10], str(val[1]))
+
+ if val[0] == 'city' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[5], str(val[1]))
+
+ if val[0] == 'state_id' and val[1] != False :
+ #Finding the state index in list and setting it.
+ id = i = -1
+ temp = list(NewConn.GetAllState())
+ for t in temp:
+ i+=1
+ if str(t[1]) == str(val[1][1]):
+ id = i
+ break;
+ sel = win32gui.SendMessage(fs_combo, win32con.CB_SETCURSEL, id )
+
+ if val[0] == 'country_id' and val[1] != False :
+ #Finding the country index in list and setting it.
+ id = i = -1
+ temp = list(NewConn.GetAllCountry())
+ for t in temp:
+ i+=1
+ if str(t[1]) == str(val[1][1]):
+ id = i
+ break;
+ sel = win32gui.SendMessage(c_combo, win32con.CB_SETCURSEL, id )
+
+ if val[0] == 'phone' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[6], str(val[1]))
+
+ if val[0] == 'mobile' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[7], str(val[1]))
+
+ if val[0] == 'fax' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[8], str(val[1]))
+
+ if val[0] == 'email' and val[1] != False :
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[9], str(val[1]))
+
+ win32gui.SetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[0], "")
+ except Exception,e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "Open Contact", flag_error)
+ pass
+
+def WritePartner(btnProcessor,*args):
+ new_vals=[]
+ #Reading new value of the fields.
+ contect_name = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[1])
+ street = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[2])
+ street2 = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[3])
+ city = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[4])
+ phone = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[7])
+ mobile = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[8])
+ fax = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[9])
+ email = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[10])
+ zip = win32gui.GetDlgItemText(btnProcessor.window.hwnd, btnProcessor.other_ids[11])
+ country_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[6])
+ country_sel = win32gui.SendMessage(country_combo, win32con.CB_GETCURSEL)
+ state_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[5])
+ state_sel = win32gui.SendMessage(state_combo, win32con.CB_GETCURSEL)
+ partner_combo = win32gui.GetDlgItem(btnProcessor.window.hwnd, btnProcessor.other_ids[0])
+ partner_sel = win32gui.SendMessage(partner_combo, win32con.CB_GETCURSEL)
+ #Checking that record not being saved without name or Partner
+ if contect_name.strip() == "":
+ win32ui.MessageBox("Please enter partner Contact Name name.", "Open Contact", flag_excl)
+ return
+ if partner_sel < 1:
+ win32ui.MessageBox("Please Select Partner From list.", "Open Contact", flag_excl)
+ return
+ fs_id = c_id = p_id = -1
+ #Finding the partner index in list finding it record ID.
+ if not partner_sel < 0 :
+ try:
+ temp = NewConn.GetPartners()
+ i = -1
+ for t in temp:
+ i+=1
+ if i == partner_sel:
+ p_id = t[0]
+ break;
+ except Exception, e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "Open Contact", flag_error)
+ pass
+ #Finding the State index in list finding it record ID.
+ if not state_sel == -1 :
+ try:
+ temp = NewConn.GetAllState()
+ i = -1
+ for t in temp:
+ i+=1
+ if i == state_sel:
+ fs_id = t[0]
+ break;
+ except Exception, e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "Open Contact", flag_error)
+ pass
+ #Finding the country index in list finding it record ID.
+ if not country_sel == -1 :
+ try:
+ temp = NewConn.GetAllCountry()
+ i = -1
+ for t in temp:
+ i+=1
+ if i == country_sel:
+ c_id = t[0]
+ break;
+ except Exception, e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "Open Contact", flag_error)
+ pass
+ # Creating a list to write the values to the OpenERP
+ new_vals.append(['partner_id',p_id])
+ new_vals.append(['name',contect_name])
+ new_vals.append(['street',street])
+ new_vals.append(['street2',street2])
+ new_vals.append(['city',city])
+ new_vals.append(['state_id',fs_id])
+ new_vals.append(['country_id',c_id])
+ new_vals.append(['phone',phone])
+ new_vals.append(['mobile',mobile])
+ new_vals.append(['email',email])
+ new_vals.append(['fax',fax])
+ new_vals.append(['zip',zip])
+ flag = 0
+ try:
+ #writing the updated values to the Server.
+ flag = NewConn.WritePartnerValues(new_vals)
+ except Exception,e:
+ msg = getMessage(e)
+ win32ui.MessageBox(msg, "Open Contact", flag_error)
+ pass
+ if flag == 1:
+ win32ui.MessageBox("Changes have been Updated Successfully.", "Open Contact", flag_info)
+ elif flag == 0:
+ win32ui.MessageBox("Error in Updating the Changes.\n Please check the Database Connection.", "Open Contact", flag_error)
+ elif flag == -1:
+ win32ui.MessageBox("Contact can not be Save.\nFirst select contact using Search.","Open Contact", flag_info)
+
+
+
+dialog_map = {
+ "IDD_MANAGER" : (
+ (CancelButtonProcessor, "IDCANCEL", resetConnAttribs, ()),
+ (TabProcessor, "IDC_TAB IDC_LIST",
+ """IDD_GENERAL IDD_OBJECT_SETTINGS IDD_ABOUT"""),
+ (DoneButtonProcessor, "ID_DONE"),
+ ),
+
+ "IDD_GENERAL": (
+ (DBComboProcessor, "ID_DB_DROPDOWNLIST", GetConn, ()),
+ (TextProcessor, "ID_SERVER_PORT ID_USERNAME ID_PASSWORD", SetAllText, ()),
+ (CommandButtonProcessor, "ID_BUT_TESTCONNECTION ID_DB_DROPDOWNLIST ID_USERNAME \
+ ID_PASSWORD", TestConnection, ()),
+ (CommandButtonProcessor, "IDC_RELOAD", ReloadAllControls, ()),
+ (DialogCommand, "IDC_BUT_SET_SERVER_PORT", "IDD_SERVER_PORT_DIALOG"),
+ ),
+
+ "IDD_OBJECT_SETTINGS" : (
+ (CommandButtonProcessor, "IDC_BUT_LOAD_IMAGE IDC_IMAGE_PATH", GetImagePath, ()),
+ (CommandButtonProcessor, "IDC_BUT_SAVE_OBJECT IDC_OBJECT_TITLE IDC_OBJECT_NAME \
+ IDC_IMAGE_PATH IDC_LIST", AddNewObject, ()),
+ (CommandButtonProcessor, "IDC_BUT_DEL_OBJECT IDC_LIST", DeleteSelectedObjects, ()),
+ (ListBoxProcessor, "IDC_LIST", SetDefaultList, ())
+ ),
+
+ "IDD_ABOUT" : (
+ (ImageProcessor, "IDB_OPENERPLOGO"),
+ (MessageProcessor, "IDC_ABOUT"),
+ ),
+
+ "IDD_SERVER_PORT_DIALOG" : (
+ (CloseButtonProcessor, "IDCANCEL"),
+ (OKButtonProcessor, "IDOK ID_SERVER ID_PORT IDR_XML_PROTOCOL"),
+ (RadioButtonProcessor, "IDR_XML_PROTOCOL", GetConn, ()),
+ (RadioButtonProcessor, "IDR_XMLS_PROTOCOL", GetConn, ()),
+ (RadioButtonProcessor, "IDR_NETRPC_PROTOCOL", GetConn, ()),
+ ),
+
+ "IDD_SYNC" : (
+ (CommandButtonProcessor, "ID_SEARCH ID_SEARCH_TEXT IDC_NAME_LIST", SearchObjectsForText,()),
+ (GroupProcessor, "IDC_STATIC_GROUP", setCheckList, ()),
+ (CSComboProcessor, "ID_ATT_METHOD_DROPDOWNLIST", GetConn,()),
+ (TextProcessor, "ID_SEARCH_TEXT", GetSearchText, ()),
+ (DialogCommand, "ID_CREATE_CONTACT ID_SEARCH_TEXT", "IDD_NEW_CONTACT_DIALOG", set_search_text, ()),
+ (CloseButtonProcessor, "IDCANCEL"),
+ (CommandButtonProcessor, "ID_MAKE_ATTACHMENT IDC_NAME_LIST IDD_SYNC", MakeAttachment, ()),
+ (CommandButtonProcessor, "ID_CREATE_CASE ID_ATT_METHOD_DROPDOWNLIST IDC_NAME_LIST", CreateCase, ()),
+ (ListBoxProcessor, "IDC_NAME_LIST", SetNameColumn, ())
+ ),
+
+ "IDD_NEW_CONTACT_DIALOG" : (
+ (PartnersComboProcessor, "ID_PARTNER_DROPDOWNLIST", GetConn, ()),
+ (CountryComboProcessor, "ID_COUNTRY_DROPLIST", GetConn, ()),
+ (StateComboProcessor, "ID_FED_STATE_DROPLIST", GetConn, ()),
+ (CloseButtonProcessor, "IDCANCEL"),
+ (CommandButtonProcessor, "ID_CONTACT_SAVE_BUTTON ID_CONTACT_NAME_TEXT ID_CONTACT_EMAIL_TEXT ID_CONTACT_OFFICE_TEXT ID_CONTACT_MOBILE_TEXT ID_FAX_TEXT ID_STREET_TEXT ID_STREET2_TEXT ID_PARTNER_CITY_TEXT ID_ZIP_TEXT ID_PARTNER_DROPDOWNLIST ID_FED_STATE_DROPLIST ID_COUNTRY_DROPLIST", CreateContact, ()),
+ (TextProcessor, "ID_CONTACT_NAME_TEXT ID_CONTACT_EMAIL_TEXT ID_FED_STATE_DROPLIST ID_COUNTRY_DROPLIST" , SetDefaultContact, ()),
+ (DialogCommand, "ID_NEW_PARTNER_BUTTON ID_CONTACT_NAME_TEXT ID_CONTACT_EMAIL_TEXT", "IDD_NEW_PARTNER_DIALOG", set_name_email, ()),
+ ),
+
+ "IDD_NEW_PARTNER_DIALOG" : (
+ (CloseButtonProcessor, "IDCANCEL"),
+ (CommandButtonProcessor, "ID_SAVE_PARTNER_BUTTON ID_PARTNER_NAME_TEXT", CreatePartner, ()),
+ ),
+
+ "IDD_VIEW_PARTNER_DIALOG" : (
+ (PartnersComboProcessor, "ID_PARTNER_DROPLIST", GetConn, ()),
+ (StateComboProcessor, "ID_ALL_STATE_DROPDOWNLIST", GetConn, ()),
+ (CountryComboProcessor, "ID_ALL_COUNTRY_DROPDOWNLIST", GetConn, ()),
+ (TextProcessor, "IDET_SEARCH_PARTNER ID_PARTNER_DROPLIST IDET_PARTNER_CONTACT_NAME IDET_PARTNER_STREET IDET_PARTNER_STREET2 IDET_PARTNER_CITY IDET_PARTNER_OFFICENO IDET_PARTNER_MOBILENO IDET_PARTNER_EMAIL IDET_PARTNER_FAX IDET_ZIP ID_ALL_STATE_DROPDOWNLIST ID_ALL_COUNTRY_DROPDOWNLIST", GetDefaultEmail, ()),
+ (CommandButtonProcessor, "IDPB_SEARCH_PARTNER IDET_SEARCH_PARTNER ID_PARTNER_DROPLIST IDET_PARTNER_CONTACT_NAME IDET_PARTNER_STREET IDET_PARTNER_STREET2 IDET_PARTNER_CITY IDET_PARTNER_OFFICENO IDET_PARTNER_MOBILENO IDET_PARTNER_EMAIL IDET_PARTNER_FAX IDET_ZIP ID_ALL_STATE_DROPDOWNLIST ID_ALL_COUNTRY_DROPDOWNLIST", SearchPartner, ()),
+ (CommandButtonProcessor, "IDPB_WRITE_CHANGES ID_PARTNER_DROPLIST IDET_PARTNER_CONTACT_NAME IDET_PARTNER_STREET IDET_PARTNER_STREET2 IDET_PARTNER_CITY ID_ALL_STATE_DROPDOWNLIST ID_ALL_COUNTRY_DROPDOWNLIST IDET_PARTNER_OFFICENO IDET_PARTNER_MOBILENO IDET_PARTNER_EMAIL IDET_PARTNER_FAX IDET_ZIP", WritePartner, ()),
+ (CloseButtonProcessor, "IDCANCEL"),
+ (DialogCommand, "ID_NEW_PART_BUTTON", "IDD_NEW_PARTNER_DIALOG" ),
+ (DialogCommand, "IDPB_NEWPARTNER_BUTTON" , "IDD_NEW_CONTACT_DIALOG")
+ ),
+}
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgcore.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgcore.py
index 40603d9d60a..efccf4f494e 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgcore.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgcore.py
@@ -1,6 +1,10 @@
# A core, data-driven dialog.
# Driven completely by "Control Processor" objects.
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
import win32gui, win32api, win32con
import commctrl
import struct, array
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgutils.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgutils.py
index 44d83f2d88d..8ffc4e62d22 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgutils.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/dlgutils.py
@@ -1,5 +1,9 @@
# Generic utilities for dialog functions.
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
def MAKELONG(l,h):
return ((h & 0xFFFF) << 16) | (l & 0xFFFF)
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/opt_processors.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/opt_processors.py
index 4397f27a609..ae21ba1c538 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/opt_processors.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/opt_processors.py
@@ -2,18 +2,39 @@
# These are extensions to basic Control Processors that are linked with
# Outlook-Plugin options.
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
+# -*- 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 win32gui, win32api, win32con, win32ui
import commctrl
import struct, array
from dlgutils import *
import xmlrpclib
-
import processors
-
verbose = 0 # set to 1 to see option values fetched and set.
-
# A ControlProcessor that is linked up with options. These get a bit smarter.
-
class OptionControlProcessor(processors.ControlProcessor):
def __init__(self, window, control_ids):
processors.ControlProcessor.__init__(self, window, control_ids)
@@ -204,8 +225,8 @@ class CSComboProcessor(ComboProcessor):
try:
list=['CRM Lead']#, 'CRM Helpdesk', 'CRM Lead', 'CRM Meeting', 'CRM Opportunity', 'CRM Phonecall']
objlist = conn.GetAllObjects()
- if 'crm.claim' in objlist:
- list.append('CRM Claim')
+# if 'crm.claim' in objlist:
+# list.append('CRM Claim')
if 'crm.helpdesk' in objlist:
list.append('CRM Helpdesk')
if 'crm.fundraising' in objlist:
@@ -284,4 +305,4 @@ class GroupProcessor(OptionControlProcessor):
def UpdateControl_FromValue(self):
pass
def UpdateValue_FromControl(self):
- pass
+ pass
\ No newline at end of file
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/processors.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/processors.py
index 6c17fb51c41..0b427852c89 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/processors.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/processors.py
@@ -1,5 +1,30 @@
# Control Processors for our dialog.
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
+# -*- 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 win32gui, win32api, win32con
import commctrl
import struct, array
@@ -87,21 +112,6 @@ class RadioButtonProcessor(ControlProcessor):
conn.setitem('protocol', text)
p=conn.getitem('protocol')
-# def OnCommand(self, wparam, lparam):
-# win32ui.MessageBox("clicked===",'')
-# code = win32api.HIWORD(wparam)
-# id = win32api.LOWORD(wparam)
-# win32ui.MessageBox("clicked===",'')
-# if code == win32con.BN_CLICKED:
-# win32ui.MessageBox("clicked===",'')
-# import win32ui
-# conn = self.func()
-# win32ui.MessageBox("clicked===",'')
-# text=win32gui.GetDlgItemText(self.window.hwnd, self.control_id)
-# win32ui.MessageBox("clicked===",'')
-# conn.setitem('protocol', text)
-# win32ui.MessageBox("clicked==="+text,'')
-
class CloseButtonProcessor(ButtonProcessor):
def OnClicked(self, id):
win32gui.EndDialog(self.window.hwnd, id)
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/__init__.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/__init__.py
index cf0b8ec9340..abeff9ae69b 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/__init__.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/__init__.py
@@ -1,3 +1,7 @@
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
# Package that manages and defines dialog resources
def GetImageParamsFromBitmapID(rc_parser, bmpid):
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.py b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.py
index 6e277297356..81bf5d8b1e6 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.py
@@ -1,9 +1,9 @@
-#C:\Python26\openerp-outlook-plugin\plugin_trunk\dialogs\resources\dialogs.py
-#This is a generated file. Please edit C:\Python26\openerp-outlook-plugin\plugin_trunk\dialogs\resources\dialogs.rc instead.
-_rc_size_=11427
-_rc_mtime_=1280992064
+#C:\Documents and Settings\TinyERP\Desktop\OpenERP-Outlook-PlugIn\openerp-outlook-plugin\dialogs\resources\dialogs.py
+#This is a generated file. Please edit C:\Documents and Settings\TinyERP\Desktop\OpenERP-Outlook-PlugIn\openerp-outlook-plugin\dialogs\resources\dialogs.rc instead.
+_rc_size_=11409
+_rc_mtime_=1285078254
class FakeParser:
- dialogs = {'IDD_VIEW_PARTNER_DIALOG': [['Open Contact', (0, 0, 350, 215), -1865940928, 1024, (8, 'Tahoma')], [130, 'Email ID : ', -1, (32, 17, 40, 12), 1342177280], [129, '', 2051, (70, 15, 200, 12), 1350631552], [128, 'Search Partner ', 2052, (280, 15, 60, 14), 1342242816], [130, 'Partner Name : ', -1, (13, 42, 50, 17), 1342177280], [133, '', 2069, (70, 42, 200, 80), 1344339971], [128, 'New Partner', 2070, (280, 41, 60, 14), 1342242816], [128, 'Postal Address ', 2024, (10, 65, 175, 125), 1342177287], [130, 'Contact Name : ', -1, (18, 83, 50, 17), 1342177280], [129, '', 2046, (76, 82, 100, 12), 1350631552], [130, 'Street : ', -1, (18, 97, 50, 17), 1342177280], [129, '', 2053, (76, 96, 100, 12), 1350631552], [130, 'Street2 : ', -1, (18, 112, 50, 17), 1342177280], [129, '', 2054, (76, 111, 100, 12), 1350631552], [130, 'Zip : ', -1, (18, 126, 50, 14), 1342177280], [129, '', 40010, (76, 125, 100, 12), 1350631552], [130, 'City : ', -1, (18, 140, 50, 17), 1342177280], [129, '', 40011, (76, 139, 100, 12), 1350631552], [130, 'Fed. State : ', -1, (18, 154, 50, 17), 1342177280], [133, '', 2060, (76, 153, 100, 50), 1344339971], [130, 'Country :', -1, (18, 169, 35, 17), 1342177280], [133, '', 2061, (76, 168, 100, 50), 1344339971], [128, 'Communication ', 2024, (188, 65, 152, 125), 1342177287], [130, 'Phone : ', -1, (194, 83, 30, 17), 1342177280], [129, '', 2048, (224, 82, 100, 12), 1350631552], [130, 'Mobile : ', -1, (194, 97, 30, 17), 1342177280], [129, '', 2050, (224, 96, 100, 12), 1350631552], [130, 'Email : ', -1, (194, 111, 30, 17), 1342177280], [129, '', 2058, (224, 110, 100, 12), 1350568064], [130, 'Fax : ', -1, (194, 125, 30, 17), 1342177280], [129, '', 2047, (224, 124, 100, 12), 1350631552], [128, 'Create a New Contact', 2071, (124, 195, 82, 14), 1342242816], [128, 'Save', 2059, (213, 195, 60, 14), 1342242816], [128, 'Cancel', 2, (281, 195, 60, 14), 1342242816]], 'IDD_GENERAL': [['Connection Parameters', (0, 0, 430, 210), 1355284544, None, (8, 'Tahoma')], [128, '', 2024, (10, 10, 250, 130), 1342177287], [130, 'Server : ', -1, (30, 30, 100, 17), 1342177280], [129, '', 2003, (85, 30, 120, 12), 1350633472], [128, 'Change', 2021, (210, 30, 30, 13), 1342242816], [130, 'Database : ', -1, (30, 50, 100, 17), 1342177280], [133, '', 2004, (85, 50, 120, 40), 1344339971], [128, 'Reload', 2038, (210, 50, 30, 13), 1342242816], [130, 'Username : ', -1, (30, 70, 100, 17), 1342177280], [129, '', 2005, (85, 70, 154, 12), 1350631552], [130, 'Password : ', -1, (30, 90, 100, 17), 1342177280], [129, '', 2006, (85, 90, 154, 12), 1350631584], [128, 'Connect', 2007, (179, 110, 60, 13), 1342242816]], 'IDD_OBJECT_SETTINGS': [['Documents Setting', (0, 0, 430, 210), 1355284672, 1024, (8, 'Tahoma')], [128, 'Document Attributes', 2024, (2, 2, 340, 32), 1342177287], [130, 'Title', -1, (6, 15, 30, 17), 1342177280], [129, '', 2013, (20, 14, 57, 12), 1350631552], [130, 'Document Name', -1, (83, 15, 60, 17), 1342177280], [129, '', 2014, (138, 14, 57, 12), 1350631552], [130, 'Image', -1, (200, 15, 20, 17), 1342177280], [129, '', 2015, (220, 14, 57, 12), 1350631552], [128, 'Load Image', 2010, (286, 13, 50, 15), 1342242816], [128, 'Add', 2011, (347, 13, 38, 15), 1342242816], [128, 'Remove', 2012, (391, 13, 38, 15), 1342242816], ['SysListView32', 'List1', 2016, (8, 40, 535, 160), 1353711657]], 'IDD_NEW_PARTNER_DIALOG': [['Create a New Partner', (0, 0, 140, 40), -1865940928, 1024, (8, 'Tahoma')], [130, 'Name : ', -1, (5, 3, 100, 17), 1342177280], [129, '', 2036, (40, 3, 94, 12), 1350631552], [128, 'Cancel', 2, (90, 22, 45, 14), 1342242816], [128, 'Save', 2035, (40, 22, 45, 14), 1342242817]], 'IDD_MANAGER': [['OpenERP Configuarion', (0, 0, 460, 260), -1865940800, None, (8, 'Tahoma')], [128, 'Cancel', 2008, (400, 239, 50, 14), 1342177281], ['SysTabControl32', '', 1068, (8, 7, 440, 228), 1342177280], ['SysListView32', '', 2016, (0, 0, 0, 0), 1353711657]], 'IDD_ABOUT': [['About', (0, 0, 430, 210), 1355284672, 1024, (8, 'Tahoma')], [128, 'About Plugin', -1, (7, 3, 422, 200), 1342177287], [130, '1062', 1062, (60, 30, 20, 20), 1342179342], [130, '', 2028, (80, 90, 250, 100), 1342177280]], 'IDD_NEW_CONTACT_DIALOG': [['Create a New Contact', (0, 0, 350, 190), -1865940928, 1024, (8, 'Tahoma')], [130, 'Select Partner : ', -1, (13, 20, 50, 17), 1342177280], [133, '', 2032, (70, 18, 200, 80), 1344339971], [128, 'New Partner', 2033, (280, 17, 55, 14), 1342242816], [128, 'Postal Address ', 2024, (10, 35, 175, 125), 1342177287], [130, 'Contact Name : ', -1, (18, 53, 100, 17), 1342177280], [129, '', 40005, (76, 52, 100, 12), 1350631552], [130, 'Street : ', -1, (18, 67, 40, 17), 1342177280], [129, '', 2062, (76, 66, 100, 12), 1350631552], [130, 'Street2 : ', -1, (18, 81, 40, 17), 1342177280], [129, '', 2063, (76, 80, 100, 12), 1350631552], [130, 'Zip : ', -1, (18, 94, 50, 17), 1342177280], [129, '', 2068, (76, 93, 100, 12), 1350631552], [130, 'City : ', -1, (18, 108, 50, 17), 1342177280], [129, '', 2067, (76, 107, 100, 12), 1350631552], [130, 'Fed. State : ', -1, (18, 123, 40, 17), 1342177280], [133, '', 2064, (76, 122, 100, 80), 1344339971], [130, 'Country : ', -1, (18, 137, 40, 17), 1342177280], [133, '', 2065, (76, 136, 100, 80), 1344339971], [128, 'Communication ', 2024, (188, 35, 150, 125), 1342177287], [130, 'Office : ', -1, (194, 53, 30, 17), 1342177280], [129, '', 40006, (224, 52, 100, 12), 1350631552], [130, 'Mobile : ', -1, (194, 67, 30, 17), 1342177280], [129, '', 40007, (224, 66, 100, 12), 1350631552], [130, 'Fax : ', -1, (194, 81, 30, 17), 1342177280], [129, '', 2066, (224, 80, 100, 12), 1350631552], [130, 'Email : ', -1, (194, 95, 30, 17), 1342177280], [129, '', 40008, (224, 94, 100, 12), 1350631552], [128, 'Cancel', 2, (290, 170, 45, 14), 1342242816], [128, 'Save', 40009, (240, 170, 45, 14), 1342242816]], 'IDD_SERVER_PORT_DIALOG': [['OpenERP Connection', (0, 0, 160, 55), -1865940928, 1024, (8, 'Tahoma')], [130, 'Server : ', -1, (5, 3, 150, 17), 1342177280], [129, '', 2001, (40, 3, 100, 12), 1350631552], [130, 'Port : ', -1, (5, 18, 100, 17), 1342177280], [129, '', 2002, (40, 18, 100, 12), 1350631552], [128, 'Close', 2, (110, 35, 45, 14), 1342242816], [128, 'OK', 1, (60, 35, 45, 14), 1342242817]], 'IDD_SYNC': [['Archive to OpenERP', (0, 0, 470, 320), -1865940928, 1024, (8, 'Tahoma')], [128, ' Link to an Existing Documents ', 2024, (8, 5, 250, 290), 1342242823], [130, 'Search for : ', -1, (15, 17, 40, 12), 1342177280], [129, '', 40003, (60, 15, 120, 12), 1350631552], [128, 'Search', 40004, (187, 15, 40, 14), 1342242816], [130, 'Documents : ', -1, (15, 140, 100, 14), 1342177280], ['SysListView32', 'List1', 2026, (15, 150, 234, 110), 1350631433], [128, 'Archive to OpenERP', 2019, (160, 270, 85, 14), 1342242816], [128, ' Create a Document ', 2024, (263, 5, 202, 100), 1342242823], [130, 'Type of Document : ', -1, (266, 25, 100, 12), 1342177280], [133, '', 2025, (332, 24, 75, 45), 1344339971], [128, 'Create', 2020, (412, 23, 50, 14), 1342242816], [128, ' Create a Contact ', 2024, (263, 110, 202, 185), 1342242823], [130, 'Create a New Contact : ', -1, (280, 140, 100, 12), 1342177280], [128, 'Create Contact', 2018, (360, 138, 60, 14), 1342242816], [128, 'Close', 2, (385, 300, 60, 14), 1342242816]]}
+ dialogs = {'IDD_VIEW_PARTNER_DIALOG': [['Open Contact', (0, 0, 350, 215), -1865940928, 1024, (8, 'Tahoma')], [130, 'Email ID : ', -1, (32, 17, 40, 12), 1342177280], [129, '', 2051, (70, 15, 200, 12), 1350631552], [128, 'Search Partner ', 2052, (280, 15, 60, 14), 1342242816], [130, 'Partner Name : ', -1, (13, 42, 50, 17), 1342177280], [133, '', 2069, (70, 42, 200, 80), 1344339971], [128, 'New Partner', 2070, (280, 41, 60, 14), 1342242816], [128, 'Postal Address ', 2024, (10, 65, 175, 125), 1342177287], [130, 'Contact Name : ', -1, (18, 83, 50, 17), 1342177280], [129, '', 2046, (76, 82, 100, 12), 1350631552], [130, 'Street : ', -1, (18, 97, 50, 17), 1342177280], [129, '', 2053, (76, 96, 100, 12), 1350631552], [130, 'Street2 : ', -1, (18, 112, 50, 17), 1342177280], [129, '', 2054, (76, 111, 100, 12), 1350631552], [130, 'Zip : ', -1, (18, 126, 50, 14), 1342177280], [129, '', 40010, (76, 125, 100, 12), 1350631552], [130, 'City : ', -1, (18, 140, 50, 17), 1342177280], [129, '', 40011, (76, 139, 100, 12), 1350631552], [130, 'Fed. State : ', -1, (18, 154, 50, 17), 1342177280], [133, '', 2060, (76, 153, 100, 50), 1344339971], [130, 'Country :', -1, (18, 169, 35, 17), 1342177280], [133, '', 2061, (76, 168, 100, 50), 1344339971], [128, 'Communication ', 2024, (188, 65, 152, 125), 1342177287], [130, 'Phone : ', -1, (194, 83, 30, 17), 1342177280], [129, '', 2048, (224, 82, 100, 12), 1350631552], [130, 'Mobile : ', -1, (194, 97, 30, 17), 1342177280], [129, '', 2050, (224, 96, 100, 12), 1350631552], [130, 'Email : ', -1, (194, 111, 30, 17), 1342177280], [129, '', 2058, (224, 110, 100, 12), 1350568064], [130, 'Fax : ', -1, (194, 125, 30, 17), 1342177280], [129, '', 2047, (224, 124, 100, 12), 1350631552], [128, 'Create a New Contact', 2071, (124, 195, 82, 14), 1342242816], [128, 'Save', 2059, (213, 195, 60, 14), 1342242816], [128, 'Cancel', 2, (281, 195, 60, 14), 1342242816]], 'IDD_GENERAL': [['Connection Parameters', (0, 0, 430, 210), 1355284544, None, (8, 'Tahoma')], [128, '', 2024, (10, 10, 250, 130), 1342177287], [130, 'Server : ', -1, (30, 30, 100, 17), 1342177280], [129, '', 2003, (85, 30, 120, 12), 1350633472], [128, 'Change', 2021, (210, 30, 30, 13), 1342242816], [130, 'Database : ', -1, (30, 50, 100, 17), 1342177280], [133, '', 2004, (85, 50, 120, 40), 1344339971], [128, 'Reload', 2038, (210, 50, 30, 13), 1342242816], [130, 'Username : ', -1, (30, 70, 100, 17), 1342177280], [129, '', 2005, (85, 70, 154, 12), 1350631552], [130, 'Password : ', -1, (30, 90, 100, 17), 1342177280], [129, '', 2006, (85, 90, 154, 12), 1350631584], [128, 'Connect', 2007, (179, 110, 60, 13), 1342242816]], 'IDD_OBJECT_SETTINGS': [['Documents Setting', (0, 0, 430, 210), 1355284672, 1024, (8, 'Tahoma')], [128, 'Document Attributes', 2024, (2, 2, 340, 32), 1342177287], [130, 'Title', -1, (6, 15, 30, 17), 1342177280], [129, '', 2013, (20, 14, 57, 12), 1350631552], [130, 'Document Name', -1, (83, 15, 60, 17), 1342177280], [129, '', 2014, (138, 14, 57, 12), 1350631552], [130, 'Image', -1, (200, 15, 20, 17), 1342177280], [129, '', 2015, (220, 14, 57, 12), 1350631552], [128, 'Load Image', 2010, (286, 13, 50, 15), 1342242816], [128, 'Add', 2011, (347, 13, 38, 15), 1342242816], [128, 'Remove', 2012, (391, 13, 38, 15), 1342242816], ['SysListView32', 'List1', 2016, (8, 40, 535, 160), 1353711657]], 'IDD_NEW_PARTNER_DIALOG': [['Create a New Partner', (0, 0, 140, 40), -1865940928, 1024, (8, 'Tahoma')], [130, 'Name : ', -1, (5, 3, 100, 17), 1342177280], [129, '', 2036, (40, 3, 94, 12), 1350631552], [128, 'Cancel', 2, (90, 22, 45, 14), 1342242816], [128, 'Save', 2035, (40, 22, 45, 14), 1342242817]], 'IDD_MANAGER': [['OpenERP Configuarion', (0, 0, 460, 260), -1865940800, None, (8, 'Tahoma')], [128, 'Close', 2008, (400, 239, 50, 14), 1342177281], ['SysTabControl32', '', 1068, (8, 7, 440, 228), 1342177280], ['SysListView32', '', 2016, (0, 0, 0, 0), 1353711657]], 'IDD_ABOUT': [['About', (0, 0, 430, 210), 1355284672, 1024, (8, 'Tahoma')], [128, 'About Plugin', -1, (7, 3, 422, 200), 1342177287], [130, '1062', 1062, (60, 30, 20, 20), 1342179342], [130, '', 2028, (80, 90, 300, 100), 1342177280]], 'IDD_NEW_CONTACT_DIALOG': [['Create a New Contact', (0, 0, 350, 190), -1865940928, 1024, (8, 'Tahoma')], [130, 'Select Partner : ', -1, (13, 20, 50, 17), 1342177280], [133, '', 2032, (70, 18, 200, 80), 1344339971], [128, 'New Partner', 2033, (280, 17, 55, 14), 1342242816], [128, 'Postal Address ', 2024, (10, 35, 175, 125), 1342177287], [130, 'Contact Name : ', -1, (18, 53, 100, 17), 1342177280], [129, '', 40005, (76, 52, 100, 12), 1350631552], [130, 'Street : ', -1, (18, 67, 40, 17), 1342177280], [129, '', 2062, (76, 66, 100, 12), 1350631552], [130, 'Street2 : ', -1, (18, 81, 40, 17), 1342177280], [129, '', 2063, (76, 80, 100, 12), 1350631552], [130, 'Zip : ', -1, (18, 94, 50, 17), 1342177280], [129, '', 2068, (76, 93, 100, 12), 1350631552], [130, 'City : ', -1, (18, 108, 50, 17), 1342177280], [129, '', 2067, (76, 107, 100, 12), 1350631552], [130, 'Fed. State : ', -1, (18, 123, 40, 17), 1342177280], [133, '', 2064, (76, 122, 100, 80), 1344339971], [130, 'Country : ', -1, (18, 137, 40, 17), 1342177280], [133, '', 2065, (76, 136, 100, 80), 1344339971], [128, 'Communication ', 2024, (188, 35, 150, 125), 1342177287], [130, 'Office : ', -1, (194, 53, 30, 17), 1342177280], [129, '', 40006, (224, 52, 100, 12), 1350631552], [130, 'Mobile : ', -1, (194, 67, 30, 17), 1342177280], [129, '', 40007, (224, 66, 100, 12), 1350631552], [130, 'Fax : ', -1, (194, 81, 30, 17), 1342177280], [129, '', 2066, (224, 80, 100, 12), 1350631552], [130, 'Email : ', -1, (194, 95, 30, 17), 1342177280], [129, '', 40008, (224, 94, 100, 12), 1350631552], [128, 'Cancel', 2, (290, 170, 45, 14), 1342242816], [128, 'Save', 40009, (240, 170, 45, 14), 1342242816]], 'IDD_SERVER_PORT_DIALOG': [['OpenERP Connection', (0, 0, 160, 55), -1865940928, 1024, (8, 'Tahoma')], [130, 'Server : ', -1, (5, 3, 150, 17), 1342177280], [129, '', 2001, (40, 3, 100, 12), 1350631552], [130, 'Port : ', -1, (5, 18, 100, 17), 1342177280], [129, '', 2002, (40, 18, 100, 12), 1350631552], [128, 'Close', 2, (110, 35, 45, 14), 1342242816], [128, 'OK', 1, (60, 35, 45, 14), 1342242817]], 'IDD_SYNC': [['Push to OpenERP', (0, 0, 470, 320), -1865940928, 1024, (8, 'Tahoma')], [128, ' Link to an Existing Documents ', 2024, (8, 5, 250, 290), 1342242823], [130, 'Search for : ', -1, (15, 17, 40, 12), 1342177280], [129, '', 40003, (60, 15, 120, 12), 1350631552], [128, 'Search', 40004, (187, 15, 40, 14), 1342242816], [130, 'Documents : ', -1, (15, 140, 100, 14), 1342177280], ['SysListView32', 'List1', 2026, (15, 150, 234, 110), 1350631433], [128, 'Push', 2019, (160, 270, 85, 14), 1342242816], [128, ' Create a Document ', 2024, (263, 5, 202, 100), 1342242823], [130, 'Type of Document : ', -1, (266, 25, 100, 12), 1342177280], [133, '', 2025, (332, 24, 75, 45), 1344339971], [128, 'Create', 2020, (412, 23, 50, 14), 1342242816], [128, ' Create a Contact ', 2024, (263, 110, 202, 185), 1342242823], [130, 'Create a New Contact : ', -1, (280, 140, 100, 12), 1342177280], [128, 'Create Contact', 2018, (360, 138, 60, 14), 1342242816], [128, 'Close', 2, (385, 300, 60, 14), 1342242816]]}
ids = {'IDC_BUT_DEL_OBJECT': 2012, 'IDC_DELAY1_SLIDER': 1056, 'IDC_PROGRESS': 1000, 'IDD_MANAGER': 101, 'IDC_ABOUT': 2028, 'IDD_DIAGNOSTIC': 113, 'IDET_PARTNER_COUNTRY': 2057, 'IDD_TRAINING': 102, 'ID_CONTACT_EMAIL_TEXT': 40008, 'IDC_DELAY2_TEXT': 1059, 'IDC_DELAY1_TEXT': 1057, 'IDD_WIZARD': 114, 'IDC_CHKBX': 2023, 'IDC_STATIC_HAM': 1002, 'IDC_PROGRESS_TEXT': 1001, 'IDR_XMLS_PROTOCOL': 2042, 'IDD_GENERAL': 108, 'IDD_ABOUT': 2027, 'IDC_TAB': 1068, 'IDC_FOLDER_UNSURE': 1033, 'IDC_VERBOSE_LOG': 1061, 'IDC_EDIT1': 1094, 'IDC_BROWSE': 1037, 'ID_DB_DROPDOWNLIST': 2004, 'IDC_BACK_BTN': 1069, 'IDD_WIZARD_FINISHED_UNCONFIGURED': 119, 'IDC_ACTION_CERTAIN': 1025, 'IDC_BUT_ACT_ALL': 1019, 'IDD_FILTER_NOW': 104, 'ID_PROTOCOL_GRP': 2040, 'IDC_HEADER': 2017, 'IDC_MARK_SPAM_AS_READ': 1047, 'ID_PARTNER_NAME_TEXT': 2036, 'IDC_RECOVER_RS': 1075, 'IDC_NAME_LIST1': 2037, 'ID_CONTACT_OFFICE_TEXT': 40006, 'IDC_STATIC': -1, 'IDC_PAGE_PLACEHOLDER': 1078, 'IDC_BROWSE_WATCH': 1039, 'IDET_ZIP': 40010, 'IDET_PARTNER_CITY': 40011, 'IDC_FOLDER_HAM': 1083, 'IDD_WIZARD_FOLDERS_REST': 117, 'IDC_SHOW_DATA_FOLDER': 1071, 'IDC_BUT_ACT_SCORE': 1018, '_APS_NEXT_RESOURCE_VALUE': 128, '_APS_NEXT_SYMED_VALUE': 101, 'IDC_CONTACT_LIST': 2029, 'IDC_SLIDER_CERTAIN': 1023, 'IDET_PARTNER_STREET': 2053, 'IDC_BUT_UNREAD': 1020, 'ID_PARTNER_DROPDOWNLIST': 2032, 'ID_COUNTRY_DROPLIST': 2065, 'IDC_BUT_ABOUT': 1017, 'IDC_BUT_RESCORE': 1008, 'IDC_BUT_SEARCHSUB': 1041, 'IDC_BUT_TRAIN_FROM_SPAM_FOLDER': 1010, 'IDET_PARTNER_MOBILENO': 2050, 'IDD_VIEW_PARTNER_DIALOG': 2044, 'IDD_WIZARD_FOLDERS_TRAIN': 120, 'IDC_BUT_FILTER_ENABLE': 1013, 'IDC_ABOUT_BTN': 1072, 'IDD_WIZARD_FINISHED_TRAINED': 122, 'ID_SERVER': 2001, 'IDD_FOLDER_SELECTOR': 105, 'IDC_BUT_SET_SERVER_PORT': 2021, 'ID_DONE': 2008, 'IDC_LIST_FOLDERS': 1040, 'IDC_IMAGE_PATH': 2015, 'IDB_SBWIZLOGO': 125, 'IDB_OPENERPLOGO': 1062, 'ID_ZIP_TEXT': 2068, 'IDD_NEW_PARTNER_DIALOG': 2034, 'ID_PARTNER_DROPLIST': 2069, 'IDC_BUT_VIEW_LOG': 1093, 'IDC_STATUS2': 1044, 'IDC_STATUS1': 1043, 'IDCANCEL': 2, 'IDC_BROWSE_HAM': 1004, 'ID_BUT_TESTCONNECTION': 2007, 'IDR_NETRPC_PROTOCOL': 2043, 'IDC_BROWSE_SPAM': 1005, 'IDD_WIZARD_FINISHED_UNTRAINED': 116, 'IDC_MARK_UNSURE_AS_READ': 1051, 'ID_PARTNER_CITY_TEXT': 2067, 'IDC_BUT_WIZARD': 1070, 'IDC_VERSION': 1009, 'ID_NEW_PARTNER_BUTTON': 2033, 'IDC_FOLDER_NAMES': 1036, 'ID_ATT_METHOD_DROPDOWNLIST': 2025, 'IDC_BUT_TIMER_ENABLED': 1091, 'IDPB_WRITE_CHANGES': 2059, 'IDC_SLIDER_UNSURE': 1029, 'IDC_BUT_NEW': 1046, 'IDC_FOLDER_WATCH': 1038, 'IDC_BUT_UNTRAINED': 1088, 'IDC_STATIC_SPAM': 1003, 'IDD_NEW_CONTACT_DIALOG': 2031, 'IDC_EDIT_UNSURE': 1030, 'IDC_BUT_CLEARALL': 1042, 'IDC_BUT_UNSEEN': 1021, 'IDC_OBJECT_NAME': 2014, 'IDD_WIZARD_FOLDERS_WATCH': 118, 'IDC_BUT_SAVE_OBJECT': 2011, 'ID_FED_STATE_DROPLIST': 2064, 'ID_ALL_COUNTRY_DROPDOWNLIST': 2061, 'IDC_EDIT_CERTAIN': 1024, 'IDC_BUT_FILTER_DEFINE': 1016, 'ID_NEW_PART_BUTTON': 2070, 'ID_FAX_TEXT': 2066, 'IDD_WIZARD_TRAINING_IS_IMPORTANT': 123, 'ID_ALL_STATE_DROPDOWNLIST': 2060, 'IDC_INBOX_TIMER_ONLY': 1060, 'IDPB_SEARCH_PARTNER': 2052, 'ID_USERNAME': 2005, '_APS_NEXT_CONTROL_VALUE': 1096, 'IDC_WIZ_GRAPHIC': 1092, 'IDD_OBJECT_SETTINGS': 2009, 'IDD_FILTER_UNSURE': 111, 'IDC_DEL_SPAM_RS': 1074, 'ID_SERVER_PORT': 2003, 'IDR_XML_PROTOCOL': 2041, 'IDET_PARTNER_OFFICENO': 2048, 'IDB_FOLDERS': 127, 'IDC_BUT_PREPARATION': 1081, 'ID_STREET2_TEXT': 2063, 'IDC_DELAY2_SLIDER': 1058, 'IDC_SAVE_SPAM_SCORE': 1048, 'IDC_OBJECT_TITLE': 2013, 'IDC_FOLDER_CERTAIN': 1027, 'IDC_BROWSE_UNSURE': 1034, 'IDC_STATISTICS': 1095, 'ID_MAKE_ATTACHMENT': 2019, 'IDC_BUT_LOAD_IMAGE': 2010, 'IDC_NAME_LIST': 2026, 'IDC_BUT_TRAIN_TO_SPAM_FOLDER': 1011, 'IDC_BUT_RESET': 1073, 'IDET_PARTNER_CONTACT_NAME': 2046, 'ID_CONTACT_MOBILE_TEXT': 40007, 'IDC_ACTION_UNSURE': 1031, 'IDD_WIZARD_TRAIN': 121, 'IDC_STATIC_GROUP': 2024, 'IDPB_NEWPARTNER_BUTTON': 2071, 'IDD_SYNC': 40002, 'IDD_WIZARD_FINISHED_TRAIN_LATER': 124, 'IDET_PARTNER_NAME': 2045, 'ID_CONTACT_NAME_TEXT': 40005, 'IDC_BUT_REBUILD': 1007, 'IDET_PARTNER_STREET2': 2054, 'ID_SAVE_PARTNER_BUTTON': 2035, 'ID_STREET_TEXT': 2062, '_APS_NEXT_COMMAND_VALUE': 40001, 'IDET_SEARCH_PARTNER': 2051, 'ID_PORT': 2002, 'IDD_SERVER_PORT_DIALOG': 2022, 'ID_SEARCH_TEXT': 40003, 'ID_SEARCH': 40004, 'ID_CREATE_CONTACT': 2018, 'IDC_FORWARD_BTN': 1077, 'IDC_TRAINING_STATUS': 1035, 'IDD_WIZARD_WELCOME': 115, 'IDET_PARTNER_FAX': 2058, 'IDC_BUT_TRAIN': 1089, 'IDC_LIST': 2016, 'ID_CREATE_CASE': 2020, 'IDET_PARTNER_EMAIL': 2047, 'IDC_START': 1006, 'IDD_FILTER': 103, 'IDC_RELOAD': 2038, 'ID_PASSWORD': 2006, 'ID_NAME_TEXT': 2030, 'IDC_FILTER_STATUS': 1014, 'ID_CONTACT_SAVE_BUTTON': 40009, 'IDOK': 1, 'IDC_BROWSE_CERTAIN': 1028, 'IDC_BUT_SHOW_DIAGNOSTICS': 1080, 'IDC_BUT_TRAIN_NOW': 1012}
names = {1024: 'IDC_EDIT_CERTAIN', 1: 'IDOK', 2: 'IDCANCEL', 1027: 'IDC_FOLDER_CERTAIN', 1028: 'IDC_BROWSE_CERTAIN', 1029: 'IDC_SLIDER_UNSURE', 1030: 'IDC_EDIT_UNSURE', 1031: 'IDC_ACTION_UNSURE', 1033: 'IDC_FOLDER_UNSURE', 1034: 'IDC_BROWSE_UNSURE', 1035: 'IDC_TRAINING_STATUS', 1036: 'IDC_FOLDER_NAMES', 1037: 'IDC_BROWSE', 1038: 'IDC_FOLDER_WATCH', 1039: 'IDC_BROWSE_WATCH', 1040: 'IDC_LIST_FOLDERS', 1041: 'IDC_BUT_SEARCHSUB', 1042: 'IDC_BUT_CLEARALL', 1043: 'IDC_STATUS1', 1044: 'IDC_STATUS2', 2069: 'ID_PARTNER_DROPLIST', 1046: 'IDC_BUT_NEW', 1047: 'IDC_MARK_SPAM_AS_READ', 1048: 'IDC_SAVE_SPAM_SCORE', 2052: 'IDPB_SEARCH_PARTNER', 1051: 'IDC_MARK_UNSURE_AS_READ', 2053: 'IDET_PARTNER_STREET', 1056: 'IDC_DELAY1_SLIDER', 1057: 'IDC_DELAY1_TEXT', 1058: 'IDC_DELAY2_SLIDER', 1059: 'IDC_DELAY2_TEXT', 1060: 'IDC_INBOX_TIMER_ONLY', 1061: 'IDC_VERBOSE_LOG', 1062: 'IDB_OPENERPLOGO', 2047: 'IDET_PARTNER_EMAIL', 1068: 'IDC_TAB', 1069: 'IDC_BACK_BTN', 1070: 'IDC_BUT_WIZARD', 1071: 'IDC_SHOW_DATA_FOLDER', 1072: 'IDC_ABOUT_BTN', 1073: 'IDC_BUT_RESET', 1074: 'IDC_DEL_SPAM_RS', 1075: 'IDC_RECOVER_RS', 1077: 'IDC_FORWARD_BTN', 1078: 'IDC_PAGE_PLACEHOLDER', 2057: 'IDET_PARTNER_COUNTRY', 1080: 'IDC_BUT_SHOW_DIAGNOSTICS', 1081: 'IDC_BUT_PREPARATION', 1083: 'IDC_FOLDER_HAM', 2058: 'IDET_PARTNER_FAX', 1088: 'IDC_BUT_UNTRAINED', 1089: 'IDC_BUT_TRAIN', 40002: 'IDD_SYNC', 1091: 'IDC_BUT_TIMER_ENABLED', 1025: 'IDC_ACTION_CERTAIN', 1093: 'IDC_BUT_VIEW_LOG', 1094: 'IDC_EDIT1', 1095: 'IDC_STATISTICS', 1096: '_APS_NEXT_CONTROL_VALUE', 2060: 'ID_ALL_STATE_DROPDOWNLIST', 40010: 'IDET_ZIP', 40011: 'IDET_PARTNER_CITY', 2061: 'ID_ALL_COUNTRY_DROPDOWNLIST', 2062: 'ID_STREET_TEXT', 2063: 'ID_STREET2_TEXT', 2064: 'ID_FED_STATE_DROPLIST', 101: 'IDD_MANAGER', 102: 'IDD_TRAINING', 103: 'IDD_FILTER', 104: 'IDD_FILTER_NOW', 105: 'IDD_FOLDER_SELECTOR', 106: 'IDD_ABOUT', 108: 'IDD_GENERAL', 2066: 'ID_FAX_TEXT', 111: 'IDD_FILTER_UNSURE', 113: 'IDD_DIAGNOSTIC', 114: 'IDD_WIZARD', 115: 'IDD_WIZARD_WELCOME', 116: 'IDD_WIZARD_FINISHED_UNTRAINED', 117: 'IDD_WIZARD_FOLDERS_REST', 118: 'IDD_WIZARD_FOLDERS_WATCH', 119: 'IDD_WIZARD_FINISHED_UNCONFIGURED', 120: 'IDD_WIZARD_FOLDERS_TRAIN', 121: 'IDD_WIZARD_TRAIN', 122: 'IDD_WIZARD_FINISHED_TRAINED', 123: 'IDD_WIZARD_TRAINING_IS_IMPORTANT', 124: 'IDD_WIZARD_FINISHED_TRAIN_LATER', 125: 'IDB_SBWIZLOGO', 127: 'IDB_FOLDERS', 2067: 'ID_PARTNER_CITY_TEXT', 2050: 'IDET_PARTNER_MOBILENO', 2070: 'ID_NEW_PART_BUTTON', 2071: 'IDPB_NEWPARTNER_BUTTON', 2068: 'ID_ZIP_TEXT', 2051: 'IDET_SEARCH_PARTNER', 40004: 'ID_SEARCH', 2046: 'IDET_PARTNER_CONTACT_NAME', 2054: 'IDET_PARTNER_STREET2', 128: '_APS_NEXT_RESOURCE_VALUE', 2040: 'ID_PROTOCOL_GRP', 2065: 'ID_COUNTRY_DROPLIST', 2048: 'IDET_PARTNER_OFFICENO', 2024: 'IDC_STATIC_GROUP', 2041: 'IDR_XML_PROTOCOL', 2025: 'ID_ATT_METHOD_DROPDOWNLIST', 2026: 'IDC_NAME_LIST', 2027: 'IDD_ABOUT', 40001: '_APS_NEXT_COMMAND_VALUE', 2028: 'IDC_ABOUT', 2029: 'IDC_CONTACT_LIST', 2059: 'IDPB_WRITE_CHANGES', 2042: 'IDR_XMLS_PROTOCOL', 40003: 'ID_SEARCH_TEXT', 2030: 'ID_NAME_TEXT', 1092: 'IDC_WIZ_GRAPHIC', 2031: 'IDD_NEW_CONTACT_DIALOG', 40005: 'ID_CONTACT_NAME_TEXT', 2032: 'ID_PARTNER_DROPDOWNLIST', 40006: 'ID_CONTACT_OFFICE_TEXT', 2033: 'ID_NEW_PARTNER_BUTTON', 40007: 'ID_CONTACT_MOBILE_TEXT', 2034: 'IDD_NEW_PARTNER_DIALOG', 2043: 'IDR_NETRPC_PROTOCOL', 40008: 'ID_CONTACT_EMAIL_TEXT', 2035: 'ID_SAVE_PARTNER_BUTTON', 40009: 'ID_CONTACT_SAVE_BUTTON', 2036: 'ID_PARTNER_NAME_TEXT', 2037: 'IDC_NAME_LIST1', 2038: 'IDC_RELOAD', 2044: 'IDD_VIEW_PARTNER_DIALOG', 2001: 'ID_SERVER', 2002: 'ID_PORT', 2003: 'ID_SERVER_PORT', 2004: 'ID_DB_DROPDOWNLIST', 2005: 'ID_USERNAME', 2006: 'ID_PASSWORD', 2007: 'ID_BUT_TESTCONNECTION', 2008: 'ID_DONE', 2009: 'IDD_OBJECT_SETTINGS', 2010: 'IDC_BUT_LOAD_IMAGE', 2011: 'IDC_BUT_SAVE_OBJECT', 2012: 'IDC_BUT_DEL_OBJECT', 2013: 'IDC_OBJECT_TITLE', 2014: 'IDC_OBJECT_NAME', 2015: 'IDC_IMAGE_PATH', 2016: 'IDC_LIST', 2017: 'IDC_HEADER', 2018: 'ID_CREATE_CONTACT', 2019: 'ID_MAKE_ATTACHMENT', 2020: 'ID_CREATE_CASE', 2021: 'IDC_BUT_SET_SERVER_PORT', 2022: 'IDD_SERVER_PORT_DIALOG', 2023: 'IDC_CHKBX', 1000: 'IDC_PROGRESS', 1001: 'IDC_PROGRESS_TEXT', 1002: 'IDC_STATIC_HAM', 1003: 'IDC_STATIC_SPAM', 1004: 'IDC_BROWSE_HAM', 1005: 'IDC_BROWSE_SPAM', 1006: 'IDC_START', 1007: 'IDC_BUT_REBUILD', 1008: 'IDC_BUT_RESCORE', 1009: 'IDC_VERSION', 1010: 'IDC_BUT_TRAIN_FROM_SPAM_FOLDER', 1011: 'IDC_BUT_TRAIN_TO_SPAM_FOLDER', 1012: 'IDC_BUT_TRAIN_NOW', 1013: 'IDC_BUT_FILTER_ENABLE', 1014: 'IDC_FILTER_STATUS', 2045: 'IDET_PARTNER_NAME', 1016: 'IDC_BUT_FILTER_DEFINE', 1017: 'IDC_BUT_ABOUT', 1018: 'IDC_BUT_ACT_SCORE', 1019: 'IDC_BUT_ACT_ALL', 1020: 'IDC_BUT_UNREAD', 1021: 'IDC_BUT_UNSEEN', -1: 'IDC_STATIC', 1023: 'IDC_SLIDER_CERTAIN'}
bitmaps = {'IDB_OPENERPLOGO': 'OpenERP_Logo.bmp'}
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.rc b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.rc
index bef1c0ef516..cc9844807c6 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.rc
+++ b/addons/outlook/plugin/openerp-outlook-plugin/dialogs/resources/dialogs.rc
@@ -33,7 +33,7 @@ STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME
CAPTION "OpenERP Configuarion"
FONT 8, "Tahoma", 1000, 0, 0x0
BEGIN
- DEFPUSHBUTTON "Cancel",ID_DONE,400,239,50,14//,WS_VISIBLE //| WS_TABSTOP
+ DEFPUSHBUTTON "Close",ID_DONE,400,239,50,14//,WS_VISIBLE //| WS_TABSTOP
CONTROL "",IDC_TAB,"SysTabControl32",0x0,8,7,440,228
CONTROL "",IDC_LIST,"SysListView32",WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL |
LVS_SHOWSELALWAYS | LVS_REPORT | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES,0,0,0,0
@@ -86,9 +86,9 @@ EXSTYLE WS_EX_CONTEXTHELP
CAPTION "About"
FONT 8, "Tahoma", 400, 0, 0x0
BEGIN
- GROUPBOX "About OpenERP Outlook Plugin",IDC_STATIC,7,3,422,200
+ GROUPBOX "About Plugin",IDC_STATIC,7,3,422,200
CONTROL 1062,IDB_OPENERPLOGO,"Static",SS_BITMAP | SS_REALSIZEIMAGE,60,30,20,20
- LTEXT "",IDC_ABOUT,80,90,250,100
+ LTEXT "",IDC_ABOUT,80,90,300,100
END
IDD_SERVER_PORT_DIALOG DIALOGEX 0, 0, 160, 55
@@ -108,7 +108,7 @@ END
IDD_SYNC DIALOGEX 0, 0, 470, 320
STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Archive to OpenERP"
+CAPTION "Push to OpenERP"
FONT 8, "Tahoma", 1000, 0, 0x0
BEGIN
GROUPBOX " Link to an Existing Documents ", IDC_STATIC_GROUP, 8,5,250,290,WS_TABSTOP
@@ -117,7 +117,7 @@ BEGIN
PUSHBUTTON "Search",ID_SEARCH,187,15,40,14,WS_TABSTOP
LTEXT "Documents : ",IDC_STATIC,15,140,100,14
CONTROL "List1",IDC_NAME_LIST,"SysListView32",WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_SHOWSELALWAYS | LVS_REPORT | WS_TABSTOP, 15,150,234,110
- PUSHBUTTON "Archive to OpenERP",ID_MAKE_ATTACHMENT,160,270,85,14,WS_TABSTOP
+ PUSHBUTTON "Push",ID_MAKE_ATTACHMENT,160,270,85,14,WS_TABSTOP
GROUPBOX " Create a Document ", IDC_STATIC_GROUP, 263,5,202,100,WS_TABSTOP
LTEXT "Type of Document : ",IDC_STATIC,266,25,100,12
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/eml.py b/addons/outlook/plugin/openerp-outlook-plugin/eml.py
index 03d2328a980..14d674aef3a 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/eml.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/eml.py
@@ -1,3 +1,26 @@
+##############################################################################
+#
+# 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 .
+#
+##############################################################################
+
+ #!/usr/bin/python
+ #-*- encoding: utf-8 -*-
+
import sys
import chilkat
import os
@@ -10,31 +33,20 @@ def generateEML(mail):
body = mail.Body.encode("utf-8")
recipients = mail.Recipients
sender_email = mail.SenderEmailAddress
- sender_name = mail.SenderName
+ sender_name = mail.SenderEmailAddress
attachments=mail.Attachments
-# to = mail.To
-# cc = mail.CC
-# rec_date = mail.ReceivedTime
email = chilkat.CkEmail()
email.put_Subject (ustr(sub).encode('iso-8859-1'))
email.put_Body (ustr(body).encode('utf-8'))
email.put_FromAddress (ustr(sender_email).encode('iso-8859-1'))
- email.put_From (ustr(sender_name).encode('iso-8859-1'))
+ email.put_From (ustr(sender_email).encode('iso-8859-1'))
for i in xrange(1, recipients.Count+1):
name = ustr(recipients.Item(i).Name).encode('iso-8859-1')
address = ustr(recipients.Item(i).Address).encode('iso-8859-1')
email.AddTo(name,address)
-# email.AddMultipleTo(to)
-# email.AddMultipleCC(cc)
-# win32ui.MessageBox("cccc---"+str(dir(cc)),'')
-# for i in xrange(1, cc.Count+1):
-# name = ustr(recipients.Item(i).Name).encode('iso-8859-1')
-# address = ustr(recipients.Item(i).Address).encode('iso-8859-1')
-# email.AddCC(name,address)
-
eml_name= ustr(sub).encode('iso-8859-1')+'-'+str(mail.EntryID)[-9:]
ls = ['*', '/', '\\', '<', '>', ':', '?', '"', '|', '\t', '\n']
mails_folder_path = os.path.abspath(os.path.dirname(__file__)+"\\dialogs\\resources\\mails\\")
@@ -79,5 +91,4 @@ def generateEML(mail):
sys.exit()
print "Saved EML!",eml_path
- return eml_path
-
+ return eml_path
\ No newline at end of file
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/manager.py b/addons/outlook/plugin/openerp-outlook-plugin/manager.py
index aa8a9334713..783da92bb2a 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/manager.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/manager.py
@@ -1,3 +1,28 @@
+# This module is part of the spambayes project, which is Copyright 2003
+# The Python Software Foundation and is covered by the Python Software
+# Foundation license.
+
+# -*- 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 os
import sys
import win32api, win32con
@@ -83,6 +108,7 @@ class OpenERPManager:
('Account Invoices','account.invoice',''), ('Accounts','account.account',''), \
('Projects', 'project.project',''),('Sale Orders','sale.order',''), \
('Project Tasks','project.task',''), ('Products', 'product.product', '')]
+
self.config=self.LoadConfig()
def WorkerThreadStarting(self):
diff --git a/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py b/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py
index d5dbe9b757a..9a3efc6fa7f 100755
--- a/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py
+++ b/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py
@@ -1,376 +1,389 @@
-# -*- 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 xmlrpclib
-import sys
-import socket
-import os
-import pythoncom
-import time
-from manager import ustr
-
-import smtplib
-from email.mime.text import MIMEText
-from email.parser import*
-import email
-
-waittime = 10
-wait_count = 0
-wait_limit = 12
-import binascii
-import base64
-def execute(connector, method, *args):
- global wait_count
- res = False
- try:
- res = getattr(connector,method)(*args)
- except socket.error,e:
- if e.args[0] == 111:
- if wait_count > wait_limit:
- print "Server is taking too long to start, it has exceeded the maximum limit of %d seconds."%(wait_limit)
- clean()
- sys.exit(1)
- print 'Please wait %d sec to start server....'%(waittime)
- wait_count += 1
- time.sleep(waittime)
- res = execute(connector, method, *args)
- else:
- return res
- wait_count = 0
- return res
-
-class XMLRpcConn(object):
- __name__ = 'XMLRpcConn'
- _com_interfaces_ = ['_IDTExtensibility2']
- _public_methods_ = ['GetDBList', 'login', 'GetAllObjects', 'GetObjList', 'InsertObj', 'DeleteObject', \
- 'ArchiveToOpenERP', 'IsCRMInstalled', 'GetPartners', 'GetObjectItems', \
- 'CreateCase', 'MakeAttachment', 'CreateContact', 'CreatePartner', 'getitem', 'setitem', \
- 'SearchPartnerDetail', 'WritePartnerValues', 'GetAllState', 'GetAllCountry' ]
- _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER
- _reg_clsid_ = "{C6399AFD-763A-400F-8191-7F9D0503CAE2}"
- _reg_progid_ = "Python.OpenERP.XMLRpcConn"
- _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
- def __init__(self,server='localhost',port=8069,uri='http://localhost:8069'):
- self._server=server
- self._port=port
- self._uri=uri
- self._obj_list=[]
- self._dbname=''
- self._uname='admin'
- self._pwd='a'
- self._login=False
- self._running=False
- self._uid=False
- self._iscrm=True
- self.partner_id_list=None
- self.protocol=None
- def getitem(self, attrib):
- v=self.__getattribute__(attrib)
- return str(v)
-
- def setitem(self, attrib, value):
- return self.__setattr__(attrib, value)
-
- def GetDBList(self):
- conn = xmlrpclib.ServerProxy(self._uri + '/xmlrpc/db')
- try:
- db_list = execute(conn, 'list')
- if db_list == False:
- self._running=False
- return []
- else:
- self._running=True
- except:
- db_list=-1
- self._running=True
- return db_list
-
- def login(self,dbname, user, pwd):
- self._dbname = dbname
- self._uname = user
- self._pwd = pwd
- conn = xmlrpclib.ServerProxy(str(self._uri) + '/xmlrpc/common')
- uid = execute(conn,'login',dbname, ustr(user), ustr(pwd))
- return uid
-
- def GetAllObjects(self):
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[])
- objects = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','read',ids,['model'])
- obj_list = [item['model'] for item in objects]
- return obj_list
-
- def GetObjList(self):
- self._obj_list=list(self._obj_list)
- self._obj_list.sort(reverse=True)
- return self._obj_list
-
- def InsertObj(self, obj_title,obj_name,image_path):
- self._obj_list=list(self._obj_list)
- self._obj_list.append((obj_title,obj_name,ustr(image_path)))
- self._obj_list.sort(reverse=True)
-
- def DeleteObject(self,sel_text):
- self._obj_list=list(self._obj_list)
- for obj in self._obj_list:
- if obj[0] == sel_text:
- self._obj_list.remove(obj)
- break
-
- def ArchiveToOpenERP(self, recs, mail):
- import win32ui, win32con
- conn = xmlrpclib.ServerProxy(self._uri + '/xmlrpc/object')
- import eml
- new_msg = files = ext_msg =""
- eml_path=eml.generateEML(mail)
- att_name = ustr(eml_path.split('\\')[-1])
- flag=False
- attachments=mail.Attachments
-
- try:
- fp = open(eml_path, 'rb')
- msg =fp.read()
- fp.close()
- new_mail = email.message_from_string(str(msg))
- except Exception,e:
- win32ui.MessageBox(str(e),"Reading Error Mail")
-
- for rec in recs: #[('res.partner', 3, 'Agrolait')]
- model = rec[0]
- res_id = rec[1]
- object_ids = execute ( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=',model)])
- object_name = execute( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','read',object_ids,['name'])[0]['name']
-
- #Reading the Object ir.model Name
-
- ext_ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'mailgate.message','search',[('message_id','=',mail.EntryID),('model','=',model),('res_id','=',res_id)])
- if ext_ids:
- name = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,model,'read',res_id,['name'])['name']
- ext_msg += """This mail is already archived to {1} '{2}'.
-""".format(object_name,name)
- continue
-
- msg = {
- 'subject':mail.Subject,
- 'date':str(mail.ReceivedTime),
- 'body':mail.Body,
- 'cc':mail.CC,
- 'from':mail.SenderEmailAddress,
- 'to':mail.To,
- 'message-id':str(new_mail.get('Message-Id')),
- 'references':str(new_mail.get('References')),
- }
- result = {}
- if attachments:
- result = self.MakeAttachment([rec], mail)
-
- attachment_ids = result.get(model, {}).get(res_id, [])
- ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'email.server.tools','history',model, res_id, msg, attachment_ids)
-
- new_msg += """- {0} : {1}\n""".format(object_name,str(rec[2]))
- flag = True
-
- if flag:
- t = ext_msg
- t += """Mail archived Successfully with attachments.\n"""+new_msg
- win32ui.MessageBox(t,"Archived to OpenERP",win32con.MB_ICONINFORMATION)
- return flag
-
- def IsCRMInstalled(self):
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=','crm.lead')])
- return id
-
- def GetPartners(self):
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- ids=[]
- ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','search',[])
- ids.sort()
- obj_list=[]
- obj_list.append((-999, ustr('')))
- for id in ids:
- object = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','read',[id],['id','name'])[0]
- obj_list.append((object['id'], ustr(object['name'])))
- return obj_list
-
- def GetObjectItems(self, search_list=[], search_text=''):
- import win32ui
- res = []
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- for obj in search_list:
- object_ids = execute ( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=',obj)])
- object_name = execute( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','read',object_ids,['name'])[0]['name']
- if obj == "res.partner.address":
- ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'search',['|',('name','ilike',ustr(search_text)),('email','ilike',ustr(search_text))])
- recs = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'read',ids,['id','name','street','city'])
- for rec in recs:
- name = ustr(rec['name'])
- if rec['street']:
- name += ', ' + ustr(rec['street'])
- if rec['city']:
- name += ', ' + ustr(rec['city'])
- res.append((obj,rec['id'],name,object_name))
- else:
- ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'search',[('name','ilike',ustr(search_text))])
- recs = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'read',ids,['id','name'])
- for rec in recs:
- name = ustr(rec['name'])
- res.append((obj,rec['id'],name,object_name))
- return res
-
- def CreateCase(self, section, mail, partner_ids, with_attachments=True):
- res={}
- import win32ui
- import eml
- section=str(section)
- partner_ids=eval(str(partner_ids))
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- try:
- eml_path=eml.generateEML(mail)
- fp = open(eml_path, 'rb')
- msg =fp.read()
- fp.close()
- new_mail = email.message_from_string(str(msg))
- except Exception,e:
- win32ui.MessageBox(str(e),"Mail Reading Error")
- execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'email.server.tools','process_email',section, str(new_mail))
-
- def MakeAttachment(self, recs, mail):
- attachments = mail.Attachments
- result = {}
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- att_folder_path = os.path.abspath(os.path.dirname(__file__)+"\\dialogs\\resources\\mails\\attachments\\")
- if not os.path.exists(att_folder_path):
- os.makedirs(att_folder_path)
- for rec in recs: #[('res.partner', 3, 'Agrolait')]
-
- obj = rec[0]
- obj_id = rec[1]
- res={}
- res['res_model'] = obj
- attachment_ids = []
- if obj not in result:
- result[obj] = {}
- for i in xrange(1, attachments.Count+1):
- fn = ustr(attachments[i].FileName)
- if len(fn) > 64:
- l = 64 - len(fn)
- f = fn.split('.')
- fn = f[0][0:l] + '.' + f[-1]
- att_path = os.path.join(att_folder_path,fn)
- attachments[i].SaveAsFile(att_path)
- f=open(att_path,"rb")
- content = "".join(f.readlines()).encode('base64')
- f.close()
- res['name'] = ustr(attachments[i].DisplayName)
- res['datas_fname'] = ustr(fn)
- res['datas'] = content
- res['res_id'] = obj_id
- id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.attachment','create',res)
- attachment_ids.append(id)
- result[obj].update({obj_id: attachment_ids})
- return result
-
- def CreateContact(self, sel=None, res=None):
- res=eval(str(res))
-
- self.partner_id_list=eval(str(self.partner_id_list))
- if self.partner_id_list.get(sel,-999) != -999:
- res['partner_id'] = self.partner_id_list[sel]
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner.address','create',res)
- return id
-
- def CreatePartner(self, res):
- res=eval(str(res))
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','search',[('name','=',res['name'])])
- if ids:
- return False
- id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','create',res)
- return id
-
- def SearchPartnerDetail(self, search_email_id):
- import win32ui
- res_vals = []
- address = {}
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- address_id = execute(conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address', 'search', [('email','ilike',ustr(search_email_id))])
- if not address_id :
- return
- address = execute(conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address','read',address_id[0],['id','partner_id','name','street','street2','city','state_id','country_id','phone','mobile','email','fax','zip'])
- for key, vals in address.items():
- res_vals.append([key,vals])
- return res_vals
-
- def WritePartnerValues(self, new_vals):
- import win32ui
- flag = -1
- new_dict = dict(new_vals)
- email=new_dict['email']
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- address_id = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address', 'search', [('email','=',ustr(email))])
- if not address_id:
- return flag
- address = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address','read',address_id[0],['id','partner_id','state_id','country_id'])
- vals_res_address={ 'name' : new_dict['name'],
- 'street':new_dict['street'],
- 'street2' : new_dict['street2'],
- 'city' : new_dict['city'],
- 'phone' : new_dict['phone'],
- 'mobile' : new_dict['mobile'],
- 'fax' : new_dict['fax'],
- 'zip' : new_dict['zip'],
- }
- if new_dict['partner_id'] != -1:
- vals_res_address['partner_id'] = new_dict['partner_id']
- if new_dict['state_id'] != -1:
- vals_res_address['state_id'] = new_dict['state_id']
- if new_dict['country_id'] != -1:
- vals_res_address['country_id'] = new_dict['country_id']
- temp = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address', 'write', address_id, vals_res_address)
- if temp:
- flag=1
- else:
- flag=0
- return flag
-
- def GetAllState(self):
- import win32ui
- state_list = []
- state_ids = []
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- state_ids = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country.state', 'search', [])
- for state_id in state_ids:
- obj = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country.state', 'read', [state_id],['id','name'])[0]
- state_list.append((obj['id'], ustr(obj['name'])))
- return state_list
-
- def GetAllCountry(self):
- import win32ui
- country_list = []
- country_ids = []
- conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
- country_ids = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country', 'search', [])
- for country_id in country_ids:
- obj = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country','read', [country_id], ['id','name'])[0]
- country_list.append((obj['id'], ustr(obj['name'])))
- return country_list
+# -*- 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 xmlrpclib
+import sys
+import socket
+import os
+import pythoncom
+import time
+from manager import ustr
+import email
+
+waittime = 10
+wait_count = 0
+wait_limit = 12
+
+def execute(connector, method, *args):
+ global wait_count
+ res = False
+ try:
+ res = getattr(connector,method)(*args)
+ except socket.error,e:
+ if e.args[0] == 111:
+ if wait_count > wait_limit:
+ print "Server is taking too long to start, it has exceeded the maximum limit of %d seconds."%(wait_limit)
+ clean()
+ sys.exit(1)
+ print 'Please wait %d sec to start server....'%(waittime)
+ wait_count += 1
+ time.sleep(waittime)
+ res = execute(connector, method, *args)
+ else:
+ return res
+ wait_count = 0
+ return res
+
+class XMLRpcConn(object):
+ __name__ = 'XMLRpcConn'
+ _com_interfaces_ = ['_IDTExtensibility2']
+ _public_methods_ = ['GetDBList', 'login', 'GetAllObjects', 'GetObjList', 'InsertObj', 'DeleteObject', 'GetCSList', \
+ 'ArchiveToOpenERP', 'IsCRMInstalled', 'GetPartners', 'GetObjectItems', \
+ 'CreateCase', 'MakeAttachment', 'CreateContact', 'CreatePartner', 'getitem', 'setitem', \
+ 'SearchPartnerDetail', 'WritePartnerValues', 'GetAllState', 'GetAllCountry' ]
+ _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER
+ _reg_clsid_ = "{C6399AFD-763A-400F-8191-7F9D0503CAE2}"
+ _reg_progid_ = "Python.OpenERP.XMLRpcConn"
+ _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
+ def __init__(self,server='localhost',port=8069,uri='http://localhost:8069'):
+ self._server=server
+ self._port=port
+ self._uri=uri
+ self._obj_list=[]
+ self._dbname=''
+ self._uname='admin'
+ self._pwd='a'
+ self._login=False
+ self._running=False
+ self._uid=False
+ self._iscrm=True
+ self.partner_id_list=None
+ self.protocol=None
+
+ def getitem(self, attrib):
+ v=self.__getattribute__(attrib)
+ return str(v)
+
+ def setitem(self, attrib, value):
+ return self.__setattr__(attrib, value)
+
+ def GetDBList(self):
+ conn = xmlrpclib.ServerProxy(self._uri + '/xmlrpc/db')
+ try:
+ db_list = execute(conn, 'list')
+ if db_list == False:
+ self._running=False
+ return []
+ else:
+ self._running=True
+ except:
+ db_list=-1
+ self._running=True
+ return db_list
+
+ def login(self,dbname, user, pwd):
+ self._dbname = dbname
+ self._uname = user
+ self._pwd = pwd
+ conn = xmlrpclib.ServerProxy(str(self._uri) + '/xmlrpc/common')
+ uid = execute(conn,'login',dbname, ustr(user), ustr(pwd))
+ return uid
+
+ def GetAllObjects(self):
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[])
+ objects = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','read',ids,['model'])
+ obj_list = [item['model'] for item in objects]
+ return obj_list
+
+ def GetObjList(self):
+ self._obj_list=list(self._obj_list)
+ self._obj_list.sort(reverse=True)
+ return self._obj_list
+
+ def InsertObj(self, obj_title,obj_name,image_path):
+ self._obj_list=list(self._obj_list)
+ self._obj_list.append((obj_title,obj_name,ustr(image_path)))
+ self._obj_list.sort(reverse=True)
+
+ def DeleteObject(self,sel_text):
+ self._obj_list=list(self._obj_list)
+ for obj in self._obj_list:
+ if obj[0] == sel_text:
+ self._obj_list.remove(obj)
+ break
+
+ def ArchiveToOpenERP(self, recs, mail):
+ import win32ui, win32con
+ conn = xmlrpclib.ServerProxy(self._uri + '/xmlrpc/object')
+ import eml
+ new_msg = files = ext_msg =""
+ eml_path=eml.generateEML(mail)
+ att_name = ustr(eml_path.split('\\')[-1])
+ flag=False
+ attachments=mail.Attachments
+
+ try:
+ fp = open(eml_path, 'rb')
+ msg =fp.read()
+ fp.close()
+ new_mail = email.message_from_string(str(msg))
+ except Exception,e:
+ win32ui.MessageBox(str(e),"Reading Error Mail")
+
+ for rec in recs: #[('res.partner', 3, 'Agrolait')]
+ model = rec[0]
+ res_id = rec[1]
+
+ #Check if mailgate installed
+ object_id = execute ( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=','mailgate.message')])
+ if not object_id:
+ win32ui.MessageBox("Mailgate is not installed on your configured database '%s' !!\n\nPlease install it to archive the mail."%(self._dbname),"Mailgate not installed",win32con.MB_ICONERROR)
+ return
+
+ object_ids = execute ( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=',model)])
+ object_name = execute( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','read',object_ids,['name'])[0]['name']
+
+ #Reading the Object ir.model Name
+
+ ext_ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'mailgate.message','search',[('message_id','=',mail.EntryID),('model','=',model),('res_id','=',res_id)])
+ if ext_ids:
+ name = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,model,'read',res_id,['name'])['name']
+ ext_msg += """This mail is already archived to {1} '{2}'.
+""".format(object_name,name)
+ continue
+
+ msg = {
+ 'subject':mail.Subject,
+ 'date':str(mail.ReceivedTime),
+ 'body':mail.Body,
+ 'cc':mail.CC,
+ 'from':mail.SenderEmailAddress,
+ 'to':mail.To,
+ 'message-id':str(new_mail.get('Message-Id')),
+ 'references':str(new_mail.get('References')),
+ }
+ result = {}
+ if attachments:
+ result = self.MakeAttachment([rec], mail)
+
+ attachment_ids = result.get(model, {}).get(res_id, [])
+ ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'email.server.tools','history',model, res_id, msg, attachment_ids)
+
+ new_msg += """- {0} : {1}\n""".format(object_name,str(rec[2]))
+ flag = True
+
+ if flag:
+ t = ext_msg
+ t += """Mail archived Successfully with attachments.\n"""+new_msg
+ win32ui.MessageBox(t,"Archived to OpenERP",win32con.MB_ICONINFORMATION)
+ return flag
+
+ def IsCRMInstalled(self):
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=','crm.lead')])
+ return id
+
+ def GetCSList(self):
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ ids = execute(conn,'execute',self._dbname,int(int(self._uid)),self._pwd,'crm.case.section','search',[])
+ objects = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'crm.case.section','read',ids,['name'])
+ obj_list = [ustr(item['name']).encode('iso-8859-1') for item in objects]
+ return obj_list
+
+ def GetPartners(self):
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ ids=[]
+ obj_list=[]
+
+ ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','search',[])
+ if ids:
+ ids.sort()
+ obj_list.append((-999, ustr('')))
+ for id in ids:
+ object = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','read',[id],['id','name'])[0]
+ obj_list.append((object['id'], ustr(object['name'])))
+ obj_list.sort(lambda x, y: cmp(x[1],y[1]))
+ return obj_list
+
+ def GetObjectItems(self, search_list=[], search_text=''):
+ import win32ui
+ res = []
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ for obj in search_list:
+ object_ids = execute ( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','search',[('model','=',obj)])
+ object_name = execute( conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.model','read',object_ids,['name'])[0]['name']
+ if obj == "res.partner.address":
+ ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'search',['|',('name','ilike',ustr(search_text)),('email','ilike',ustr(search_text))])
+ recs = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'read',ids,['id','name','street','city'])
+ for rec in recs:
+ name = ustr(rec['name'])
+ if rec['street']:
+ name += ', ' + ustr(rec['street'])
+ if rec['city']:
+ name += ', ' + ustr(rec['city'])
+ res.append((obj,rec['id'],name,object_name))
+ else:
+ ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'search',[('name','ilike',ustr(search_text))])
+ recs = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,obj,'read',ids,['id','name'])
+ for rec in recs:
+ name = ustr(rec['name'])
+ res.append((obj,rec['id'],name,object_name))
+ return res
+
+ def CreateCase(self, section, mail, partner_ids, with_attachments=True):
+ res={}
+ import win32ui
+ import eml
+ section=str(section)
+ partner_ids=eval(str(partner_ids))
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ try:
+ eml_path=eml.generateEML(mail)
+ fp = open(eml_path, 'rb')
+ msg =fp.read()
+ fp.close()
+ new_mail = email.message_from_string(str(msg))
+ except Exception,e:
+ win32ui.MessageBox(str(e),"Mail Reading Error")
+ execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'email.server.tools','process_email',section, str(new_mail))
+
+ def MakeAttachment(self, recs, mail):
+ attachments = mail.Attachments
+ result = {}
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ att_folder_path = os.path.abspath(os.path.dirname(__file__)+"\\dialogs\\resources\\mails\\attachments\\")
+ if not os.path.exists(att_folder_path):
+ os.makedirs(att_folder_path)
+ for rec in recs: #[('res.partner', 3, 'Agrolait')]
+
+ obj = rec[0]
+ obj_id = rec[1]
+ res={}
+ res['res_model'] = obj
+ attachment_ids = []
+ if obj not in result:
+ result[obj] = {}
+ for i in xrange(1, attachments.Count+1):
+ fn = ustr(attachments[i].FileName)
+ if len(fn) > 64:
+ l = 64 - len(fn)
+ f = fn.split('.')
+ fn = f[0][0:l] + '.' + f[-1]
+ att_path = os.path.join(att_folder_path,fn)
+ attachments[i].SaveAsFile(att_path)
+ f=open(att_path,"rb")
+ content = "".join(f.readlines()).encode('base64')
+ f.close()
+ res['name'] = ustr(attachments[i].DisplayName)
+ res['datas_fname'] = ustr(fn)
+ res['datas'] = content
+ res['res_id'] = obj_id
+ id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'ir.attachment','create',res)
+ attachment_ids.append(id)
+ result[obj].update({obj_id: attachment_ids})
+ return result
+
+ def CreateContact(self, sel=None, res=None):
+ res=eval(str(res))
+
+ self.partner_id_list=eval(str(self.partner_id_list))
+ if self.partner_id_list.get(sel,-999) != -999:
+ res['partner_id'] = self.partner_id_list[sel]
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner.address','create',res)
+ return id
+
+ def CreatePartner(self, res):
+ res=eval(str(res))
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ ids = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','search',[('name','=',res['name'])])
+ if ids:
+ return False
+ id = execute(conn,'execute',self._dbname,int(self._uid),self._pwd,'res.partner','create',res)
+ return id
+
+ def SearchPartnerDetail(self, search_email_id):
+ import win32ui
+ res_vals = []
+ address = {}
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ address_id = execute(conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address', 'search', [('email','ilike',ustr(search_email_id))])
+ if not address_id :
+ return
+ address = execute(conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address','read',address_id[0],['id','partner_id','name','street','street2','city','state_id','country_id','phone','mobile','email','fax','zip'])
+ for key, vals in address.items():
+ res_vals.append([key,vals])
+ return res_vals
+
+ def WritePartnerValues(self, new_vals):
+ import win32ui
+ flag = -1
+ new_dict = dict(new_vals)
+ email=new_dict['email']
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ address_id = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address', 'search', [('email','=',ustr(email))])
+ if not address_id:
+ return flag
+ address = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address','read',address_id[0],['id','partner_id','state_id','country_id'])
+ vals_res_address={ 'name' : new_dict['name'],
+ 'street':new_dict['street'],
+ 'street2' : new_dict['street2'],
+ 'city' : new_dict['city'],
+ 'phone' : new_dict['phone'],
+ 'mobile' : new_dict['mobile'],
+ 'fax' : new_dict['fax'],
+ 'zip' : new_dict['zip'],
+ }
+ if new_dict['partner_id'] != -1:
+ vals_res_address['partner_id'] = new_dict['partner_id']
+ if new_dict['state_id'] != -1:
+ vals_res_address['state_id'] = new_dict['state_id']
+ if new_dict['country_id'] != -1:
+ vals_res_address['country_id'] = new_dict['country_id']
+ temp = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.partner.address', 'write', address_id, vals_res_address)
+ if temp:
+ flag=1
+ else:
+ flag=0
+ return flag
+
+ def GetAllState(self):
+ import win32ui
+ state_list = []
+ state_ids = []
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ state_ids = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country.state', 'search', [])
+ for state_id in state_ids:
+ obj = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country.state', 'read', [state_id],['id','name'])[0]
+ state_list.append((obj['id'], ustr(obj['name'])))
+ return state_list
+
+ def GetAllCountry(self):
+ import win32ui
+ country_list = []
+ country_ids = []
+ conn = xmlrpclib.ServerProxy(self._uri+ '/xmlrpc/object')
+ country_ids = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country', 'search', [])
+ for country_id in country_ids:
+ obj = execute( conn, 'execute', self._dbname, int(self._uid), self._pwd, 'res.country','read', [country_id], ['id','name'])[0]
+ country_list.append((obj['id'], ustr(obj['name'])))
+ return country_list
diff --git a/addons/partner_geo_assign/crm_lead_view.xml b/addons/partner_geo_assign/crm_lead_view.xml
deleted file mode 100644
index dfd7c3bef1a..00000000000
--- a/addons/partner_geo_assign/crm_lead_view.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- crm.lead.geo_assign.inherit
- crm.lead
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [('partner_weight','>',0)]
-
-
-
-
-
-
diff --git a/addons/partner_geo_assign/res_partner_view.xml b/addons/partner_geo_assign/res_partner_view.xml
deleted file mode 100644
index f9310fdfbd0..00000000000
--- a/addons/partner_geo_assign/res_partner_view.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
- res.partner.geo.inherit
- res.partner
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/product/product_demo.xml b/addons/product/product_demo.xml
index 155e759a549..cbc1f4d458a 100644
--- a/addons/product/product_demo.xml
+++ b/addons/product/product_demo.xml
@@ -463,18 +463,17 @@
Restaurant Expenses
-
- WORK
- produce
- service
-
+ WORK
+ produce
+ service
+
- 20.0
+ 20.0
Worker
@@ -486,15 +485,12 @@
buy
10.0
-
-
- Rear Panel SHE100
-
+
+
+ Rear Panel SHE100
-
-
+
+
RPAN200
@@ -504,9 +500,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Rear Panel SHE200
-
@@ -519,9 +512,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Side Panel
-
@@ -534,9 +524,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Rack 100cm
-
@@ -549,9 +536,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Rack 200cm
-
@@ -576,9 +560,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Wood Lintel 4m
-
@@ -590,9 +571,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Metal Cleats
-
@@ -607,7 +585,6 @@ Returning customers (0.00) : 0.99'" name="pricelist_sale"/>
Hotel Expenses
-
diff --git a/addons/product/test/product_report.yml b/addons/product/test/product_report.yml
index 6e80083f66b..de86f392e5b 100644
--- a/addons/product/test/product_report.yml
+++ b/addons/product/test/product_report.yml
@@ -3,7 +3,7 @@
-
!python {model: product.product}: |
import netsvc, tools, os
- data_dict = {'model': 'product.price_list'}
+ data_dict = {'model': 'product.product'}
data_dict['form'] = {
'qty1': 1,
'qty2': 5,
diff --git a/addons/sale/sale_demo.xml b/addons/sale/sale_demo.xml
index cd0fdbd682f..a6cfc961600 100644
--- a/addons/sale/sale_demo.xml
+++ b/addons/sale/sale_demo.xml
@@ -193,6 +193,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index b1f31294a97..ed93388df54 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1450,7 +1450,7 @@ class stock_move(osv.osv):
'date': fields.datetime('Creation Date', select=True),
'date_planned': fields.datetime('Date', required=True, help="Scheduled date for the movement of the products or real date if the move is done."),
'date_expected': fields.datetime('Date Expected', readonly=True,required=True, help="Scheduled date for the movement of the products"),
- 'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
+ 'product_id': fields.many2one('product.product', 'Product', required=True, select=True, domain=[('type','<>','service')]),
'product_qty': fields.float('Quantity', required=True),
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True),
diff --git a/addons/thunderbird/plugin/openerp_plugin.xpi b/addons/thunderbird/plugin/openerp_plugin.xpi
index 70e1f8fcaa0..e928318e313 100644
Binary files a/addons/thunderbird/plugin/openerp_plugin.xpi and b/addons/thunderbird/plugin/openerp_plugin.xpi differ
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin.jar b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin.jar
index aeab9c82228..2ee7837623f 100644
Binary files a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin.jar and b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin.jar differ
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/createpartner.xul b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/createpartner.xul
index abc23a5b430..ba511be6257 100644
--- a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/createpartner.xul
+++ b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/createpartner.xul
@@ -13,7 +13,7 @@
&name.value;
-
+
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/overlay.xul b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/overlay.xul
index 15626e54f49..6e2af251052 100755
--- a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/overlay.xul
+++ b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/overlay.xul
@@ -38,7 +38,7 @@
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/plugin.xul b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/plugin.xul
index 227c69802e6..afe02875931 100644
--- a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/plugin.xul
+++ b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/plugin.xul
@@ -3,7 +3,7 @@
+ title="&title.label;" onload="myPrefObserver.loaddata()" height="650" width="1000">
@@ -12,17 +12,22 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -30,12 +35,11 @@
- Documents
+
-
-
+
@@ -43,21 +47,21 @@
-
-
-
+
-
+
-
-
-
-
-
+
+
+
+
+
+
+
@@ -82,14 +86,14 @@
-
-
+
+
-
-
-
-
-
+
+
+
-
+
+
+
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/tiny_xmlrpc.js b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/tiny_xmlrpc.js
index fadc29222fe..0736e39b3ed 100755
--- a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/tiny_xmlrpc.js
+++ b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/tiny_xmlrpc.js
@@ -1329,9 +1329,7 @@ var listPartnerHandler = {
listItem.value = arrPartnerList[i][0];
cmdPartnerList.appendChild(listItem);
}
-
}
-
},
onFault: function (client, ctxt, fault) {
@@ -1873,7 +1871,10 @@ var listCreatePartnerHandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var createId = result.QueryInterface(Components.interfaces.nsISupportsPRInt32);
+ setPartnerId(createId);
+ txtselectpartner = document.getElementById('txtselectpartner')
if(typeof(createId.data) == 'number' && createId!=0){
+ window.opener.document.getElementById('txtselectpartner').setAttribute('value',txtselectpartner.value);
window.close();
}
if(createId == 0){
@@ -1891,6 +1892,7 @@ var listCreatePartnerHandler = {
//function to create the tiny partner object
function createPartner(){
var branchobj = getPref();
+ txtselectpartner = document.getElementById('txtselectpartner')
setServerService('xmlrpc/object');
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var xmlRpcClient = getXmlRpc();
@@ -1904,12 +1906,13 @@ function createPartner(){
strmethod.data = 'create_partner';
var strobj = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strobj.data = 'thunderbird.partner';
- if(document.getElementById('txtname').value ==''){
+ if(document.getElementById('txtselectpartner').value ==''){
alert("You Must Enter Partner Name.");
return false;
}
- var a = ['name'];
- var b = [document.getElementById('txtname').value];
+ setPartnerId(txtselectpartner.value)
+ var a = ['partner_id','name'];
+ var b = [getPartnerId(),txtselectpartner.value];
var arrofarr = dictcontact(a,b);
xmlRpcClient.asyncCall(listCreatePartnerHandler,null,'execute',[strDbName,struids,strpass,strobj,strmethod,arrofarr],6);
}
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd
index a2345f0aaaf..48bec840d1a 100755
--- a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd
+++ b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd
index ed26728b0d0..2f1a06ed341 100644
--- a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd
+++ b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd
@@ -1,9 +1,10 @@
-
+
+
-
+