← Back to team overview

openerp-dev-web team mailing list archive

lp:~openerp-dev/openobject-addons/trunk-calendar-import_event-uco into lp:~openerp-dev/openobject-addons/trunk-calendar

 

Ujjvala Collins (OpenERP) has proposed merging lp:~openerp-dev/openobject-addons/trunk-calendar-import_event-uco into lp:~openerp-dev/openobject-addons/trunk-calendar.

Requested reviews:
  OpenERP R&D Team (openerp-dev)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-calendar-import_event-uco/+merge/53398

Backlog 3 : Import event
* Wizard near meeting
* For login use the module google_account
* Choose which google calendar synchronize (there is more then one calendar per user)
   Can be all
   Need an option for all calendar (or rename default to all if default is for all calendar)
       Each calendar in google calendar will create a meeting of different type
       the type of the event is the title of the calendar
          Need to create new type if not present
   Map the meeting in openerp with the meeting in google calendar with ir.model.data
       Merge if the meeting already exist : 
           the meeting already exist when the mapping in ir.model.data already exist
* Category of meeting : Add user field, 
     if user = 0 for all user
     otherwise category is defined just for the user
       When import a google calendar : create a new category for each calendar
* Check Virtual Id
     check reccurent meeting 
* Check Virtual Id
   check reccurent meeting 

-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-calendar-import_event-uco/+merge/53398
Your team OpenERP R&D Team is requested to review the proposed merge of lp:~openerp-dev/openobject-addons/trunk-calendar-import_event-uco into lp:~openerp-dev/openobject-addons/trunk-calendar.
=== modified file 'crm/crm_lead.py'
--- crm/crm_lead.py	2011-03-04 12:53:34 +0000
+++ crm/crm_lead.py	2011-03-15 10:37:28 +0000
@@ -248,7 +248,6 @@
         data_obj = self.pool.get('ir.model.data')
         value = {}
 
-        view_id = False
 
         for case in self.browse(cr, uid, ids, context=context):
             context.update({'active_id': case.id})

=== modified file 'crm/wizard/crm_lead_to_partner.py'
--- crm/wizard/crm_lead_to_partner.py	2011-03-01 11:34:15 +0000
+++ crm/wizard/crm_lead_to_partner.py	2011-03-15 10:37:28 +0000
@@ -153,7 +153,6 @@
         contact_obj = self.pool.get('res.partner.address')
         partner_ids = []
         partner_id = False
-        contact_id = False
         rec_ids = context and context.get('active_ids', [])
 
         for data in self.browse(cr, uid, ids, context=context):
@@ -164,7 +163,7 @@
                         'user_id': lead.user_id.id,
                         'comment': lead.description,
                     })
