diff options
| author | aag (OpenERP) <aag@tinyerp.co.in> | 2010-10-14 13:31:03 +0530 |
|---|---|---|
| committer | aag (OpenERP) <aag@tinyerp.co.in> | 2010-10-14 13:31:03 +0530 |
| commit | fabe3674a7a2d0da9dac1dadf4e7370abc2bbb20 (patch) | |
| tree | 3ea9201015595747a47cea94a151ff778ed50a24 /addons/base_synchro | |
| parent | 7b2e3875b1590d4efbb60b15e78503b6922bc543 (diff) | |
| parent | b7a6164e75f4c08c317ec5a64af2b8cecde62b6e (diff) | |
trunk merge
bzr revid: aag@tinyerp.co.in-20101014080103-58ysx9lo20h9kogo
Diffstat (limited to 'addons/base_synchro')
| -rw-r--r-- | addons/base_synchro/__openerp__.py | 5 | ||||
| -rwxr-xr-x | addons/base_synchro/base_synchro_obj.py | 6 | ||||
| -rwxr-xr-x | addons/base_synchro/base_synchro_view.xml | 82 | ||||
| -rw-r--r-- | addons/base_synchro/base_synchro_wizard.xml | 8 | ||||
| -rw-r--r-- | addons/base_synchro/security/ir.model.access.csv | 5 | ||||
| -rw-r--r-- | addons/base_synchro/wizard/__init__.py | 1 | ||||
| -rw-r--r-- | addons/base_synchro/wizard/base_synchro.py | 136 | ||||
| -rw-r--r-- | addons/base_synchro/wizard/base_synchro_view.xml | 51 |
8 files changed, 201 insertions, 93 deletions
diff --git a/addons/base_synchro/__openerp__.py b/addons/base_synchro/__openerp__.py index 69fcb839715..bd285821e2b 100644 --- a/addons/base_synchro/__openerp__.py +++ b/addons/base_synchro/__openerp__.py @@ -24,9 +24,12 @@ "version":"0.1", "author":"Tiny", "category":"Generic Modules/Base", + "description": """Synchronization with all objects.""", "depends":["base"], "demo_xml":[], - "update_xml":["base_synchro_wizard.xml","base_synchro_view.xml"], + "update_xml":[ "wizard/base_synchro_view.xml", + "base_synchro_view.xml", + "security/ir.model.access.csv",], "active":False, "installable":True, } diff --git a/addons/base_synchro/base_synchro_obj.py b/addons/base_synchro/base_synchro_obj.py index 5093c8f787e..64fad4cd687 100755 --- a/addons/base_synchro/base_synchro_obj.py +++ b/addons/base_synchro/base_synchro_obj.py @@ -42,7 +42,7 @@ class base_synchro_server(osv.osv): base_synchro_server()
class base_synchro_obj(osv.osv):
- '''Class to store the operations done by wizart'''
+ '''Class to store the operations done by wizard'''
_name = "base.synchro.obj"
_description = "Register Class"
_columns = {
@@ -66,6 +66,10 @@ class base_synchro_obj(osv.osv): #
# Return a list of changes: [ (date, id) ]
#
+
+ def get_ids(self, cr, uid, object, dt, domain=[], context={}):
+ return self._get_ids(cr, uid, object, dt, domain, context)
+
def _get_ids(self, cr, uid, object, dt, domain=[], context={}):
result = []
if dt:
diff --git a/addons/base_synchro/base_synchro_view.xml b/addons/base_synchro/base_synchro_view.xml index 97995106070..e35a43837fa 100755 --- a/addons/base_synchro/base_synchro_view.xml +++ b/addons/base_synchro/base_synchro_view.xml @@ -30,6 +30,37 @@ </field> </record> + <record id="ir_filters_transfer_line_form" model="ir.ui.view"> + <field name="name">base.synchro.obj.line.form</field> + <field name="model">base.synchro.obj.line</field> + <field name="type">search</field> + <field name="arch" type="xml"> + <search string="Transfered Ids Details"> + <group colspan="4" col="10"> + <field name="name"/> + <field name="obj_id"/> + </group> + <newline/> + <group expand="0" string="Group By" colspan="4"> + <filter string="Object" icon="terp-stage" domain="[]" context="{'group_by':'obj_id'}"/> + <separator orientation="vertical"/> + <filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'name'}"/> + </group> + </search> + </field> + </record> + + <!-- Filters action--> + + <record id="actions_transfer_line_form" model="ir.actions.act_window"> + <field name="name">Filters</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">base.synchro.obj.line</field> + <field name="view_type">form</field> + <field name="view_id" ref="view_transfer_line_tree"/> + <field name="search_view_id" ref="ir_filters_transfer_line_form"/> + </record> + <record id="action_base_synchro_obj_line_tree" model="ir.actions.act_window"> <field name="name">Synchronized instances</field> @@ -56,7 +87,7 @@ <field colspan="4" name="domain"/> <field name="synchronize_date"/> <newline/> - <field name="avoid_ids" colspan="4"> + <field name="avoid_ids" colspan="4" nolabel="1"> <tree string="Fields" editable="bottom"> <field name="name"/> </tree> @@ -81,6 +112,37 @@ </field> </record> + <record id="ir_filters_regclass_tree" model="ir.ui.view"> + <field name="name">base.synchro.obj.line.form</field> + <field name="model">base.synchro.obj</field> + <field name="type">search</field> + <field name="arch" type="xml"> + <search string="Synchronized objects"> + <group colspan="4" col="10"> + <field name="model_id"/> + <field name="synchronize_date"/> + </group> + <newline/> + <group expand="0" string="Group By" colspan="4"> + <filter string="Object to synchronize" icon="terp-stage" domain="[]" context="{'group_by':'model_id'}"/> + <separator orientation="vertical"/> + <filter string="Latest synchronization" icon="terp-go-month" domain="[]" context="{'group_by':'synchronize_date'}"/> + </group> + </search> + </field> + </record> + + <!-- Filters action--> + + <record id="actions_regclass_tree" model="ir.actions.act_window"> + <field name="name">Filters</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">base.synchro.obj</field> + <field name="view_type">form</field> + <field name="view_id" ref="view_regclass_tree"/> + <field name="search_view_id" ref="ir_filters_regclass_tree"/> + </record> + <record id="action_transfer_tree" model="ir.actions.act_window"> <field name="name">Synchronized objects</field> <field name="type">ir.actions.act_window</field> @@ -115,15 +177,15 @@ <field name="type">form</field> <field name="arch" type="xml"> <form string="Synchronized server"> - <field name="name" select="1"/> - <newline/> - <field name="server_url" select="2"/> - <newline/> - <field name="server_port"/> - <field name="server_db"/> - <newline/> - <field name="login" select="1"/> - <field name="password"/> + <group colspan="4" col="6"> + <field name="name"/> + <field name="login"/> + <field name="password" password="True"/> + <field name="server_url"/> + <field name="server_port"/> + <field name="server_db"/> + </group> + </form> </field> </record> diff --git a/addons/base_synchro/base_synchro_wizard.xml b/addons/base_synchro/base_synchro_wizard.xml deleted file mode 100644 index b26b3bbae2b..00000000000 --- a/addons/base_synchro/base_synchro_wizard.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<openerp> - <data> - <wizard id="wizard_cost_account_synchro" model="account.analytic.account" name="account.analytic.account.transfer" string="Synchronize objects"/> - <menuitem id="next_id_62" name="Synchronization" parent="base.menu_administration"/><menuitem action="wizard_cost_account_synchro" id="menu_wizard_cost_account_synchro" parent="base_synchro.next_id_62" type="wizard"/> - - </data> -</openerp> diff --git a/addons/base_synchro/security/ir.model.access.csv b/addons/base_synchro/security/ir.model.access.csv new file mode 100644 index 00000000000..fa0f00e8ccd --- /dev/null +++ b/addons/base_synchro/security/ir.model.access.csv @@ -0,0 +1,5 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"base_synchro_server","base.synchro.server","model_base_synchro_server","base.group_system",1,1,1,1 +" base_synchro_obj"," base.synchro.obj","model_base_synchro_obj","base.group_system",1,1,1,1 +"base_synchro_obj_avoid","base.synchro.obj.avoid","model_base_synchro_obj_avoid","base.group_system",1,1,1,1 +"base_synchro_obj_line","base.synchro.obj.line","model_base_synchro_obj_line","base.group_system",1,1,1,1 diff --git a/addons/base_synchro/wizard/__init__.py b/addons/base_synchro/wizard/__init__.py index 7ff450acd76..3deff83f9e3 100644 --- a/addons/base_synchro/wizard/__init__.py +++ b/addons/base_synchro/wizard/__init__.py @@ -19,4 +19,5 @@ # ############################################################################## import base_synchro + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_synchro/wizard/base_synchro.py b/addons/base_synchro/wizard/base_synchro.py index 3a394d4ba3b..c83ec7df0e9 100644 --- a/addons/base_synchro/wizard/base_synchro.py +++ b/addons/base_synchro/wizard/base_synchro.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +## -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution @@ -18,7 +18,6 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## -import wizard import osv from datetime import date import time @@ -27,26 +26,7 @@ import xmlrpclib import re import tools import threading - -acc_synchro_form = '''<?xml version="1.0"?> -<form string="Transfer Data To Server"> - <field name="server_url" colspan="4"/> - <newline/> - <separator string="Control" colspan="4"/> - <field name="user_id"/> - <newline/> -</form>''' - -acc_synchro_fields = { - 'server_url': {'string':'Server URL', 'type':'many2one', 'relation':'base.synchro.server','required':True}, - 'user_id': {'string':'Send Result To', 'type':'many2one', 'relation':'res.users', 'default': lambda uid,data,state: uid}, -} - -finish_form ='''<?xml version="1.0"?> -<form string="Synchronization Complited!"> - <label string="The synchronisation has been started.\nYou will receive a request when it's done." colspan="4"/> -</form> -''' +from osv import osv, fields class RPCProxyOne(object): def __init__(self, server, ressource): @@ -66,13 +46,26 @@ class RPCProxy(object): def get(self, ressource): return RPCProxyOne(self.server, ressource) -class wizard_cost_account_synchro(wizard.interface): +class base_synchro(osv.osv_memory): + """Base Synchronization """ + _name = 'base.synchro' + + _columns = { + 'server_url': fields.many2one('base.synchro.server', "Server URL", required=True), + 'user_id': fields.many2one('res.users', "Send Result To",), + } + + _defaults = { + 'user_id': lambda self,cr,uid,context: uid, + } + start_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss') report = [] report_total = 0 report_create = 0 report_write = 0 - def _synchronize(self, cr, uid, server, object, context): + + def synchronize(self, cr, uid, server, object, context): pool = pooler.get_pool(cr.dbname) self.meta = {} ids = [] @@ -80,14 +73,14 @@ class wizard_cost_account_synchro(wizard.interface): pool2 = pool #try: if object.action in ('d','b'): - ids = pool1.get('base.synchro.obj')._get_ids(cr, uid, + ids = pool1.get('base.synchro.obj').get_ids(cr, uid, object.model_id.model, object.synchronize_date, eval(object.domain), {'action':'d'} ) if object.action in ('u','b'): - ids += pool2.get('base.synchro.obj')._get_ids(cr, uid, + ids += pool2.get('base.synchro.obj').get_ids(cr, uid, object.model_id.model, object.synchronize_date, eval(object.domain), @@ -109,7 +102,7 @@ class wizard_cost_account_synchro(wizard.interface): if object.model_id.model=='crm.case.history': fields = ['email','description','log_id'] value = pool_src.get(object.model_id.model).read(cr, uid, [id], fields)[0] - value = self._data_transform(cr, uid, pool_src, pool_dest, object.model_id.model, value, action) + value = self.data_transform(cr, uid, pool_src, pool_dest, object.model_id.model, value, action) id2 = self.get_id(cr, uid, object.id, id, action, context) # # Transform value @@ -133,7 +126,7 @@ class wizard_cost_account_synchro(wizard.interface): else: print value idnew = pool_dest.get(object.model_id.model).create(cr, uid, value) - synid = pool.get('base.synchro.obj.line').create(cr, uid, { + synid = self.pool.get('base.synchro.obj.line').create(cr, uid, { 'obj_id': object.id, 'local_id': (action=='u') and id or idnew, 'remote_id': (action=='d') and id or idnew @@ -141,25 +134,20 @@ class wizard_cost_account_synchro(wizard.interface): self.report_total+=1 self.report_create+=1 self.meta = {} - return 'finish' + return True - # - # IN: object and ID - # OUT: ID of the remote object computed: - # If object is synchronised, read the sync database - # Otherwise, use the name_search method - # def get_id(self, cr, uid, object_id, id, action, context={}): pool = pooler.get_pool(cr.dbname) + line_pool = pool.get('base.synchro.obj.line') field_src = (action=='u') and 'local_id' or 'remote_id' field_dest = (action=='d') and 'local_id' or 'remote_id' - rid = pool.get('base.synchro.obj.line').search(cr, uid, [('obj_id','=',object_id), (field_src,'=',id)], context=context) + rid = line_pool.search(cr, uid, [('obj_id','=',object_id), (field_src,'=',id)], context=context) result = False if rid: - result = pool.get('base.synchro.obj.line').read(cr, uid, rid, [field_dest], context=context)[0][field_dest] + result = line_pool.read(cr, uid, rid, [field_dest], context=context)[0][field_dest] return result - def _relation_transform(self, cr, uid, pool_src, pool_dest, object, id, action, context={}): + def relation_transform(self, cr, uid, pool_src, pool_dest, object, id, action, context={}): if not id: return False pool = pooler.get_pool(cr.dbname) @@ -186,7 +174,14 @@ class wizard_cost_account_synchro(wizard.interface): print self.report.append('WARNING: Record "%s" on relation %s not found, set to null.' % (names,object)) return result - def _data_transform(self, cr, uid, pool_src, pool_dest, object, data, action='u', context={}): + # + # IN: object and ID + # OUT: ID of the remote object computed: + # If object is synchronised, read the sync database + # Otherwise, use the name_search method + # + + def data_transform(self, cr, uid, pool_src, pool_dest, object, data, action='u', context={}): self.meta.setdefault(pool_src, {}) if not object in self.meta[pool_src]: self.meta[pool_src][object] = pool_src.get(object).fields_get(cr, uid, context) @@ -201,12 +196,12 @@ class wizard_cost_account_synchro(wizard.interface): del data[f] elif ftype == 'many2one': if data[f]: - df = self._relation_transform(cr, uid, pool_src, pool_dest, fields[f]['relation'], data[f][0], action, context) + df = self.relation_transform(cr, uid, pool_src, pool_dest, fields[f]['relation'], data[f][0], action, context) data[f] = df if not data[f]: del data[f] elif ftype == 'many2many': - res = map(lambda x: self._relation_transform(cr, uid, pool_src, pool_dest, fields[f]['relation'], x, action, context), data[f]) + res = map(lambda x: self.relation_transform(cr, uid, pool_src, pool_dest, fields[f]['relation'], x, action, context), data[f]) data[f] = [(6, 0, res)] del data['id'] return data @@ -215,21 +210,22 @@ class wizard_cost_account_synchro(wizard.interface): # Find all objects that are created or modified after the synchronize_date # Synchronize these obejcts # - def _upload_download(self, db_name, uid, data, context): - cr = pooler.get_db(db_name).cursor() + + + def upload_download(self, cr, uid, ids, context): start_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss') + syn_obj = self.browse(cr, uid, ids)[0] pool = pooler.get_pool(cr.dbname) - server = pool.get('base.synchro.server').browse(cr, uid, data['form']['server_url'], context) + server = pool.get('base.synchro.server').browse(cr, uid, ids, context)[0] for object in server.obj_ids: dt = time.strftime('%Y-%m-%d %H:%M:%S') - self._synchronize(cr, uid, server, object, context) + self.synchronize(cr, uid, server, object, context) if object.action=='b': time.sleep(1) dt = time.strftime('%Y-%m-%d %H:%M:%S') - pool.get('base.synchro.obj').write(cr, uid, [object.id], {'synchronize_date': dt}) - cr.commit() + self.pool.get('base.synchro.obj').write(cr, uid, [object.id], {'synchronize_date': dt}) end_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss') - if 'user_id' in data['form'] and data['form']['user_id']: + if 'user_id' in syn_obj.user_id: request = pooler.get_pool(cr.dbname).get('res.request') if not self.report: self.report.append('No exception.') @@ -248,32 +244,26 @@ Exceptions: request.create(cr, uid, { 'name' : "Synchronization report", 'act_from' : uid, - 'act_to' : data['form']['user_id'], + 'act_to' : syn_obj.user_id, 'body': summary, }) - cr.commit() - cr.close() - return 'finish' + return True - def _upload_download_multi_thread(self, cr, uid, data, context): - threaded_synchronization = threading.Thread(target=self._upload_download, args=(cr.dbname, uid, data, context)) - threaded_synchronization.start() - return 'finish' - - states = { - 'init': { - 'actions': [], - 'result': {'type':'form', 'arch':acc_synchro_form, 'fields':acc_synchro_fields, 'state':[('end','Cancel'),('upload_download','Synchronize')]} - }, - 'upload_download': { - 'actions': [], - 'result':{'type':'choice', 'next_state': _upload_download_multi_thread} - }, - 'finish': { - 'actions': [], - 'result':{'type':'form', 'arch':finish_form,'fields':{},'state':[('end','Ok')]} - }, - } -wizard_cost_account_synchro('account.analytic.account.transfer') + def upload_download_multi_thread(self, cr, uid, data, context): + threaded_synchronization = threading.Thread(target=self.upload_download, args=(cr, uid, data, context)) + threaded_synchronization.run() + data_obj = self.pool.get('ir.model.data') + id2 = data_obj._get_id(cr, uid, 'base_synchro', 'view_base_synchro_finish') + if id2: + id2 = data_obj.browse(cr, uid, id2, context=context).res_id + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'base.synchro', + 'views': [(id2, 'form')], + 'view_id': False, + 'type': 'ir.actions.act_window', + 'target': 'new', + } +base_synchro() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/base_synchro/wizard/base_synchro_view.xml b/addons/base_synchro/wizard/base_synchro_view.xml new file mode 100644 index 00000000000..291e2c4385e --- /dev/null +++ b/addons/base_synchro/wizard/base_synchro_view.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + + <record id="view_base_synchro" model="ir.ui.view"> + <field name="name">Base Synchronization</field> + <field name="model">base.synchro</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="Transfer Data To Server"> + <field name="server_url" colspan="4"/> + <field name="user_id" default="uid"/> + <newline/> + <separator string="" colspan="4"/> + <button special="cancel" string="_Close" icon="gtk-cancel"/> + <button name="upload_download_multi_thread" string="_Synchronize" type="object" icon="gtk-ok"/> + </form> + </field> + </record> + + <record id="action_view_base_synchro" model="ir.actions.act_window"> + <field name="name">Base Synchronization</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">base.synchro</field> + <field name="view_type">form</field> + <field name="view_mode">form</field> + <field name="target">new</field> + </record> + + <menuitem id="next_id_62" name="Synchronization" parent="base.menu_administration"/> + <record id="view_base_synchro_finish" model="ir.ui.view"> + <field name="name">Base Synchronization</field> + <field name="model">base.synchro</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="Synchronization Complited!"> + <label string="The synchronisation has been started.You will receive a request when it's done." colspan="4"/> + <separator string="" colspan="4"/> + <button special="cancel" string="OK" icon="gtk-ok"/> + </form> + </field> + </record> + + <menuitem id="next_id_62" name="Synchronization" parent="base.menu_administration"/> + + <menuitem parent="base_synchro.next_id_62" name="Synchronize objects" + action="action_view_base_synchro" + id="menu_action_view_base_synchro" /> + </data> +</openerp> |
