From e38d7bcf52fc57e5ee65f259e7b93a264fc3a0a1 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Tue, 21 Sep 2010 20:37:46 +0530 Subject: [PATCH] [IMP] thunderbird, outlook plugin bzr revid: hmo@tinyerp.com-20100921150746-i4ccvy382ugl0pnb --- .../plugin/openerp-outlook-plugin/addin.py | 54 +- .../plugin/openerp-outlook-plugin/chilkat.py | 145 +- .../dialogs/__init__.py | 4 + .../dialogs/dialog_map.py | 2839 +++++++++-------- .../openerp-outlook-plugin/dialogs/dlgcore.py | 4 + .../dialogs/dlgutils.py | 4 + .../dialogs/opt_processors.py | 35 +- .../dialogs/processors.py | 40 +- .../dialogs/resources/__init__.py | 4 + .../dialogs/resources/dialogs.py | 10 +- .../dialogs/resources/dialogs.rc | 10 +- .../plugin/openerp-outlook-plugin/eml.py | 41 +- .../plugin/openerp-outlook-plugin/manager.py | 26 + .../openerp-outlook-plugin/tiny_xmlrpc.py | 765 ++--- addons/thunderbird/plugin/openerp_plugin.xpi | Bin 152340 -> 149756 bytes .../openerp_plugin/chrome/openerp_plugin.jar | Bin 71837 -> 70768 bytes .../openerp_plugin/content/createpartner.xul | 2 +- .../chrome/openerp_plugin/content/overlay.xul | 2 +- .../openerp_plugin/content/tiny_xmlrpc.js | 13 +- .../openerp_plugin/locale/en-US/overlay.dtd | 4 +- .../openerp_plugin/locale/en-US/plugin.dtd | 4 +- 21 files changed, 2139 insertions(+), 1867 deletions(-) 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/thunderbird/plugin/openerp_plugin.xpi b/addons/thunderbird/plugin/openerp_plugin.xpi index 05b4ea55c9720d0070ba36c666e9328c2748c744..e928318e3138549e9b3012f0f006a89703f7169d 100644 GIT binary patch delta 77074 zcmYhhQ*@xgwlx~twr#UxyJOq7@x``n+jhscosK$o(n&gZ?{m%=|E*DLt*Tjb%r)QY zp(?c;_A?0<@uwU(1RThJ$3_lk5+WgVVt1x|Mt5csD<1gje-K3m=;;3-|B3%1As+Ne z`K-_avN7_X4gW<_9KldP2{TBcL2)yTzCfW7)YV`?z*7&*{_h->DVtN^f8_r!5&bV$ zDIFB%f4Pnwneq((qmERc^Z(~&kcxs5{8tq5e~H5XvGJeyzosd#pg7?F&qK-&Fs%Q# zW&7VH1~$fjy25}g{zunlI59`~4Ftpq0~7@JzaDS^CL3dy|FIkNALajsyB9nND8xB9 z2+04W&_2^vMuiMYKfCRA`~R6YP5)PiUez=;J^NO74No?j#^Z^7<03KH&r~E!gE?4W zFa`(o-Lh(XLB217K?Xrt+B;lX+gyt@)q@~F+8yOGiZ0|coSy>$C=duiw8zNVtMivf7)J?^CU>W^>KpE=JBVu4@#VDi^i>S^Elv4cXUC~x2R zQjPe}1CgL#Qn4*i5GTH~rXjK{$_(CCj-#a=P4z8GU)x%RQfwWe zOEM~%i0!M5VS6arnYwO!tuH@w2-*CYJ1v*uq)jQPnm1$qiQqLB`!yCqY1*t`NwEFv z_~zgMoN~WmYE8ICZHJv) zYfZ#GC+%EA#`khkRukv%e)-4gbM$lJ&{L?{4;uJARBBBb-DpET8o*gYXX9=B!y^-d zsx}b!Iv>0kLL!MYSWs$+Nj3#E%@d*Tpj!^L!gV~E3IpHgs-97rl&Uj>KQGDd$JsJA z`&5W{s>KA5L;=%S(KDV`j!A%nezovoV)M`Vt>V2pSzrf#cLnfbfCop5N4>m%kU^fQcwo z$h#A@9nrrZX;y#EkP3jTzrSyI@A6MqM#7|07gh|t!yF9Z_{Y|DvA~Syec*ZzHu?Ny z;#3TfJ3lAg3g0r5KFoEbx|MM_{ki_7xkK}_VqxFYnf#5kF(&XW(bU`9$Kk+_DT{Q_ z`WREfW)ocdZ1<0DPd|cad~L03g-{P{?uUDan}g1w;vRUK*p;y?xK0s*lWJ(*i7c~T zFcE9It@?El+itVPBodekuPlw)5}|m$7fBc};YWWP#dtfZ{!!4aZ*poc4CPOuDG3g7Of{mkk8`PR6Hr% z;oD(Oe%q5o}8l}u{4ce?M<3H&g12lRknkQ~9f_RbFFt2q&i&O{0Ox=DF9h9)TGePzPDy@=^J3zBYo*MTe9oY40f|6OicRfj|`=$u8L4tbba?Of9z&| zr{l#L&myV4B_i0_Abg5lQd~-YMZb#*ta%IUeA^FNpNZ##wWIk)YLmtL{LInvFk*^ngeH1$b7OlE(_dg zv?vEyB76-9k;YQBvbha{^?N3o(nEuTN%0M1c(w*NvtLHk zq}r{zDj`~jk;PtZ>i=ciZ!nM~LSg^KFU|J|X}O5h;d|kh3sHCan6l zANm(i`GFS278HJ|0a3l%uIV=%P)}Y@u8P(9PFbzxIhIMCP$Tn`{UH8~v#*bucx=CU zQ!!m5(4&JOmd43~)E zsxILs{!Lc>JitxG)Cycnl-xK(#r9*Du&VkqXQZ>69v?xKh;toshb%Hj$c=~{gUCel zw42ElBMe@B$>)&qY4ROCwoGpCVzD=}oF2!j;(335ILIg=Z@r)Vf4ylu*ogZ9q9R0D^ozZi}Ze!c3!)3aLeU$Z8|7;$r;v zJ?a|j>vtSw$_{Y@+-d$2{t`j-V-cHUnF-mDdPeZBglq)kGRF_z91dk9_5W8ZjHese zXZrk6ux;B|jgz=GV#}$^v%VLu`op}(ovKYf`<>LqTB~BlqUeZ{T*H&YW~YgTE5pkK z3aB6qW)I$d40HuW7=_FxJz9ex_@l-pExNwh&N18BHPvrKlG|8p4XMqna7yHgsUTz- z<0?~LW=mIswSplT=(8q1-mJ+mJSx(HW{iC5eW+aMV9W;fuQ)T?gD#Hpapi$QNV#nk zdVVhSA!woEhjWB&)z%*P#0HlZ=%5VJH85wEYjl}Rq{O3sh1c5FfCF1oMOUw9v$<$8 zQ8yEq-TYfn_Bb_Bb+jwO__T8RH$4Unh+{_%ZD!9(A(S*s#L=xah4~9l$035)`jCx89jYk9@6-eN zXARU0Lu^aQ-dcaqLv3I-pZL{`96~hyZ%B^GaU#2M^cnC6gfW5u4d4@6~hk5bvo=Vt-Xq(O4eP~t2zh#~iNo%J~HnVWk zn6uJDHC}2^D+G{%k(CfjN~KY*(fudvq(8rw(nZ@PH4uuY#{)sD?Emmd=>x6c_6P?U zTA@!={bw$@Vp}JRkIM&#eHv`gW6vdgRa^Y`DIH@xc1nAo<`0^l%TIXV842^B3+O+o z(l4$W5R@b{xWY{AQO~(}_DfGR@o_W!S1vLTqU{R?u13p{uXpVV>2~lISMF z))Ffn7s$GpH%CCm@2;>Z2Y|X@yJ>zHJ2xqbeuk(BBo}cDxe>B9SPok;lxVOlsrT#K+i+e0K;XZ6dTwWKi_FnIg6_K=*~ zsyOZ|V1WDNjIPq$Jh=aMd!RZE0+an}xfHH&Xhc|Hi-5K!5@zCb&}Km$E06xIH&Q6k z<3AYk`lg-i2#*={Yy{xSRolywzyC{U_yOm%mf$N(K1rG(`|D}%$b^ofSq)8lGgv)(+4pQ3Kay%Tr{N!C)j~ zhQoqwj34)^bDKGJbI?T?W|FXu5E&MMO7nv!DQR>+-$GCg_JsyKKo z{J1V&@)YzDP5|PzSx+oTkxH=ll$gF%8@M?$P}WAx4Uiwhra?dP!JX*|<0sPuG*W}1 z85JqD>Unq#$>hiE(X(PjVNLaBT!7=yqs305S@`wiU>Jq(;%FZN zX9hGXr$oW+WDyoq=Z!E8z4$-twnWuFJkFNbGcGm1kt58 zK27PSi!9@%nr(n>Q^xz|?Eo{=lWxhMQ$txT8Va&4*KpJ}d$xJFYECsRT>s!+F%k8z za#F*WXG9iux{pv-FEopR9vY`qYRu#vf^R=PYxOx zY*M@mJfJ0(rXeq}J|k}Gu|tZ~)EOrO0R-Vl)U!Zo0uj)$JCZ;P z9O&1UhS27d83Of3XBAs;$_lzfQ(t{0B{?U5<)^VZiW)W9Q0J5eR-MUiKRpl zdn|4Ev6B#*Zj^dH32&K1P8rykuDq zPfN`|qdSJ=KSFCKCKivL%s+yoz1YZp8f3j-PB(C+XNhseFv2ZwudlaqNhAcO8pnkJ zNdL*IJwlnQW;Be!z3C%x$F-H2um5A62I;tcTN&Q(SmqM9Dg}4iVMaY&>8swKx1v_I zDJu`ruK#rB`e8=qH~Me83G(hp^DyPddqn?l?weq}f#2S-NBA|NhBu-HhwQZP5oMu< zZzhTt%e?Oq6{SiC!3GzqeD4uerAmK_0mb`Ax_9W>Ql*DsgL_x{cj)?3rN2l2K^-5E zjVAAy-|wKi2392UkIuB44d+Y@?_CK;JK9zpH%tsCTbfoJcT5a7*#$?ryH*^>ih-dP z!4qz+$p)OVCrF{uj@}i=rz1yem;1Akh9gTamtw?k=;{^6VKSj4b2P=<$Yp+@Y=wCt zxz8|3GqscTIa(_!y-aq$qZ(54zIWQg07hoQ104^qe*xmn|LGt8(fWLd!FWX8LSE;Y`B1Lb}O_`zHprqUNSV7*>H(vbhSKh zPL9^AI5>^G`%(Fe(Qct-lt&R@MSqGz!9yEtN8XH(~M`+p#eXFFiR^^{%dHJf z8ImIbqzxM6x(KAvLvu4O5z!{1ByXbpfkjCp4V?mh0^mwzZgHQ0PiMDqIPxfy4|dah z?ShW|SlJ^>-fLUu-Hfw>fv!eObB4{I&HCurgF7#Vt)gFT^fNyXy_8=sV2;rtsp;SA zSYdP>J2e+~@nfud=wE`1YrGh64~-NGKJJ9_$!eAR#!?8pEJhl#KWo@%A{_L4kKuwwRbX-A1rN;+XZ|a4abbNuE+2 z1;L;E)9lYZuX6ue%=9R+$j>NcB#|hA>VFq^gs;{Pct1T5;XC^)@g1_M9U0W}Ir5_W z{P*;rh^v|#(tLlds|mI<5au;oaj!FOpnkvSI{`I&B|ncUA>@*1j2QovE!PH37{FQu z1(M4^;DX2?WI5$fU{pQ|2>Cfq3^1s4j6DWN)(?f0pW7BbOrl_FQ@P44Fn){@@!)lh zh0giPwWG?$p6Hk4il7N$dm3zBo3D$mBrr8{Ep<1OwJ<^Obl=oxc$YJmy|2u<5|j4F z9RjdvPSxhol1@i(So9YMGZ#H8i9$0zwwOQ%hXGuZyOr}8Zua9k_}$O2?+q;+^$V~W zOmk&+p3JOs&j8;_t?DbA1!!8rX92oa9!`#6K=5_7p)L{;=^H1d=!>l5{7XD2)B*dhg!d0Y8^nCy z30y&yGyYnZ)?p;{d%Q3GHy1w}_PXR?u8tGe@+ex~k z=b9R1=07FdR^(PH)F|X!a?G`s3rWnEwHB|6TFL1Olm zu&9GqlAEtaX1CGY6oIP#!`D;tnDEP}lVM)N5l<1Q46?Ki+x`a`k$0m~z847g6Twvke*F zr}|bA?N?GP#A}5=)$8;lMASnBNZJYOSl^p#x-0uRP5mRhLNBg{rujDcH1wq%ba-#f z{SS>?B{HTFJb@ik+M``_%DqN>Xh%x1^DBfC#C0&>PMy3i{R>1hiA=Mf2c%U_kzqF5ybLL5Axv z_-ue5bM=TYspK^je6+^-DmR4Y9!kLuP};dGxG6YxiL9n$UL_xK5Ic5WYBqEU#kS=$N_y3fl zy@d(#Ie|Oq<;)SN^Ry@?;J5T{JN7AdK))ZgB$`D#+~C#_JUlrm6_PVtVozdl(5YLJ z5{|-fh+sn&ppSEbVaIo#5FW*}cXNrIOaE{%1h_=DyS!q5S5PArn*>KyX2!@iOrqa4 zcw9#XE-PnvfNxi(x_~H?{!Mg;=5hk*Sl2VnPlV%8lCX?tpqhidg!hYJ-;T+(#(y(< z&sWUz0edxPJ9F3e)pqMtD-S(3QtkpHMH86!pke(%q6~$|!DP&U*&4}fQ-mn*u$a3; z2Q09Yr=z4%&d3TRQ!Pam*^sS6#az;fn4_mw0~=^^7}3Kln9=5bW(yc*-IQ1sF!taW z46&)CwPwQ#IN+(~Y!RS-X~WJ%G;wd?XAP|BOe5w37}PLYzch=DJuzZX=R8tvx>QO0 zU*(b!Oh7~7#H#C*Sv(UkZIgeCNl_@b{E1uc;#~pS$qfY*FC&q z8uhteZmnY6ykzf}XDFm|q(`F?{bxx+d5K9Q{N5ONjx$VlizLm}A~nla)_BPH%XU{r zL*5e~Wbp&b2Q~r@F&J-YTzQvl)U1pM`?7-$3Th0YoG5 z`VP;^sNPq9Mfb437$FMWJCm~|+4J0d#R08iL{rWwaa)hwNmk&>=Xl0?l?FnldVdTO z<{*_gRG8JO=_E1GIx$<4sqt!dpc2;FR&fAMv!JE%x_Di)*$p<;!(m0dCs~NJQ0lw~cIN9Eo@<40YQBneVocQ;0J=w8wF9 z^jJ%~TaT)UiZ@eOJA?qV5YF|_gN}U^;a?}2zqtNIWV=J*O&7aL;$CM8$D~aNcrO)b zUIuAur;z%R)wEu#?N~Pn2q3=^RE4q9FW)GW$=hF;g!j?5TU~HA*KVrC0eJ;1^?w9- zE9*I|9q!;Wi@|xuXNN$^ljcJr$zDsreli%q*%5oMs&U71+gl4k!S$KRrB4*@5{u6v z!TtgH5hGZLImYSsdPgvh=#ARD&DZ>k13ZwCh$5gUE*Pa-oJ~IWS)q_joYQUx%s>te zU8eq>lZv5R#s-U*m8+3LvCCT4y9n?0&SD(LYkg*QChD1zakAj>lt zFR%Jc2uJPyE8#HcEs}-s;TZg99!@M@;|-{Mzl!V)VnNe`KC7{hIiOc|HH#lspSxjk z*?~}l#i;(nHnOP{EY5x2Xn|amLF;!WgW|KhRRe*2o zLbitPh}GA-VTblpNPq>zvtB<`O>~!RFELN@r(cMDKFI zmXE!1sLPvxAQo|LauHvrC9~}xrEn8;4W`|F94axN1 zbmobS`noY-wc(7)7mI0p?o}lulzSfF5{f_Jk{k-V1PQ7qMrPj03RK63JQsG2jj32^>|oV-qeZkimLH!!8rJ*9lBZnyI( z0%@}lbEA<#D3;+!D@qKp0x(P17^}_dmHf!=AQIk>M5@U@WEu5njcPhnukmI+!R)dq}ya<>!Ed#9Sq}5pP7;1>5l9Zm@^cSKXR_!HKmS1GCV225U^< zm|-YQk*GQI1*dY79}j#Bb%H0#!Y9vZj!UW;Qi*OCuh4n$EppxyOtjWtgWW;gM!bk$ zzgzucz*|~!C`_t-%o(C(e68FbPq<-FUT0G;sz_}e9)TYwze2U?Y3-{J+@v;q$&htg z$WcwBgSw@Z6mXI8cg%VY^#z(g>qlrUgJv-z>mO?$lmK?ftK%?^#=VJ*2$KwRcQXy{UKXAhq^I2=wuK5gMMg(VSUTNw7FjpY1;aSrJsf{v?Gnts`MArmz5guvo8f-2 z+#>8RGZ6;+uRQY0hQGDvg}Akz{~Wy0p8ok&;Q~k-`V;)7SzfrKP-~*s|8Lm8 zGL5#V-fA=*G1Hy&vc*mfavx>B6d{XQc&$Zw{GCBAjS9XP%! zh$z1p{V$kGnBJ}obht01liN(nv<~5P^&p=%*HnLL5DeDYSTs5Mf2p#6aSxslZ9lWv zovQ*!BrHj@@C%u0eS78Xwn7N3l{#eDsNc3AL7ezQZuwxuy2TH7A8sYf!XOB>49F7= zQ8w!NOI7=~%cKlq(E`Ogo3XOU?qOj3iNR`^Z=2#MVX5bPrFx5+PTeJcPQ8!!KDN@)TztKR&F{L?Z2h(g1sDh#cq z%A+gi#Y8s*zpG1FR!CLuY*mwuL%D_XCS>w-rdRtBn$Q3X*xz#=%C9zup>g6{#2OWmobic4o&XAJxhDMQnO?hjNY60%MMXX5bQ-wQ543tkbIGVvwmx~j$xyH0JG2Vm zBx8T3W=87zv+Ro9<8SjGRV5TufPJkbftgGJOA($(eG*A|W$L&wyCa}gRD2Q`F;$8V z4IafTK$*TRZKicKUZa&z@i%g0nhJ3s}T(=d!s zl3T+CpSF>^?giO*Nro8f4((hpfa*z!rJ4K=fD)l{yw644XevV`cH7BTa+fireXfA| z*A;GQOP6)lIs{|tYW^@Y@aCx7jCeQTltmWT=cB9)tJP=$&E&kSea2U`YzyQm;~>J8 zS)IU-He1adAKJg&v+_Kfc+Za5Ehp_)q~NPsy%ccS^+@Vv%^#X8TKc3O!ZN!|)E99) z49l`FTaTs?(%MfC+l^GIuR@r68xM2k$;O_`IRdmXXE|do^#r2IRnO#Qn)JSiR*qTX zwjKzVURudq7v=}rnn8A)JWT*VhQxkO#P=S^VM3^ zv_qIx=Z(|l^U|5P$q}`ISbVv{JC*#G3U>{dA$i3reoP=2w~9X`82Cz{E`~i)ha^M! zsf_>}eHNF7Kh)ZCI5-F*#dufxsnODS#}A~DU;l=K>Mj12kTKEZC{rm`-14rqj7*Ek zZ29v28#`qdC0f^5!wVzT>rBk+cgG4GN_0Sf(DR^;*M_^9Iqp;{D+~`kQo(cYF ziG_|;rh0PT;O>LTd z7;~v<{DwcW4+(EQgW~M-=u&TNFAJ+hL>As@mYnr{E#q^p*Ox~5No(?ayOC^68+NxO zb5<>L8fkm4Ux834b}HJ^PRHq=jF+4!^$9rVuAm7Y|Lo>av!PLOw#J9TvNcc!-_uYG zTfR@<xa=Z0p)vwjwtSXgF7-Q zvp`Ne8ky%4s!{6yY8ZYGga)@T71Q(NccOYX<`lHz;emg}CL@{ZlY}hTKYoPz@jY({ zPx&QKg-{ODv?^g&7V0$+jgAR>iKs|v~L-p zFV}lp@#^U-v^D0g1{tbG1d63{4Lg*?q^HP0LQ}%0e>{N@n zv!q7GS3!v_J6rm>G4QkJKfkZAiXjDc{iVAD=*0kYV`vyFZkEu>U*6zcqSYa1e9XSk z_eHQ;3VqkY1tHj|Fb8?UM+tq3TIpbN>Fn7bHktvK zq_kIWaX6Sj5jpkVL~Sh&<|z13C#e#|WW;C~S#RDb5Sb*fF&ffrw&m7*Px0dGdqV5K1?W9G}S$sY2s5!BtwL5IWG<&^k09iS=U=wz~(ip&{Ldm ziy;c|9)FuX^I{TKxfr@SfC4jP6Q!Yo<3BwB56;AR;Mn1W7TZyOLzyMV<^sdu<^ou-2J8RMUOOW@9~$AXM%XNp63JAmw_uqPNWkre#qf$gsMY&8@t(9(UOfu+wo4wiLF ze7C#bN1Soyw<6lJw?DJHc;FLGc5*ko`OU(~?>2&3AM+%h5KVO({e(6Yo-WnFTl%Hz z(wpMDrt_q1sn@|x9j<6+MwRM|xYU~qz*?EHG@(_g<7Ij^J|(2;D^Fu;)BzP(u%fNTTDh_t_^h7 z*{M^IAIJv;Pzrn@VcoMYj{)>)Hbbf%=PU*S1`e%-`Fb90jCi`un_$iOcUz^Ad4c$vq{TlN(<$ld z4wXkw_f#uwX%y{6#*av4>sI=sI+WT>q9r_pTNS!xiCLH4MfGsfbj)gaVz&XvE=SLa zJ9`_}mTzj;7s*VQ(UtmLE%Dn*VFV#C0A3c>e6OR2?=

