############################################################################### # # Copyright (C) 2007-TODAY Tiny ERP Pvt Ltd. All Rights Reserved. # # $Id$ # # Developed by Tiny (http://openerp.com) and Axelor (http://axelor.com). # # The OpenERP web client is distributed under the "OpenERP Public License". # It's based on Mozilla Public License Version (MPL) 1.1 with following # restrictions: # # - All names, links and logos of Tiny, OpenERP and Axelor must be # kept as in original distribution without any changes in all software # screens, especially in start-up page and the software header, even if # the application source code has been changed or updated or code has been # added. # # - All distributions of the software must keep source code with OEPL. # # - All integrations to any other software must keep source code with OEPL. # # If you need commercial licence to remove this kind of restriction please # contact us. # # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html # ############################################################################### import re import cherrypy import wikimarkup from openobject import rpc from openobject.widgets import CSSLink from openerp.widgets import register_widget from openerp.widgets.form import Text _image = re.compile(r'img:(.*)\.(.*)', re.UNICODE) _rss = re.compile(r'rss:(.*)\.(.*)', re.UNICODE) _attach = re.compile(r'attach:(.*)\.(.*)', re.UNICODE) _internalLinks = re.compile(r'\[\[.*\]\]', re.UNICODE) _edit = re.compile(r'edit:(.*)\|(.*)', re.UNICODE) _view = re.compile(r'view:(.*)\|(.*)', re.UNICODE) class WikiParser(wikimarkup.Parser): def parse(self, text, id): text = text.replace(' ', 'n-b-s-p') text = text.replace('&', 'n-a-m-p') text = text.replace('&','&') text = text.replace('n-b-s-p', ' ') text = text.replace('n-a-m-p', '&') text = text.replace('', '
')
        text = text.replace('', '
') text = wikimarkup.to_unicode(text) text = self.strip(text) text = super(WikiParser, self).parse(text) text = self.addImage(text, id) text = self.attachDoc(text, id) text = self.recordLink(text) text = self.viewRecordLink(text) text = self.addInternalLinks(text) #TODO : already implemented but we will implement it later after releasing the 5.0 #text = self.addRss(text, id) return text def viewRecordLink(self, text): def record(path): record = path.group().replace('view:','').split("|") model = record[0] text = record[1].replace('\r','').strip() label = "View Record" if len(record) > 2: label = record[2] proxy = rpc.RPCProxy(model) ids = proxy.name_search(text, [], 'ilike', {}) if len(ids): id = ids[0][0] else: try: id = int(text) except: id = 0 return "[[/openerp/form/view?model=%s&id=%d | %s]]" % (model, id, label) bits = _view.sub(record, text) return bits def addRss(self, text, id): def addrss(path): rssurl = path.group().replace('rss:','') import rss.feedparser as feedparser data = feedparser.parse(rssurl) values = "

%s


" % (data.feed.title) values += "%s
" % (data.channel.description) for entry in data['entries']: values += "

%s


" % (entry.link, entry.title) values += "%s
" % (entry.summary) return values bits = _rss.sub(addrss, text) return bits def attachDoc(self, text, id): def document(path): file = path.group().replace('attach:','') if file.startswith('http') or file.startswith('ftp'): return "Download File" % (file) else: proxy = rpc.RPCProxy('ir.attachment') ids = proxy.search([('datas_fname','=',file.strip()), ('res_model','=','wiki.wiki'), ('res_id','=',id)]) if len(ids) > 0: return "%s" % (file, id, file) else: return """Attach : %s """ % (id, file) bits = _attach.sub(document, text) return bits def addImage(self, text, id): def image(path): file = path.group().replace('img:','') if file.startswith('http') or file.startswith('ftp'): return "" % (file) else: proxy = rpc.RPCProxy('ir.attachment') ids = proxy.search([('datas_fname','=',file.strip()), ('res_model','=','wiki.wiki'), ('res_id','=',id)]) if len(ids) > 0: return "" % (file, id) else: return """Attach : %s """ % (id, file) #"[[/attachment/?model=wiki.wiki&id=%d | Attach:%s]]" % (id, file) bits = _image.sub(image, text) return bits def recordLink(self, text): def record(path): record = path.group().replace('edit:','').split("|") model = record[0] text = record[1].replace('\r','').strip() label = "Edit Record" if len(record) > 2: label = record[2] proxy = rpc.RPCProxy(model) ids = proxy.name_search(text, [], '=', {}) if len(ids): id = ids[0][0] else: try: id = int(text) except: id = 0 return "[[/openerp/form/edit?model=%s&id=%d | %s]]" % (model, id, label) bits = _edit.sub(record, text) return bits def addInternalLinks(self, text): proxy = rpc.RPCProxy('wiki.wiki') def link(path): link = path.group().replace('[','').replace('[','').replace(']','').replace(']','').split("|") name_to_search = link[0].strip() mids = proxy.search([('name','ilike', name_to_search)]) link_str = "" if mids: if len(link) == 2: link_str = "%s" % (mids[0], link[1]) elif len(link) == 1: link_str = "%s" % (mids[0], link[0]) else: if len(link) == 2: link_str = "%s" % (link[0], link[1]) elif len(link) == 1: link_str = "%s" % (link[0]) return link_str bits = _internalLinks.sub(link, text) return bits def wiki2html(text, showToc, id): p = WikiParser(show_toc=showToc) return p.parse(text, id) class WikiWidget(Text): template = "/wiki/widgets/templates/wiki.mako" params = ["data"] css = [CSSLink("wiki", "css/wiki.css")] data = None def set_value(self, value): super(WikiWidget, self).set_value(value) if value: toc = True id = False if hasattr(cherrypy.request, 'terp_record'): params = cherrypy.request.terp_params if params._terp_model == 'wiki.wiki': proxy = rpc.RPCProxy('wiki.wiki') toc = proxy.read([params.id], ['toc'])[0]['toc'] id = params.id text = value+'\n\n' html = wiki2html(text, toc, id) self.data = html register_widget(WikiWidget, ["text_wiki"]) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: