# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (). # # 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 . # ############################################################################## from openerp import models, fields, _ from openerp import exceptions # , fields, api, _ import difflib class document_page(models.Model): _name = "document.page" _description = "Document Page" _order = 'name' name = fields.Char('Title', required=True) type = fields.Selection( [('content', 'Content'), ('category', 'Category')], 'Type', help="Page type", default="content" ) parent_id = fields.Many2one( 'document.page', 'Category', domain=[('type', '=', 'category')] ) child_ids = fields.One2many( 'document.page', 'parent_id', 'Children' ) content = fields.Text( "Content" ) display_content = fields.Text( string='Displayed Content', compute='_get_display_content' ) history_ids = fields.One2many( 'document.page.history', 'page_id', 'History' ) menu_id = fields.Many2one( 'ir.ui.menu', "Menu", readonly=True ) create_date = fields.Datetime( "Created on", select=True, readonly=True ) create_uid = fields.Many2one( 'res.users', 'Author', select=True, readonly=True ) write_date = fields.Datetime( "Modification Date", select=True, readonly=True) write_uid = fields.Many2one( 'res.users', "Last Contributor", select=True, readonly=True ) def _get_page_index(self, page, link=True): index = [] for subpage in page.child_ids: index += ["
  • " + self._get_page_index(subpage) + "
  • "] r = '' if link: r = '%s' % (page.id, page.name) if index: r += "" return r def _get_display_content(self): for page in self: if page.type == "category": display_content = self._get_page_index(page, link=False) else: display_content = page.content page.display_content = display_content def onchange_parent_id(self, cr, uid, ids, parent_id, content, context=None): res = {} if parent_id and not content: parent = self.browse(cr, uid, parent_id, context=context) if parent.type == "category": res['value'] = { 'content': parent.content, } return res def create_history(self, cr, uid, ids, vals, context=None): for i in ids: history = self.pool.get('document.page.history') if vals.get('content'): res = { 'content': vals.get('content', ''), 'page_id': i, } history.create(cr, uid, res) def create(self, cr, uid, vals, context=None): page_id = super(document_page, self).create(cr, uid, vals, context) self.create_history(cr, uid, [page_id], vals, context) return page_id def write(self, cr, uid, ids, vals, context=None): result = super(document_page, self).write(cr, uid, ids, vals, context) self.create_history(cr, uid, ids, vals, context) return result class document_page_history(models.Model): _name = "document.page.history" _description = "Document Page History" _order = 'id DESC' _rec_name = "create_date" page_id = fields.Many2one('document.page', 'Page') summary = fields.Char('Summary', size=256, select=True) content = fields.Text("Content") create_date = fields.Datetime("Date") create_uid = fields.Many2one('res.users', "Modified By") def getDiff(self, cr, uid, v1, v2, context=None): history_pool = self.pool.get('document.page.history') text1 = history_pool.read(cr, uid, [v1], ['content'])[0]['content'] text2 = history_pool.read(cr, uid, [v2], ['content'])[0]['content'] line1 = line2 = '' if text1: line1 = text1.splitlines(1) if text2: line2 = text2.splitlines(1) if (not line1 and not line2) or (line1 == line2): raise exceptions.Warning( _('There are no changes in revisions.') ) diff = difflib.HtmlDiff() return diff.make_table(line1, line2, "Revision-%s" % (v1), "Revision-%s" % (v2), context=True)