SWAfLgcV{WF!`xNENI*`+-CwbS1F-WMet)a$F>~;1T>?||^CN4}bgg;y zRgu`cjR!YxW78H!>)`O-SFox~_av*-yXl5LzdG@f1ZaDzIe>698?xu=s0n&PFXZ*t z7S(H18wW)_LJQ(PvZJ(VI953}{|sY^d8HLqX?%;mQ0<_HxdCj6w+U5HcQGhVl^U#1 z-?DE4uiO&lnRu}syax>0P3cv%zM)e#Tw;g-ItM4>joi&DzEev6vEB!NVG|b32qD1O zhwD+Wgf)O98knA2#qqiw&Cky`6N{=$@ISW4}3&@u7ub zN46cyDJ0|pyU>yN&7r7pm%?>~ioV>DyfG8&ePC*U1wn-i|D{r;*A_nWw*LE8k0}Hm zvZK4UzJGkrfjXk_Pm#$McDEObLH{3LHiG?^`D=@_P9l#ikox2BFcxAO#aHg=^ znCK?5Dl8axY_%W3`4z)67T%CbxV!h#mzQnAokt?uv&Y`YX0`W`%sDY|8oQBQuMzAf zmwnu7(e+onkOy!LCfj4(CbaqNSWg@yGly95vS_&2jLhVAk=-62AXDL3_0jvGkn-R) zm{MI$1?&}l5t&O4*l?Y=8dk+L?Ws4dD&?|o7IX^^o~2A$;EjLj;Ys2Mu7&x%8DvCt zKe)D?u(?;<#99%qh8bes1jr~s(e7ZZV9eNLl*x6gH0F!CYL=uP7}`7WPauvLfPT=i zMq3oxLC#8dpjpRwWVSA0N%FT7HSE&$iZEWI17meuE0v&OL_S&V%{Rxz_N7uH&4;hK z(xYklkH40#qsCoWyHRJV$DnKa3}Mm4Jv_3Y z+3lHzeIbqYQ~HUQ0E1mV&B5gdE8SEEoF^s1?JL2ZHu|YW_52i=^dhw=>a9t)S;LSt zk!1VN)$Fz-0|fTS7mo*JauoC{#Kj4YjoUfLFZ{&uw9f3nxh9BjgisWYb;Y|>vx7~` z@JVws0C?05l7f`fiEQ?}e0>`ttKxc@RA@VO?KL&wm9^{evKJ58l(M8F{?YmaE%-=T zc?L!D_0=wPL1Kbm(G=iDw@Se?GbG%}O2@w!f`1umLZB7@0Nv$0P9jXwej{_DV$UzG zbFN{-caGE;T7K#9nMl4DECjX4k|i z=imGphp33$UNH(JLfngRvtzf<+A7c1plMfhJ+duLS1~tw3Rz9>R%lUh5cn%eMZ^eE z=7`JwTU47-vTP33e0c>oOhLg@ny6Q}h-$nD*+yJqxRYNArt0!)^E#|JuIj>@pU{x6 zI7c<{xMGS7XG;++#WBAch|TFf-CFg~&!9?Q(|CTeJ|aa|i)(<&wF^w+o^0O1Aq#y& z-+7{zh+Qjxk8UA9c{CqO$Uw$Q+Y)PyCbnc@4$4b*F~3LrS(HfiEn!5%>$V!IA%HS3 zNiUP)HCB^u(OUvt=OlKJTuA8Coi{U6Xa1g9!Rf#zUWqKlE$A~0#NFtIVUNn*gSQBV z3P{~7^H;oNb2b_Rl~aYRAgqb6+aY1FlbEU47yT%9T(-12DRvoJJV&tA{Q6i5+VD?S zhFVHapDbzC;xST=DA5811NyGH+Tm(w@9pD?>k;X;mT9{XcjSqZKds3GkPyE}{BKKs zMz6ozJzrl>5eB>fOo2dY#gKa&;fNMRrA4DQ=aV|7q#YspDQfsJi>Xqy zIo33-9R9_edv(Uy#eqI`rmmmkl3_aZHz4dt1gCNm)6F}^virBZ#*5>O?dyG=c$_*L z7j!>^qj-jj?hsJ(`ce}A6+~t?^!b1&tLkeyY<*6!fIm$FIp9+H%-;z+h$~lHrrIUZ zPl5u$+7a(or;b`R*pz=^v9C5yZA1o{Qn3-IjOMR*BE|2-%^64ApAGwN%o3HhQ7reZ z`qU|eSdIB=@WkuWjWoO*oVvlq{=(kBi3(TQ4Y9|wVJgc?GE_0|1g!g1$t6}i(dcji z-G={w-3=39^-p~kJOoG}94tuSX8~9HMo$*sCXUaNcjwmU_qEN1Oj6pog*Z$Odhe5` z7d#L3Rq*T_vD9mF^ip-?iw(uv^!8B|qwX_hoNDB591TA^iDSNJEX zs?hV)8LJ?-k#Ishq79C(!`8dY>%sJKV8wt#<`e(l>k-w6IhsxB50Eb-6iyfWUpELG z9p9yH$P~&3JHKxSO<|d|quA4HeA22l!upZKsW2Z2bo?c{YDCB@Yy}2CeF>if2TSeE z?|trpG>umi>@cRPoXGC3!oH9KLx8=5 zw3Z*CvV5{n+lhyy6eb%$)~d0nda75t8>p286U*JBI2|(H5EpYknR5DC#&Gp0zvZt? zaVd)7H{O+g6)b*nb=*aYM^99X`_)RgeME7|k!&^bkaCh-HrHBX{=G+JW+jN_pdIDUK|2S=ck~Vg`zGqpJkd zMw5h79@6ln3Rg+OyKpR(Nxjw1Y5B2%H>UBa4X%^c&s#`sv;U zhFi=@Gt&s7bTK6Y^1p*A{C;wnn5=d{dsjkqay~@z^l(f?+)2H-J-#3;ur?h5f7*by zMRYK-V~ELrYo1W9LAD#iVY0Zdz8J)bZ8cmjXyKSothkAq_Z9ffy@I%-?ae5}w*4Ut z0z!id3X=E_eTC3YZAil?*>hiU2Hd?5v8WIzx$!+AT>-dC!y7pUz4zU@vvD8-9 zx<_bRVR}moBgJtuFgF5$Bo@IZiz8mXbOjW%lr;%ucK%Uq`J3MKi&`H$-bZl|ZDLz+ z==S*b`f_MPH*ZocC3JV>wO{}^boV{>TB^7YN_m@${)O_JLPA(1qXjUFho$sd9;v!) zoC?~CQey?LFTv1;BkQ1{vjXZ*Y_LuMK`3yB&cLcRG&FtLMZcJyyPW!)=zRyxgj#xR-~VkSXs+Bs<WPEzBeIkhqU(&ORtL%3LDXD81x;^dP!h z90tC#SBq^L>eBCr^1@tTu_gLOyHvFi=XB%_uUn-uRLg+0I6)o}jao$J zl(9JQX}kQpX40)omcmo%6EvU6E-}=3t5fmj>Lt-OC7SR?DsgntBg><3#^9-|h*iYw z79-V4|B1wk1#VmZy^r3zh_0e6J^DmVJ0E3~WMWH}hRh@@57z|fj}K)F=Rd*@Rovez zdFX{R=MKC zN1V(*9Yqv;Puxb}gbCvB*${Y@!HoN*c8ld&v-gwWBX9#jkcnCVIXjVYw3VYNFNx^#2nBNlff(qoWHhsxv&?oG* zmC8OoWRy**I7zyd)Zq;FPaDQpa;ViF4X4+Wz%BEe!!8`KW3g$EG^%tIb%<*o3LZQW zJ(Y|i$;2_HP+#d5n0c822`_A}V5?gqSgXfR8$Lu2O11qi9wR2qY1KSNdGL1C+z=A$ z?>}}^yK!e`vQ7y37oCjvE-$%hREwI42hS-leU(2`BSp8#qfl~oT`ehgclQVBduCl=`wE1%M51DU{g&k-)E0d2w5tBKOY@s zGSS@I3gfpGifb1(RZCaWEyvwj=L1%l?%D@Wy+ss&#aiST&T@FM)z9GZmy5G=iud^T z?zHx>=X(pL=G@IZ`V^PIJ~cVCUb>PL==YK=27ixz1&hwtn^m&CJjuz`#PnT9-?FNj zv2@9Y5zeRh7np|JT|cJhi}b6wI#y;~F}H2m5jV%7%LJ0Md^}d~KBJ<4dzHkqlH0#? z>LwL|E^lO=gnvu(k3@f{{w_)xHL#Zm_~93~EtFAsLm1P*YARKnBMT-w;j=%hp(Q zgHdzvMO+m!{j-~uX!dy!uVB_dsOmwjMb!1KjoOM%Shto&B207zyfJZd#d?OpBlT#o zZ^Zkr_mR1gv4xx&bE?|P?;h@eomZ|a)dB>V{n=|>Wn`07Y;X(^ncyW5T6PtV+*k(y zCB{-RWR1+laoes%%W-;RWaeBgHqbvRDh%Z(>L!Sbdo?ViY@AXJbM{s3zJ4ZxO`U!D zeT`w>--^W&vH3KWW4O^!Q+MNy%siu6Dh^|Qdi3FqW`epu;ry@5PqygT(;)@|UjHgR zDR8N|jVpi5fU0DYF9|bt{7o4}Qqyk%1gn?g48Fpr`=YCJz>QLrXfYo^Trs2H#&BKi z{-S@Ydx-8D)GZUbF7_7esHy;aDZVotY^1NDKbD@3s)NhNh&**$S!W^zlMjclltltl zJWK@Gf=O;+pmn$*K*N1f@~4e17|h1?ZkAUghmESaImNcK`&a^B#i)*_Mx9E^GDf7Q*PV`jMS3jW^F0b^IZrsY{n~ z*nXNhq4L!LJ3!>VPq~)370{@A8L$auW@!0hJs;x)*cF1Yh+r}!ch5~R)qv+kUbG`& zk!@L2IaVzQBJeZ9DF)q%=D(U`_!}|`?&a-vudSKPj=e6vE+Aa*(^3OEaUb~Rmn%R7 zN@!3ZDW@YDyZf*EMvPDjIHa!qe zYfNGg@J{j@Ep(2u-=+uZxIv&B*!Yixw`wsuq22w&Q=F+7P5J>5;q=Za^#2bjK-RzT zT)7)5&E9xP%3eLumS_fv-lLRajb$l5?8P|mjEFov(h9bT-B~Z&vRBq#S9^55At3$- z)I67uPl*L};+%bWnPAEz`+8Poj_rYWS$;zRZATanSO|v+EX0ZIn)sqy`hb8=FXpd? zD5N9bbLT?!tNaoRY83DFe@zRx7ty+#UwDmbuyb__BaP@nv=g-32W~+}9D1CA=q9IJ zXm94@nI=>jf`J_icw*)ErmWn=vCP3L7gt7H(z(yCl&bL{!8EGbYW1EGeDpf0m5p**bR=6U0tkTt)+I zOUZ*MANGW(0?SG|WSmlCr#MSr&#e1&vR8ACiOA%Q;|9qD48t;8f&cI^-rubM?{HcO){->NybsP zb}OG++K2B`%%;*CuVU(-LFB~B3se}1SzwM`Qc$B>cv~X}cX4|`Z9%KE^s+|m;4R3s zbQ$?h>xI{)?H!q$(NUUkKI}vMv}NS47jU9@&Wsa)e;3nivc4a{wYh$Iw{BJ5?xof0 zEddXUjKS=ZsNWG_;IUVNt1O7-MwG&~k|hS-b5B9crd@HRc{7ukw8bCuOE|ADX|R95$JNsXW9m@k ziz4qLf2AF4+iBn>El|tv^+OfZ|HjQ*U54CiqJk^b7y(xXL#ns0zXwHGA; zX{UbD9IPAk5&X^Og<8xNL$SZNL0ee`8a(^Ce^Sl~>=>9tqLLBeT1~=}jh1%t+OPYx znZn&>!B>``G&J}nL)yRX++nov*xkQjK;T3fp7tg+%<8K1OFks>@$c?Sqdf9M^B~)X zgIhW^U|>*0e+$t#EFnDzA>$|hS9{dAwTJD)nS&ppST+QW z00tF5&2Rlj!#Vnr;ElE!Ep>PUv!!lX!vf5dsUOpMyV z;2rnyE=?5~LlTj5gcWlE>1_S>;78eKmJDkAVKkh29Z$WsznayO6miS&W#QnnWKP=U z6Dn4anDH`^EL7Y+)-24Nn@);h%PgIDfcFyy{>@J z@uPwts`e*nFklu)e4Ie+f9J)ZK=;&THl>upxPcH)QoCDmlpDja&B1QoD@wJj;Z`6b zF|O(zn_)%pWGw4(fV|sL;Y@RG2&hn(Fg?n0$840WAf37tR>>%5vom{sE;rdT6$&ak zQouSpXd@#1CsRLa^1V8p?d0t2mX1}6p&tbNgQfOB10EWhX4?wUf7@zLM(NJciK-HY znX3i&>a^83^nm%+g+SM8>~WTOFT%IS&F~0D@CFk%h1be{bYnWgW{Lr*cQFf6Q_aT$ zr6Z)JWYZ^PHE5~k7Ulesyqt#!?me}+vz@ImY;mQkWV+N1za&fAj^gxw-!FLO@SelF zIrVwcUpBm_nv#P~eLsHfMMntMN2cVQ1$Td*&F@F1Pe}*NvDBGNxvOJIcBZ(HP(Itomd*GFbpa|5D~OP zsy)VFRw(QZXPcQF7j+g6#QXdapMQ8LL+r6s&SXlc73nEBZpj5ITx38rV+!HN##=0bF@-^G#N&I7 zD2~>fhJAo4%r6?oqec1*f`nEa2m&@ChX>~vf?al{5xc0X) zauExdF}-uZ+)kI&QrTNq`e#Ei7I9(HhvkhtjJV$J{=k2c?LORxl}1WFbWWFIt&R>c zTicL|fAsW7rhz;lsIy8zS@VzS32S#aqTfWWGCO#YiKm-%_&w~bx@+HLDXh&rQ!zDj zY7los6}1$zXRPIzHAsB!vk66?T4TOFBpSrEG@+5RA+RU(rp+Gc7wxjn_qj1Xaxv)n z{#ncB%JO!NrSl!m5pN>^J8x0S(1HUwkU{tCe+Qup{%j1z{p~!NO=jc;e4O?CZ_~fG*7< zO|PwO)ub=w^0WOqe)jmi!LF{41;OEXrTxI2o=2pQ!Pks_{MlN9(gd(6hGa~xq?OSz zf8DM{$`Wk#zw;%!r|lXhMbC(meyVqobiEZvi`1yRnPe?s{&6$)RxTjl*gWhOjO>>- zGC?*^S96>{fy#MyUM8)fh-PHLsS9+l$%DOzdNISY=)4is)(N7uq}b-4M&%$Vfw)!# zCF#oF*4XFx#o!S)tEGPZ6Ea&ZLXE!kf5$!U-#`8rImF(N{b_N3)~x;4u2`R&UxsZ9 zWNot`*D2h1AL)Cu1oXfne(<$`pBPey7Z zSKWM4X$uKwlW0LubxwG~DHwy`HPEIcw%h{df(^|@Pj=&-cPMtyso#7&FK*K{)H=Cq z`QA(q#w1=aD)6S>#vZ>Le14O5f8%=QrYu$7>b&@CS_=AQ~_I%gxF(w ztKfgMXTcCOuY!RUhCau;79d!7XiJ41Tw5}D{WS48ro;A0u~Usw866C3&FSmW{F6fm z=Eq@x4kd!fi6oV9rFP;2GYY^Uj5WRDAKDjx&)ccb?bdLkzH;jKy~kO?f9=mgPO2RP zFr;AXR6>bPh1W-W(UkAWlo@)-h}^x>LS9{-bdjh@X!H-FMJJBlUpNIi-pmQD2E+i% zO@si@)vyR70mHod`()9*sE4JqHD6;37Xejw$HJg60k*5<1qDmj+wV zragCW_leHJe~-@Qn9BX_e{Gtk9xT<5465$<_zsbc%9sJF$<2yyRq2!+yx9|Nc2A=L z-5~w+=2u)KON&MVZ4mBb_E3;qZ|=;Ee%rqHalgW)=kzg`zIB;Mz3-+CeHy)IyxD>=l|E(YQdr>vjy~@*b4byYe_cth9)M4E{6Y2aMhxrXurh) zEqEfv_GyM5;}5r$Z*CgW>o0q-;Upa$DBXm5@1b)(+zP2b8N+ju~f_)mFA6o7*&9I)!!CVMQLrgc2%RR896_=&;E) zBL$S(e;AwKBzqIjXk$pLuznzwD^2;H7fGfh!Mt#n^_A}~++6ysDpOc7gMuL0+AcPY zZWTi$WBQ!(64ci*MoZqeuLpHy7y3orZNWC;E#S(Bu7IcI%kv1xREGR-uZXG_u`JAG;n1hc*QDuAG4?nIFuW65TbpK%f7i-6LPRLdRJc%?Z3MlYEC28b zXU>IxMOHH*-O;BHLy1NCiW?QNUTml-HO>jFP_uZ?Ob8Z)om>~9#_)&(H^iogUQT}- z_dwUKfmR>>8x8oNFajls|K*Mwn_0;?f8ZZISIhugD>~#=*ifRtmTn^iNRy2TJki9B zN{`Q~D0_dg2FE5|WneRWLHr@-BD=1^vNdnwf5fk8 z!cwys73ApN=wT8!R;g7#j4w;kWy{!8DBsqw=f5l~3aLAqve@e@lUgV>TXP-{=47o! zi1dtK(nWw=HxHR>esBja*uxhE7<(&)HNStfbWko102NDx`RE)@6mE=|6eYde}Vti0<3LKe-q+>008tL{A+gY-|GthT}F6BW5#)t1BHJ`zhK3XoO2m0 z(N5TEQMfgn*CjLKc~Mz>9H?qMRV?viTz}7e0&D{T&28d2lkflEl?^BZ0*Zf+HA&JpUv2?>G$gKVAnfRYe?w2b>%Q_tEkNAAb5A0k5*eQnh(>Y|a+X~lA+1h%h((0qF&p31 z5VA#m4Z}2Mj+uL)%^#NGJ#W({=uRwnl318koegGPzL7*PDq+Fp(JF)j!yq)4mY$8j zAHBxnd1*hKW&nR%D6Bf{p4a8^z#cBO^fVXE5p!f9g@Z&v_&jA=%m^0qnjgG)J z>rbuYg7Q#LsFHjk84@6FotibSp=w9QFdu18lCpAqe>SLRMe2^rHmnYpmv_f~r|q=d zHnvb&RYyDJCl-s{=23yxE4^Xqjw6FOOR%w7-%)1H5?5^!qEzyUpdb~bv*>dC7RqpJ zTHvebp@-KKR@H$Goc9`}p5^8@mF08rq=j~58x2wsglVVe%W0{q@NeXs#h>?cnbV@A z@;gWWf4!RDq{u!8)cCNKiI5yK?0eU+p@W-WNcs~uDV&pRS~;6#@5hgN8cnvAx_y-8s2;cLEE- zFIbkQ-+PNL&9M8==Nxw?XC1dHepN^47(NFFe+xZ4C!U%PQk5A#ivsegV`rYw4cv1B zLnrpw=T2-#EHvQs=c_}1KiAz2a^UO;;9ecBrukD;=*o0Lio5r5lwgMoAa$L&o_4v2 zuL2OOXA6#!|A3y$Fwv0z<5CeElbk6yL3JHn-=-YVoVV8-y0O>zB{Kbb0=2;AQ5{s? zf8kgiah1=4W+w(QHT3wm(GU6E^_!+cS+1|RE=lStba22xJPI4!&|A8P?#6A9y!wOl zJo^LwE6=c7I?G4`0RS|E{+Ifty`7n*xxTT5p`H1EOE)da4R-%lfchWxOHn2fmrS&B z#7|ePj5ff8R_4%t zxw7vsHrZv@n!`DP8o&fqz&xlrD+8&j+V= zKlkrPskSY&JE=STyZqaJ=5;h@148%E_N)K1ggMK1VO3ydNj)w_!`T1^V%gNNf6rQ2 z_Icy>zl)flU1DM(1XPjrK=&v{uz*as%;qz6)@xyZ#Bom>M@PR#H}zc7pDtXeHlOLu zV=A+0CIW<2qm#KgNs+8rmfv*uAhWow1qm@H|3_6b=9}lhL@?5IfL~E&M+CKbOn5H$ zMC?^_)<|I_i!1>SBpRq?hqnCBf4=G~&Ib*;@5gV!+fFYq2d27I@?Ah2g<@YgX54H< zLKpEPMO|8L3Hem4PLQDtmhOU}k_vDjv#hdmFilI1MI75=wd86O4z zHWyS}7@oF@?x_G;PoD%@Fw|(n1-WO7SrN z)Opq3VnQ|cnUOu#$C@XzPiedyxqQ{*3D$z<>W$WYha=+o6KkVXW@lNVTHpj%PVtoH zNv7Clus0!UPPQKG-Zg~hf7?yOnVP?02dXY@$i|zXp#S&GXy1RSF!kbt<4OHv1CgohFaiidM|7Y6FA2)zOiWF5d6s=;>(9ULJoTb4sOVAEC(RX z@1-w+K$&dU7(^qg*f`rhkANYsEEN;NPy{wO7C*%$q;oGAT)l7LFXqwHbnL@Tmo-eF zgf83Yo4x%&lb=z=!RCtaTX3~R`p7sI7atZi6gT6A(b&l=e>aCIORS#;kK~~NUk3!& z*X;WjYCtqb>2QL2Kx-Vw57vM}yt!a2?XlnCxC-(F$e{uniwZ#TKL*imSxJ7Sv?0jH zKK4N+BRL~HaF?J8M1Da9p>ut0d}lrwAjUKk<1krJ1p!(Xpk3fJcB(xjhy`a|kacLt zxgmVrFviZ2e@74xgcK72GQjWr3X_oN9Vc@SMKp?6J{1|xg+Yj#C{+|VnK=Q!udb-b zWAW}qK?$V!amhBDeZ7a>=Pw-lTjU#0KesFe^U9QatZ1@K+AL)xk9I!Nrp;PRh|)Q; zg`WV}D`y6}&$s=D*@&iOm>Dal z`XN~A5|H9)L6~kJ7K@Zq(i$QkNgSpnZf@bk0liA|#P&=5`9JNK zk3!Nvf5dLejFU&V0Y)m+{E9J)M}wX!Q%Izn4_YTyppz7pLoHF>8C}w2wZXf|o$FMW zo7WpHI|5vK8#h`P?uFJlf!d0(mgydZac^T-_04t6R?)^y$z6=tz4>g{PYDBGP}%X+NhYwdoEVQVdm(y+ZZ<{T9EC4}vT3Q~Ub?P|<03O!b>>)+<6&W(i! z1QwikXPq6lvOnr$^h8y$Pvx#H(@!PG$tXeox1djE3ZsOYtlmYw4lMIq;Nb6Fo!1kN ze{NNk8!<~>mLZXDw%aL*cLQ3u+JZQpIX~2}vn$EbTxARkp~|3+LCRwSGvlSB5MsLL z9!E(!al1)MXncwJHv7R9d_i?&{<@a?sr5J5{0YgCJHB0>;V{1ro@E6WbGQq);TR z=s${n#QLg*mC&WCUbtkB(4~hCGKLPO5jzILWoPH3pfVne!pe3be;E8fh~`h%f0S%7 zQz%QIN`mOjIix`6E;{bWW5Po|9vP`G&FK@7h+AkcV5mD4d;QoI`g}TjyZ?GM30zf2 zd|>VP_4H_e1#&UyEe1tB_L`^ydBli^DDoeUFiCf7j9@4Ll;y$=LvapOD3MO<)~)Hy z_L;^Y{)ry;FW$k5XGmYe?3qvQBj~z`iHbuw^U&Id>9!y&MGD~;ca}a97@g2 z&40xHSm~!wf?aVj{ql+lP5#4B7TLqh+4lAX+-n8JKu8ymnI@S757hU9EA7gvE_N6t zEYeD>Lw$1c48@dc7chA_+2^6)Oh}p)+tYmUs10f{#Sv!S%#f5S%?iDfe^EEQ)#}L! zZv+oK_czbKkiEMVc>&eR=*XgeU~J*G1}0s=H4+$)usnptc_p5WbK}=vF#4IG>OmA1 zST542BpeCr_>SMhMO5Jq^4_{3-AXSK`)!IX(vnbuQ!tF0c8p<5%n~b2>ZbHRP_T{07eK2i`DIBzQ>2G zx(C{KlJT1~a?{b6B50mrp>ScaB~lC)iKvDt7j>~f!dnKcL+dvNkB<)X5X?#FGwz);UbIPc23c6@~gX3G7_QSmOC?4(3&{AS1q!Pi=g!F zwIhEvgSKqg3&bC9<`yJ6Y5RNFT4pTY$g*$RGL%#Pe-eveTz4RP&uLIU4)vK zM(n65s8rX^x?=nB!(|zEn!@_+kH@>ge<~F>wO(UdW36!E@d^BDT$6BhyV!r&-U?0 zW}v_-xv@rPrUxXz)=s}K(Km~6Q`N*Cl|l;h3oqEwnm(wS zJy&8y-2lOcw{%7Z6h0ZYb+W!OKB#$SS7n(6imMEr0=oIYHbxo38pY83i$ToYn5QTb z713y@_6fvnf0=@yRlK48ZIg8cmCN@CD<&<*Uf)*V)1x=yW zL$O3en`CyGZeC|FlMZUtw>Q7_7=M&l@>n#z7>b&x~`8d-8_*ze;f6bqko?x@zES0f6UiHij;0Z_> zQhwidcJ#&cAc*_M;s@XMmr0^PY{6I9PNp!wcqs+c5@9mg7`;z1q&HtUan_X12S1EE zhyH2}r-ZEN3Fct1&qQyzOY9%ToOv;-Q()lbD91d1a+(bRJdyBC@87!oPra?9O?Dpa z*RdzRe~GCYPUb@YA2A2mkDHgBm$K-(bF9R+cc)-G`gu^}^Juq(b7GVP31ib5J9#<+Z|CMGjZ9!GFLz>$M#trc}Xd zkN|~LEo@gn@*SNjHlE)^e=~^+*k9~Ccuu#2fA5n0Up|~3&Ta;SlYnyDaO|ksgG9#z zq@&{M(Am}N=B+Me7ajz&)oibvH?;z1pGJ*mCD8dK$m)Dkk(5mWa1utW@L>HChnrk~;1lpG z9z&f%U4YZk@sVupRo{hifOhoRvA%IwYs(49!IdI|X&{N+Mu$=H85_mnmON6)XcU<+ zL{+57_PG5cm-akS76?$2*yL4~!NhW9f5I}`)?Dd=Mpsu?Lnxz<)D!}8BN=fSF-acZ zWtdk(yn4W_kl~lG;dF#BHReq<2MkCsRHv&uW-X`|(|Il1mN2E$(_zgN*$yPRrNmi` zZjhMLAqfzpm@hnd7cE#uHJOxnWFv~zuSMiuPok65?P$m|_J7jFr^}cDV13_vf9OGS z{w^t`gKw|M<9)2JTOquk15X1I9x4Tr<@4AKfUS$hf#gwga1=3m3MJA+`DmCio+KEt zL#^VB*<0XzebE{l`DJUvx;d-r&Ipms|eN8uQBU2z9Z(gfM7 zn**zp|D&JR=i%J!|6bTOY;nMSGF#I}Lnb?mf_e#y6C$bFfpnRy-1AX-}7OBG0LEQ<*^2X?dov=IUe@vT0n`7(7 z;sGRFE`wJ}xU}2%nSOr6yBz}WR}h@(&?w_2>YQqLZvcNtu(vlD0aZ~L&?>M-BFFDY zwls+2~LNX9SVwh<|Ei@Egj?#`9nUU-=_}t_S!Z}13k5K56$Os&KX<^C# zBY|hpAtA10xNclRFPNDwioo-l8EmG{b48ABi_g1|Z)4+y!lY&GaKGg2&>Ip|=Ol^JV*-g; z6r3+FWlVG!qeQqLe;68fx`+@MiGv=I33rZnQkkKfguP3KW3+Pfo)g~Hg&K?UN0E@l z8{rbiX;jP-N$Rf5u53y33btqwc{IK&;}rmZfyz#ygTT7*OFhZOI~J;OS#wCY`eA@x zCL>?Kx)2NFcZQM0j1Me(ZJldiJze=`|{1vRa9?Vad$zLKn$Mu#bFM%2cNP+f(?Xg>Ne8o%5S)W_9ve z*?nL!?UXig-cb6jnz0iwRXkND9m1xdd52AG zd5e9lmHIWv%iPP{+(QZYv6`b@6$O1t2O&SNY+XXgv|cFy1ybhC*zmEpd)0V|p3`$I ziJ|9JR$W%6lBiW{M{Ubzx|^!RX}AM={j*SJT-FcOf5wL(zbO+;p%!kDWe`<@_~hNd zhep6$gn+YNASwstb52 z&bovse{;H50N6aPxR-jCHa-z@X|1y3hS<7VCM86e+U^|}dj97qExp+vWmpBVC8Ms2 zsfL=u^0wYc9o_z5o3c4^F7_PUN60?Bi#j{-RXo1!&^`uMA=ovu2S~z%WEdJc z?Zsg`Kf)}TH&c?6wfw*E7L_evZ=vWU6M$GS83c`wS-`R@l30(79`_v==JA6bwim7L zEf(is2B+@(&ME>xD@gzKwSmCG`G zf0k|G8^ah4Rx+Hjb>Q{LF=Stu@Nbkai`q;>x9Zwkl9-< z(fO=7dJinf$C*`>0Aq@}E6(Nc>uzKfL=1#82j}xU35KQPjF6t`<+eIdf^D43NE|=$ zl99*dc&bkkfsucoC4g7)3{fI(t&RlM7`VS;s8?OdocCNhBo}Anpf6kj! zxtykPo$ydnmst5j*T^z-9ZJqDVA@`VgM?S7u-S>xXHxX2-%J7xO9 zc3P}@CrmDs6eO3~-*86f>htq6sx@f0K`3>QFpP`#kk?%Z(#Cs!+l58HZ+pKLou7|1 z*0e{iU}69(B)=~NNjv|Br-N*nDaSd_nf(M_ zLiTzC09^@%Ztbu}Ud#+BlMhZP6 zy(M}nXywBJkMYI#5Z-9bt4M=Ne!WI=twGk#&bu5_kiDOt&-F{JQ0c`Qe~UR~?PqA# zobRMrXJ?Eb2X!`fwu;Vyyp2bwgn)VwyIq63;mTCEUHyS4Y_JxPrg>2;w_gOfdz*st zsO|}RTzuKbdc*S%X|k^H>Rm6uOC`sAp=-_So#-t;cA8$Mi=XQn1e!{97tPsZn}Yl_ zJ178xc|nu{eKzw9^OeUAf1iKxP#+r6jg;BB(F!lqj=J?*e!A7BHxUQPNN4h`?Gyf} zeN>qcYaWweoqn&fpTHWh=jia7QQ6D2aC{R@YR6SQ+9@0(lC1bMP;Czeoa{nQpDM2r z%TE~3?b^jiYglv3IfGg@b;T1qeX15u0kzyx)NM_GhPl{{B#;hve^Ll{L|Nz>RaC3) z60x_;u7C>EeoccDdPmNO_?v51kd%OWcZcjMtHBtB`RX*YX_k&iw1`zG)|KjXJDj`S zn~nz!r;|@TLT!phhI!$hJo2&tVj%@BH2<*S=U;~P(H`1Cmf;0M(@Wg^{=w2V@fOClp2VUw0Qn5HD+!AvcCz5E#I)=~u>Md|x<(nnCIT=}R zn_OW*EFZF9Vi?0xQY4W8eqdf$^RCf<+V@;YTY>?*`pPTZ6|W~mXzE1tZtGnb)Mk2T za{OVkV6Ku^)6fMEA05Pd>FeY4iOv1 zLiYB^7Ixi^f3fD9%Xf)iCq_;5%4_&pGRoS}N{*(QY|IkjK6zXVSZfWsxpR5;IW6dd za@y$hu=9c%-9I86j;mo1Ok)jRx*OWx;Tju-3fYRRF%AA^B*Z6nL72PqW!Z1LhP`%t zcvzIvw-iuW#!7PW>gJ{*#?v5q)%Xs}C#2KOLRt+9e0fpFKT|*dQ>Q%|R{uAh)@az;AF;vwTz^63 z^bLz~mEG)w)ntUfoWN1E>O!OZWk3-vSa&*9ZGe%sbMCtG$CvzIMK7bb2rO<8;Ugh^ zBur9Ne=5XQtcQQN!UAW)G6LT zVTm1|ZWhycv>^;~rQG2?J)ENI{INM!iHNw@>A#WqQ?%ex8ER-oxz3wbVn9^@UZskb zJt(C_Xw3UbC*$;}Mun$bKg&y>ZbqmL;Y=Fkf34_oPFL%Mb}4Yi#Jc-#5mRM3*iEfm zyfJv>htWy*_chiPeUb)EGBa}h1#mM`Ri&07AE2LKDiB}3H+yV%y;@cU&FLDPEhxT2 zNmPd}h3!^3s)I^K{psvG&kwLvnEY ze_xOxU~Q1b{KDjL=u{mFd9`*48!c#ZdBilx6{ow9g&LHP=Mei)PRQ&;+^xY`uKosD z>a99+B=*VcJFq|%yXQ%Xz=J5Dckk=-{?vPHYX#kt&%rnj*wY8nJ6CrA#aojEyZ>Ad zJ#{-rb%9st!bUB)vq>}{kpFjFhz;*=f4X_~=aG^D!f$!vx2n|;pAaVcbSm=SY4t!X?v{oeG&Ef4HjskKFaEfFB9hbG4SPrb}CcHnHliPQ zyp^=jYGX*(B;W|c3oV6HQM~u2(wRmUPbt^yCU?RqDaxvVJX@C`J!#FZh_WH&7my-% zQ%!wShf_;$$U3l4d^o$x*uEBu#+--z1gY{XoFJzfd=8uRq4x}4*#O|!e*wk2zz6guuD^|a z)*3e`-5m)0-39H;w&q^ByR)@f;W?Y@#J~qAI@5}$e35WgCUhu&&d?5R=WRVeWe zv5SS3a3|fnOSYK^4&i6fm)29E04?8z<__#mWVYn92&mIDT7DVr(0V zbi7Sd)%A`4uP1g~?=Ru6{nL{M0sz4HuP?;?k8NxwE++qf$9BXf2to%jV1(U$N1f=F zSW6%r6iAE0e-0_`)S&(_ur<3eCoFbrH%jgo&#Q%XaENl#7-RJyHGDa=vuV%24u%yXCl~Q5& zV{B-s@c4y;xu))Ivq+pPnz+HkrTjZK}gJ7Pl^y90cLYvQBP%2#9KeU8@!Q8l8k zFUQ7?e?*T4g+fVYNo_BX2rRySPx!?0ZGmA|6Dx-;lN z#ehuB5142a;`G-WC`!c6UCY$0JwE>Vyi6K{Rf{R*jz)xpPH~3BE;-15wlm3wGWC*X z$DlQzZVY)DzGmpn+J1}oy2<`Frl~C+UhZJLf1jC&q4;ZNP0RBTUx%+WH z0!u)k@>ukwSmGMF7$#w>Ag$)cr4N4uP?gTeUBdjQ2JQ%e*`jHf*}sx@@b9)C4q=Bd z2zx8H?|=y(oP!>3E_CA5ZWNPtp{T8xnw-mPef}Ky3mWP;(=tP3TTD`jKss;sKD^A+CMsNl+|=Bm=t1w#c&I1K3Pb~WYzv~LL-vj!WC z&uV3eYv6u%?)H$2m(`TAk|38+4w}za*9shSdK!vOM2)HC0*`30 zY9y9!gPQlu)8Js=Z+{&=-xr%Mz4?Q?Jrq6Tuuy-KFbq%IsHThW37}m-;EIY7=~7)j zn*n7k@RK+fUDDt3tiNHAO`iqr%|`H;xI*PoPRZBdZZUGGeG7?kKZ$GV(7A;&f030X zRc39FFRGT?al2Nk%6+Bt`CtcSCq6Cjn5}IKwhmhee>xu-DXMF3?d;sTbdS}QRCi-! zG_EEZMhpXCM%#$e{vOe8+awzh`(DrOjUJUDt=TOz*J^LRza!*18BEt%I!T1Pvy@Tq zJy{BdMjbc5)grO>h_aui@a3NFf33DDl0MacBdNNtNid%$Hqm8Hlj@k)TNRJ4Noj-i zw5bq{kqxCGK$#H;CYwv2^HNv+2`7lfCz0ebeH#3PLy=E{_DZFn7?#c{wU9}EnrRT5e=Ij07UlXU zTue%$0>jiTO7mPQBsY~>(dYi9KFmFOLIPrcHOdGL9%8yFW@_oG-p*N`9w!%Kr#HD*w-i5-eoV@v6d>K+pZtQ~QV5@c!%l`mbBd|Kqj=4EQ4h{7?Ho=xqQl zhyf<-j&I}`P^=s4aKzzWe@KReF;^xB6>X~3W#|kY1Q8gVPI~iqZm&+aQLgDLUSDKB zPyuN>Uc^O62z3~d1LN4DO{$meS5b$299@EE-Ui(vYf6t^1I2ifAKlnzLpY(i9V{rb40{T0>_&F)HxOh6%T=?1+HXi+^qb*H=>Jjrdz~?_bpv zX%`2b|4&a2@c*Kwe?7qAzf)6O1Job`LYR9V(JP>mPD#52cp6bNft*tqb69SggXGm! zRzZqT8r|5y@58r$e@k7~?c$EAQ=|eiPlAdgT1W^K%8|ORAW{)ZnJ()P4E{3ld_bke zqrXnrEihWn0}t{kEg!S#1+bZ-2MAX65!34j%S#RSdB0o5{dae9C}LV9Ae+Q*&M|Rq zC%KulH|?RQ_M4XEV+d`K8v~eeHVXg0&f8J-MkeQF^O$;!rC?5K_D-YM_)>^eRVa1_m35#|oPD^~c=susK4YjoiqNH1Eiox=yT~ zx<5?RG$JEIXrZU?Y5(T4x+H0SH z7ws^~l5vTrQT)!DW+c_TGV5gnkZPUuRM2&r@i4b!F2Q@)c0BLlH#!rlinIOe}Mn%YEJ}c zeQW-++GHUA7cb{O9;N#4@SP<4Z_6F}#v3{X7&P1{ltLv%iY8D}Z^^!5K=#ja(~bdd zF0Dl##Y<|`M>6^4?R}Xr`Rm!aRqdcV4@%0Ae_SgzPORn|LD%3ouzUJuic1IvPGFjZ z+B`z8Qa0Nh&FOt2z`uRkShJc*n?t5!ADd#$=u8Bu^|F7wTry~*NRX*>y6*uc1A)3fI?utnBvBmIuZbA_rP<} ze?&<^!pT{=MEAWZxF zuPGZ=GH;32f7C4s4gf&(Uzf_($lk-!_TQ?FbPi7T4yH~nmZtwZhr`?Xf4HV8D$@2_ zVhFuY>eDr_1kkZLSPg(g5J>0{iyUB?TUB<_*E^QBR{-Vg8$K8p+Be+6#< zuc3#(mkwzvCxgB@A~Ul`S@yk{6_X;mGa`WvA{(^@ztCbGB9=5o8B|Kk07*c$zaFG9 ztPhqB3Om6zcLK>Ni)t&=c)^t8>C6leqlZGRZ=~aHE!7Pnq33x0<_^#?pHjcMvuVHZ z8^xW=gN-5czrJjdrd^E?DR$~DL8e`mA%BkXm4I%@2da19557K!`~;Rz7JZpk&RaFd zr>Q#5r0i=H#D;PYi_gXaR}|wr~{P{my99F#-JL5UGQ~t6c?wPZhcAK zg#@T%?$S|5m^u=lwILy(aJ<{{`AT+@^{TgvyL1^1)uX+F(CBc81G=B+A z<|HsM9|Uz7%CkZ?Q(-#8-BOTP_HQ~BSbbrHqmfeWjB`)x&n8>l-KH>nth1<^pW9I( zZ0pT|%j!7QSXaB)iS0eHWE zT!wbEl#=xKv)qhZcBEYetaZ0pJQUehv2@BE=-E(JqO`^cD?tHG#``Zx#FXR_?Jd=V zNa&^X!3;IyRZu#RIlALTX>=*`O;*SaHWWM?*oQuet}HiQ;*XO`t2Hm2jDKeVw?_7* zae^ft>Cm{jED%;xXnDIu;W=8XLTbkfCz71%{^a4MYrIghL#f#iI$+R;teBz^-3E|8 zb;QYK2eP9#DWb9)WkOs@`{)Q30+N;FYJr*+eN+iX7GC4<>!e+SzxDOdB=(WTovIsC zT-Hcz6j8enn1~t8S24Rmu75(-!JKqolnNrIoH=sg5HjH3ir}CVI7N%ovOEZV#Vt&9 zngneoamYG;6)dHsiSJS@VY^;p;R#Bba!MoL^rL5It1Xn$@;gg^0HoN;hWwSO3&`Ku>~&~ujTkd|OMpQ<>qOCu>R}t; zey!Jhd*73Ztp^)+g}H% zS6|g7CSqjz3E9#V1f9Em_`xD{Tb)GRP4weiK@X$ z7hR{-Fu{8%{RI^~F_Jz5U&5#PVfEBloR12AfrW$aoPXEefynfc9{5I`RadB+pT`@7 zv>y39(Xf0cZ9TD?F4M02p1zcWkfy5;~+e(S~W zo=Hh=$|oa}7@q8pQXBVTL(EFq8_7D^ca6D0g{r+yg>i&joQ%OA6ZyPmo{S-w7Q#0r zIE+nsbbr8?&rAeK7IQV4(G`!FrG=iK{PZ;#qLe>PrxxhT{$l*o*Y1b~V9yIJ(0Q;( z%j2lELA@F1K(0%h_v)@J9Jn*G>(#tnxg>PNb;&>$)sf7DxaXhmb-`B zOo$ns6)L*Ebqma61r*%pJAS4sA0>UT3cB#Z5r3gT0Tq4@|4|q^v#v`|3Y>E;QiB@nbAwmq;)7d~KB<1>v4$07Y z1VE-ga)+mCz^2oEW`hy*;)R~!x3xuq%z(5|x9e;<|I9Q}2MaP98`~(;qQgo;Od?x5 z;Op})O@^%991m3f2#sG>i@bTk6${pAPxI*5CqZzk&dLU(+FrGM${H_7{DYyAJ%39A z)}TURsDII+(W=$msfkxchTQyf+FLnTqfzHlurM5U=$M#=_KmX+&;5zAT5H}M1Kshk zuov0VVDIR&Ru7vtnCcu_uki|M?P!u9@Du09U7%@&k1`w9L@rzXytZ*S+wCz&-4=qUa9wvKiTU^uW%G!6z1&Y7zmL7~x11{28h>ARfQ0#oE@BVGjX|2IH@wk1!R?d|GpWGLOrR zx)Y~5AFk#YxKA!fVxuON!NS|#z0jD;!<)K4JOPCL%;3tXCze6#{JJS9Q!ZtLiL zI_ADrsi;TKFG-a5rDN!v27d~xq|tI%m+(EPGxDQbd1wB1LL!d8pnaLcQP)aOwzGs2 zSkk>@qr9;havdGXDI_60BT2y{(Z;9iLCLB2*`>9Ir0vZOhDln7xeH2I*SZpx#~MjT z-?%|4d=vz7KW7o?pqJd~5v!TYndY19b0IRcw})<&59|j^f7pbM)qiie&VSoh05aFi ziuN91lefIX=zi$DI7JCugrKX;PQ`V=Vv7RV-JajMhd%!HneF z#7njAeDgI%f*xl?&&L?sAHo$AmJ%uv(DeFM%4s3@feNp(RQN^8);fkp_Im#ZQU-u) zi@z88$JqdPf{pI4FMm*$qMvMDUq$~>MEZWj7z6J4p?J1|&l4jiYKkZjrzhMu&8)nU zMkMj&`UP*b_(UOKKG#{Ti3Ahc%Aybp$UY)h3@r0za9R-r&B2sR>NWHV#LY{l`Js9j z_dPmWEI02g+Ni;L#aHs;wd`1iF)}{3D!eUF$=hdEJc^%dQ-5%HGb?G#Dp#@8R>Q42 ziB)>d(lR`qu%ydyS3wpe-FyQ=xUUz#0v)p5G_DrO&dkOvNL?NqZC?V=-yS-2Yg~Gs zWrx_o*7R$oHED{YIA0{VffMp5K&-4P1pp)zKM{KdtYTZbxrOb}8mBqofP3Y)yFkPW z5h_DS2+L`rI)6$7Jc5H^qO(1zIxxYQY)+vk31oE#W&j2SDvU4+A3a0`LPFwDMW^{I zBZ%bF^nHmhJ^~1V5sLvA9vDKP1R@d}pcx)^9AxLPb}|8MMJIrQekx!_@AzUQACEmQ zPh`#QvhwmkJ&6)H6QZo>w!sgZn#OeK%Af?`RH$zifPZ!%p*t#2Ym4+46D3HFFE5#R z+1ZUkzi%uxI`B3yV=np4Q}~v(#RJIGsDKFJGhhe85$05Qdg^Q}El+#K#>U?0JH51f z)3y+%>g9kdcIq;KA$h-B({AyxfeYheBfrPF3Anzw8EDrW1sxr^Fl{7b&_*pI&ckd_ z{hWsp2Y*sv9cE20s5snC;2}>qzpxP8xkd*v3Sl`UksRRh37^n|C=b&IL$R9g)3A)9 z&7@XfK|#nlSM8Xg0?2NHmI-1~AqY`d06GRC6!|-G^6ae&XxbMic9-kJL#L7nJU`Zl z6}?aq5PyIFjXBe4m&fl>ss`?o{q6RJQ^u&@j(_YgiWZh!&ktyMd7qAMZ?ukTmyO>( z?={0OKb=LnoIKe+#klP~yX-WS?2VnBB`$C_FO)XBRZbW)e-}=9+2j5k_Fc#2cIYNG zeYWZ1?g_s2%g*q^*Gf}6pci1OfYCzU2>UOuU7OHZLD^Q`Lf_Uw%UTZraGa;4rJWfV z9DksZlA;ow8le3E0brR0S4NQUSNqTEgpt?{pnFx?kMibsbqZ?P{GUjZ(pFg6R`AD? zkdcKszJigN9ze(fpPmU{%EBI>fsT#=pPrqAnSq0z9iNhpo{nyJfnWCZzd_iFNeV+u zK*B=cAW;f%2L2&w=+hqsNT7%*?)5`Z1Al%=egL5SE6k%7*sH_?ejC)Y<;4w=Wl^{p zS6dZ2$5n2U7tqu*1W~m7sz!(k9bY+n znJpZ`7EIXN+aD_xPJKioic3ielh2*WSAZ557dNa{!3XqjF~D|0Mq(lW78VwIx2z$- zy>lsI`gOc;5yP|8$WR1W61(s3Ie!@9VNrzno7Eu@ZB$cs_+#~KIdEE{Vk!?)ki);T zgX7N`vLuQUBVj9(p&&qlhIJr;(!G1_xw=uG$$5aBf&$Ool-!h!;=Th&J@asbF z(%a$GmJDTHJz)u{@Bn#|WR8)Yba;*Dhc{E|9`t2$en<5%pj}>H>ajq%*nb%_uf1z_ z9!QHoHM99D` zOm3?^Q{t8ZuYEx)Qd_KTZ4~qIf-&YpwhO51hfmm}ajdvSTvaPYUw@h<+4KC^p=H`o z$&mv)N%GX4+}w||+!>z%l0xrG4X{&Q{QoAMUGWRCt&9xw(P=sWfj%Jn~#2ZQvZ0F5uXJ^qFA(0)^1am0|gf-HKE z`_AxpoaB)t%$~0p;D3|dK8P^_?E&~A=$nM&kV20j(R?ako&)%zgaL-~h;I!OKZ!Pa zbxBr1QqcF(RT$Y~8yveX)-Pl1*qiLdpzME6ws9Oe`I55Z>rPcZvvEj__72{G&TzWs zj<|DZ4I>2)@>D;89&t5&B2a-wuo^lcXsw2kfo>>x>B$~OPJe%KjcZxx z@3^yX0=v6o>wib+Cq`UEzi4VZWl^Zpgfis&zm%-{@yySaJ(D3toB8cPG9G`lrQ*t| zJph_hz*ICat3*HEsxg@=SZ%Ok8!K2$L^rJ@uSe2ZI@MhYcG*_pAQ(rm8RP3X1)9?Cqz>-WXdoDSyw_bcWt3l~LeRUvBPJ(yeOD zu`;a2AOPKPbjxb zenYf!r+;w;g9hE%r>3-W^`C{{M!fvV@wHR`DDeLh!f(3>|G#q%_kVK^L&KUaR28xL zMw)M$4LIFuQa6aD7C?of`4Zs$1kk$reJHw80mzg{FfRgH`q@OMXuABsiW!7_Q|lx~ zF#>NR=f#k}TRlFW@f<(VE11G^kAE7rML<*++kX*-OKEDoIavDIvr&GdF+=EObL?I{ zt)1M>{@u{hiMpQc!MX0`G_e);L=6G~vFYMs`7*V5I(NA5EnoDwW6ReQ2*;jI4)K(C zaAGrDYuoCLoUq=lyu3&74lJxJEmv?~!;~BxZdwj)=OA^GKOtUNPJT$p% z;eQ?DmP~NeLw52XM8(fVU62JGJEhrT!zo=(85Xb2BXb-PJmGQxKn6x%Q{(SVc zNcMI4A!EkOm%{*;Oi48!$$2Z-bswsMu@A^7u){_P^3~rUKE>8=Wxx5P(I_Tqx4FM( zR*k&4?)|kDfH*uXg#o9-H6lX=YJZq13r!LwlvFwV@Kk$5>b~f1$w~F?n|X8P=~{AX zzd>u2bV{uI^9N~?jV|;kU#;CLB~$`h6z?VlihAQ}=emlfN9C)BFY`w%ysj@xst_(W zye@7$EtNHQ*B7iGmE?-;a;jrRG6`BvICVk_XAVl_@veZj6g?!XYzkg3pE9q!i zd4^tvnxhDlWjnro25aa`R5Rs)vH1Vaf&63F!AZNa7UqZZ2nqne{Vrf(YikQ@8UrK! z|4F|`Q6}P1R@i>-Ba65!s#WoE{QXM$(8F3;WEnQYAA`V>S)DaOZ_#Kee@$iGjw1&MnXDeJ)qK+ct30VpFwUw>FGak4>XF4e-jjNBe-OsGF@A!)w4K}&d>ikt(SWN!M_V6T4=|>a4x95o>qFo=6$9; zQ&I`|Vr69k0}Tt?GdMXZ8BeA6#Y|irwT-Z?U?MPU+#dTYG;{)M;?U>MVT+4_V`EzN zi*#I%kEdEQHz&gE?0+Q&4R7K6qx+`2)@wXG)I4&Nlf_ZRIX!&)CMOIwcbU(j=NE6; z*`f2Rh*bCv7yRYq!sYfPq~Ak+iBIu;dBi%Vcngx}pB7qn29>7D-+NkRvhNbSCm^iT ziQPzL8H_iiE`LU>)U&*V!NDstuZnimXIYkuj5OPxPu&2GjLKNIBe2+(C7V-nU2kt% z#*gwn+pN)jfcCSK-iz7IsHtK=)?*HX@>`3&(V@66M47u=o?sc!rPPXBXgDZA%aquy zn_}GVnsMY|VLYrY@lfhHVrgd;Il_Lr}WbRdm_X=|)fA9RDzzqDoZpy15zZ z8JQcWE@*BkB;gD2uVZ2e+SjXpTQLzcx3@6T`E^hf{y%dLC5`YI>G6g1oPRinjQI3y z91Lt6^nY}}Ifu^yY_NYghali+pg6=ePhfv{T2}PWX<3x2=!6z}PwI=*P`;|9WKH*Y z%_RL!06CP1eU^6&nyeTUzikwX*k@q}L@i;^>1;4{&;(ggL|@$jTccqe5~(rCTu!`~ zhA2+gAz`#eQBaLrnwFcbr?aM&2ktf!ZRWf%Lh083lhgJ~h-wlA`m* z-1O}cz`YSPGO}M+I1aOPX&ESL9K-@1OQ4%Q-aSKc*W)7K7HuSIDDfO_?If6a(`r} z)4GpoPb{AD;~Q)PAMsJrWa4-w(WfEM@~my?o`GfqX9wb>gFzYaOWFLs%vJ9`(}f&A zTlIPaW2aTNt@YtA$oqpz3*Q-XNyzj0g$w&bhdvgxFXD3tZGSH%*d)g1%;U40QY^~@ zL(q{=QgOR_cXvr$mLA0sGF4?E)_;;gzwgH11cw7vf(}Wbg=EJ?ke;5be~x?;@CNJv zvvU)a@-lQhqRjv)HUIOwPRI8ovV!34i)D?GnE`t=i-f%R^F{KkDDHq`jRgV_{fLYh6S@DcW^?xC1@C14O z{)fghe3v@=#x1_W4W^7W9Q#UC{cNtPQ{4Dvx4u_(0SN9ufqr<%RDgdd`c>1QqNjag zh0TuOQHAVkq!<7Mxy1AWfR=MR0cRK=-S8cHI~|jcYC3+eq$BT|3_c%Km_Mihof?O1 zP*JSo5m|!t7%LTYxbUtmD1U(S*CCznDAqvZ^=z8|{O-rU?oi0W!Ti4&paa-bo1Lx5 zb!|<})vHTODBy8m{K0l`;w|16X;3+;ZmARkY(AOJi1GHeHnQWrb#(2q#H2F5Hhi&L z3Dc{Umyw`5kgt=MJP`^yBT_06ZgfX{3!BzZ*|X|_U#?n}yOM{%rhggF0qrMFFUXWF zuImQiz&kl2K+OucsW=pGQ5oM+xgC-X$~m>`=IngGE_oh8-UIOuOO|81aB$Pn(Q(nS zaX$g?NuE1+S)sk{n#m@#D0aQQb`JX@rSb55aau&D%OLIOToUJhw9@Fc5D3Spf5XGY zu#jS~!bKmR%w=S+DayWZYc>p zecS(wp#s!KKuiJh^>BsM4FCXu2>&rr3LT1U{s1D2;M@A&R^-96kTo@|?4liWOp5)stARfH z?M%O7LV>e&X@8`%oY;2g6OPmgE|Q=&Q2ht_Vly;1=Ira_xnBLzP$-UXwdFnD#d`bx zg$XIT;L3PX=a|<}8eGoH9_vlRXOa*A?%_v8LK!w|58H=Zfptl@%`o%uL~}LzC?nkIe&5}k{|$$EKept3W98#fv6Mf zNQ_SmMsm+5&g+1!p?CY`Z`-O&70v1k=B;Cl<~DfcYL&)^Y3FsDc87KPst)lq?oO`2 z2hgl+DV)U6|FZ>&jF_Z;``Q3+e_nHy68@<0f6`*VjlQM5tYATVukSH_4EFzW^7(Zw zwDs`C%zv~D^yKukbe*jF^tfJ!=-l6iXj6G{X=GWH=i}tzOE46bGLK$CP_WQ-qKFuh zdk|up5Ys@!RG(@QG!d{^V{N7eIx8&+Vj5Q=VbmZJ%+H9p={^8x5#nop)p;p{ZRc$z zNY9kPt)F33~>c2RjxR> zGS1~#_me0c4ik<$M1G>3BrF+N`Ef7CkR5 zuagy2Rc!OBy?YDtk!AvT#1J7n8z6;t7JqJBVVBpv=((}x1n}|E%`pr+21}n9_KP#7 zgyIDWf-~y=HnjYQ!td1ctW2*h=dIcXXXPUcVVXk90W*MruUYkB>zkFb=-Am7o6@hN;tD1WBJ zlEtlzgvytCZ$u7Tfcxb!06MB@NE9@%{f1r1;k9Yr_8AqyE14K0vaJYhYZff zVKW;9d7UP!j*^mQt34SE%L3y}k0TYaQ5WP)Po|$Q3wp5KE-m>wzEm#0t8^kFCoQs_ zFPyUI%rTi+)P~*U=9!bPQdd;$k-NzW$FM0^MSMt08xQ+mm>l({GYW|autof2>}57C~!Y( zi~j$CxNv`ze~62dt|a5fgETgB?*#xQ!`OTOT3dSg@h`18H|nRgQsf^62!D`}g#ItL zc^(uK`W*qba(naZC%Ql6Ci*@3+nojWcSPUT{p0wx;d8Z!Xwishs*+t%Iwa+9dhBSC zFB}l-=yb4n5!B=jdCJi`frRAo-+Gto8z^}%Y5KbS%(6VdoIOk2mh76Gi3(el-JrES zKzoIzfS^49gl8I%hM$o8fq%^~%fQ9tiN)H`M|Zuz$tVRrWq9;4NU(TiN%6@TB2X^^ z6c9iaF^c?0^NiIBGeq#M0;)yV!>I(vQHnh2ECG{Oh&pX9W%ibEgh;7GL2UT^2%ex3 zLhW$sg?R#}c{ljreR7ABDC6cjBJayH&9bI~@CiK1@%=_Q+fEMGZ-1^KAs`GD`6eKH zJebKMIfNGS(gFlU5eLWKG7HHlN>Fx6jzlJLN>|hc>`7?#d@px`(;h_#Cl($@Il3{b zsmV(zmgRj)xbL><7`9*Z7N?u$KoAdU0fG$>ep_5nM?YefD;<^M9(*W()>!6YR6UyU zRq5UHD*pBi1hFK&j(^VVo>64Ca7E19egkRp6W%oE%W!=ioTDotvoa|!XHZ#0qJSVvA1&!noy89bw0FR|K3CI!{Gx6Ry!n3E91VrB9;Dj!S68{E8Yx6H-| zzKPM=?%8o%^4!JU&m|xU1iUTkEJx7XM0PcyGwne-!w4lfZj+CokAmrqP=p0vO;gFIFmurbk@VhNQQjEpCK=YED_Xd0D?`PKVj4;yDjZdNWb3W|^G8XVNFDv?>i|KyjLNUHjYK=pW?BscABawJurr%AfG1awVlnz;I1&ZL!J}O=qZ`7#yV|l$9egjPw?l=J z`vxXH$w$3TJ*Sx@-r-pM!N9Gp?{{yAu7D%i7AJ{G80tHv?0RDxv&6-FdqrJkKCiVd zoE~JAi1!4_-yglJ3#$$k!$>$1;xUnxNmUiGt{^OUcLxA}Eta5l&J{MS#n+GY zvVZ^feN2Y+x{P8K8RUb-sQO8(^<}1gMMtvWIW`7fa6VQNPLS936=g^UNX2wJSx8dw z&FJK6;>$)g{&aV_lQAYI2Q*38@aVyqsl^8P{dU~-rcWiJPzKxGr!?oqg-Eu;O_aVp z#<+4TnRkaL6Qa9HxnMDpSqi<7z9*%<0D-*{?9OW8KY)(fsjIK7yK@?xWz&XLxy(;-lf2sn(lWq8 zW>&Nvb;Bz@xaIf;>yyOY|MIm$7;d;e?KZ&Yx`VA6xL;zQ z(Ng6X8wH=%!Bjr76&rhz8>*YhaytuI>%(z!1YxAM4W;x959x5=xSk*sQ=VQsioy=D zdJoiy#m1u7TgOb7E_X{w$(FXJy?@N*Uh+I*O+}GLICrmhvCEvUn8`n0(3tD{>6*h$ z;C4%eMA*oar>dFq}d(*7Dqkjo8OOOxc4F7tln zMjuHKI_b0{uouOCvjq!lm4CwnjMt4%MnHm*E3nHwQ+|v0p2XPUF;bI1G5@^TVi&Q! zF|-*)|J3`-lcnt2eer#Z7Jipz^kt@Cy!Sz9inP)+b~8X@X>f1i{WQB(n33h{>Yc`I zb}V6F>W0a6i3JOTWE2fg9q~bZ3xuw3#y*zjv9cPfw{%&!qs92g<$no;#_;1gj-K-t z+YH-~KsjanXJ3I;0&WQPb>v6=d7Vw>pWoT}e`lTTf4K<@a*$bq_jfm8&3|*^ry@U# z%4=cwq*hiQ<$bSCt{kG~)kd5}sh(t^g=X}kN~gN77@%p8^%;a|L=ev?#Udx0R+QtH zgB1R38xh+x2u-9gYk%v*j=0kjmQr0`=~QEPZ%JLyXnx=Mvc9!-*F5rY3V3-!i1*(y z&rYAVD(mIkBIGWqBY)pnt9p#`eeTWJH^B7g7{4 zRXMm^(qfUHTLF*QlQQU*k5!TkM(z5QU~UTcD}!j`G5d1z zDgpQZSzj0wRVUc5TEYHBU)C17b~^tjixYpPFC%;g7JPm?gMY4LGjK35aWFCbrmsbn zvVxx;FT#W)L|Ikym-xH-vi*G>Tig(tAKk;j-hTj(p5DkbUl%c0l111#TuD6rE&N+& zNOWjiP+=FO=1B?N8o{+f0bA=GfWvA4EZJ% zXrMsN6e(*$1Gh)ox7hfN0!sHZLIwWFMSq$axK{=`Y)|wXND!RwO1U}5O(sZjIo>m@ zhB0g;y6F8U7yNY<8FIMrR+;<=91qm+rVGOsJm(~yiZizU1T1&l*l5J&!&>No&)yr` zd`AXv5VXIs!aPg1Q{S57C$dNa=XFE}ElnwI)TlC?rD|H8sejR2 z^$98eo_Zg`9OU?sA-*=_yS#ZTo%1z4%OLl_zLZGl@1VkH&U}hK7E|HqPJ8SKxBm7b}9q&Hg4J-5jvqohTDN9~spyzMvWGi%O1U zSpEUOhXvnvHe9!IPICO|%YU%AieS4cL!}870;ULdyGzm5Y3=9k_lcWmD17Ea ztNW9(RLNmoecM7aC+)F;gVq7FTC*E+yaZ~5C}_K88I*dUpb#Avj+eK3U+9c@HKkCp z1+>qweFG^AxK-fR*?*vl@DdW8vjb$P^PAZGj_?7^FkjQCd^08c@FUu&F z?1M?J*cYzKtpTL@xUg)Evn&(6l&IItKrRe26yt5CUb}!;_+2LEVKeC2Fth1>7Vu0Y z=ljw%oeY>2tf#6>5L|&gew=ruc)$hFhH!ZLs%=d1iV9|Vc7HH$KKn16c?*iMlP z=t7wk^e}J@Knl@nJP{wNSZ{rvz~%>yv=lmh7yq*WX9@A>2w%lS`15kEyq4+zf9%zQ z;p=sKDE?jbIsZP!X^6_pVt;SlIc^wYhb?v2{+KAATYsFPRusv^AVD_kJt=rE13xB? zqJ6m>tc*UXIx6n2zTd}}6(B(9B05mdz&}=;pxr1xW52W5+-S4F{n=ND^4%%K4p-6z zH(txm4L8KBe#8)qh^d4>lyPobTV`tjT8(jBvDxlC3O;OG+*x}c*GQvIv}iHmfkgQ# zA+kKvSbx29bS;TocIx+YF^Je1khqw=?~KW;iFPz{*Ru#CimaBxsFi^QgVGqv7|7C1 zz0_8igfW&+dzx?4;_Ny56B@4SeXIG%0`lBZJLSbibv;Cp(oo@&o|wYD9#R4992eBt z5*y|3;Vtmt2#WCI06oMwVb^wRgN0b((OkXT>wg!Q$hPi4B#4QrV3`bLT%+nV{$n+`Z6#71P11oIXqa%@nlu_-YtNsU&SF;k4>jL3 zGWkN&GeK$RdG}kh?&(&2W5X}aMsR|{lHY$eUv}^NvaA(|-FRD;gk@Du7VxkpuX#1Ch&Hy$Ch+W*SAZLvfV^rFhL3#k?u^ac z#4CjvViLxN>l0$H#VJbPnXHeix~Miv_kUYEvT|0F;#8nFwg!FU6RavbxSDWZHaC0T zgWaRfj7Rt@sG(QkM4!+q>vPZz|4?c)y;4!6w=7P& znv)VbXYpxX@z#;IWP(8X`C-(4AC2=4l;Z)$6z)F@jo`b{iwH0P@T2_eSwVR{Eq`kr z!@s}xy6ptGzP^5betvp-y1&0)d3o7*dD(ngw`xYkRxt?B(Un(8rSa%x z?&YQ7=w)kbvts+@sZb~{J*K2-d4JGZ%-KEY@bL2G`6;cgd*$@DeCy?FO2_8rW`JE- zWO{w?+EII3dwNRt_wRG%%MZq;Zp$mHkB^T5cA@cc8OuwH7w5OrFE5iXFTR0^%PT7b zcP|}XOKq1g15Yn6dwul_XSb`Zi!VQphu5P}#Kpy@e)DB=^P*_=B|bjK-G3vrar@== z`KA8oX{h)fSBFK-`TKQ9MLg0!pDHmZ~t@ns~kg4UklGcQ*S3Jc`O z!153BBX)qfxw*M}x{V$5JH9=zT$3XHjI2JxX}2Taf7+_G#wiuYX3{PDeXZ51LL;j@ zP42VQ+S=OZc3zeg^um*G`U}EjA+V|wY&435uO5+go64)hs((DkfM)lL9B7TEFvNz{UFe7N5f-5Z)Ijpv58eanfvf+FL^1bZLOyFs99y2DR{)8 zZ@qnbdirqtcy4YkH8s`si_5DVCkLjj)?`K|hh(gTnH}-VdkP!+tJg1BpDfZVM`dfc=|E)j%XcGWLy@$J( zBeFI!qqT-tusedWk(My*r}tDL2qNI7;P3)pNK8I^5r4pv!V|+`V#1(N(yO?WNs|M^ zF#%Yxlx4XMKT5c8+5!M>)JUL^&gd30x-gWOyr>R+5D;pXc2?#{gs7rCkPL62`8foE z#H9G-UD+Yt*yyp!iDTgaNfMzkn}L8ZG_{?54@LshR0zR9NGI?G_Cl&_J0%$Lhevdj zDT~yMz<)tg{h*Mixebem5CYmx*48fgmLdcg=+C`W^+hO0=e5V_{Op}5XxW(jzvP|B zTi`RW;mhk;{^p%9Fmlkdaxk*}=AEDyTqyqGoj_r~ML{(dR-bv%{a|3Bn6j}6_ zS3kbaM&d; zT8}^oRCtL(@1yPaC&os`3;pG$<>UL4V~7>k6_<-Ax09RZJ8-rPD3`v?O`(f6KZ-`>7q7j&lj4B^c-#WxnW3Sf zZ-1q(E$31TQrsU=^aNsK=(2}JJXAS~AqM(^#U`rcDl4TQtd+|x-Rzw-HH(UCZys6U zO7@Oho?zHejScHuX>oH2#5fj^Lg(McD#~GpQt&bjLHl(&EL=l@@}qKa>>~yjr{(T= zg^RkOl&;hj0mcu{B8h*x3^AqgT z)6BVZRdk@W3y!DU+v4Kl+xrK2DV7vLyC+geZPcM50#P~NI`=4f`9cw{^DsHWu*Pi*uofT0KmcDA%;MjWa%3A$9!oYRJ-$ zK3bxymGAj6~o&MW5B5+i|)Z{JDaP#OmgwRD919_JSmOg(FcW|J@&!_94-#dOiMEF!1 zR2y0jZaP@p(CQjb*hie!JAWJ$^)RSxk!%qlecq8$=EF6?0pR)R7*5qXEXE<4(&ET^ zMZHp9zUWqMe+Pa)nxt!|=DC6Zz+H(D@ncEx@Xj;0{velULpF=fbo+ksy*)m{J5edQ z!_1kEh?d&1@5|qJ%26i{l+p|I*>R=kfT#>LgE&0nbcfw-HfXa>yMK;(QA)-4-j2); zF4EJ?HnEdgl-5(pJblW-xzK{a;o@UK#m3HLl9}UjKiM)|+bLC^@)noDPAiw^Y1ke5 zG!*al;KUVC0UtT8y5;i4wRu1FnDz}xSTx*0N|A$Fb|j=E`clcZ|4G&zF7Hxm8h92j z?_nO~XC#@`EFnv_r+>Xsi)&GZ!C+LUbIgGBjNoB%YMdn-LDZ?qq++I{@1-K2Kj%s< zIG?krH&C;Iw(BX;{a_7+` zU&=1;VdTzOym@>s5-BHU*$HL;W=NG$#ZUEXKa^>Yi+ufF>Ig(;@3IT_v%OnWQsZp= z!)C$etA7>_Tv`#SI~WeVqWVrM$gy~nOq#o8(c2s6P~|Dl%H*Ud+K;Z z^^R)ktwrD6<Ox1Khty5DqKf2FRTcN20a}5F%*Vw8gxG<8`^gI2wI==Uu zLq?zq5D=8;sdgSds#ml{ti+ld=5UNVr^kZuD@gdI4-~E)I4vI`mWE5B;$~|Rl$m_K z6Kv38bZvII9__cWFf*;JK>6&D-&_38dXd1uuwk!x~U*&q>l3t17k}W=(_gVUZ0U+xA?FRSbo=Ml82mza@ zSw38;b6E76emWfjAD=Fds8K&KbSU}v32s5?)CzjdTef4kiTI|62ZoWO66)&1MpLiQ z;VEf2MD>B&7%j@!Ih>oL<5{OhM+X<5IvMobGzK7w+V>{sIB&wO76WRzoi3nNCi`2* zuLgk${rs6WZlT38^|;Uh5jQtwe^kpjz3k9l$1o)#@8|IIoy;1Fz2lT?LjyIn>ytkU zGp}oiS?0o;Xw4TDbmha}Y8AD4$HI$vS#E_I;|MY>=r+^Liq0tRlnw37Z1iM}YRaY~U1dO34u3B9y z|9Bie*U(7z*XdOdyIda^IG^w~B_(8u7MwDYGWW=C*3%R9hm#+wfTCm66W>2R{+;4E zxUZYGRf|~ z@Z?W+NXv^>O@V2o;({B~;3V1k>yElQo0D}%sHB7ZPv09L+ed+3(7Sfj-ou^SK-xXo*w@o*^wAz^esqQ{ zJ!9eALGJgZqSU3puj>(HuRMuC^%T+MzCv`hLBq?2J>?;c-EQ%=5nO)~U15IyRgB|| zy&4T&^ndd(59Ug~9&dNAD2#*|o?c!eiP*8Yf9Urd2mf5euP*tsv$84T82VM**Mv|uFnsGJAN$3M@Uiycb{oS1Po?aB z+8_KAGfawgqG2r|o09Kl#e@(V8v>~~bAg6CnfL~r8-})>d;ki?mxad_O!uJn^2-zr zU28?*TbZ(WS^l~(#mt{euVf2HfK=jG?Wg~_T4?n1&UCa?g!?Lt-D+GrR`n!JDsmI) z3BBnI3WRQg;PP>9(r{hGdR`yWMi2Yd^)+|NbA*BQVCW|qBjY|a%@2I>nwZ-CQWam^ z>dehnW_028K zACGeIn{ykn$kNi{hQVnxFyM=$ibvDHhUL$w*{wd@d)i^2i+!0$mo?-^hWle_U|fB? zTGux-k&B~HNdniUmQPM|gE_J;Dy(BwWS!aTReJk=ww@;0VI{w?DhtXYEC2Rf_Tu}nTC7*pFXe(Ckqx8M@ySk#0EQKov&AzrSk7srBVy{aF-Ybd?FF*YC z**7S`)hi8eJvYr|;NAU%+uzl-p1S3CIh*HRi_6s{%*1zp|ecjO_gExAoSi_&n^sjfSMk>;;Dvx1n+DzC=nM<5Z_F zJ5fPp4KB#7-5m_W&S2Y#CTir8w+#Ek4*@14=~r-z4)E=!02qSgZC`%8@4*A8jh7_{V$8=mNu zXmET0!7rQd>Vvqs3#A<2@s$zL1_;3fs^`2xNI~JOb;Nldwo!)({F|;P)UYW9{#Dd; z(I0{ae*`qufjHCQQ(GhhklJ;9PA zY_gui?BBQBX3}i@$u=)@kgvL#avs> zFR+cHOWuaZh_p-sTQeB>UG2V@*?wF?DipAYc1q) zC^ga$yn_6mO6X)m$L=W3;GrK$*e$wLl%+ranVKVvh)oCMf6;+X0N;Kg9jt-cMiztC z;1>Tf4zO64;9>qg3Vro-Xtb6erf6wpRy)6oPm7DZrr`wzd$)oY^5$LTyWYd*Gq;|M z`~SvQ(M-u=mk@Kf91I3yXbe?P^;V5{hgPKQDW92GvR3Q;P8IaIx#F&uuXo`ZaGDv8 zPqQ-c&hP^Wc>P3}S%W{+&**l zHu&}|9YOhrut+iziNvHZHdRtxuxP9vPEI~P-%YhPew6j}^%KjTb%ZI`?f~nslxni< z92_s(@MBFl6?mB(Ka1|S*CJqbeK!9}jNmRVc%ypgYJ0g~PP<_bE1h9gPsDA3KH&yO z0rlLwyZskfSRFXpKPuK%UyQ)C!Pn&r1-%%3RFiTVzE}TZfMg)<)+TlSsVp-6lLz^D zkE;}{rGDF*u+_$c?q-$(W(9WB*VFe+5c>&Jplw$4bBFFBMKE_}IqEy_JbH_Ga{t$0 zQr3%WEC1~-`SNQF8{;GVcqoFu$dO@lRe+3R*G;sQr0DV4850A89b95VGoEU5CPi1I z48*b!Xu4tWNjT}LRa`FU-@wNGu;#GDYSlw6%pK~vSo!$OT=8HSQb9M6sd_C+4y{~R zPk0H2u*EGE&ymBan$sqxKz`dVqddNdhADW+lE5)!Ui}j^B@r3TSzK04`8kM<4?vMU zuv9Lm+_rG7YvNunSlU=ck%)^Q84d;Y!}<4~uu9bSMBizuFJ;%b-T5g_xk zRKb*??Jc0_aKkij(DdV}jS6q1AtVz^SthO!mzB>1-mlp)XDT{U?hJSEt*m0&2DN8L z3?n;CDr^Q)Ca_IQvuk^b?ro$v7U+t#b~We-4I6aV23rRRzPE%n&CouPL0C(sP_z%7 z3=H4OFAB_;_at*<_upZqrY>e7Lzq5FwC}isBN6+Hi*KQ-!FqxXFJ)%v&(Dt?%IW;R zqZT_$TIGC8f6AxtI6^9RL&$K@4L!fZci(r&Ez4;kN-)ldd2HB!W9P;aw54E031O z&0mZIdo3t4L^D_(+4e4!WB@G0`W;Io<3Tqymlc*I5WE`c(u$emIez)n5HeYCWA3cW zm!8#`M9%*G--`+!qmP+YP17v|4meN~?~aB?j=rWGKzzSdb{g%BJXqB60L|M_TX&CX zLRw&Zy^*vVsW)@Hz*>@C{TjC#&jXJpyY-hDMXk0fG#ATgHNFT&0a)ef1B11hdzlUh z)oteO#U7Wqf4KGL6YH5u55gsKg33_H8uz#OU7E|qEw=w6ODpDa`z6kw%_&4Rz}@en z{7+qPS*7oXlt&xnv_FIITNl?ZH;5}Hy@;9V-2Om47WQBL!=Bklac$%G)Dbsmk{#x&0y0u`HUY$E1FnUdi`?GhJ;Fr7KAU?C7 zn3430Wf{Rgpw%gRdk_q}%FkvP?3OIqkc;>cf8d7_mZ%IUcmZSle`?hmm6br0IF46OhtEVZbYJ24R**)oZ`aQ{WPiDZ=OE=g>71AS3UB7VcFq?cn|6s0dr|6AD=*2n!>oU7Y~@H`W&9hG z@+@dE!ZYh&YIc>=8Wdh%`epX2uJ15IzHa?h--gVCo%;o6+mtDt)7dtFsHB_YSam2V zzZ@lZwuF>>F3rZ_A!lFDSu02AqE$|nqwid+MFtOOCM$|f)}nGMYg`uB(VP=sswT6| zK|yv=e~vz3Vq;-igm)wQ_Lb?ED&?08IjzNUrX04F^SG%8%(?u;E7eUP8h9ji*mWBQ zK9D`FT2KWJ-9{)+)9$tcW6MwRq$wMuLl6rd%opO~cb+{=UU&0z4vObm$qiOa36I>r zhvow?YoT?ouS;XM!SD}%@xQJUHN3wxzm-6JXRz6yT2ULF*={~8v3L}JXr2i6hsEq4 z>tX(+I=18J7@%yc*AbqFC!?i{3;DLs(0kT;XjV00tq^}G8%!N<9rqqtepmrWX-nItxjqzMG#6(zc@3b5awM<+TUE%(@O#JHI z&uLI=i-oPVk#wP`yCTV|A^6;#ZMWx-@$d4nZ|yDF0ltRXg{$#6Rya2`lqXJ`o`FwH zRidaN&G4)*Rf>q@;V2na*_9Z_pm$}WjNqW6RV46|I7Xy!M%l^^zx-R_j|1?Z=;kZ{ ze-k~jmW=`5Q^AR-=14oGmML>raod(!)m~vI!3#|m3e#mJG~IXn*e+puZf*(Y90tvy z`(W{Y)E`1!RM&6LV2m4umexpu_NdhGKH_ledt=vrtEoTu$Afr1_dNsr8q8l74s6*B zF83Q9bRV~T!Vsry1P3zE?j8i`z3sUH>U6}nBjXq10*6S&LR&Pcoo|;I!uPnIvHf~C z#B@h;$GRakWfmJMCw1AgnCJod@ZK^}^UU}=$vw=BKqWY!ZdC2G=l)S_N{S@PzG(nk z&%VK`_S+3nwLD>9oV(3TY%JneZ;v=alJ^nYKfR7PY+UV>(>kli??_V)qQj!VR1q32 zqkk(DX>SAmC|%s@fD->IX*_y(jEWMtScM_Ur7`i7whFWoCxv z;rTZq@sd8A%12>cdPGCl{J_I(hs=+3QccXKt*KAY29>V)F_C$)r&omg0k0M~=-%65nLq46y}YyL{5Mt_TPp%$0K19GS*vX3|Io7fB__-4S2viaP z`L~mbAl1fjw1;;G00rpaM?tN#aV?kG3)>NYtasKqMP$jSw0^xoD^G0?45g-CpgG}Q z`ujPCpb;wPU}JN5EVt3;!+2FN0u+)E|M}wmG_eQmI1;1TQyJ6`HN)bbs{#!8?z20{XW$p;108Q#{5m;ZLYG~UuQUV z;1A^dkNpA&ju!$}rW1HY92`v?+n71V^BOw7W`<0`>S#_$DWx-vsZi!cXibDM^Y4R`k%T);Hm(;(1$C7IF{M=Dw ziJD7Fnh9&T2UvqmKy3?gPzodnh_=H37BjXPRKlfps;e%AQ9?1aM?N>}q+KwgBs z2KnPx1n^0krXhk@Xw93{Ye-0kO`s@wwhP=!Q@f%;s$q}p?S~H&gs(WKv zNAwodq!;uNR}m!mzi-G!uWXEa`012wIJJ*1rxVNd^dNCEw@v zd#T5J*y%iV6g+o%>Z6d5QBq=7py|nw<-SI|=m2_10x$;Kh&19p)MU}uYqH8#^f`TB>~%1Q^}$Ib9=VZ~XmqCHnn zId5Hu9a_6c!Dxn~gwc%Wbw#7G#s<3Fk(AcoPaR_>B_rgkLYRmJhnl%igoRF4SFB>i z{Q;LvA_nw6fB`KWC!7*;pK5rdlsd+N!I^;7&$;VXSku3YH8zbfVZP`}D|?l#)5oqD zp^7Oaa-xgQXw0y@kq-}RKXBKswCSyxbSl+birFCKfhKm#)rnjV7UR19*}fF9sQ8B{ z8gx|H6g~+O(iJA!GlR4e#Dv-|Yd1+uFufmup!3-^V?m%;C=vN7>DT8c&zb6@VC$AG6d z?+I9*-N3yS8w$~SmUz;!)56#1(NnJT!s^3y?)5#;pd`1f`J@* zNr8WiTG70kk@$7yl{dpF3=SxMPMQ_>&O=*S7zNYDpg5|t8-^zRMxc&4FV+?o+2`<& zan<`$W@O8mE5Mr014RXQ$UBH(87wGf2`l6N?Uzdc>h1dIGV34uGXjK|zfYnP^y^>% zuUQtpgH_gubE-H6x#2jO!G|DWT**1WK@^QCIPPI`0xWI2%>G_U&;uBIhrMs=WRfF1 zE0w0NLm?d!8ujeDe?sioz{PTML5G0GW>1}6RC9G7u2gwjx`LBtZ(krYz^TXZc|2rn zFdlDuOw{-HNGmz{^lNq}brF>ks?DJ}uDafEBIrIei38`;o|^om#9NrQYA`vYT?#QI zgtWzqB`<7dh4V2g8vwZ0Bw?0}HAvDWmha0<|D?-YInCjRcS~D8mp0~5ZE{ST0|!Qg z^mZBP|8>~Q;i|?6f9T+P4YE^o^P=%=nIj3z?b5YK)@*D)8AYV29rWzF3I2W9i+-Gq zHW;EFBYlCR!!v}Oy9sn^l>ees2PGt+?o^Xw>Qj>TmH{6y9R;|Mhj4&jOD*KTgp9Kx z-fJ}S9+Kj_&B^R9!dQR<;VKg8%0&19 z$1k_u_Z-@aDh;%`HT>DF3v$r|>k|5caZeRqu>U1DoVZF^X-1FNp zk(!@pAiWQlHeA_F;99Yo~wmi(TXJ9I&si}xegHOb^2T19zl6|LmX)`D-Yj< zNX&18fb=&df$aR>9zuo`t?gK%-9PA9M)I4Vcq8+o+P<)D`vLCwL@5+X+>O()7>#Eh zkLf0HD=m|~%sDQe!CC%79_P9y1Sm0ezd9a&8hbYw3UsKojK*DAf=31i&N$LERIM5m zRtV}D)mZ^pDplq8Vp`Jqi692UZ=6}e^W0S}Ar-cDy;-Eixu63A3u&S*bD#rZVnh`@$NxTLemC9LLm` zMVuTVi%Lx1pF~dLl*}tlnlBcAZ&y2~eTUZ)m{!*B<)Jkb&T)!~+{Or%27=wH6Z8gd z=bC`R2_<@ZVxna;a`Dol&H@=l$4k**Axz2w8wgnY*hpUX&a}F_mrH0z=l0*L`fu5^ z%QrKK#ETdl^78WP+VLLQ(0U}zMFxX|gH(&ikX8dp^KMc)JSKY-myJ9NHMwT&oGe{0 za>@K-sa03o3rxa+6Hb_B7HQzKBs_SB-K79KHSN&z1SYE7m9%6JQOM{>i#^8Iq3rAT zZ=**)We=V8>eE8atfcAq3ymzNUI$rqeuQhasa=c;7Q%)sJlb!giBGyp@0ncEB_Bue zJ#*a)_ylqf4h33rQ5DTpL4>DT<#luLST{a;Ut$L8JH%!l8f zN;%Bt<|R`a(_@TA<6Js}g>%j_b^U?JhhUuu4Ph1wc&R;^BX*Dd#HzY61Dcp5lT$4i z`Dr0B)b%QImXTJe@NWs^1t6tn*prJ(p;ndw7iWuKM+e0$zsPA(?{F~LzpguksEipb zXd%^Hx6#~=3blpc+58KkCkPQezL@0Mgktnz-grV;BiSkR>pa^G$gpE{<|_iieC$w% zP+RTmD5Kl|z z?{RIEb`CT&2g!A>V1hbGq`WEuE%~K7gM76|??m3d z7qN9?1p3qxA}VDaR?+xTz$~c*fQ8dc(Oj2bMY@Y}xMJWl%Jha`pB^%WjA=L8E=t@P z?Udtd%OLyf`=FF}PDTLumr6DqQ$iluV9J-N&z-y@g%0VbZz(5i`fyt!$onCWWK%F? zb-3om)M~_$_?j+8mJIA2txnBoZT^ku+_ z=?44SPmUqrW=*_MP;kf<<*F(^ffYd?Ga|6S;ny+KDYZ#motvp&Xv)#5*bBxJqZP(B zeFs0AL?b~s2n}c-KbY#p!Qn>05|UY^!3QT2cJZs!4Zo5?U|3&X;IjM~Kb3#E zk&6kB{~XD8dN%ngI`n&VYk39=&Wso(8!0WxjQqkEoi>r9zttyaHAS90?+I#QaG+=) zS~}UGD>FZqF@(l=!+>Vovq`@N%Z2fnj4<>bMPw2hc^ZgMM4~ywa=EMpL=cnzk*|m! z^5WxUOE&B4dsSBf?R2X7?AlsO=$cc)`dT;Ia~+o!&8cs*x!z|Nf>kF0$kjsV-Ee#( zblqb6zQ3k@Zk6mM9O#UIcqOvB;)YB#za@n7boSf~vZqNlJ;V1!12qoXt=K2G#wsmN zk&ZSWV}ST@Y0~q;Y<1N+{jAm=!(A}pFLwIAQl8DsVq1+wD`A|aY*M`u|{Cl$%kiur~d zw*cd%$fUh`))*E6Oj}tMGrwHWEKw|Tb6sLxX#G<$rkh!@c~~XMmk0QTGr`h~q2Q5I za8=_@jpw?)YBo=SR1Gvq6J9g;Ma7A1Y1i(jD=Tuss8BLLkeJb0tOBYs&Rq0@ssu*1 zokThOcFs#oPNMipQPa*$*elL+{F8yx9iV4Jyym2H*MvdT`4q;ZlYP$ooV=!gN z0%D_!&>!{!xQ~q-ZN=hP%iD-PMfoxz7P4@!wx~&;bwk^TwHi221)*=YRy5!p1)K}} z${Gvznb6%=)_aF-QpI3HE&9}UIT88OrrStik~A%tTCXLGS?!1}445MjtxG)pWZ0D; z>Ao4}%|^#>Ak4OA$OS(i`@ZJQG>Je_iJg@4uiP%Q|M*%6Y5lG}tq0|o01j^M+o6^7 zAA~p?Lna3~wl_@;l2W?03>sg%E}%$SGc@&@rn@czdq~K1%`|fsI_4sS!qVisuI8Q0 zw`1?btTN)Z(Yd4BC-!}3ECa8`Q0}^Di4Xo1wF&N+KNX$QZVLA6y7o-NY-%2WH zO>)MEy5r)Sk(5ME^4$GN8bjgiwdTcAB0Pw1JgP@fGNU-R&;`FBh4W-nP5?g^WL$~E zgp^YKv?Lo~_8|WLweep$^S34s^Jw-ofI(Pol1D!5)X1feeS%HH2Z&t*RZDIH>cg=b zUY0v{#}J#p(@xd*gFgtkmY(Vp&_^#9PNCS z7C2VDp#o(?xH64f_b-#;#Emj-rT%Qg;ozO<+~b_GxNLHxRtKQqTIH_h#o$bEM5-lJ z{?hIAXZEPxE91v=!3`I?rCb^-7m5+%?a+-~?> z*_R$y%~ZY$d|6t%iH&r>hg))y&#w6*jFZ5G&yJxx?xK+g8Ggc~5^VR!AA35bITn|( z02g=2ib%|M^i7J997R9`pN)ODwRA{LNL#grO6r=U;J&@&=RK9|cc-0dfOqyQguZ&D zM7EQ0l(Fd;GpwFvG&WEeqx|IK^=+t9lE!a{EUa9bIh{VJM#%^t@6tJ)~gD zS%A6ekQ2kxeOQiaHB}j~EwswbKnMVZFsn`~(Vj|?UCBx6SQN1GE6((7BdnIL)&%eb7cHdF^Hwa%XX}P9Wxd z9&-rCQZMg$tP6BCkI=U1&|7F7%5)f$Y+UHd_*nS9<-lFeX)6RyF;$!2$bb)b%dS|J zSUXx<{IZs|u(LRqeA7qg^iSiNethJ|F2PW$ zl*KaI40wJzP4!)T#$L4gI749O=4noGpQX)&&9pasD+O3s&bIozhJK31hgWd+-Uh6d|+dpizX|CQTB)sztXo$t>{+(&tEY{5YB-jixqw+6<>tO};J zwz@S=h#>$a7J2gf_ZoqD7-ss}74BMEeOP(KJlq==nlAmK| zEM3k-P2f6}!x`JWeictdQ4zm`pgn1ElNwsAyErN>!_~jA%`oG*#y&tgjan+or{cKl zDaPUxJ4KW9SifDM>j1f`X$JynU}?UoX#&IDQ5v`yC{s?VtQO{DtLG#+syq$S=>oa+ z9pJKHSBpHekM3dk7GtFO2f`iYNbq&f2`rLF#W-j~iyM;0cnWea#M!m`a+Dz6R=L;S z$XeqxGZe7sHT+n=Bo)nKieUNOCo|B!6I4)YZS4-<_7Z-RR9F!ldMm%wB348&WIlSw zGzRb>(?EL}=QHI@7jMMDxcAT3Er79#Y;m}FKP+;T%ZvCZY(IOZ+32N&UD}%DT{@zR z9tv`cWyyUDQ1rNC(mXZ7is=|V@)$KRye}Ekz_QNr-FNjfpap@;!5SEY%N@=n>4wYzh0xKt(*SrU5Fz zxpF%;zh{kjeKGfv+vC#Q!zT+Yz(E4~#QTh6nQ%XQI(|I^b9E{KF!P-eN{d9mN5s0m zeGe6pz11*sxw?YJy8HVU4l=j3ob>J&&L+pMjxXW!S{gQ50G z2f;uR4l&Wg3{eF8ZYXtv@==c2^PiqxrTk$J zA$Ck`ehvecc%2~IbS<8pdU@s&>EAUK$;(u2ZCXZC(`IBk*PWeaq-t>@-##(&0i|>= z)T2h{cQJy^4w}tMo1rP`OR7u!L`(!UX$roAdXf>d+-RX&wF04ZY>fq5R2kGCxh)kj zLo|qB1DRBTc?a@`fM@<|IM`4B`?@L!klG|6zh!^Y)WmO|FawvZ|18>I(#%`HLx4H0mb0j$`14!};dJ@C0JFa2${wCXz zTH?IOi4&e*A0hvuZ1t5@>5CnA$>}vC{%3(Yx8miYM9RjMItGiX(}GiuQp%BGuD;G) zKFp$+8nZ~PY_>hiH9G!NB|O*3Lhgrll~O`hqu7_<$_)9DI%B?&8-apu0ex79jjgtK z3cY#entP?8kia~ntn=kn%0eZmQ~Qs4&lh;{T@z|EFr4G3 z*8#CisqJxbeMY%PILRZ`x(r5J2yYRBsmOF%Zg%V;QOdlRKCR{+K3=hve8rM*2x+ZC zP6B?ai+>Uwd%Vo{Myf{;SQjq8c~S3f$W*OI%SXC>2S9H)F55#B`X?D4da}iY9+K4F z=|VJU<0bqO`RWPZ>CYeJ8#z3ncInnPA>h?x_xRF4 z!Ihm$0_ZCdXKE^xJqaWC1ohQXPzCp;_Y6GnmpSpFP>@fC$yR7uAn0>FwPdnrfgjr2 zU*~bc7CbZG(I0dm~rm}&nz57L!{Sq)Ny$$ri(|w17R~78=Lq( zRCQwBMSn<)RFOz))kosXZZGu6z1mwaG2Tsl09-a7_7)!-E$AO4_$%Gfvrk_w#M1RV zQ@o6nc^IJ50t3sD=rKqw1sr7d404|-GEGys)Y@Q z06CnNlrgNVR4nO}66veo8U=8}6Tx63!B6^-wd@*dvY{F0e+JmtO-P~f70NH;YY}A~ z3^n3{#89|+yO3^$-#BiR$*Gukr`CB+Xz4pSkI@kY18;E$;(eBRZCfxn`A|(=2`#;) z`j*=q_xZx>BVY3q@)ydm-3Ifi=XRQBfyOHnR+p%$c{{E~%avWrvWS7$?R{PCE9l?9 zE6kerU3w9!_)j)?_5>P<1y-Odm&8T!YTT;kq$Yf@Z(=3Avg;lrii+u{ZeYn3k2|uR z;z7SWJzdVKmyIuA4__P9|!9&|AX&7)P5@=ak?{}?_Te+5?|MH)mE*!pjHv3G!7^VF_0 zl-rLV4E+o?u2na1SPX^Vdey$yem$p2rk-rroM6LCEz1vM(N;Tsb#XPkq-<&!(`L7s zPT(V-tccc5Jg{R~IHMl3b}n}wARbm=gqj@f@8-k|eT5=PAq)%IwcKIP0S?&WA^!D0PWAk?)OPA(Wr zP+oOurM*$IuDC>f#jk#`w@(o}I$L>;O-}Gd295QN6GoBj7}BchC*x#%=8v#Kd5t1U zi9RLn9~inE7kl{|u;?;Z;|}c&`*nA$4l^w_(YsSpyBFU^RKX?0LucB~0+Y99%I*qp znMRI0`>4JpGcft@`!o*m1HX(Rl&#cc;VBI)FnrKXB{3O_s^LG@lRaMHYNh7!_X;hS zYO89yZDYFBzSgT={=k$8AsnpNkofllXJQ`ScHWzU(})*$j^J;;_3vcm_XxJiH0eL3 zcURBv)W27#9J`1^H+2Ny(Edn3CKQv(i!s5}xUNQ-&2jyE7Z&`oGYE*j|HD7B3l9Sa zutJJ{rIZ_w(p#Ym8}Bo#LHr>sO&3+P)Cg1h`3g~xdKc-7a^a>M2}g=PWY|SZhW6On zuia7y5~-{$lC0|M^({@SuaNO@Tw7HNY$Uh42*-nJAWgx&H;TQy`pd?kwD| z6t>v*89yaV5{Ov%u@(4#k?fDbrIiQW?)}Rd?vU*zuN6Y3Wi! z_8-zrn8-|3+_*qt2~X@S!>`oH!U*coBp}fGy&eM27Wao8&~@BZcBfIWy3{mZz+tgTsjdU!ZvYAlYtI<7&mnhP+rfoJPejoJUU;+Hqi zV)Q2!QXA>?0cs;DYHayE>L9z6d9ss%;r(17?*Y0S3HO*v)FCvjaJ8}kimTn0-_AE$ zq;$5_pMwOS_8twcyA<)k3}T8YkmFkf3zX99Jw~%LuggW{rSH>nfL|Gp& z!R>jPu_6a5D>E?SG?YR8E#u_?7bza>7I^;w#=HG-_53y4!C1&tPYQ|^EL`fWTX#Rt zR%G8=WR5iOCtOF@JBP%Bh{;UNO~VIBEAjE9xbq2W{|)A}#eMTb^!n{(hmzZ-I0$T{yLJih!{nojddtT8*{dfLd177K3(lh| z9}J9-94zP-gLm95d=KSPB&qac($M|AW?hvb{ia`AMd&c@=acn0;{l054p8LX@M>NA zr#k{C8L-%vzUorp_OC*Lx)j-&@qX`FJIpvfT7JiiYe#?CyqsB6Q-XB@3nH=o7av%D z?$QO+oCDlDn_IDX+%y{9{6f?tfTJ{ixkzgXwqAR?UbEf@!sSFCDd^r#lZWE94eto^ z-Qe#>R-_46eFCaq)d792$dX(3wXy+%TL1+FfJ7w0or^U+)Hg4=6dc8Q6p>DL=Sf_EhDzx<;|DDriWah${=4OL9Q@m#ZBvot?|@iGa( zCH&@%Qk#2eqUVnf93=L+*Ll;|e8pI+w13@Xoc(tUxiN7faP`TO`HsN7`cJv}(JSY0 z_4u8r;kM9R^cu^{rXw)+R&U9sdpe8gL-OMww!`p3@c%#bY;bSju*SgzBEoFXpvr}qm!*JeK_sNaZEO6^#g^n|mxis~i3=FK#`0%3R zU6N<6+4;@76}ec@)z@&)ifK4fw) zl0$L2z@YnI45Z(=L*Co)F5f=fV}aPh?tZa%>yKR-sXF~z=bk*b$Pc02 z8oWe6I#vqwPHud?2^79(I^J6!`!jBBCQZEy-MrbsPvrfKfC~cT!=E0QZS}#AuhGc``l>w`#5p-h@tT z%F_aekgXx!v%`-r$bdh*HynxNB$rN4*6+kOOCz@;94TV}2tX@+|8yKP{KnB#0)L4! z)Am7pxAfRAqF#3b2B5_}ekzeFo;kSM&@K;9e*q{@c8?=@30qY`01EZfLw+|j=oJrt z4*4-EJ_v|=wwrFwE6+9z5(#sD@#BBvYM-APsk#XIz_mNRFg&kWn-_VpZ@~%bUT%E% z(|$eCxWAdwwg=!Iqy8Lr%e;B4JzCR`VQq;xkbgXUeS9Dq5Sf`-)}S@guvhD=$`@ckT)F$z=4sv=kDZG9_LX;{S5$1>k0%ZLP)l!r}dhGI9kL2 zkQqc;k0uB{4c8AO^1lksmRLWKFhp9E7fA5`m8FSlfhbzYyg?7(Y4+~_=kR|N;w_XO zAZzfn6z5O7|8dWm_UVPDh0O)T29ZYY0FwESqQ%|;Lc7+A{Eq{Sv@UrN za|_E?&<*&1ClqA!8T>y-x@|x;Y0Xw3x&J)1Kv;tUKxwxYAkqJ|=W4OH1j&K^+bY=f zzpYySQy)Z{s4ht8zs{M0K9euh1#QBljcNX$*rlJbA<~r8{*UNC>0q`jtAVb;(^{1N zKMIT%QDqP^L>jOB|77RmWhzYX!r0WF7O;bV#asTINOBgx`3p@?@k8BR{Q}&-%^Vtf$7Aqvs zG~|C;2Azfq1CssU9=W#sfdQRE;$VV-fx&_?XL1R($+PE1u!DhlQi8x3)5u^zcxfWT zAOakxmUM;xTpr#CU?9jt2r#h!y0v^A1}WeIONk!@!h>jTzENAw^ele0wE?S?=1t>k#^sm%XWrQ!lzGzl2 zBVuVG{iARgs{B=}$ZpHNodyUxMNu0H}wyQal+_13Q#dXKa?SZ3|8RoLdStzst za8ay$Ql~eQrNG^U{Ed6UH;B3>*>li;crX4kozBy!8^iX<sT==)4&aN1zmecLTlsCOWNTmOrC3s)d zNPwcC(gG4!u;NhGoV8A5SJX|HKU|w0KYy#lv+S!kd7Mg#y!ujQ;N_Q?h)8; z5tub9reS?oBWe1vxFoe?G+(Fbzy*CwyPr=y@cYB4tD;~QBX?)t{*QO zt=~k$1AAy}nAt(#VoNbW->qmEpnUI)g)JXtCokfsH)`+!z35l(iMsCm*019pl2Z>N zFTm-yYa@UN67Zd>&lA@`5G-%cQN$zMbK|~KvTT9rE88@v(M}LJPUbr;Z7q!o zlgpHK=_@Q#Awy>oT>nmi0wT{~L?9xIp+}Ik#wxH!%q^T!S_Hpk!xyIqY!Me~(RI=H zOf?hvS2#TuNh=!QHGv;dw^a+zV3JxJba?(~&6<^~Boh_o+(CmzbN}2= zM!1c3bd>M212Bu5$v)CVVhcrYAQkpuXqq&;4wa+{aIzFR2!UFKAlYmc+q zcOdVbU2FNj;h-5uIp<;SHrQ+3E}Kc!k$+zzi~VlY!xo#m*=cYj7=_*ipQ?!)i4OCX zL(K=9OKC+=?^JFnafoABCbb>SEOGDB-<5xSrXhPeXF)J!WdQ#RS`)_-bc$~G=FzN& z)(K*!R>vDx=n*43P&V;n$?OMhj#MOl^S8a8Q)k^#zR4txrz>_upO~)o5^o=w>tdv6 zk|b6;{^`EAz<#j0<6-A@k|!;@3~bI>w~SJzVbP|ql9x0|arbt;_lg$%PUK(H)>DZl zq&JPcQF7#FhQC^N43XpM%NPAWeO(1u6>AgbEZrd8Ae{oz-Cfcxjg)kVzyYK~N;m@2 zC`by@A<`fzN+WF`Dc$@F+|fJ#@ot;nrGj6?DtX}TH}n(1i@(U=Q=e= z;`19YV?pZEto6Pyx#^i7b+pDugc&m~FCZGn5SJr0wUUUvViunC>n@y?lfI)xq4{EJ zT?5*f5nJVOkZNCTs6**Y9IQB)XWaS?Us3<7)#w4CPw%w6Zvao@qv#)dzBE6+VZdx+LzZ{pAuc5JB4T^oE!Vx%KQA)({4>_dWLirq~m*H zs$Sv)_7--G+6Ac9jng9%yyn$W&!dZs%Tu}#UOs-6EaoYwjc!C$D z3AzyY)Ei%s1YfKH!F4Fn0X}5xn`$YY5&NJLt4GWvE4`kW-ZO1s6ge!)!nj7}w@hL| zUzHBO?yxl)a}>DHsXkG`kV9%E4!g~+a4&QxXpkn4ov&DT=XMi-D%f)C14DV_r_}^f z?dlJ6ODfGzQhg74Uh1fR78bon*V|(f+&=~#fSzv1d}p1+6zq`ZNDasK3ZCtP+E4iJ zs`5`Bg{uC%V?c1rPcZkzhvhFggaHD>Z!Iz`9M?GH*2oN3NO_rY)_x`fK_?sL3kUD+iTgy3P!$FP}&DB z&z7yTSvW0Hu+m8i(%kV@YiFqC!p0NJ6w*~c2#Ci42qu22ArVtzifA)i^G9Ws`X|o62;ZW` z#1eCQG}v=+JFg27^Q|wF2T(`W*k;kS*xjx6%^}l0xaCF*D^BaFBdXj9dF$Uaxt+JZ zG~n;sq{!{ZN&qdWr@F&~cB-HjCV7!8cVXmG=lOo2X2Rt@9N&!Q`<6b_0!)*T%zmh} zx=nL0dNuw7m4oAe&=Xc2$H>)Usc}NC8C5p@HQn2LnzxarUvoFUO%AZsXuwTSZTD*ZWoZ2UoiEQTuzZJu&l(f#cfdQoj5^VI7+X z^A2n0rTr&?9$RFdi(&1@YH&e`e7+Ef-1+KoSP3VO9m2+(Q?^BXP-$ujej^Ly7d$Pt9Usr`uneTs`1 zZ>lwCFu7GP84&$V2`Q=T-r#axyK)S6?EY6;ChjIex5Ti;z2L58KQ2-e;f;tcl>2Ef zQNPUOHI3!=I(o5dr-QFTntp4vmBzwYv*%xKlJ5|C7U?Y?Wn&fGR=DiV=C_~va7x{4 z!lM-BvELY{p&@BO>!?Cs-gn|SGU&kk4`%xrD3$5%_ap=KuOZz;b+2?BtA2u4zd+fh zPk4<^7O#rdW>4)K^k}-WOK|V99*dGQ>g?<`@;j##ezk^D2l%p|zb?L|NQX)+^@zFC z4s-im*!s{GQtmywRv+yTZUUTi{&$#3y*eYqVvqLak|d!XpUd#$Le2nXvn8m9N~<#( z=huB~VA;`0*WrEgGvx=yCu_G)Kc^zidCx5?U!qYa@67ibkJ2Dn zePeC7cka%`+7SE%y4)L09j^nGh`=G>F+YDA5T(?fzJ9crFT&!d!^AAIe5Muo zP%Wp`H#&Uz6C>FM9cxJR3o+j3i_G_a4$Q}8=Q9k@$lH^=_Q`qqI2*+$yShw*M)r75 zj-7WN6aD4svv#i3)wRZ|_XQ}%PW>9bB91?6qLi2kC-8bghT2^@L)7dBpmC*BltZ1- z*>MLemX>1-UM!wpzvbso^YrG&KX5a8d|OLkGSH*4!KX6Qud*tzvL>W5DxwlXLNBS1 zI>;cYV;6SZ?UnDz4iRfDAniJIHSkpNR_87v=pNpUje;%N^=;*MX z%fen~RS`u+JGyN*`-`vgnTz(EiT?E5tM+j2^vvP>uGGiz0V`x=4k=R4{heHN^qHs| zwq@$q$~J8&UIbJ(iuS4+WqzALbaXbVsbx=ZaY~qyo(b3?#OPL(x;GDX;w(}1Z4JMV z8|1fwO>wwuD-fE65)|4ZAVdJm2^2g{h%cQ#cyvK)Dvl$D=VwMUP#?<4Cm2EZxnByU zqGE#kt{j%8VNgki)Fbwu3LA63H@l?G3T7)L84@z7_zlBmsRrzaW&M5}HM%ys$gQ%f zZZ*4UG))YV#_4z_PR(DSxX3j#(7v_-Psi?@hpg}sJ@lNMsV;vNWo5KX<2E^j`4g7RNLWW%}a4Z0aB&U;9V^kNj zE_k0eqatep)DJ055%uw^Ma{-<(@~GqNx?hTDEGNH3d zl>I!Qa7|rBi*pNpX2eRlms0gkR?DfR%qKIPxkOQcRbDlXY9>>j=_ z{M^P(9I^bXi4R&BEgvUy@`i&nKq*hvZq6bRHgd1LMTLwFsX!86%G@7;7>cjQ=2Yx1 zFxHuqtc-;*;$ch{z1ebMT9s4L650MxtMHD{EK&H+O|COB*B=seMLu_3ybu7ZP8vB` z%x)Jy1l**MosPyK4BE!rU(q6JVV%I!?(P#tMo!WV?{#R%rV#3!r@EuPtH1fl@Q+;a zC}%4}*JYU;43ANc4i>Ru>iD<1RRT*=KUDd&j2`K!e3gIkZsndq2S@w%K^vs%|0j+HT@k2?^#dt9iNc zi`J`jL{RbrM%nH%_swIgN&S!bt?s|k2}(buxBpDKEL`Z`RrX;bC}!Q6$yWaB8rqch zi=9BDm65Twl-^}J-%+S+=PJu^eu;L9fXMq%Ye#>mXHc2R`{fYdJ?$QBk;bN(2ME~* z6RW<4N{qZO)6?9jyA7XO%X{jQj`!Y6p z3{>fNQIq!-lLzwVvXZrp9wY2VcMX@!F6|bd;jf#otX7yDsE-tkTPA@WuYw z0i`~wySJ!5v8z`)pTrBd^=jpI*B)I4cH?|?dT2q>qz-wDXhM1I%fwnjGST+urG~4q z_DOal==g4n&d=?W8Ej2`3C1K8wLTVEqR*bS2~sxGZLB{uO7$!Lk|Qo0I#BB+2#-u; zz%Q$VT6q%1q2|#W1B7ADo2ZV`5*VnIl__TNwzV$bCWlWC4qeqtRB1<%>xAXxS5n0ezt%u?F10L!$OI1}Rj&<;Nt=<+@OAoP0 zvOZMdCCW}T)qr*I{=^tXdz`%`i*uBvjp&7kXrWsod9r$cH)uISKcAnRwkBjJQn8Yy zI(m}N<3oHf@;7<2t)Qy32AytS)$Y5aXA5*@L*-P%E7so!4hQsm7Gx>-MOwlvZMZ|B zss-{f`qrWK9;Y;!E}QPe1l<1hSuWFyX(=Uk@8>eN^PX6#R*?=5cmITI`Ix=a!%BS) z>-33mOkbuyI6=>dm0P+{1)tj(BUtKPFqY@nut z?3JSd{&(ACo(nF62pGEAhWLCLzAu(3bOoZ?l^(Y{WfB(hTv8`UOn*7r|JV5am8V=4 zr^#PT-qp>0Db4pX4rYG%?z?FLy6D!+anuuAE;0j8dr6K@20iRHnfGralAmM*M;wyW zxs*a@#&2~;sz~UH46fbbyM1>u<5gYHX+*MtZnMWD>!d6Z7fpp-dFcD{+-4n1i9u=LOM-x(hV*8(OH)dxVsim3pZCbFq>Phcw zY+lfRZDaD%(ABUh`>g!3F`0BHG;=IU6MNs0qMp&bXBW~^M4UH(<|JuDKb^>)_l4UK z_OYvedV9_5^Z*C+x$0<9o26Yb-Fl09~wvkNJ0GlaXv78Deznp@s#k}Wu$XT8jp zozl6_RVph^C6xG*P3h>Rw?0T_@Ia4>N{^tW@#|@+!dJd88`h58idGqr z`-&EgHoYG|9+lJW+#g}l@V1{RDUo8aA2YY%pt##-r5qaf>fm8V$YB2{^Rr@TvD-^5 zylDKlTg!A87^r%DNxZCU`r~09qgq} zVf|U?h5sCXN2W?PB|6_OO=gmH6<^1E>oZLnzNpe{NAXq$$@~MBp|TjQerV%+5@e>Q zQ~I3fT~FpwU2CnY`({}BHS!%`Zeo?JN;;fe0hmTg8!)G5HA`oBv|YJ~cdEP1h49Dn z30N~^`3#J^FjJnpJZoFQXJsV66I@Afi+J-#LP&W7_)lbL>@lUy2j6-=EpZHKsEMq8?Wlm%OW*TKZHoNkekFu_j+-hX^Z09-#Y@Q!b12n)Q%r# zl&$dwy}#dHY*rbF8zg$>!^3^c6H)ZmRxZ+D`lo0EhFMzah#j=1=c$An3hoIWjao$}b(mvCpaq%Qc18 zNI3B^*S;>y6o}9WQqya=+se@i)-i0dKg)>PlL14fIUZ`fZoYQxSI_3y`aeWyh(lqd^D9w+kw@mFMr^ z*wov0rCo&8_%aiH6~g>JHI@@Ni{{IQ-`2b_)T!{Kx2TM1#^J=Y=^4VYQ;55NwCUKb z06A$6`%+w?>Le0Qi1{KL0UuF&52pe~{suw!1d-#D55FU3zW@4a4k1xp-s+@v8~T!h;iWsN zr(Us+;p_XxC}}KrhX~)iF7!036!d%pH+)#m+A8tEsVILUf7P&Qq>;&l-b+T$R?^ue zARx2!%${kOyS>`s@s9JT)!fu=r6*)_&4Rc=Zj*=)5=Gpc>o$>vQN=*N7J6 zXZ8NC?%gAHoDp8iOWKimRuG=wZ>hE_>r`<}b3Renku$uSQ2Pr@&U^n}!!-n^oAM`?AaEeK#W(6L+rR*x3-QlokjM)xV&tpH;X`b7F+S zm|7sL;_%DiRGfvUuN*L@B_pOLgNNRdv>2%F;GdCK@Z&hZS$PJ+f{TUfkjg>}V~mt( z7v-j#vtAPmw$Dnp;tJufz!F*@Y*6OZWPLY_b=>@cuHf;A%#B*7bl!~uJ~Z3}pR zT3RU_0$e`0Oyd$7iC322N><)JbU5_jHY;;*?58T(cYEJY6dn3QGv#TnoOG-S2H#yb zOq*T<%!ZMFkuR_*<3SFMzlKxR(~5eN%gc1Aeo; zgV@a?1KTDFrMhr;)n*zueoc}Ze=j_9 z)RG|QeF>+%f*o5rfs!_7oTa(B#`Y;W$++HQ#}V30*~Cxpa)F0(WT&;mh)A~;pVh$f zOfsqLXOsdC?qwQVb#dfKW7X!Upx?7+5FX+lnx=Z^HziIv=kO{IsvCus?Ic`v4)aHk$+5)xnskNYv5 zLsSRzCHfGUWL+@HJinRYKZOtyK?39csSIEyr;y1jbmYUQ=-D7z4Q%bdqg~*Ee@Cal z14UP8SDkg03=ruI*6nYHkfH%#Tn7Iy-fL43fC9*sf!;vFGXu~71Gr^=uaIGl>kapB z7PQa+TL_H&0)lm2`&VV9egUDx6a9z&^ymWe9v(Jw^k>muX@hCLYHEtyPXCyqJI9c8 z+^6ZhqI35h+XKNEo52|WdywQ%c+k^7?913^tq?iZM6@)Ec({sbK@cnn&0}SDl+e&fkIx9luYG>uPRGyM zlgR(Mcb{~LjnHC|jbt6KG=oGkIq`hqVFrnGc8tWR^dLFw`l`fhURo5UAWy$L4XxL9@KIb1jyk>K}ozIAOs)vr{swjD{M^=5Qi64 zioVi;6$t}4xD;^2;O@Ho!GT+s{00XHOE8BJ!N3YchH;7jQWZAq*hGOZ*YxRXi{|VE_xV4f7EOG$8!2 zUSU8D;tL}d0eE2d#Q+qVkDzV)w)k|3LpV4Wd042Qf$<=X@!wv#Kw}J8iDR^8Mut7P16khb=k2Pd@;O^x_C>GYADY>-y3xEa5 z0jjVgS%4G>K)U=u3487V!GMX&0SvIGm*Nc6YjKY(z<4>Ihz6s(6nkL8K8gbrFcVpT z3sxrsO1|J+OMb}!%&MJ9Q(%@Po!Sx!I48RHV zyp$*sT}tGy@fep90+MU9rRLzAtGYB8R<0B%4ky1BPfLOR!J*Kb2i8k>z3MCl9`*-G zP+y$sTJlH}OcIV1XvXwX+{k(@hDm~o;8^HQGn#i`xRPLgz_CzL;3N0t2TE9r0t6j4 zBmr8WycB!!UW@f50Pf3a(3=*x1upGNUmvryIHeH~|K~jYjbi?W&JU{Jxkk&Yf%OTJwcqOV5_p4M-T?0JUIRg% ziFbL5{*JxDEpK2E_OGxY%f$W%+zm>31BY^W?Gq%II5&W32~(E{hBYCvXGQ zdvpx~$t4l&lkD}i1L=xPVqRazF3%cx9fQTIf&Cav^V^7fuQXcb@~iIe_~QW{PA} delta 79794 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�g&w_s3fvG}|6%V&P;~gMf}n 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 diff --git a/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin.jar b/addons/thunderbird/plugin/openerp_plugin/chrome/openerp_plugin.jar index 79759155f4ac2051ff0fb1f09bbaf95ead794c1f..2ee7837623fdaaff4b6a327915d8cf104f6ef82f 100644 GIT binary patch delta 12361 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 bRk49Q_=vDAH~_#8`#FPcBdy@>mW2NU&q|n7 delta 13676 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 &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/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 5015ccbcfa9..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,10 +1,10 @@ - + - +