[IMP] jQuery deferred API changes refactoring. Changed 'then's in 'done'/'fail' and...
[odoo/odoo.git] / addons / pad / pad.py
1 # -*- coding: utf-8 -*-
2 from osv import fields, osv
3 import random
4 import re
5 import string
6 import urllib2
7 from tools.translate import _
8 from openerp.tools.misc import html2plaintext
9 from py_etherpad import EtherpadLiteClient
10
11 class pad_common(osv.osv_memory):
12     _name = 'pad.common'
13
14     def pad_generate_url(self, cr, uid, context=None):
15         company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id;
16
17         pad = {
18             "server" : company.pad_server,
19             "key" : company.pad_key or "4DxmsNIbnQUVQMW9S9tx2oLOSjFdrx1l",
20         }
21
22         # make sure pad server in the form of http://hostname
23         if not pad["server"]:
24             return ''
25         if not pad["server"].startswith('http'):
26             pad["server"] = 'http://' + pad["server"]
27         pad["server"] = pad["server"].rstrip('/')
28         # generate a salt
29         s = string.ascii_uppercase + string.digits
30         salt = ''.join([s[random.randint(0, len(s) - 1)] for i in range(10)])
31         #path
32         path = '%s-%s-%s' % (cr.dbname.replace('_','-'), self._name, salt)
33         # contruct the url
34         url = '%s/p/%s' % (pad["server"], path)
35
36         #if create with content
37         if "field_name" in context and "model" in context and "object_id" in context:
38             myPad = EtherpadLiteClient( pad["key"], pad["server"]+'/api')
39             myPad.createPad(path)
40
41             #get attr on the field model
42             model = self.pool.get(context["model"])
43             field = model._all_columns[context['field_name']]
44             real_field = field.column.pad_content_field
45
46             #get content of the real field
47             for record in model.browse(cr, uid, [context["object_id"]]):
48                 if record[real_field]:
49                     myPad.setText(path, html2plaintext(record[real_field]))
50                     #Etherpad for html not functional
51                     #myPad.setHTML(path, record[real_field])
52
53         return {
54             "server": pad["server"],
55             "path": path,
56             "url": url,
57         }
58
59     def pad_get_content(self, cr, uid, url, context=None):
60         content = ''
61         if url:
62             page = urllib2.urlopen('%s/export/html'%url).read()
63             mo = re.search('<body>(.*)</body>',page)
64             if mo:
65                 content = mo.group(1)
66         return content
67
68     # TODO
69     # reverse engineer protocol to be setHtml without using the api key
70
71     def write(self, cr, uid, ids, vals, context=None):
72         self._set_pad_value(cr, uid, vals, context)
73         return super(pad_common, self).write(cr, uid, ids, vals, context=context)
74
75     def create(self, cr, uid, vals, context=None):
76         self._set_pad_value(cr, uid, vals, context)
77         return super(pad_common, self).create(cr, uid, vals, context=context)
78
79     # Set the pad content in vals
80     def _set_pad_value(self, cr, uid, vals, context=None):
81         for k,v in vals.items():
82             field = self._all_columns[k].column
83             if hasattr(field,'pad_content_field'):
84                 vals[field.pad_content_field] = self.pad_get_content(cr, uid, v, context=context)        
85
86     def copy(self, cr, uid, id, default=None, context=None):
87         if not default:
88             default = {}
89         for k, v in self._all_columns.iteritems():
90             field = v.column
91             if hasattr(field,'pad_content_field'):
92                 pad = self.pad_generate_url(cr, uid, context)
93                 default[k] = pad['url']
94         return super(pad_common, self).copy(cr, uid, id, default, context)
95
96 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: