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