-                    contact_id = contact_obj.create(cr, uid, {
+                    contact_obj.create(cr, uid, {
                         'partner_id': partner_id,
                         'name': lead.contact_name,
                         'phone': lead.phone,
@@ -184,7 +183,6 @@
                 else:
                     if data.partner_id:
                         partner_id = data.partner_id.id
-                        contact_id = partner_obj.address_get(cr, uid, [partner_id])['default']
                 self.assign_partner(cr, uid, lead.id, partner_id)
                 partner_ids.append(partner_id)
         return partner_ids
@@ -208,7 +206,7 @@
         if context is None:
             context = {}
 
-        partner_ids = self._create_partner(cr, uid, ids, context=context)
+        self._create_partner(cr, uid, ids, context=context)
         mod_obj = self.pool.get('ir.model.data')
         result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
         res = mod_obj.read(cr, uid, result, ['res_id'])

=== modified file 'crm/wizard/crm_merge_opportunities.py'
--- crm/wizard/crm_merge_opportunities.py	2011-02-24 15:03:09 +0000
+++ crm/wizard/crm_merge_opportunities.py	2011-03-15 10:37:28 +0000
@@ -45,7 +45,6 @@
 
     def get_attachments(self, cr, uid, id, context=None):
         attach_obj = self.pool.get('ir.attachment')
-        result = []
         attach_ids = attach_obj.search(cr, uid, [('res_model' , '=', 'crm.lead'), ('res_id', '=', id)])
         return attach_ids
 
@@ -116,7 +115,7 @@
             attach_ids = self.get_attachments(cr, uid, opp, context=context)
             self.set_attachements_res_id(cr, uid, first_opportunity.id, attach_ids)
             for history in opp.message_ids:
-                new_history = message_obj.copy(cr, uid, history.id, default={'res_id': opp.id})
+                message_obj.copy(cr, uid, history.id, default={'res_id': opp.id})
 
         #Notification about loss of information
         details = []
@@ -159,8 +158,6 @@
 
 
         # Get Opportunity views
-        result = models_data._get_id(
-            cr, uid, 'crm', 'view_crm_case_opportunities_filter')
         opportunity_view_form = models_data._get_id(
             cr, uid, 'crm', 'crm_case_form_view_oppor')
         opportunity_view_tree = models_data._get_id(

=== modified file 'crm_partner_assign/wizard/crm_forward_to_partner.py'
--- crm_partner_assign/wizard/crm_forward_to_partner.py	2011-02-24 15:03:09 +0000
+++ crm_partner_assign/wizard/crm_forward_to_partner.py	2011-03-15 10:37:28 +0000
@@ -20,11 +20,9 @@
 #
 ##############################################################################
 
-import base64
 import time
 import re
 from osv import osv, fields
-import tools
 from tools.translate import _
 
 class crm_lead_forward_to_partner(osv.osv_memory):

=== added directory 'google_base_account'
=== added file 'google_base_account/__init__.py'
--- google_base_account/__init__.py	1970-01-01 00:00:00 +0000
+++ google_base_account/__init__.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+##############################################################################
+
+import google_base_account
+import wizard
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'google_base_account/__openerp__.py'
--- google_base_account/__openerp__.py	1970-01-01 00:00:00 +0000
+++ google_base_account/__openerp__.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+    'name': 'Google user',
+    'version': '1.0',
+    'category': 'Generic Modules/Others',
+    'description': """The module adds google user  in res user""",
+    'author': 'OpenERP SA',
+    'website': 'http://www.openerp.com',
+    'depends': ['base'],
+    'init_xml': [],
+    'update_xml': [
+                  'google_base_account_view.xml',
+                  'wizard/google_login_view.xml',
+                   ],
+    'demo_xml': [],
+    'installable': True,
+    'active': False,
+    'certificate': '',
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'google_base_account/google_base_account.py'
--- google_base_account/google_base_account.py	1970-01-01 00:00:00 +0000
+++ google_base_account/google_base_account.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields,osv
+    
+class res_users(osv.osv):
+    _inherit = "res.users"
+    _columns = {
+        'gmail_user': fields.char('Username', size=64,),
+        'gmail_password': fields.char('Password', size=64),
+    }
+res_users()    
+
+# vim:expandtab:smartindent:toabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'google_base_account/google_base_account_view.xml'
--- google_base_account/google_base_account_view.xml	1970-01-01 00:00:00 +0000
+++ google_base_account/google_base_account_view.xml	2011-03-15 10:37:28 +0000
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+		<record id="view_users_gogole_form" model="ir.ui.view">
+        <field name="name">res.users.google.form1</field>
+          <field name="model">res.users</field>
+          <field name="type">form</field>
+          <field name="inherit_id" ref="base.view_users_form"/>
+          <field name="arch" type="xml">
+              <xpath expr="//notebook[last()]" position="inside">
+                     <page string=" Synchronization ">
+                     	<separator string="Google Account" colspan="4" />
+						<field name="gmail_user"/>
+                      <field name="gmail_password" password="True"/>
+					</page>
+              </xpath>
+          </field>
+     </record>
+    </data>
+</openerp>

=== added directory 'google_base_account/wizard'
=== added file 'google_base_account/wizard/__init__.py'
--- google_base_account/wizard/__init__.py	1970-01-01 00:00:00 +0000
+++ google_base_account/wizard/__init__.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+##############################################################################
+
+import google_login
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'google_base_account/wizard/google_login.py'
--- google_base_account/wizard/google_login.py	1970-01-01 00:00:00 +0000
+++ google_base_account/wizard/google_login.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields,osv
+from tools.translate import _
+try:
+    import gdata.contacts.service
+except ImportError:
+    raise osv.except_osv(_('Google Contacts Import Error!'), _('Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list'))
+
+class google_login(osv.osv_memory):
+    _description ='Google Contact'
+    _name = 'google.login'
+    _columns = {
+        'user': fields.char('Username', size=64, required=True),
+        'password': fields.char('Password', size=64),
+    }
+
+    def google_login(self,cr,uid,user,password,type='',context=None):
+        gd_client=False
+        if type == 'group': 
+            gd_client = gdata.contacts.client.ContactsClient(source='OpenERP')
+        if type == 'contact' :   
+            gd_client = gdata.contacts.service.ContactsService()
+        if type == 'calendar':
+            gd_client = gdata.calendar.service.CalendarService()
+        try:    
+            gd_client.ClientLogin(user, password,gd_client.source)
+        except Exception, e:
+            raise osv.except_osv(_('Error'), _(e))            
+        return gd_client
+
+
+    def default_get(self, cr, uid, fields, context=None):
+        res = super(google_login, self).default_get(cr, uid, fields, context=context)
+        user_obj = self.pool.get('res.users').browse(cr, uid, uid)
+        if 'user' in fields:
+            res.update({'user': user_obj.gmail_user})
+        if 'password' in fields:
+            res.update({'password': user_obj.gmail_password})
+        return res
+
+    def check_login(self, cr, uid, ids, context=None):
+        if context == None:
+            context = {}
+        data = self.read(cr, uid, ids)[0]
+        user = data['user']
+        password = data['password']
+        gd_client = gdata.contacts.service.ContactsService()
+        gd_client.email = user
+        gd_client.password = password
+        gd_client.source = 'OpenERP'
+        try:
+            gd_client.ProgrammaticLogin()
+            res = {
+                   'gmail_user': user,
+                   'gmail_password': password
+            }
+            self.pool.get('res.users').write(cr, uid, uid, res, context=context)
+        except :
+            raise osv.except_osv(_('Error'), _("Authentication fail check the user and password !"))
+
+        return self._get_next_action(cr, uid, context=context)
+
+    def _get_next_action(self, cr, uid, context=None):
+        return {'type': 'ir.actions.act_window_close'}
+
+google_login()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'google_base_account/wizard/google_login_view.xml'
--- google_base_account/wizard/google_login_view.xml	1970-01-01 00:00:00 +0000
+++ google_base_account/wizard/google_login_view.xml	2011-03-15 10:37:28 +0000
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+        <record model="ir.ui.view" id="view_google_login_form">
+            <field name="name">google.login.form</field>
+            <field name="model">google.login</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Google login" >
+                    <group colspan="4" col="4" width="300">
+                        <field name="user" />
+                        <newline/>
+                        <label string="ex: user@xxxxxxxxx" align="1.0" colspan="2"/>
+                        <newline/>
+                        <field name="password" password="True"/>
+                    </group>
+                    <separator string="" colspan="4"/>
+                    <group colspan="4" col="4">
+                        <group colspan="2"/>
+                        <group colspan="2">  
+                            <button special="cancel" string="_Cancel" icon="gtk-cancel"/>
+                            <button name="check_login" string="_Login" type="object" icon="terp-check"/>
+                        </group>
+                    </group>
+                </form>
+            </field>
+        </record>
+    </data>
+</openerp>

=== added directory 'sync_google_calendar'
=== added file 'sync_google_calendar/__init__.py'
--- sync_google_calendar/__init__.py	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/__init__.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+##############################################################################
+
+import sync_google_calendar
+import wizard
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'sync_google_calendar/__openerp__.py'
--- sync_google_calendar/__openerp__.py	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/__openerp__.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+    'name': 'Google Calendar',
+    'version': '1.0',
+    'category': 'Generic Modules/Others',
+    'description': """The module adds google calendar events to meetings.""",
+    'author': 'OpenERP SA',
+    'website': 'http://www.openerp.com',
+    'depends': ['base','google_base_account', 'crm'],
+    'init_xml': [],
+    'update_xml': ['wizard/wizard_import_calendar_events_view.xml', 'sync_google_calendar_view.xml'],
+    'demo_xml': [],
+    'installable': True,
+    'active': False,
+    'certificate': '',
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'sync_google_calendar/sync_google_calendar.py'
--- sync_google_calendar/sync_google_calendar.py	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/sync_google_calendar.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import osv, fields
+
+class crm_meeting(osv.osv):
+    _inherit = "crm.meeting"
+
+    def unlink(self, cr, uid, ids, context=None):
+        model_obj = self.pool.get('ir.model.data')
+        model_ids = model_obj.search(cr, uid, [('res_id','in',ids),('model','=','crm.meeting'),('module','=','sync_google_calendar')], context=context)
+        model_obj.unlink(cr, uid, model_ids, context=context)
+        return super(crm_meeting, self).unlink(cr, uid, ids, context=context)
+
+crm_meeting()
+
+class crm_case_categ(osv.osv):
+    """ Category of Case """
+    _inherit = "crm.case.categ"
+    _columns = {
+        'user_id': fields.many2one('res.users', 'User')
+    }
+crm_case_categ()
+
+# vim:expandtab:smartindent:toabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'sync_google_calendar/sync_google_calendar_view.xml'
--- sync_google_calendar/sync_google_calendar_view.xml	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/sync_google_calendar_view.xml	2011-03-15 10:37:28 +0000
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+        <record model="ir.ui.view" id="crm_case_form_view_meet_inherit">
+	        <field name="name">CRM - Meetings Form (Inherited)</field>
+	        <field name="model">crm.meeting</field>
+	        <field name="type">form</field>
+	        <field name="inherit_id" ref="crm.crm_case_form_view_meet"/>
+	        <field name="arch" type="xml">
+		        <field name="categ_id" position="replace">
+		           <field name="categ_id" widget="selection"
+	                      string="Meeting Type" groups="base.group_extended"
+	                      domain="[('object_id.model', '=', 'crm.meeting'),('user_id','in',[uid, False])]" />
+		        </field>
+		    </field>
+        </record>
+        
+        <record model="ir.ui.view" id="crm_case_tree_view_meet_inherit">
+	        <field name="name">CRM - Meetings Tree (Inherited)</field>
+	        <field name="model">crm.meeting</field>
+	        <field name="type">tree</field>
+	        <field name="inherit_id" ref="crm.crm_case_tree_view_meet"/>
+	        <field name="arch" type="xml">
+	           <field name="categ_id" position="replace">
+                   <field name="categ_id" widget="selection"
+                          string="Meeting Type" groups="base.group_extended"
+                          domain="[('object_id.model', '=', 'crm.meeting'),('user_id','in',[uid, False])]" />
+                </field>
+	        </field>
+	    </record>
+    </data>
+</openerp>
\ No newline at end of file

=== added directory 'sync_google_calendar/wizard'
=== added file 'sync_google_calendar/wizard/__init__.py'
--- sync_google_calendar/wizard/__init__.py	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/wizard/__init__.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+##############################################################################
+
+import wizard_import_calendar_events
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'sync_google_calendar/wizard/wizard_import_calendar_events.py'
--- sync_google_calendar/wizard/wizard_import_calendar_events.py	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/wizard/wizard_import_calendar_events.py	2011-03-15 10:37:28 +0000
@@ -0,0 +1,286 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#    
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+##############################################################################
+
+from osv import fields,osv
+from tools.translate import _
+import tools
+
+import time
+import datetime
+import dateutil
+from dateutil.tz import *
+from dateutil.parser import *
+from dateutil import parser
+import re
+
+import urllib
+
+try:
+    import gdata
+    import gdata.calendar.service
+    import gdata.calendar
+except ImportError:
+    raise osv.except_osv(_('Google Contacts Import Error!'), _('Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list'))
+
+def _get_tinydates(self, stime, etime):
+    stime = dateutil.parser.parse(stime)
+    etime = dateutil.parser.parse(etime)
+    try:
+        au_dt = au_tz.normalize(stime.astimezone(au_tz))
+        timestring = datetime.datetime(*au_dt.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S')
+        au_dt = au_tz.normalize(etime.astimezone(au_tz))
+        timestring_end = datetime.datetime(*au_dt.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S')
+    except:
+        timestring = datetime.datetime(*stime.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S')
+        timestring_end = datetime.datetime(*etime.timetuple()[:6]).strftime('%Y-%m-%d %H:%M:%S')
+    return (timestring, timestring_end)
+
+def _get_rules(self, datas):
+    new_val = {}
+    if  datas['FREQ'] == 'WEEKLY' and datas.get('BYDAY'):
+        for day in datas['BYDAY'].split(','):
+            new_val[day.lower()] = True
+        datas.pop('BYDAY')
+
+    if datas.get('UNTIL'):
+        until = parser.parse(''.join((re.compile('\d')).findall(datas.get('UNTIL'))))
+        new_val['end_date'] = until.strftime('%Y-%m-%d')
+        new_val['end_type'] = 'end_date'
+        datas.pop('UNTIL')
+
+    if datas.get('COUNT'):
+        new_val['count'] = datas.get('COUNT')
+        new_val['end_type'] = 'count'
+        datas.pop('COUNT')
+        
+    if datas.get('INTERVAL'):
+        new_val['interval'] = datas.get('INTERVAL')
+        datas.pop('INTERVAL') 
+
+    if datas.get('BYMONTHDAY'):
+        new_val['day'] = datas.get('BYMONTHDAY')
+        datas.pop('BYMONTHDAY')
+        new_val['select1'] = 'date'
+
+    if datas.get('BYDAY'):
+        d = datas.get('BYDAY')
+        if '-' in d:
+            new_val['byday'] = d[:2]
+            new_val['week_list'] = d[2:4].upper()
+        else:
+            new_val['byday'] = d[:1]
+            new_val['week_list'] = d[1:3].upper()
+        new_val['select1'] = 'day'
+
+    if datas.get('BYMONTH'):
+        new_val['month_list'] = datas.get('BYMONTH')
+        datas.pop('bymonth')
+    return new_val
+
+def _get_repeat_status(self, str_google):
+    rrule = str_google[str_google.find('FREQ'):str_google.find('\nBEGIN')]
+    status = {}
+    for rule in rrule.split(';'):
+        status[rule.split('=')[0]] = rule.split('=')[-1:] and rule.split('=')[-1:][0] or ''
+    rules = _get_rules(self, status)
+    if status.get('FREQ') == 'WEEKLY':
+        status.update({'rrule_type': 'weekly'})
+        status.pop('FREQ')
+    elif status.get('FREQ') == 'DAILY':
+        status.update({'rrule_type': 'daily'})
+        status.pop('FREQ')
+    elif status.get('FREQ') == 'MONTHLY':
+        status.update({'rrule_type': 'monthly'})
+        status.pop('FREQ')
+    elif status.get('FREQ') == 'YEARLY':
+        status.update({'rrule_type': 'yearly'})
+        status.pop('FREQ')
+    status.update(rules)
+    return status
+
+def _get_repeat_dates(self, x):
+    if x[3].startswith('BY'):
+        zone_time = x[4].split('+')[-1:][0].split(':')[0][:4]
+    else:
+        zone_time = x[3].split('+')[-1:][0].split(':')[0][:4]
+    tz_format = zone_time[:2]+':'+zone_time[2:]
+    repeat_start = x[1].split('\n')[0].split(':')[1]
+    repeat_end = x[2].split('\n')[0].split(':')[1]
+    o = repeat_start.split('T')
+    repeat_start = str(o[0][:4]) + '-' + str(o[0][4:6]) + '-' + str(o[0][6:8])
+    if len(o) == 2:
+        repeat_start += ' ' + str(o[1][:2]) + ':' + str(o[1][2:4]) + ':' + str(o[1][4:6])
+    else:
+        repeat_start += ' ' + '00' + ':' + '00' + ':' + '00'
+    p = repeat_end.split('T')
+    repeat_end = str(p[0][:4]) + '-' + str(p[0][4:6]) + '-' + str(p[0][6:8])
+    if len(p) == 2:
+        repeat_end += ' ' + str(p[1][:2]) + ':' + str(p[1][2:4]) + ':' + str(p[1][4:6])
+    else:
+        repeat_end += ' ' + '00' + ':' + '00' + ':' + '00'
+    return (repeat_start, repeat_end, tz_format)
+
+class google_login(osv.osv_memory):
+    _inherit = 'google.login'
+    _name = 'google.login'
+
+    def _get_next_action(self, cr, uid, context=None):
+        data_obj = self.pool.get('ir.model.data')
+        data_id = data_obj._get_id(cr, uid, 'sync_google_calendar', 'view_synchronize_google_calendar_import_form')
+        view_id = False
+        if data_id:
+            view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
+        value = {
+            'name': _('Import Events'),
+            'view_type': 'form',
+            'view_mode': 'form,tree',
+            'res_model': 'synchronize.google.calendar',
+            'view_id': False,
+            'context': context,
+            'views': [(view_id, 'form')],
+            'type': 'ir.actions.act_window',
+            'target': 'new',
+        }
+        return value
+
+google_login()
+
+class synchronize_google_calendar_events(osv.osv_memory):
+    _name = 'synchronize.google.calendar'
+    
+    def _get_calendars(self, cr, uid, context=None):
+        user_obj = self.pool.get('res.users').browse(cr, uid, uid)
+        google = self.pool.get('google.login')
+        res = []
+        gd_client = google.google_login(cr, uid, user_obj.gmail_user, user_obj.gmail_password, type='calendar')
+        calendars = gd_client.GetAllCalendarsFeed()
+        for cal in calendars.entry:
+            res.append((cal.id.text, cal.title.text))
+        res.append(('all','All Calendars'))
+        return res
+    
+    _columns = {
+        'calendar_name': fields.selection(_get_calendars, "Calendar Name", size=32),
+    }
+    
+    _defaults = {
+        'calendar_name': 'all',
+    }
+    
+    def get_events(self, cr, uid, event_feed, context=None):
+        meeting_obj = self.pool.get('crm.meeting')
+        categ_obj = self.pool.get('crm.case.categ')
+        model_obj = self.pool.get('ir.model.data')
+        object_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'crm.meeting')])
+        meeting_ids = []
+        categ_id = categ_obj.search(cr, uid, [('name','=',event_feed.title.text),('object_id','=',object_id and object_id[0]),('user_id','=',uid)])
+        if not categ_id:
+            categ_id.append(categ_obj.create(cr, uid, {'name': event_feed.title.text, 
+                                                       'object_id': object_id and object_id[0],
+                                                       'user_id': uid }))
+        for feed in event_feed.entry:
+            google_id = feed.id.text
+            model_data = {
+                'name': google_id,
+                'model': 'crm.meeting',
+                'module': 'sync_google_calendar',
+                'noupdate': True
+            }
+            vals = {
+                'name': feed.title.text,
+                'description': feed.content.text,
+                'categ_id': categ_id and categ_id[0]
+            }
+            if feed.when:
+                timestring, timestring_end = _get_tinydates(self, feed.when[0].start_time, feed.when[0].end_time)
+            else:
+                x = feed.recurrence.text.split(';')
+                repeat_status = _get_repeat_status(self, feed.recurrence.text)
+                repeat_start, repeat_end, zone_time = _get_repeat_dates(self, x)
+                timestring = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(repeat_start, "%Y-%m-%d %H:%M:%S"))
+                timestring_end = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(repeat_end, "%Y-%m-%d %H:%M:%S"))
+                if repeat_status:
+                    repeat_status.update({'recurrency': True})
+                    vals.update(repeat_status)
+
+            vals.update({'date': timestring, 'date_deadline': timestring_end})
+            data_ids = model_obj.search(cr, uid, [('model','=','crm.meeting'), ('name','=',google_id)])
+            if data_ids:
+                res_id = model_obj.browse(cr, uid, data_ids[0], context=context).res_id
+                meeting_ids.append(res_id)
+                meeting_obj.write(cr, uid, [res_id], vals, context=context)
+            else:
+                res_id = meeting_obj.create(cr, uid, vals, context=context)
+                meeting_ids.append(res_id)
+                model_data.update({'res_id': res_id})
+                model_obj.create(cr, uid, model_data, context=context)
+        return meeting_ids
+    
+    def import_calendar_events(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids, context=context)[0]
+        if not ids:
+            return { 'type': 'ir.actions.act_window_close' }
+
+        user_obj = self.pool.get('res.users').browse(cr, uid, uid)
+        gmail_user = user_obj.gmail_user
+        gamil_pwd = user_obj.gmail_password
+        
+        google = self.pool.get('google.login')
+        gd_client = google.google_login(cr, uid, gmail_user, gamil_pwd, type='calendar')
+
+        if not gmail_user or not gamil_pwd:
+            raise osv.except_osv(_('Error'), _("Please specify the user and password !"))
+        
+        meetings = []
+        if obj.calendar_name != 'all':
+            events_query = gdata.calendar.service.CalendarEventQuery(user=urllib.unquote(obj.calendar_name.split('/')[~0]))
+            events_query.start_index = 1
+            events_query.max_results = 1000
+            event_feed = gd_client.GetCalendarEventFeed(events_query.ToUri())
+            meetings.append(self.get_events(cr, uid, event_feed, context=context))
+        else:
+            calendars = map(lambda x:x[0], [cal for cal in self._get_calendars(cr, uid, context) if cal[0] != 'all'])
+            for cal in calendars:
+                events_query = gdata.calendar.service.CalendarEventQuery(user=urllib.unquote(cal.split('/')[~0]))
+                events_query.start_index = 1
+                events_query.max_results = 1000
+                event_feed = gd_client.GetCalendarEventFeed(events_query.ToUri())
+                meetings.append(self.get_events(cr, uid, event_feed, context=context))
+        
+        meeting_ids = []
+        for meeting in meetings:
+            meeting_ids += meeting
+        
+        return {
+            'name': _('Meetings'),
+            'domain': "[('id','in', ["+','.join(map(str,meeting_ids))+"])]",
+            'view_type': 'form',
+            'view_mode': 'tree,form',
+            'res_model': 'crm.meeting',
+            'context': context,
+            'views': [(False, 'calendar'),(False, 'tree'),(False, 'form')],
+            'type': 'ir.actions.act_window',
+        }
+        
+synchronize_google_calendar_events()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+

=== added file 'sync_google_calendar/wizard/wizard_import_calendar_events_view.xml'
--- sync_google_calendar/wizard/wizard_import_calendar_events_view.xml	1970-01-01 00:00:00 +0000
+++ sync_google_calendar/wizard/wizard_import_calendar_events_view.xml	2011-03-15 10:37:28 +0000
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+        <record model="ir.ui.view" id="view_synchronize_google_calendar_import_form">
+            <field name="name">synchronize.google.calendar.form</field>
+            <field name="model">synchronize.google.calendar</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Import Google Calendar Events">
+                    <group colspan="4" col="4">
+                       <field name="calendar_name" />
+                    </group>
+                    <separator string="" colspan="4"/>
+                    <group colspan="4" col="4">
+                        <group colspan="2" col="2"/>
+                        <group colspan="2" col="2">
+                            <button special="cancel" string="_Cancel" icon="gtk-cancel"/>
+                            <button name="import_calendar_events" string="_Import Events" type="object" icon="terp-calendar"/>
+                        </group>
+                    </group>
+                </form>
+            </field>
+        </record>
+        
+        
+        <!-- 
+            Login Action 
+        -->
+        <record model="ir.actions.act_window" id="act_google_login_form">
+          <field name="name">Import google calendar events</field>
+          <field name="type">ir.actions.act_window</field>
+          <field name="res_model">google.login</field>
+          <field name="view_type">form</field>
+          <field name="view_mode">form</field>
+          <field name="target">new</field>
+          <field name="view_id" ref="google_base_account.view_google_login_form" />
+        </record>
+
+
+        <menuitem id="menu_sync_contact"
+                  parent="crm.menu_meeting_sale" 
+                  action="act_google_login_form"
+                  sequence="20" />
+    </data>
+</openerp>


Follow ups