##############################################################################
#
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id$
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
##############################################################################

from osv import fields,osv
from lxml import etree
import tools
import netsvc
import os

def _check_xml(self, cr, uid, ids, context={}):
	for view in self.browse(cr, uid, ids, context):
		eview = etree.fromstring(view.arch)
		frng = tools.file_open(os.path.join('base','rng',view.type+'.rng'))
		relaxng = etree.RelaxNG(file=frng)
		if not relaxng.validate(eview):
			logger = netsvc.Logger()
			logger.notifyChannel('init', netsvc.LOG_ERROR, 'The view do not fit the required schema !')
			logger.notifyChannel('init', netsvc.LOG_ERROR, relaxng.error_log.last_error)
			print view.arch
			return False
	return True

class view(osv.osv):
	_name = 'ir.ui.view'
	_columns = {
		'name': fields.char('View Name',size=64,  required=True),
		'model': fields.char('Model', size=64, required=True),
		'priority': fields.integer('Priority', required=True),
		'type': fields.selection((
			('tree','Tree'),
			('form','Form'),
			('graph', 'Graph'),
			('calendar', 'Calendar')), 'View Type', required=True),
		'arch': fields.text('View Architecture', required=True),
		'inherit_id': fields.many2one('ir.ui.view', 'Inherited View'),
		'field_parent': fields.char('Childs Field',size=64),
	}
	_defaults = {
		'arch': lambda *a: '<?xml version="1.0"?>\n<tree title="Unknwown">\n\t<field name="name"/>\n</tree>',
		'priority': lambda *a: 16
	}
	_order = "priority"
	_constraints = [
		(_check_xml, 'Invalid XML for View Architecture!', ['arch'])
	]

view()

class UserView(osv.osv):
	_name = 'ir.ui.view.user'
	_columns = {
		'name': fields.char('View Name',size=64,  required=True),
		'model': fields.char('Model', size=64, required=True),
		'priority': fields.integer('Priority', required=True),
		'type': fields.selection((
			('tree','Tree'),
			('form','Form'),
			('graph', 'Graph'),
			('calendar', 'Calendar')), 'View Type', required=True),
		'arch': fields.text('View Architecture', required=True),
		'inherit_id': fields.many2one('ir.ui.view', 'Inherited View'),
		'field_parent': fields.char('Childs Field',size=64),
		'user_id': fields.many2one('res.users', 'User'),
		'ref_id': fields.many2one('ir.ui.view', 'Inherited View'),
	}
	_defaults = {
		'arch': lambda *a: '<?xml version="1.0"?>\n<tree title="Unknwown">\n\t<field name="name"/>\n</tree>',
		'priority': lambda *a: 16
	}
	_order = "priority"
	_constraints = [
		(_check_xml, 'Invalid XML for View Architecture!', ['arch'])
	]

UserView()

class view_sc(osv.osv):
	_name = 'ir.ui.view_sc'
	_columns = {
		'name': fields.char('Shortcut Name', size=64, required=True),
		'res_id': fields.integer('Resource Ref.', required=True),
		'sequence': fields.integer('Sequence'),
		'user_id': fields.many2one('res.users', 'User Ref.', required=True, ondelete='cascade'),
		'resource': fields.char('Resource Name', size=64, required=True)
	}
	def create(self, cr, uid, vals, context=None):
		id=self.pool.get('ir.values').search(cr,uid,[('res_id','=',vals['res_id'])])
		if len(id):
			return super(view_sc, self).create(cr, uid, vals, context=context)
		else:
			raise osv.except_osv('Note !','You can not add root node as shortcut !')

	def get_sc(self, cr, uid, user_id, model='ir.ui.menu', context={}):
		ids = self.search(cr, uid, [('user_id','=',user_id),('resource','=',model)], context=context)
		return self.read(cr, uid, ids, ['res_id','name'], context=context)

	_order = 'sequence'
	_defaults = {
		'resource': lambda *a: 'ir.ui.menu',
	}
view_sc()

@@ -3867,46 +3867,64 @@
 lds.
-integer('Resource Ref.', required=True
+many2one('ir.values','Resource Ref.', ondelete='cascade'
 ),%0A%09
@@ -4128,303 +4128,8 @@
 )%0A%09%7D
-%0A%09def create(self, cr, uid, vals, context=None):%0A%09%09id=self.pool.get('ir.values').search(cr,uid,%5B('res_id','=',vals%5B'res_id'%5D)%5D)%0A%09%09if len(id):%0A%09%09%09return super(view_sc, self).create(cr, uid, vals, context=context)%0A%09%09else:%0A%09%09%09raise osv.except_osv('Note !','You can not add root node as shortcut !')
 %0A%0A%09d
@@ -4397,16 +4397,16 @@
 lts = %7B%0A
-
 %09%09'resou
@@ -4436,16 +4436,64 @@
 .menu',%0A
+%09%09'user_id': lambda obj, cr, uid, context: uid,%0A
 %09%7D%0Aview_

allow the creation of fake shortcuts