[MERGE]: Merge with lp:~openerp-commiter/openobject-addons/crm-improvement

bzr revid: rpa@tinyerp.com-20100317121215-l3aug6t1svdm2oh4
This commit is contained in:
rpa (Open ERP)
2010-03-17 17:42:15 +05:30
58 changed files with 1844 additions and 1289 deletions
+268 -218
View File
@@ -19,35 +19,39 @@
#
##############################################################################
from osv import fields, osv
from osv.osv import osv_pool
from tools.translate import _
import ir
import netsvc
import pooler
import string
import time, copy
import time
class audittrail_rule(osv.osv):
"""
For Auddittrail RUle
"""
_name = 'audittrail.rule'
_description = "Audittrail Rule"
_columns = {
"name": fields.char("Rule Name", size=32, required=True),
"object_id": fields.many2one('ir.model', 'Object', required=True),
"user_id": fields.many2many('res.users', 'audittail_rules_users', 'user_id', 'rule_id', 'Users'),
"log_read": fields.boolean("Log reads"),
"log_write": fields.boolean("Log writes"),
"log_unlink": fields.boolean("Log deletes"),
"log_create": fields.boolean("Log creates"),
"state": fields.selection((("draft", "Draft"), ("subscribed", "Subscribed")), "State", required=True),
"action_id":fields.many2one('ir.actions.act_window', "Action ID"),
"name": fields.char("Rule Name", size=32, required=True),
"object_id": fields.many2one('ir.model', 'Object', required=True),
"user_id": fields.many2many('res.users', 'audittail_rules_users',
'user_id', 'rule_id', 'Users'),
"log_read": fields.boolean("Log reads"),
"log_write": fields.boolean("Log writes"),
"log_unlink": fields.boolean("Log deletes"),
"log_create": fields.boolean("Log creates"),
"state": fields.selection((("draft", "Draft"),
("subscribed", "Subscribed")),
"State", required=True),
"action_id": fields.many2one('ir.actions.act_window', "Action ID"),
}
_defaults = {
'state': lambda *a: 'draft',
'log_create': lambda *a: 1,
'log_unlink': lambda *a: 1,
'log_write': lambda *a: 1,
'state': lambda *a: 'draft',
'log_create': lambda *a: 1,
'log_unlink': lambda *a: 1,
'log_write': lambda *a: 1,
}
_sql_constraints = [
@@ -56,58 +60,83 @@ class audittrail_rule(osv.osv):
__functions = {}
def subscribe(self, cr, uid, ids, *args):
"""
subscriber Rule on object and apply action on that object.
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of Auddittrail RUle’s IDs.
@return: True
"""
obj_action = self.pool.get('ir.actions.act_window')
obj_model = self.pool.get('ir.model.data')
#start Loop
for thisrule in self.browse(cr, uid, ids):
obj = self.pool.get(thisrule.object_id.model)
if not obj:
raise osv.except_osv(
_('WARNING:audittrail is not part of the pool'),
_('WARNING: audittrail is not part of the pool'),
_('Change audittrail depends -- Setting rule as DRAFT'))
self.write(cr, uid, [thisrule.id], {"state": "draft"})
val={
"name":'View Log',
"res_model":'audittrail.log',
"src_model":thisrule.object_id.model,
"domain":"[('object_id','=',"+str(thisrule.object_id.id)+"),('res_id', '=', active_id)]"
val = {
"name": 'View Log',
"res_model": 'audittrail.log',
"src_model": thisrule.object_id.model,
"domain": "[('object_id','=', " + str(thisrule.object_id.id) + "), ('res_id', '=', active_id)]"
}
id=self.pool.get('ir.actions.act_window').create(cr, uid, val)
self.write(cr, uid, [thisrule.id], {"state": "subscribed", "action_id":id})
id = obj_action.create(cr, uid, val)
self.write(cr, uid, [thisrule.id], {"state": "subscribed", "action_id": id})
keyword = 'client_action_relate'
value = 'ir.actions.act_window,'+str(id)
res=self.pool.get('ir.model.data').ir_set(cr, uid, 'action', keyword, 'View_log_'+thisrule.object_id.model, [thisrule.object_id.model], value, replace=True, isobject=True, xml_id=False)
value = 'ir.actions.act_window,' + str(id)
res = obj_model.ir_set(cr, uid, 'action', keyword, 'View_log_' + thisrule.object_id.model, [thisrule.object_id.model], value, replace=True, isobject=True, xml_id=False)
#End Loop
return True
def unsubscribe(self, cr, uid, ids, *args):
"""
unsubscribe Rule on object
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of Auddittrail RUle’s IDs.
@return: True
"""
obj_action = self.pool.get('ir.actions.act_window')
val_obj = self.pool.get('ir.values')
#start Loop
for thisrule in self.browse(cr, uid, ids):
if thisrule.id in self.__functions :
if thisrule.id in self.__functions:
for function in self.__functions[thisrule.id]:
setattr(function[0], function[1], function[2])
w_id=self.pool.get('ir.actions.act_window').search(cr, uid, [('name', '=', 'View Log'), ('res_model', '=', 'audittrail.log'), ('src_model', '=', thisrule.object_id.model)])
self.pool.get('ir.actions.act_window').unlink(cr, uid, w_id)
val_obj=self.pool.get('ir.values')
value="ir.actions.act_window"+','+str(w_id[0])
val_id=val_obj.search(cr, uid, [('model', '=', thisrule.object_id.model), ('value', '=', value)])
w_id = obj_action.search(cr, uid, [('name', '=', 'View Log'), ('res_model', '=', 'audittrail.log'), ('src_model', '=', thisrule.object_id.model)])
obj_action.unlink(cr, uid, w_id)
value = "ir.actions.act_window" + ',' + str(w_id[0])
val_id = val_obj.search(cr, uid, [('model', '=', thisrule.object_id.model), ('value', '=', value)])
if val_id:
res = ir.ir_del(cr, uid, val_id[0])
self.write(cr, uid, [thisrule.id], {"state": "draft"})
#End Loop
return True
audittrail_rule()
class audittrail_log(osv.osv):
"""
For Audittrail Log
"""
_name = 'audittrail.log'
_description = "Audittrail Log"
_columns = {
"name": fields.char("Name", size=32),
"object_id": fields.many2one('ir.model', 'Object'),
"user_id": fields.many2one('res.users', 'User'),
"method": fields.selection((('read', 'Read'), ('write', 'Write'), ('unlink', 'Delete'), ('create', 'Create')), "Method"),
"timestamp": fields.datetime("Date"),
"res_id":fields.integer('Resource Id'),
"line_ids":fields.one2many('audittrail.log.line', 'log_id', 'Log lines'),
"name": fields.char("Name", size=32),
"object_id": fields.many2one('ir.model', 'Object'),
"user_id": fields.many2one('res.users', 'User'),
"method": fields.selection((('read', 'Read'),
('write', 'Write'),
('unlink', 'Delete'),
('create', 'Create')), "Method"),
"timestamp": fields.datetime("Date"),
"res_id": fields.integer('Resource Id'),
"line_ids": fields.one2many('audittrail.log.line', 'log_id', 'Log lines'),
}
_defaults = {
"timestamp": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S")
@@ -116,235 +145,256 @@ class audittrail_log(osv.osv):
audittrail_log()
class audittrail_log_line(osv.osv):
_name='audittrail.log.line'
_columns={
'field_id': fields.many2one('ir.model.fields', 'Fields', required=True),
'log_id':fields.many2one('audittrail.log', 'Log'),
'log':fields.integer("Log ID"),
'old_value':fields.text("Old Value"),
'new_value':fields.text("New Value"),
'old_value_text':fields.text('Old value Text'),
'new_value_text':fields.text('New value Text'),
'field_description':fields.char('Field Description' , size=64),
}
"""
Audittrail Log Line.
"""
_name = 'audittrail.log.line'
_description = "Log Line"
_columns = {
'field_id': fields.many2one('ir.model.fields', 'Fields', required=True),
'log_id': fields.many2one('audittrail.log', 'Log'),
'log': fields.integer("Log ID"),
'old_value': fields.text("Old Value"),
'new_value': fields.text("New Value"),
'old_value_text': fields.text('Old value Text'),
'new_value_text': fields.text('New value Text'),
'field_description': fields.char('Field Description', size=64),
}
audittrail_log_line()
class audittrail_objects_proxy(osv_pool):
def get_value_text(self, cr, uid, field_name, values, object, context={}):
pool = pooler.get_pool(cr.dbname)
obj=pool.get(object.model)
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object.model)])
model_object=pool.get('ir.model').browse(cr, uid, obj_ids)[0]
f_id= pool.get('ir.model.fields').search(cr, uid, [('name', '=', field_name), ('model_id', '=', object.id)])
if f_id:
field=pool.get('ir.model.fields').read(cr, uid, f_id)[0]
model=field['relation']
def get_value_text(self, cr, uid, field_name, values, object, context=None):
if not context:
context = {}
pool = pooler.get_pool(cr.dbname)
f_id = pool.get('ir.model.fields').search(cr, uid, [('name', '=', field_name), ('model_id', '=', object.id)])
if f_id:
field = pool.get('ir.model.fields').read(cr, uid, f_id)[0]
model = field['relation']
if field['ttype']=='many2one':
if values:
if type(values)==tuple:
values=values[0]
val=pool.get(model).read(cr, uid, [values], [pool.get(model)._rec_name])
if len(val):
return val[0][pool.get(model)._rec_name]
elif field['ttype'] == 'many2many':
value=[]
if values:
for id in values:
val=pool.get(model).read(cr, uid, [id], [pool.get(model)._rec_name])
if len(val):
value.append(val[0][pool.get(model)._rec_name])
if field['ttype'] == 'many2one':
if values:
if type(values) == tuple:
values = values[0]
val = pool.get(model).read(cr, uid, [values], [pool.get(model)._rec_name])
if val:
return val[0][pool.get(model)._rec_name]
elif field['ttype'] == 'many2many':
value = []
if values:
for id in values:
val = pool.get(model).read(cr, uid, [id], [pool.get(model)._rec_name])
if val:
value.append(val[0][pool.get(model)._rec_name])
return value
elif field['ttype'] == 'one2many':
if values:
value = []
for id in values:
val = pool.get(model).read(cr, uid, [id], [pool.get(model)._rec_name])
if val:
value.append(val[0][pool.get(model)._rec_name])
return value
elif field['ttype'] == 'one2many':
if values:
value=[]
for id in values:
val=pool.get(model).read(cr, uid, [id], [pool.get(model)._rec_name])
if len(val):
value.append(val[0][pool.get(model)._rec_name])
return value
return values
def create_log_line(self, cr, uid, id, object, lines=[]):
pool = pooler.get_pool(cr.dbname)
obj=pool.get(object.model)
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object.model)])
model_object=pool.get('ir.model').browse(cr, uid, obj_ids)[0]
obj = pool.get(object.model)
#start Loop
for line in lines:
if obj._inherits:
inherits_ids= pool.get('ir.model').search(cr, uid, [('model', '=', obj._inherits.keys()[0])])
f_id= pool.get('ir.model.fields').search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (object.id, inherits_ids[0]))])
inherits_ids = pool.get('ir.model').search(cr, uid, [('model', '=', obj._inherits.keys()[0])])
f_id = pool.get('ir.model.fields').search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (object.id, inherits_ids[0]))])
else:
f_id= pool.get('ir.model.fields').search(cr, uid, [('name', '=', line['name']), ('model_id', '=', object.id)])
if len(f_id):
fields=pool.get('ir.model.fields').read(cr, uid, f_id)
old_value='old_value' in line and line['old_value'] or ''
new_value='new_value' in line and line['new_value'] or ''
old_value_text='old_value_text' in line and line['old_value_text'] or ''
new_value_text='new_value_text' in line and line['new_value_text'] or ''
f_id = pool.get('ir.model.fields').search(cr, uid, [('name', '=', line['name']), ('model_id', '=', object.id)])
if f_id:
fields = pool.get('ir.model.fields').read(cr, uid, f_id)
old_value = 'old_value' in line and line['old_value'] or ''
new_value = 'new_value' in line and line['new_value'] or ''
old_value_text = 'old_value_text' in line and line['old_value_text'] or ''
new_value_text = 'new_value_text' in line and line['new_value_text'] or ''
if old_value_text == new_value_text:
continue
if fields[0]['ttype']== 'many2one':
if type(old_value)==tuple:
old_value=old_value[0]
if type(new_value)==tuple:
new_value=new_value[0]
log_line_id = pool.get('audittrail.log.line').create(cr, uid, {"log_id": id, "field_id": f_id[0] , "old_value":old_value , "new_value":new_value, "old_value_text":old_value_text , "new_value_text":new_value_text, "field_description":fields[0]['field_description']})
if fields[0]['ttype'] == 'many2one':
if type(old_value) == tuple:
old_value = old_value[0]
if type(new_value) == tuple:
new_value = new_value[0]
vals = {
"log_id": id,
"field_id": f_id[0],
"old_value": old_value,
"new_value": new_value,
"old_value_text": old_value_text,
"new_value_text": new_value_text,
"field_description": fields[0]['field_description']
}
line_id = pool.get('audittrail.log.line').create(cr, uid, vals)
cr.commit()
#End Loop
return True
def log_fct(self, db, uid, object, method, fct_src, *args):
logged_uids = []
pool = pooler.get_pool(db)
cr = pooler.get_db(db).cursor()
obj=pool.get(object)
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object)])
model_object=pool.get('ir.model').browse(cr, uid, obj_ids)[0]
if method in ('create'):
res_id = fct_src(db, uid, object, method, *args)
logged_uids = []
pool = pooler.get_pool(db)
cr = pooler.get_db(db).cursor()
obj_ids = pool.get('ir.model').search(cr, uid, [('model', '=', object)])
model_object = pool.get('ir.model').browse(cr, uid, obj_ids)[0]
if method in ('create'):
res_id = fct_src(db, uid, object, method, *args)
cr.commit()
new_value = pool.get(model_object.model).read(cr, uid, [res_id], args[0].keys())[0]
if 'id' in new_value:
del new_value['id']
if not logged_uids or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
vals = {
"method": method,
"object_id": model_object.id,
"user_id": uid, "res_id": res_id,
"name": resource_name
}
id = pool.get('audittrail.log').create(cr, uid, vals)
lines = []
for field in new_value:
if new_value[field]:
line = {
'name': field,
'new_value': new_value[field],
'new_value_text': self.get_value_text(cr, uid, field, new_value[field], model_object)
}
lines.append(line)
self.create_log_line(cr, uid, id, model_object, lines)
cr.commit()
cr.close()
return res_id
if method in ('write'):
res_ids = args[0]
for res_id in res_ids:
old_values = pool.get(model_object.model).read(cr, uid, res_id, args[1].keys())
old_values_text = {}
for field in args[1].keys():
old_values_text[field] = self.get_value_text(cr, uid, field, old_values[field], model_object)
res = fct_src(db, uid, object, method, *args)
cr.commit()
new_value=pool.get(model_object.model).read(cr, uid, [res_id], args[0].keys())[0]
if 'id' in new_value:
del new_value['id']
if not len(logged_uids) or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines=[]
for field in new_value:
if new_value[field]:
line={
'name':field,
'new_value':new_value[field],
'new_value_text': self.get_value_text(cr, uid, field, new_value[field], model_object)
}
lines.append(line)
self.create_log_line(cr, uid, id, model_object, lines)
cr.commit()
cr.close()
return res_id
if method in ('write'):
res_ids=args[0]
for res_id in res_ids:
old_values=pool.get(model_object.model).read(cr, uid, res_id, args[1].keys())
old_values_text={}
for field in args[1].keys():
old_values_text[field] = self.get_value_text(cr, uid, field, old_values[field], model_object)
res =fct_src(db, uid, object, method, *args)
cr.commit()
if res:
new_values=pool.get(model_object.model).read(cr, uid, res_ids, args[1].keys())[0]
if not len(logged_uids) or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
id=pool.get('audittrail.log').create(cr, uid, {"method": method, "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines=[]
for field in args[1].keys():
if args[1].keys():
line={
'name':field,
'new_value':field in new_values and new_values[field] or '',
'old_value':field in old_values and old_values[field] or '',
'new_value_text': self.get_value_text(cr, uid, field, new_values[field], model_object),
'old_value_text':old_values_text[field]
}
lines.append(line)
cr.commit()
self.create_log_line(cr, uid, id, model_object, lines)
cr.close()
return res
if method in ('read'):
res_ids=args[0]
old_values={}
res =fct_src(db, uid, object, method, *args)
if type(res)==list:
for v in res:
old_values[v['id']]=v
else:
old_values[res['id']]=res
for res_id in old_values:
if not len(logged_uids) or uid in logged_uids:
if res:
new_values = pool.get(model_object.model).read(cr, uid, res_ids, args[1].keys())[0]
if not logged_uids or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines=[]
for field in old_values[res_id]:
if old_values[res_id][field]:
line={
'name':field,
'old_value':old_values[res_id][field],
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model_object)
}
lines.append(line)
cr.commit()
self.create_log_line(cr, uid, id, model_object, lines)
cr.close()
return res
if method in ('unlink'):
res_ids=args[0]
old_values={}
for res_id in res_ids:
old_values[res_id]=pool.get(model_object.model).read(cr, uid, res_id, [])
for res_id in res_ids:
if not len(logged_uids) or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
id=pool.get('audittrail.log').create(cr, uid, {"method": method , "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines=[]
for field in old_values[res_id]:
if old_values[res_id][field]:
line={
'name':field,
'old_value':old_values[res_id][field],
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model_object)
id = pool.get('audittrail.log').create(cr, uid, {"method": method, "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines = []
for field in args[1].keys():
if args[1].keys():
line = {
'name': field,
'new_value': field in new_values and new_values[field] or '',
'old_value': field in old_values and old_values[field] or '',
'new_value_text': self.get_value_text(cr, uid, field, new_values[field], model_object),
'old_value_text': old_values_text[field]
}
lines.append(line)
cr.commit()
self.create_log_line(cr, uid, id, model_object, lines)
res =fct_src(db, uid, object, method, *args)
cr.close()
return res
if method in ('read'):
res_ids = args[0]
old_values = {}
res = fct_src(db, uid, object, method, *args)
if type(res) == list:
for v in res:
old_values[v['id']] = v
else:
old_values[res['id']] = res
for res_id in old_values:
if not logged_uids or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
id = pool.get('audittrail.log').create(cr, uid, {"method": method, "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines = []
for field in old_values[res_id]:
if old_values[res_id][field]:
line = {
'name': field,
'old_value': old_values[res_id][field],
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model_object)
}
lines.append(line)
cr.commit()
self.create_log_line(cr, uid, id, model_object, lines)
cr.close()
return res
if method in ('unlink'):
res_ids = args[0]
old_values = {}
for res_id in res_ids:
old_values[res_id] = pool.get(model_object.model).read(cr, uid, res_id, [])
for res_id in res_ids:
if not logged_uids or uid in logged_uids:
resource_name = pool.get(model_object.model).name_get(cr, uid, [res_id])
resource_name = resource_name and resource_name[0][1] or ''
id = pool.get('audittrail.log').create(cr, uid, {"method": method, "object_id": model_object.id, "user_id": uid, "res_id": res_id, "name": resource_name})
lines = []
for field in old_values[res_id]:
if old_values[res_id][field]:
line = {
'name': field,
'old_value': old_values[res_id][field],
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model_object)
}
lines.append(line)
cr.commit()
self.create_log_line(cr, uid, id, model_object, lines)
res = fct_src(db, uid, object, method, *args)
cr.close()
return res
cr.close()
def execute(self, db, uid, object, method, *args, **kw):
pool = pooler.get_pool(db)
cr = pooler.get_db(db).cursor()
cr.autocommit(True)
obj=pool.get(object)
logged_uids = []
fct_src = super(audittrail_objects_proxy, self).execute
def my_fct(db, uid, object, method, *args):
field = method
rule = False
obj_ids= pool.get('ir.model').search(cr, uid, [('model', '=', object)])
obj_ids = pool.get('ir.model').search(cr, uid, [('model', '=', object)])
for obj_name in pool.obj_list():
if obj_name == 'audittrail.rule':
rule = True
if not rule:
return fct_src(db, uid, object, method, *args)
if not len(obj_ids):
if not obj_ids:
return fct_src(db, uid, object, method, *args)
rule_ids=pool.get('audittrail.rule').search(cr, uid, [('object_id', '=', obj_ids[0]), ('state', '=', 'subscribed')])
if not len(rule_ids):
rule_ids = pool.get('audittrail.rule').search(cr, uid, [('object_id', '=', obj_ids[0]), ('state', '=', 'subscribed')])
if not rule_ids:
return fct_src(db, uid, object, method, *args)
for thisrule in pool.get('audittrail.rule').browse(cr, uid, rule_ids):
for user in thisrule.user_id:
logged_uids.append(user.id)
if not len(logged_uids) or uid in logged_uids:
if not logged_uids or uid in logged_uids:
if field in ('read', 'write', 'create', 'unlink'):
if getattr(thisrule, 'log_'+field):
if getattr(thisrule, 'log_' + field):
return self.log_fct(db, uid, object, method, fct_src, *args)
return fct_src(db, uid, object, method, *args)
res = my_fct(db, uid, object, method, *args)
+52 -23
View File
@@ -1,6 +1,9 @@
<?xml version="1.0" ?>
<openerp>
<data>
<!-- Audittrail Rule form -->
<record model="ir.ui.view" id="view_audittrail_rule_form">
<field name="name">audittrail.rule.form</field>
<field name="model">audittrail.rule</field>
@@ -17,12 +20,15 @@
<field name="user_id" select="1" colspan="4"/>
<field name="state" select="1" readonly="1" />
<group colspan="2" col="2">
<button string="Subscribe" name="subscribe" type="object" states="draft"/>
<button string="UnSubscribe" name="unsubscribe" type="object" states="subscribed"/>
<button string="Subscribe" name="subscribe"
type="object" states="draft" />
<button string="UnSubscribe" name="unsubscribe"
type="object" states="subscribed" />
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_audittrail_rule_tree">
<field name="name">audittrail.rule.tree</field>
<field name="model">audittrail.rule</field>
@@ -40,6 +46,9 @@
</tree>
</field>
</record>
<!-- Action for audittrail rule -->
<record model="ir.actions.act_window" id="action_audittrail_rule_tree">
<field name="name">Rules</field>
<field name="res_model">audittrail.rule</field>
@@ -48,8 +57,11 @@
<field name="view_mode">tree,form</field>
<!--<field name="view_id" ref="view_audittrail_rule_form" />-->
</record>
<menuitem name="Audittrails" id="menu_action_audittrail" parent="base.menu_administration"/>
<menuitem name="Rules" id="menu_action_audittrail_rule_tree" action="action_audittrail_rule_tree" parent="menu_action_audittrail"/>
<menuitem name="Audittrails" id="menu_action_audittrail"
parent="base.menu_administration" />
<menuitem name="Rules" id="menu_action_audittrail_rule_tree"
action="action_audittrail_rule_tree" parent="menu_action_audittrail" />
<record model="ir.actions.act_window" id="action_audittrail_rule_tree_sub">
@@ -60,6 +72,8 @@
<field name="domain">[('state','=','subscribed')]</field>
<field name="filter" eval="True"/>
</record>
<!-- AuditTrail Log form -->
<record model="ir.ui.view" id="view_audittrail_log_form">
<field name="name">audittrail.log.form</field>
@@ -73,23 +87,34 @@
<field name="user_id" select="1" readonly="1"/>
<field name="res_id" readonly="1"/>
<field name="name" readonly="1" select="1"/>
<field name="line_ids" colspan="4" mode="tree,form" widget="one2many_list" readonly="1">
<field name="line_ids" colspan="4" mode="tree,form"
widget="one2many_list" readonly="1">
<form string="Log Lines">
<field name="field_id" colspan="4" readonly="1"/>
<newline/>
<field name="field_description" colspan="4" readonly="1"/>
<newline/>
<separator string="Old Value : " colspan="2"/>
<separator string="New Value : " colspan="2"/>
<newline/>
<field name="old_value" nolabel="1" colspan="2" readonly="1"/>
<field name="new_value" nolabel="1" colspan="2" readonly="1"/>
<newline/>
<separator string="Old Value Text : " colspan="2"/>
<separator string="New Value Text: " colspan="2"/>
<newline/>
<field name="old_value_text" nolabel="1" colspan="2" readonly="1"/>
<field name="new_value_text" nolabel="1" colspan="2" readonly="1"/>
<field name="field_id" colspan="4"
readonly="1" />
<newline />
<field name="field_description" colspan="4"
readonly="1" />
<newline />
<separator string="Old Value : "
colspan="2" />
<separator string="New Value : "
colspan="2" />
<newline />
<field name="old_value" nolabel="1"
colspan="2" readonly="1" />
<field name="new_value" nolabel="1"
colspan="2" readonly="1" />
<newline />
<separator string="Old Value Text : "
colspan="2" />
<separator string="New Value Text: "
colspan="2" />
<newline />
<field name="old_value_text" nolabel="1"
colspan="2" readonly="1" />
<field name="new_value_text" nolabel="1"
colspan="2" readonly="1" />
</form>
<tree string="Log Lines">
@@ -117,15 +142,19 @@
</field>
</record>
<!-- Action for Audittrail Log -->
<record model="ir.actions.act_window" id="action_audittrail_log_tree">
<field name="name">Logs</field>
<field name="res_model">audittrail.log</field>
<field name="view_type">form</field>
</record>
<menuitem name="Logs" id="menu_action_audittrail_log_tree" action="action_audittrail_log_tree" parent="menu_action_audittrail"/>
<menuitem name="Logs" id="menu_action_audittrail_log_tree"
action="action_audittrail_log_tree" parent="menu_action_audittrail" />
<!-- <wizard string="View log" menu="False" model="audittrail.log" name="audittrail.view.log" id="wizard_audittrail_log"/>-->
<menuitem name="View Logs" id="menu_action_log_tree2" action="action_audittrail_view_log" parent="menu_action_audittrail"/>
<menuitem name="View Logs" id="menu_action_log_tree2"
action="action_audittrail_view_log" parent="menu_action_audittrail" />
</data>
</data>
</openerp>
@@ -5,3 +5,4 @@
"access_audittrail_rule_all_users","audittrail rule all","model_audittrail_rule","base.group_user",1,0,0,0
"access_audittrail_log_all_users","audittrail log all","model_audittrail_log","base.group_user",1,0,1,0
"access_audittrail_log_line_all_users","audittrail log line all","model_audittrail_log_line","base.group_user",1,0,1,0
"access_audittrail_view_log","audittrail.view.log","model_audittrail_view_log","base.group_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
5 access_audittrail_rule_all_users audittrail rule all model_audittrail_rule base.group_user 1 0 0 0
6 access_audittrail_log_all_users audittrail log all model_audittrail_log base.group_user 1 0 1 0
7 access_audittrail_log_line_all_users audittrail log line all model_audittrail_log_line base.group_user 1 0 1 0
8 access_audittrail_view_log audittrail.view.log model_audittrail_view_log base.group_user 1 1 1 1
+24 -27
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -15,31 +15,26 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
from tools.translate import _
import netsvc
import pooler
import time
import tools
import wizard
class audittrail_view_log(osv.osv_memory):
_name = "audittrail.view.log"
_description = "View Log"
_columns ={
'from':fields.datetime('Log From'),
'to':fields.datetime('Log To', required = True)
}
_defaults = {
'to': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"),
_columns = {
'from':fields.datetime('Log From'),
'to':fields.datetime('Log To', required = True)
}
_defaults = {
'to': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"),
}
def log_open_window(self, cr, uid, ids, context):
def log_open_window(self, cr, uid, ids, context=None):
"""
Open Log form from given date range..
@param cr: the current row, from the database cursor,
@@ -47,26 +42,28 @@ class audittrail_view_log(osv.osv_memory):
@param ids: List of audittrail view log’s IDs.
@return: Dictionary of audittrail log form on given date range.
"""
if not context:
context = {}
mod_obj = self.pool.get('ir.model.data')
act_obj = self.pool.get('ir.actions.act_window')
result = mod_obj._get_id(cr, uid, 'audittrail', 'action_audittrail_log_tree')
id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id']
result = act_obj.read(cr, uid, [id])[0]
log_obj= self.pool.get(result['res_model'])
log_id = log_obj.search(cr, uid, [])
log_model=log_obj.read(cr, uid,log_id,['object_id'])
for datas in self.read(cr, uid, ids):
if not datas['from']:
if datas['to'] <> time.strftime("%Y-%m-%d %H:%M:%S"):
result['domain'] = str([('timestamp', '<',datas['to'])])
#log_obj = self.pool.get(result['res_model'])
#log_id = log_obj.search(cr, uid, [])
#log_model = log_obj.read(cr, uid, log_id, ['object_id'])
#start Loop
for datas in self.read(cr, uid, ids):
if not datas.get('from', None):
if datas.get('to') <> time.strftime("%Y-%m-%d %H:%M:%S"):
result['domain'] = str([('timestamp', '<', datas.get('to'))])
else:
pass
pass
else:
result['domain'] = str([('timestamp', '>',datas['from']),('timestamp', '<',datas['to'])])
result['domain'] = str([('timestamp', '>', datas.get('from', None)), ('timestamp', '<', datas.get('to'))])
#End Loop
return result
audittrail_view_log()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Audittrail View Log wizard-->
<record id="view_audittrail_view_log" model="ir.ui.view">
<field name="name">audittrail.view.log.form</field>
<field name="model">audittrail.view.log</field>
@@ -14,12 +17,16 @@
</group>
<separator string="" colspan="4" />
<group colspan="4" col="6">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-open" string="Open Logs" name="log_open_window" type="object"/>
</group>
<button icon="gtk-cancel" special="cancel"
string="Cancel" />
<button icon="gtk-open" string="Open Logs"
name="log_open_window" type="object" />
</group>
</form>
</field>
</record>
<!-- action for audittrail view log wizard -->
<record id="action_audittrail_view_log" model="ir.actions.act_window">
<field name="name">View log</field>
+49 -26
View File
@@ -51,6 +51,7 @@ def get_recurrent_dates(rrulestring, exdate, startdate=None):
return re_dates
def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
if base_calendar_id and isinstance(base_calendar_id, (str, unicode)):
res = base_calendar_id.split('-')
if len(res) >= 2:
@@ -220,10 +221,12 @@ class invite_attendee_wizard(osv.osv_memory):
res_obj = obj.browse(cr, uid, context['active_id'])
type = datas.get('type')
att_obj = self.pool.get('calendar.attendee')
vals = {}
vals = []
mail_to = []
attendees = []
if not model == 'calendar.attendee':
vals = {'ref': '%s,%s' % (model, base_calendar_id2real_id(context['active_id']))}
ref = {'ref': '%s,%s' % (model, base_calendar_id2real_id(context['active_id']))}
if type == 'internal':
user_obj = self.pool.get('res.users')
@@ -231,20 +234,28 @@ class invite_attendee_wizard(osv.osv_memory):
raise osv.except_osv(_('Error!'), ("Please select any User"))
for user_id in datas.get('user_ids'):
user = user_obj.browse(cr, uid, user_id)
vals.update({'user_id': user_id,
'email': user.address_id.email})
res = {
'user_id': user_id,
'email': user.address_id.email
}
res.update(ref)
vals.append(res)
if user.address_id.email:
mail_to.append(user.address_id.email)
elif type == 'external' and datas.get('email'):
vals.update({'email': datas['email']})
vals.append({'email': datas['email']})
mail_to.append(datas['email'])
elif type == 'partner':
add_obj = self.pool.get('res.partner.address')
for contact in add_obj.browse(cr, uid, datas['contact_ids']):
vals.update({
'partner_address_id': contact.id,
'email': contact.email})
res = {
'partner_address_id': contact.id,
'email': contact.email
}
res.update(ref)
vals.append(res)
if contact.email:
mail_to.append(contact.email)
@@ -254,17 +265,23 @@ class invite_attendee_wizard(osv.osv_memory):
'parent_ids' : [(4, att.id)],
'ref': att.ref
})
for att_val in vals:
attendees.append(int(att_obj.create(cr, uid, att_val, context=context)))
if model_field:
for attendee in attendees:
obj.write(cr, uid, res_obj.id, {model_field: [(4, attendee)]})
if datas.get('send_mail'):
if not mail_to:
name = map(lambda x: x[1], filter(lambda x: type==x[0], \
self._columns['type'].selection))
raise osv.except_osv(_('Error!'), ("%s must have an email \
Address to send mail") % (name[0]))
att_obj._send_mail(cr, uid, [att_id], mail_to, \
att_obj._send_mail(cr, uid, attendees, mail_to, \
email_from=tools.config.get('email_from', False))
att_id = att_obj.create(cr, uid, vals)
if model_field:
obj.write(cr, uid, res_obj.id, {model_field: [(4, att_id)]})
return {}
@@ -719,8 +736,11 @@ class calendar_event(osv.osv):
def onchange_dates(self, cr, uid, ids, start_date, duration=False, end_date=False, context={}):
if not start_date:
return {}
start = datetime.strptime(start_date, "%Y-%m-%d %H:%M:%S")
value = {}
if not end_date and not duration:
duration = 8.00
value['duration'] = 8.00
start = datetime.strptime(start_date, "%Y-%m-%d %H:%M:%S")
if end_date and not duration:
end = datetime.strptime(end_date, "%Y-%m-%d %H:%M:%S")
diff = end - start
@@ -832,19 +852,22 @@ rule or repeating pattern for anexception to a recurrence set"),
new_id = self.copy(cr, uid, event_id, default=defaults, context=context)
return new_id
def modify_all(self, cr, uid, event_id, defaults, context=None, *args):
event_id = base_calendar_id2real_id(event_id)
defaults.pop('id')
defaults.update({'table': self._table})
qry = "UPDATE %(table)s set name='%(name)s', \
date='%(date)s', date_deadline='%(date_deadline)s'"
if defaults.get('alarm_id'):
qry += ", alarm_id=%(alarm_id)s"
if defaults.get('location'):
qry += ", location='%(location)s'"
qry += "WHERE id=%s" % (event_id)
cr.execute(qry % (defaults))
def modify_all(self, cr, uid, event_ids, defaults, context=None, *args):
#start Loop
for event_id in event_ids:
event_id = base_calendar_id2real_id(event_id)
defaults.pop('id')
defaults.update({'table': self._table})
qry = "UPDATE %(table)s set name='%(name)s', \
date='%(date)s', date_deadline='%(date_deadline)s'"
if defaults.get('alarm_id'):
qry += ", alarm_id=%(alarm_id)s"
if defaults.get('location'):
qry += ", location='%(location)s'"
qry += "WHERE id=%s" % (event_id)
cr.execute(qry % (defaults))
#End Loop
return True
def get_recurrent_ids(self, cr, uid, select, base_start_date, base_until_date, limit=100):
@@ -25,29 +25,10 @@ import tools
from osv import fields,osv,orm
from tools.translate import _
#class ir_model_fields(osv.osv):
# _inherit = 'ir.model.fields'
# def _get_models(self, cr, uid, model_name, level=1):
# if not level:
# return []
# result = [model_name]
# print model_name
# for field,data in self.pool.get(model_name).fields_get(cr, uid).items():
# if data.get('relation', False):
# result += self._get_models(cr, uid, data['relation'], level-1)
# return result
# def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None):
# if context and ('model_id' in context):
# model_name = self.pool.get("ir.model").browse(cr, uid, context['model_id'], context).model
# models = self._get_models(cr, uid, model_name, context.get('model_level',2))
# models = map(lambda x: self.pool.get('ir.model').search(cr, uid, [('model','=',x)])[0], models)
# args.append(('model_id','in',models))
# print args
# return super(ir_model_fields, self).search(cr, uid, args, offset, limit, order, context)
#ir_model_fields()
class report_creator(osv.osv):
"""
Report Creator
"""
_name = "base_report_creator.report"
_description = "Report"
model_set_id = False
@@ -55,8 +36,11 @@ class report_creator(osv.osv):
# Should request only used fields
#
def export_data(self, cr, uid, ids, fields_to_export, context=None):
if not context:
context = {}
data_l = self.read(cr, uid, ids, ['sql_query'], context)
final_datas =[]
#start Loop
for i in data_l:
datas = []
for key,value in i.items():
@@ -67,6 +51,7 @@ class report_creator(osv.osv):
else:
datas.append(str(value))
final_datas += [datas]
#End Loop
return {'datas':final_datas}
def fields_get(self, cr, user, fields=None, context=None):
@@ -74,8 +59,10 @@ class report_creator(osv.osv):
return super(report_creator, self).fields_get(cr, user, fields, context)
report = self.browse(cr, user, context['report_id'])
models = {}
#Start Loop
for model in report.model_ids:
models[model.model] = self.pool.get(model.model).fields_get(cr, user, context=context)
#End Loop
fields = {}
i = 0
for f in report.field_ids:
@@ -173,7 +160,7 @@ class report_creator(osv.osv):
}
return result
def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
def read(self, cr, user, ids, fields = None, context = None, load = '_classic_read'):
if (not context) or 'report_id' not in context:
return super(report_creator, self).read(cr, user, ids, fields, context, load)
ctx = context or {}
@@ -198,43 +185,39 @@ class report_creator(osv.osv):
return res
def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
context_id = context and context.get('report_id', False) or False
if (not context) or 'report_id' not in context:
return super(report_creator, self).search(cr, user, args, offset, limit, order, context, count)
report = self.browse(cr, user, context['report_id'])
i = 0
fields = {}
for f in report.field_ids:
if f.field_id.model:
fields['field'+str(i)] = (f.field_id.model, f.field_id.name)
i+=1
else:
fields['column_count'] = (False, 'Count')
newargs = []
newargs2 = []
for a in args:
if fields[a[0]][0]:
res = self.pool.get(fields[a[0]][0])._where_calc(cr, user, [[fields[a[0]][1],a[1],a[2]]], active_test=False, context=context)
newargs+=res[0]
newargs2+=res[1]
else:
newargs += [("count(*) " + a[1] +" " + str(a[2]))]
ctx = context or {}
ctx['getid'] = True
report = self._sql_query_get(cr, user, [context['report_id']], 'sql_query', None, ctx, where_plus=newargs, limit=limit, offset=offset)
query = report[context['report_id']]
cr.execute(query, newargs2)
result = cr.fetchall()
return map(lambda x: x[0], result)
if context_id:
report = self.browse(cr, user, context_id)
i = 0
fields = {}
for f in report.field_ids:
if f.field_id.model:
fields['field'+str(i)] = (f.field_id.model, f.field_id.name)
i+=1
else:
fields['column_count'] = (False, 'Count')
newargs = []
newargs2 = []
for a in args:
if fields[a[0]][0]:
res = self.pool.get(fields[a[0]][0])._where_calc(cr, user, [[fields[a[0]][1],a[1],a[2]]], active_test = False, context = context)
newargs+=res[0]
newargs2+=res[1]
else:
newargs += [("count(*) " + a[1] +" " + str(a[2]))]
ctx = context or {}
ctx['getid'] = True
report = self._sql_query_get(cr, user, [context_id], 'sql_query', None, ctx, where_plus = newargs, limit=limit, offset=offset)
query = report[context_id]
cr.execute(query, newargs2)
result = cr.fetchall()
return map(lambda x: x[0], result)
def _path_get(self,cr, uid, models, filter_ids=[]):
# ret_str = """ sale_order_line
# left join sale_order on (sale_order_line.order_id=sale_order.id)
# left join res_partner on (res_partner.id=sale_order.partner_id)"""
# where_list = []
# for filter_id in filter_ids:
# where_list.append(filter_id.expression)
# if where_list:
# ret_str+="\nwhere\n\t"+" and\n\t".join(where_list)
self.model_set_id = False
model_dict = {}
from_list = []
@@ -366,13 +349,26 @@ class report_creator(osv.osv):
_columns = {
'name': fields.char('Report Name',size=64, required=True),
'type': fields.selection([('list','Rows And Columns Report'),], 'Report Type',required=True),#('sum','Summation Report')
'type': fields.selection([('list', 'Rows And Columns Report'), ], 'Report Type', required=True),#('sum','Summation Report')
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the report without removing it."),
'view_type1': fields.selection([('form','Form'),('tree','Tree'),('graph','Graph'),('calendar','Calendar')], 'First View', required=True),
'view_type2': fields.selection([('','/'),('form','Form'),('tree','Tree'),('graph','Graph'),('calendar','Calendar')], 'Second View'),
'view_type3': fields.selection([('','/'),('form','Form'),('tree','Tree'),('graph','Graph'),('calendar','Calendar')], 'Third View'),
'view_graph_type': fields.selection([('pie','Pie Chart'),('bar','Bar Chart')], 'Graph Type', required=True),
'view_graph_orientation': fields.selection([('horz','Horizontal'),('vert','Vertical')], 'Graph Orientation', required=True),
'view_type1': fields.selection([('form','Form'),
('tree','Tree'),
('graph','Graph'),
('calendar','Calendar')], 'First View', required=True),
'view_type2': fields.selection([('','/'),
('form','Form'),
('tree','Tree'),
('graph','Graph'),
('calendar','Calendar')], 'Second View'),
'view_type3': fields.selection([('','/'),
('form','Form'),
('tree','Tree'),
('graph','Graph'),
('calendar','Calendar')], 'Third View'),
'view_graph_type': fields.selection([('pie','Pie Chart'),
('bar','Bar Chart')], 'Graph Type', required=True),
'view_graph_orientation': fields.selection([('horz','Horizontal'),
('vert','Vertical')], 'Graph Orientation', required=True),
'model_ids': fields.many2many('ir.model', 'base_report_creator_report_model_rel', 'report_id','model_id', 'Reported Objects'),
'field_ids': fields.one2many('base_report_creator.report.fields', 'report_id', 'Fields to Display'),
'filter_ids': fields.one2many('base_report_creator.report.filter', 'report_id', 'Filters'),
@@ -449,6 +445,9 @@ class report_creator(osv.osv):
report_creator()
class report_creator_field(osv.osv):
"""
Report Creator Field
"""
_name = "base_report_creator.report.fields"
_description = "Display Fields"
_rec_name = 'field_id'
@@ -457,9 +456,18 @@ class report_creator_field(osv.osv):
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of fields."),
'field_id': fields.many2one('ir.model.fields', 'Field'),
'report_id': fields.many2one('base_report_creator.report','Report', on_delete='cascade'),
'group_method': fields.selection([('group','Grouped'),('sum','Sum'),('min','Minimum'),('count','Count'),('max','Maximum'),('avg','Average')], 'Grouping Method', required=True),
'graph_mode': fields.selection([('','/'),('x','X Axis'),('y','Y Axis')], 'Graph Mode'),
'calendar_mode': fields.selection([('','/'),('date_start','Starting Date'),('date_end','Ending Date'),('date_delay','Delay'),('date_stop','End Date'),('color','Unique Colors')], 'Calendar Mode'),
'group_method': fields.selection([('group','Grouped'),
('sum','Sum'),
('min','Minimum'),
('count','Count'),
('max','Maximum'),
('avg','Average')], 'Grouping Method', required=True),
'graph_mode': fields.selection([('','/'),
('x','X Axis'),
('y','Y Axis')], 'Graph Mode'),
'calendar_mode': fields.selection([('','/'),
('date_start','Starting Date'),
('date_end','Ending Date'),('date_delay','Delay'),('date_stop','End Date'),('color','Unique Colors')], 'Calendar Mode'),
}
_defaults = {
'group_method': lambda *args: 'group',
@@ -468,17 +476,20 @@ class report_creator_field(osv.osv):
report_creator_field()
class report_creator_filter(osv.osv):
"""
Report Creator Filter
"""
_name = "base_report_creator.report.filter"
_description = "Report Filters"
_columns = {
'name': fields.char('Filter Name',size=64, required=True),
'expression': fields.text('Value', required=True,help='Provide an expression for the field based on which you want to filter the records.\n e.g. res_partner.id=3'),
'report_id': fields.many2one('base_report_creator.report','Report', on_delete='cascade'),
'condition' : fields.selection([('and','AND'),('or','OR')], 'Condition')
'expression': fields.text('Value', required=True, help='Provide an expression for the field based on which you want to filter the records.\n e.g. res_partner.id=3'),
'report_id': fields.many2one('base_report_creator.report', 'Report', on_delete='cascade'),
'condition' : fields.selection([('and','AND'),
('or','OR')], 'Condition')
}
_defaults = {
'condition': lambda *args: 'and',
}
report_creator_filter()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -27,6 +27,9 @@
</tree>
</field>
</record>
<!-- Report Creator form -->
<record model="ir.ui.view" id="base_report_creator_form">
<field name="name">base_report_creator.report.form</field>
<field name="model">base_report_creator.report</field>
@@ -41,7 +44,9 @@
<field name="model_ids" colspan="4" context="{'model_ids':model_ids}"/>
<separator string="State" colspan="4"/>
<field name="state"/>
<button string="Create Menu" name="%(action_report_menu_create)d" type="action" colspan="2" icon="gtk-justify-fill"/>
<button string="Create Menu"
name="%(action_report_menu_create)d" type="action"
colspan="2" icon="gtk-justify-fill" />
</page><page string="View parameters">
<separator string="Used View" colspan="4"/>
<field name="view_type1"/>
@@ -54,12 +59,13 @@
<field name="field_ids" nolabel="1" colspan="4">
<form string="Fields">
<field name="sequence"/>
<field name="field_id" domain="parent.model_ids and [('model_id','in',parent.model_ids[0][2]),('ttype','&lt;&gt;','many2many'),('ttype','&lt;&gt;','one2many')] or []">
<tree string="Field List">
<field name="model_id"/>
<field name="name"/>
<field name="field_description"/>
</tree>
<field name="field_id"
domain="parent.model_ids and [('model_id','in',parent.model_ids[0][2]),('ttype','&lt;&gt;','many2many'),('ttype','&lt;&gt;','one2many')] or []">
<tree string="Field List">
<field name="model_id" />
<field name="name" />
<field name="field_description" />
</tree>
</field>
<field name="group_method"/>
<field name="graph_mode"/>
@@ -67,14 +73,18 @@
</form>
<tree editable="bottom" string="Fields to Display">
<field name="sequence"/>
<field name="field_id" domain="parent.model_ids and [('model_id','in',parent.model_ids[0][2]),('ttype','&lt;&gt;','many2many'),('ttype','&lt;&gt;','one2many')] or []" attrs="{'required':[('group_method','!=','count')]}"/>
<field name="field_id"
domain="parent.model_ids and [('model_id','in',parent.model_ids[0][2]),('ttype','&lt;&gt;','many2many'),('ttype','&lt;&gt;','one2many')] or []"
attrs="{'required':[('group_method','!=','count')]}" />
<field name="group_method"/>
<field name="graph_mode"/>
<field name="calendar_mode"/>
</tree>
</field>
</page><page string="Filters on Fields">
<button string="Add filter" name="%(wizard_set_filter_fields)d" type="action" icon="gtk-add"/>
<button string="Add filter"
name="%(wizard_set_filter_fields)d" type="action"
icon="gtk-add" />
<field name="filter_ids" nolabel="1" colspan="4">
<tree string="Filters">
<field name="name"/>
@@ -87,8 +97,10 @@
</form>
</field>
<separator string="Legend" colspan="4"/>
<label string="Use %%(uid)s to filter by the connected user" align="0.0"/>
</page><page string="Security">
<label
string="Use %%(uid)s to filter by the connected user"
align="0.0" />
</page><page string="Security">
<separator string="Authorized Groups (empty for all)" colspan="4"/>
<field name="group_ids" colspan="4" nolabel="1"/>
</page><page string="SQL Query">
@@ -98,15 +110,20 @@
</form>
</field>
</record>
<!-- Action for Report creator form -->
<record model="ir.actions.act_window" id="base_report_creator_action">
<field name="name">Custom Report</field>
<field name="res_model">base_report_creator.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
name="Custom Reports" id="base.menu_custom_reports"
action="base_report_creator_action" parent="base.reporting_menu" sequence="1"/>
<menuitem
name="Custom Reports" parent="base.next_id_50"
id="menu_base_report_creator_action_config"
@@ -122,10 +139,12 @@
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="base_report_creator_action_tree">
<field name="res_model">base_report_creator.report</field>
<field name="view_type">tree</field>
</record>
<menuitem
name="Custom Reports" parent="base.menu_custom_reports"
id="menu_base_report_creator_action"
@@ -143,6 +162,7 @@
<field name="value" eval="'ir.actions.wizard,%d'%wizard_report_open"/>
<field name="object" eval="True"/>
</record>
<record model="ir.values" id="ir_open_report_multi">
<field name="key2" eval="'client_action_multi'"/>
<field name="model" eval="'base_report_creator.report'"/>
@@ -151,7 +171,5 @@
<field name="object" eval="True"/>
</record>
</data>
</openerp>
@@ -19,14 +19,7 @@
#
##############################################################################
from osv import fields, osv
from tools.translate import _
import netsvc
import pooler
import time
import tools
import wizard
class report_menu_create(osv.osv_memory):
"""
@@ -34,40 +27,47 @@ class report_menu_create(osv.osv_memory):
"""
_name = "report.menu.create"
_description = "Menu Create"
_columns ={
_columns = {
'menu_name':fields.char('Menu Name', size=64, required=True),
'menu_parent_id':fields.many2one('ir.ui.menu', 'Parent Menu', required=True),
}
def report_menu_create(self, cr, uid, ids, context):
def report_menu_create(self, cr, uid, ids, context=None):
"""
Create Menu.
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of Report Menu Create's IDs
@return : Dictionary {}.
"""
board = self.pool.get('base_report_creator.report').browse(cr, uid, context['active_id'])
view = board.view_type1
if board.view_type2:
view+=','+board.view_type2
if board.view_type3:
view+=','+board.view_type3
action_id = self.pool.get('ir.actions.act_window').create(cr, uid, {
'name': board.name,
'view_type':'form',
'view_mode':view,
'context': "{'report_id':%d}" % (board.id,),
'res_model': 'base_report_creator.report'
})
if not context:
context={}
context_id = context and context.get('active_id', False) or False
if context_id:
board = self.pool.get('base_report_creator.report').browse(cr, uid, context_id)
view = board.view_type1
if board.view_type2:
view+=','+board.view_type2
if board.view_type3:
view+=','+board.view_type3
action_id = self.pool.get('ir.actions.act_window').create(cr, uid, {
'name': board.name,
'view_type':'form',
'view_mode':view,
'context': "{'report_id':%d}" % (board.id,),
'res_model': 'base_report_creator.report'
})
obj_menu = self.pool.get('ir.ui.menu')
#start Loop
for data in self.read(cr, uid, ids):
self.pool.get('ir.ui.menu').create(cr, uid, {
'name': data['menu_name'],
'parent_id': data['menu_parent_id'],
obj_menu.create(cr, uid, {
'name': data.get('menu_name'),
'parent_id': data.get('menu_parent_id'),
'icon': 'STOCK_SELECT_COLOR',
'action': 'ir.actions.act_window,'+str(action_id)
}, context)
}, context=context)
return {}
#End Loop
report_menu_create()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Create Menu For report -->
<record id="view_report_menu_create" model="ir.ui.view">
<field name="name">report.menu.create.form</field>
<field name="model">report.menu.create</field>
@@ -14,9 +17,11 @@
</group>
<separator string="" colspan="4" />
<group colspan="4" col="6">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-save" string="Create Menu" name="report_menu_create" type="object"/>
</group>
<button icon="gtk-cancel" special="cancel"
string="Cancel" />
<button icon="gtk-save" string="Create Menu"
name="report_menu_create" type="object" />
</group>
</form>
</field>
</record>
-1
View File
@@ -23,4 +23,3 @@ import board
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-1
View File
@@ -19,7 +19,6 @@
#
##############################################################################
{
'name': 'Dashboard main module',
'version': '1.0',
+84 -25
View File
@@ -19,28 +19,42 @@
#
##############################################################################
from osv import fields, osv
import time
from osv import fields,osv
class board_board(osv.osv):
"""
Board
"""
_name = 'board.board'
def create_view(self, cr, uid, ids, context):
board = self.pool.get('board.board').browse(cr, uid, ids, context)
_description = "Board"
def create_view(self, cr, uid, ids, context=None):
"""
Create view
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of Board's IDs
@return: arch of xml view.
"""
if not context:
context = {}
board = self.pool.get('board.board').browse(cr, uid, ids, context=context)
left = []
right = []
#start Loop
for line in board.line_ids:
linestr = '<action string="%s" name="%d" colspan="4"' % (line.name, line.action_id.id)
if line.height:
linestr+=(' height="%d"' % (line.height,))
linestr += (' height="%d"' % (line.height, ))
if line.width:
linestr+=(' width="%d"' % (line.width,))
linestr += (' width="%d"' % (line.width, ))
linestr += '/>'
if line.position=='left':
if line.position == 'left':
left.append(linestr)
else:
right.append(linestr)
#End Loop
arch = """<?xml version="1.0"?>
<form string="My Board">
<hpaned>
@@ -52,66 +66,98 @@ class board_board(osv.osv):
</child2>
</hpaned>
</form>""" % ('\n'.join(left), '\n'.join(right))
return arch
def write(self, cr, uid, ids, vals, context={}):
def write(self, cr, uid, ids, vals, context = {}):
"""
Writes values in one or several fields.
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of Board's IDs
@param vals: dictionary with values to update.
dictionary must be with the form: {‘name_of_the_field’: value, ...}.
@return: True
"""
result = super(board_board, self).write(cr, uid, ids, vals, context)
cr.commit()
board = self.pool.get('board.board').browse(cr, uid, ids[0])
view = self.create_view(cr, uid, ids[0], context)
id = board.view_id.id
cr.execute("update ir_ui_view set arch=%s where id=%s" , (view, id))
cr.execute("update ir_ui_view set arch=%s where id=%s", (view, id))
cr.commit()
return result
def create(self, cr, user, vals, context=None):
"""
create new record.
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param vals: dictionary of values for every field.
dictionary must use this form: {‘name_of_the_field’: value, ...}
@return: id of new created record of board.board.
"""
if not context:
context = {}
if not 'name' in vals:
return False
id = super(board_board, self).create(cr, user, vals, context)
view_id = self.pool.get('ir.ui.view').create(cr, user, {
'name': vals['name'],
'model':'board.board',
'priority':16,
'model': 'board.board',
'priority': 16,
'type': 'form',
'arch': self.create_view(cr, user, id, context),
})
super(board_board, self).write(cr, user, [id], {'view_id': view_id}, context)
return id
def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
"""
Overrides orm field_view_get.
@return: Dictionary of Fields, arch and toolbar.
"""
if not context:
context = {}
res = {}
res = super(board_board, self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
vids = self.pool.get('ir.ui.view.custom').search(cr, user, [('user_id','=',user), ('ref_id','=',view_id)])
vids = self.pool.get('ir.ui.view.custom').search(cr, user, [('user_id', '=', user), ('ref_id' ,'=', view_id)])
if vids:
view_id = vids[0]
arch = self.pool.get('ir.ui.view.custom').browse(cr, user, view_id)
res['arch'] = arch.arch
res['toolbar'] = {'print':[],'action':[],'relate':[]}
res['toolbar'] = {'print': [], 'action': [], 'relate': []}
return res
_columns = {
'name': fields.char('Dashboard', size=64, required=True),
'view_id': fields.many2one('ir.ui.view', 'Board View'),
'name': fields.char('Dashboard', size=64, required=True),
'view_id': fields.many2one('ir.ui.view', 'Board View'),
'line_ids': fields.one2many('board.board.line', 'board_id', 'Action Views')
}
# the following lines added to let the button on dashboard work.
_defaults = {
'name': lambda *args: 'Dashboard'
'name': lambda *args: 'Dashboard'
}
board_board()
class board_line(osv.osv):
"""
Board Line
"""
_name = 'board.board.line'
_description = "Board Line"
_order = 'position,sequence'
_columns = {
'name': fields.char('Title', size=64, required=True),
@@ -120,29 +166,43 @@ class board_line(osv.osv):
'width': fields.integer('Width'),
'board_id': fields.many2one('board.board', 'Dashboard', required=True, ondelete='cascade'),
'action_id': fields.many2one('ir.actions.act_window', 'Action', required=True),
'position': fields.selection([('left','Left'),('right','Right')], 'Position', required=True)
'position': fields.selection([('left','Left'),
('right','Right')], 'Position', required=True)
}
_defaults = {
'position': lambda *args: 'left'
}
board_line()
class board_note_type(osv.osv):
"""
Board note Type
"""
_name = 'board.note.type'
_description = "NOte Type"
_columns = {
'name': fields.char('Note Type', size=64, required=True),
}
board_note_type()
def _type_get(self, cr, uid, context={}):
"""
Get by default Note type.
"""
obj = self.pool.get('board.note.type')
ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, ids, ['name'], context)
res = [(r['name'], r['name']) for r in res]
return res
class board_note(osv.osv):
"""
Board Note
"""
_name = 'board.note'
_description = "Note"
_columns = {
'name': fields.char('Subject', size=128, required=True),
'note': fields.text('Note'),
@@ -151,10 +211,9 @@ class board_note(osv.osv):
'type': fields.selection(_type_get, 'Note type', size=64),
}
_defaults = {
'user_id': lambda object,cr,uid,context: uid,
'date': lambda object,cr,uid,context: time.strftime('%Y-%m-%d'),
'user_id': lambda object, cr, uid, context: uid,
'date': lambda object, cr, uid, context: time.strftime('%Y-%m-%d'),
}
board_note()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+29 -8
View File
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<menuitem icon="terp-graph" id="base.reporting_menu" name="Reporting" sequence="8"/>
<!-- <menuitem icon="terp-graph" id="dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>-->
<menuitem icon="terp-graph" id="base.reporting_menu"
name="Reporting" sequence="8" />
<!-- <menuitem icon="terp-graph" id="dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>-->
<record id="view_board_note_tree" model="ir.ui.view">
<field name="name">board.note.tree</field>
<field name="model">board.note</field>
@@ -13,6 +15,9 @@
</tree>
</field>
</record>
<!--Board Note form -->
<record id="view_board_note_form" model="ir.ui.view">
<field name="name">board.note.form</field>
<field name="model">board.note</field>
@@ -27,6 +32,9 @@
</form>
</field>
</record>
<!-- Action for Publish note Form -->
<record id="action_view_board_note_form" model="ir.actions.act_window">
<field name="name">Publish a note</field>
<field name="res_model">board.note</field>
@@ -46,6 +54,9 @@
</tree>
</field>
</record>
<!-- Dashboard Definition form -->
<record id="view_board_form" model="ir.ui.view">
<field name="name">board.board.form</field>
<field name="model">board.board</field>
@@ -54,7 +65,10 @@
<field name="arch" type="xml">
<form string="Dashboard">
<field name="name" select="1"/>
<button colspan="2" name="%(action_board_menu_create)d" string="Create Menu" type="action" icon="gtk-justify-fill"/>
<button colspan="2"
name="%(action_board_menu_create)d"
string="Create Menu" type="action"
icon="gtk-justify-fill" />
<field colspan="4" name="line_ids">
<tree string="Dashboard View">
<field name="name"/>
@@ -67,19 +81,24 @@
<field name="sequence"/>
<field name="width"/>
<field name="height"/>
<field name="action_id" domain="[('view_type','!=','tree')]"/>
<field name="action_id"
domain="[('view_type','!=','tree')]" />
<field name="position"/>
</form>
</field>
</form>
</field>
</record>
<!-- Action for DashBoard Definition form -->
<record id="action_view_board_list_form" model="ir.actions.act_window">
<field name="name">Dashboard Definition</field>
<field name="res_model">board.board</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="base.next_id_50"
name="Configuration"
@@ -90,10 +109,12 @@
action="action_view_board_list_form"
id="menu_view_board_form"
parent="base.next_id_50" sequence="1"/>
<menuitem action="action_view_board_note_form" id="menu_view_board_note_form" parent="base.next_id_50"
sequence="3"
groups="base.group_system" />
<act_window context="{'view': active_id}" id="dashboard_open" multi="True" name="Open Dashboard" res_model="board.board" src_model="board.board"/>
<menuitem action="action_view_board_note_form"
id="menu_view_board_note_form" parent="base.next_id_50"
sequence="3" groups="base.group_system" />
<act_window context="{'view': active_id}" id="dashboard_open"
multi="True" name="Open Dashboard" res_model="board.board"
src_model="board.board" />
</data>
</openerp>
+6 -5
View File
@@ -1,5 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_board_board,board.board,model_board_board,base.group_user,1,1,1,1
access_board_board_line,board.board.line,model_board_board_line,base.group_user,1,1,1,1
access_board_note_type,board.note.type,model_board_note_type,base.group_user,1,1,1,1
access_board_note,board.note,model_board_note,base.group_user,1,1,1,1
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_board_board","board.board","model_board_board","base.group_user",1,1,1,1
"access_board_board_line","board.board.line","model_board_board_line","base.group_user",1,1,1,1
"access_board_note_type","board.note.type","model_board_note_type","base.group_user",1,1,1,1
"access_board_note","board.note","model_board_note","base.group_user",1,1,1,1
"access_board_menu_create","board.menu.create","model_board_menu_create","base.group_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_board_board board.board model_board_board base.group_user 1 1 1 1
3 access_board_board_line board.board.line model_board_board_line base.group_user 1 1 1 1
4 access_board_note_type board.note.type model_board_note_type base.group_user 1 1 1 1
5 access_board_note board.note model_board_note base.group_user 1 1 1 1
6 access_board_menu_create board.menu.create model_board_menu_create base.group_user 1 1 1 1
+36 -22
View File
@@ -27,12 +27,19 @@ class board_menu_create(osv.osv_memory):
Create Menu
"""
def check_views(self, cr, uid, context):
board = self.pool.get('board.board').browse(cr, uid, context['active_id'])
if not board.line_ids:
raise osv.except_osv(_('User Error!'), _('Please Insert Dashboard View(s) !'))
return False
"""
check dashboard view on menu name field.
@return: False
"""
data = context and context.get('active_id', False) or False
if data:
board = self.pool.get('board.board').browse(cr, uid, data)
if not board.line_ids:
raise osv.except_osv(_('User Error!'),
_('Please Insert Dashboard View(s) !'))
return False
def board_menu_create(self, cr, uid, ids, context):
def board_menu_create(self, cr, uid, ids, context=None):
"""
Create Menu.
@param cr: the current row, from the database cursor,
@@ -40,32 +47,39 @@ class board_menu_create(osv.osv_memory):
@param ids: List of Board Menu Create's IDs
@return : Dictionary {}.
"""
board = self.pool.get('board.board').browse(cr, uid, context['active_id'])
action_id = self.pool.get('ir.actions.act_window').create(cr, uid, {
'name': board.name,
'view_type':'form',
'view_mode':'form',
'res_model': 'board.board',
'view_id': board.view_id.id,
})
if not context:
context = {}
context_id = context and context.get('active_id', False) or False
if context_id:
board = self.pool.get('board.board').browse(cr, uid, context_id)
action_id = self.pool.get('ir.actions.act_window').create(cr, uid, {
'name': board.name,
'view_type':'form',
'view_mode':'form',
'res_model': 'board.board',
'view_id': board.view_id.id,
})
obj_menu = self.pool.get('ir.ui.menu')
#start Loop
for data in self.read(cr, uid, ids):
self.pool.get('ir.ui.menu').create(cr, uid, {
'name': data['menu_name'],
'parent_id': data['menu_parent_id'],
obj_menu.create(cr, uid, {
'name': data.get('menu_name'),
'parent_id': data.get('menu_parent_id'),
'icon': 'STOCK_SELECT_COLOR',
'action': 'ir.actions.act_window,'+str(action_id)
}, context)
'action': 'ir.actions.act_window,' + str(action_id)
}, context=context)
#End Loop
return {}
_name = "board.menu.create"
_description = "Menu Create"
_columns = {
'menu_name':fields.char('Menu Name', size=64, required=True),
'menu_parent_id':fields.many2one('ir.ui.menu', 'Parent Menu', required=True),
'menu_name': fields.char('Menu Name', size=64, required=True),
'menu_parent_id': fields.many2one('ir.ui.menu', 'Parent Menu', required=True),
}
_defaults = {
'menu_name':check_views,
'menu_name': check_views,
}
board_menu_create()
+10 -3
View File
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--Board menu create wizard -->
<record id="view_board_menu_create" model="ir.ui.view">
<field name="name">board.menu.create.form</field>
<field name="model">board.menu.create</field>
@@ -14,13 +17,17 @@
</group>
<separator string="" colspan="4" />
<group colspan="4" col="6">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-save" string="Create Menu" name="board_menu_create" type="object"/>
</group>
<button icon="gtk-cancel" special="cancel"
string="Cancel" />
<button icon="gtk-save" string="Create Menu"
name="board_menu_create" type="object" />
</group>
</form>
</field>
</record>
<!-- Action for Board Menu create wizard. -->
<record id="action_board_menu_create" model="ir.actions.act_window">
<field name="name">Create Board Menu</field>
<field name="res_model">board.menu.create</field>
+8 -1
View File
@@ -32,4 +32,11 @@
"access_crm_phonecall_report_user","crm.phonecall.report","model_crm_phonecall_report","crm.group_crm_user",1,0,0,0
"access_crm_opportunity_report_user","crm.opportunity.report","model_crm_opportunity_report","crm.group_crm_user",1,0,0,0
"access_report_crm_case_service_dashboard","report.crm.case.service.dashboard","model_report_crm_case_service_dashboard","crm.group_crm_user",1,0,0,0
"access_crm_lead2partner","crm.lead2partner","model_crm_lead2partner","crm.group_crm_user",1,0,0,0
"access_crm_lead2opportunity","crm.lead2opportunity","model_crm_lead2opportunity","crm.group_crm_user",1,0,0,0
"access_crm_opportunity2meeting","crm.opportunity2meeting","model_crm_opportunity2meeting","crm.group_crm_user",1,0,0,0
"access_crm_opportunity2phonecall","crm.opportunity2phonecall","model_crm_opportunity2phonecall","crm.group_crm_user",1,0,0,0
"access_crm_phonecall2phonecall","crm.phonecall2phonecall","model_crm_phonecall2phonecall","crm.group_crm_user",1,0,0,0
"access_crm_phonecall2partner","crm.phonecall2partner","model_crm_phonecall2partner","crm.group_crm_user",1,0,0,0
"access_crm_phonecall2meeting","crm.phonecall2meeting","model_crm_phonecall2meeting","crm.group_crm_user",1,0,0,0
"access_crm_phonecall2opportunity","crm.phonecall2opportunity","model_crm_phonecall2opportunity","crm.group_crm_user",1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
32 access_crm_phonecall_report_user crm.phonecall.report model_crm_phonecall_report crm.group_crm_user 1 0 0 0
33 access_crm_opportunity_report_user crm.opportunity.report model_crm_opportunity_report crm.group_crm_user 1 0 0 0
34 access_report_crm_case_service_dashboard report.crm.case.service.dashboard model_report_crm_case_service_dashboard crm.group_crm_user 1 0 0 0
35 access_crm_lead2partner crm.lead2partner model_crm_lead2partner crm.group_crm_user 1 0 0 0
36 access_crm_lead2opportunity crm.lead2opportunity model_crm_lead2opportunity crm.group_crm_user 1 0 0 0
37 access_crm_opportunity2meeting crm.opportunity2meeting model_crm_opportunity2meeting crm.group_crm_user 1 0 0 0
38 access_crm_opportunity2phonecall crm.opportunity2phonecall model_crm_opportunity2phonecall crm.group_crm_user 1 0 0 0
39 access_crm_phonecall2phonecall crm.phonecall2phonecall model_crm_phonecall2phonecall crm.group_crm_user 1 0 0 0
40 access_crm_phonecall2partner crm.phonecall2partner model_crm_phonecall2partner crm.group_crm_user 1 0 0 0
41 access_crm_phonecall2meeting crm.phonecall2meeting model_crm_phonecall2meeting crm.group_crm_user 1 0 0 0
42 access_crm_phonecall2opportunity crm.phonecall2opportunity model_crm_phonecall2opportunity crm.group_crm_user 1 0 0 0
+28 -27
View File
@@ -50,12 +50,13 @@ class crm_lead2opportunity(osv.osv_memory):
@return : Dictionary value for created Opportunity form
"""
value = {}
record_ids = context and context.get('active_ids', []) or []
if record_ids:
record_id = context and context.get('active_id', False) or False
if record_id:
lead_obj = self.pool.get('crm.lead')
opp_obj = self. pool.get('crm.opportunity')
data_obj = self.pool.get('ir.model.data')
# Get Opportunity views
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
@@ -66,32 +67,32 @@ class crm_lead2opportunity(osv.osv_memory):
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
for this in self.browse(cr, uid, ids, context=context):
for case in lead_obj.browse(cr, uid, record_ids, context=context):
new_opportunity_id = opp_obj.create(cr, uid, {
'name': this.name,
'planned_revenue': this.planned_revenue,
'probability': this.probability,
'partner_id': case.partner_id and case.partner_id.id or False ,
'section_id': case.section_id and case.section_id.id or False,
'description': case.description or False,
'date_deadline': case.date_deadline or False,
'partner_address_id': case.partner_address_id and \
case.partner_address_id.id or False ,
'priority': case.priority,
'phone': case.phone,
'email_from': case.email_from
})
lead = lead_obj.browse(cr, uid, record_id, context=context)
new_opportunity_id = opp_obj.create(cr, uid, {
'name': this.name,
'planned_revenue': this.planned_revenue,
'probability': this.probability,
'partner_id': lead.partner_id and lead.partner_id.id or False ,
'section_id': lead.section_id and lead.section_id.id or False,
'description': lead.description or False,
'date_deadline': lead.date_deadline or False,
'partner_address_id': lead.partner_address_id and \
lead.partner_address_id.id or False ,
'priority': lead.priority,
'phone': lead.phone,
'email_from': lead.email_from
})
new_opportunity = opp_obj.browse(cr, uid, new_opportunity_id)
vals = {
'partner_id': this.partner_id and this.partner_id.id or False,
}
if not case.opportunity_id:
vals.update({'opportunity_id' : new_opportunity.id})
new_opportunity = opp_obj.browse(cr, uid, new_opportunity_id)
vals = {
'partner_id': this.partner_id and this.partner_id.id or False,
}
if not lead.opportunity_id:
vals.update({'opportunity_id' : new_opportunity.id})
lead_obj.write(cr, uid, [case.id], vals)
lead_obj.case_close(cr, uid, [case.id])
opp_obj.case_open(cr, uid, [new_opportunity_id])
lead_obj.write(cr, uid, [lead.id], vals)
lead_obj.case_close(cr, uid, [lead.id])
opp_obj.case_open(cr, uid, [new_opportunity_id])
value = {
'name': _('Opportunity'),
+25 -24
View File
@@ -50,11 +50,12 @@ class crm_opportunity2meeting(osv.osv_memory):
@return : Dictionary value for created Meeting view
"""
value = {}
record_ids = context and context.get('active_ids', []) or []
if record_ids:
record_id = context and context.get('active_id', False) or False
if record_id:
opp_obj = self.pool.get('crm.opportunity')
data_obj = self.pool.get('ir.model.data')
# Get meeting views
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
id1 = data_obj._get_id(cr, uid, 'crm', 'crm_case_calendar_view_meet')
@@ -68,28 +69,28 @@ class crm_opportunity2meeting(osv.osv_memory):
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
for this in self.browse(cr, uid, ids, context=context):
for opp in opp_obj.browse(cr, uid, record_ids, context=context):
context = {
'default_opportunity_id': opp.id,
'default_partner_id': opp.partner_id and opp.partner_id.id or False,
'default_section_id': opp.section_id and opp.section_id.id or False,
'default_email_from': opp.email_from,
'default_state': 'open',
'default_name': opp.name
}
value = {
'name': _('Meetings'),
'domain' : "[('user_id','=',%s)]" % (uid),
'context': context,
'view_type': 'form',
'view_mode': 'calendar,form,tree',
'res_model': 'crm.meeting',
'view_id': False,
'views': [(id1, 'calendar'), (id2, 'form'), (id3, 'tree')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
opp = opp_obj.browse(cr, uid, record_id, context=context)
context = {
'default_opportunity_id': opp.id,
'default_partner_id': opp.partner_id and opp.partner_id.id or False,
'default_section_id': opp.section_id and opp.section_id.id or False,
'default_email_from': opp.email_from,
'default_state': 'open',
'default_name': opp.name
}
value = {
'name': _('Meetings'),
'domain' : "[('user_id','=',%s)]" % (uid),
'context': context,
'view_type': 'form',
'view_mode': 'calendar,form,tree',
'res_model': 'crm.meeting',
'view_id': False,
'views': [(id1, 'calendar'), (id2, 'form'), (id3, 'tree')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
+3 -2
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -15,11 +15,12 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import idea
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+13 -4
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
@@ -24,7 +24,16 @@
'name': 'Idea Manager',
'version': '0.1',
'category': 'Tools',
'description': """This module allows your user to easily and efficiently participate in the innovation of the enterprise. It allows everybody to express ideas about different subjects. Then, others users can comment these ideas and vote for particular ideas. Each idea as a score based on the different votes. The managers can obtain an easy view on best ideas from all the users. Once installed, check the menu 'Ideas' in the 'Tools' main menu.""",
'description': """This module allows your user to easily and efficiently
participate in the innovation of the enterprise.
It allows everybody to express ideas about different subjects.
Then, others users can comment these ideas and vote for
particular ideas. Each idea as a score based on the
different votes.
The managers can obtain an easy view on best ideas from all
the users. Once installed, check the menu 'Ideas' in the 'Tools' main menu.""",
'author': 'Tiny',
'website': 'http://openerp.com',
'depends': ['base'],
@@ -34,7 +43,7 @@
'idea_view.xml',
'idea_workflow.xml',
'security/idea_security.xml',
'security/ir.model.access.csv',
'security/ir.model.access.csv',
],
'demo_xml': [],
'installable': True,
+106 -40
View File
@@ -21,33 +21,47 @@
from osv import osv, fields
VoteValues = [('-1','Not Voted'),('0','Very Bad'),('25', 'Bad'),('50','Normal'),('75','Good'),('100','Very Good') ]
VoteValues = [('-1', 'Not Voted'), ('0', 'Very Bad'), ('25', 'Bad'), \
('50', 'Normal'), ('75', 'Good'), ('100', 'Very Good') ]
DefaultVoteValue = '50'
class idea_category(osv.osv):
""" Category of Idea """
_name = "idea.category"
_description = "Category for an idea"
_columns = {
'name': fields.char('Category', size=64, required=True),
'summary': fields.text('Summary'),
'parent_id': fields.many2one('idea.category','Parent Categories', ondelete='set null'),
'child_ids': fields.one2many('idea.category','parent_id','Child Categories')
'parent_id': fields.many2one('idea.category', 'Parent Categories', ondelete='set null'),
'child_ids': fields.one2many('idea.category', 'parent_id', 'Child Categories')
}
_sql_constraints = [
('name', 'unique(parent_id,name)', 'The name of the category must be unique' )
]
_order = 'parent_id,name asc'
idea_category()
class idea_idea(osv.osv):
""" Idea """
_name = 'idea.idea'
_rec_name = 'title'
def _vote_avg_compute(self, cr, uid, ids, name, arg, context = None):
if not len(ids):
""" compute average for voting
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of voting’s IDs
@return: dictionay of Idea """
if not ids:
return {}
sql = """SELECT i.id, avg(v.score::integer)
sql = """SELECT i.id, avg(v.score::integer)
FROM idea_idea i LEFT OUTER JOIN idea_vote v ON i.id = v.idea_id
WHERE i.id = ANY(%s)
GROUP BY i.id
@@ -56,11 +70,18 @@ class idea_idea(osv.osv):
cr.execute(sql, (ids,))
return dict(cr.fetchall())
def _vote_count(self,cr,uid,ids,name,arg,context=None):
if not len(ids):
def _vote_count(self, cr, uid, ids, name, arg, context=None):
""" count number of vote
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of voting count’s IDs
@return: dictionay of Idea """
if not ids:
return {}
sql = """SELECT i.id, COUNT(1)
sql = """SELECT i.id, COUNT(1)
FROM idea_idea i LEFT OUTER JOIN idea_vote v ON i.id = v.idea_id
WHERE i.id = ANY(%s)
GROUP BY i.id
@@ -69,41 +90,63 @@ class idea_idea(osv.osv):
cr.execute(sql, (ids,))
return dict(cr.fetchall())
def _comment_count(self,cr,uid,ids,name,arg,context=None):
if not len(ids):
def _comment_count(self, cr, uid, ids, name, arg, context=None):
""" count number of comment
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of comment’s IDs
@return: dictionay of Idea """
if not ids:
return {}
sql = """SELECT i.id, COUNT(1)
sql = """SELECT i.id, COUNT(1)
FROM idea_idea i LEFT OUTER JOIN idea_comment c ON i.id = c.idea_id
WHERE i.id = ANY(%s)
GROUP BY i.id
"""
cr.execute(sql,(ids,))
cr.execute(sql, (ids,))
return dict(cr.fetchall())
def _vote_read(self, cr, uid, ids, name, arg, context = None):
""" Read Vote
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of vote read’s IDs """
res = {}
for id in ids:
res[id] = '-1'
vote_obj = self.pool.get('idea.vote')
votes_ids = vote_obj.search(cr, uid, [('idea_id', 'in', ids), ('user_id', '=', uid)])
for vote in vote_obj.browse(cr, uid, votes_ids, context):
vote_obj_id = vote_obj.browse(cr, uid, votes_ids, context)
for vote in vote_obj_id:
res[vote.idea_id.id] = vote.score
return res
def _vote_save(self, cr, uid, id, field_name, field_value, arg, context = None):
""" save Vote
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of vote save’s IDs """
vote_obj = self.pool.get('idea.vote')
vote = vote_obj.search(cr,uid,[('idea_id', '=', id),('user_id', '=', uid)])
vote = vote_obj.search(cr, uid, [('idea_id', '=', id), ('user_id', '=', uid)])
textual_value = str(field_value)
if vote:
if int(field_value)>=0:
vote_obj.write(cr,uid, vote, { 'score' : textual_value })
if int(field_value) >= 0:
vote_obj.write(cr, uid, vote, {'score': textual_value })
else:
vote_obj.unlink(cr,uid, vote)
vote_obj.unlink(cr, uid, vote)
else:
if int(field_value)>=0:
vote_obj.create(cr,uid, { 'idea_id' : id, 'user_id' : uid, 'score' : textual_value })
if int(field_value) >= 0:
vote_obj.create(cr, uid, {'idea_id': id, 'user_id': uid, 'score': textual_value })
_columns = {
@@ -111,15 +154,20 @@ class idea_idea(osv.osv):
'title': fields.char('Idea Summary', size=64, required=True),
'description': fields.text('Description', required=True, help='Content of the idea'),
'comment_ids': fields.one2many('idea.comment', 'idea_id', 'Comments'),
'create_date' : fields.datetime( 'Creation date', readonly=True),
'vote_ids' : fields.one2many('idea.vote', 'idea_id', 'Vote'),
'my_vote' : fields.function(_vote_read, fnct_inv = _vote_save, string="My Vote", method=True, type="selection", selection=VoteValues),
'vote_avg' : fields.function(_vote_avg_compute, method=True, string="Average Score", type="float"),
'count_votes' : fields.function(_vote_count, method=True, string="Count of votes", type="integer"),
'count_comments': fields.function(_comment_count, method=True, string="Count of comments", type="integer"),
'category_id': fields.many2one('idea.category', 'Category', required=True ),
'state': fields.selection([('draft','Draft'),('open','Opened'),('close','Accepted'),('cancel','Cancelled')], 'State', readonly=True,
help='When the Idea is created the state is \'Draft\'.\n It is opened by the user, the state is \'Opened\'.\
'create_date': fields.datetime('Creation date', readonly=True),
'vote_ids': fields.one2many('idea.vote', 'idea_id', 'Vote'),
'my_vote': fields.function(_vote_read, fnct_inv = _vote_save, \
string="My Vote", method=True, type="selection", selection=VoteValues),
'vote_avg': fields.function(_vote_avg_compute, method=True, string="Average Score", type="float"),
'count_votes': fields.function(_vote_count, method=True, string="Count of votes", type="integer"),
'count_comments': fields.function(_comment_count, method=True, \
string="Count of comments", type="integer"),
'category_id': fields.many2one('idea.category', 'Category', required=True),
'state': fields.selection([('draft', 'Draft'), ('open', 'Opened'), \
('close', 'Accepted'), ('cancel', 'Cancelled')], \
'State', readonly=True,
help='When the Idea is created the state is \'Draft\'.\n It is \
opened by the user, the state is \'Opened\'.\
\nIf the idea is accepted, the state is \'Accepted\'.'),
'stat_vote_ids': fields.one2many('idea.vote.stat', 'idea_id', 'Statistics', readonly=True),
}
@@ -132,62 +180,79 @@ class idea_idea(osv.osv):
_order = 'id desc'
def idea_cancel(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state' : 'cancel' })
self.write(cr, uid, ids, { 'state': 'cancel' })
return True
def idea_open(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state' : 'open' })
self.write(cr, uid, ids, { 'state': 'open' })
return True
def idea_close(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state' : 'close' })
self.write(cr, uid, ids, { 'state': 'close' })
return True
def idea_draft(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state' : 'draft' })
self.write(cr, uid, ids, { 'state': 'draft' })
return True
idea_idea()
class idea_comment(osv.osv):
""" Apply Idea for Comment """
_name = 'idea.comment'
_description = 'Comments'
_rec_name = 'content'
_columns = {
'idea_id': fields.many2one('idea.idea', 'Idea', required=True, ondelete='cascade' ),
'user_id': fields.many2one('res.users', 'User', required=True ),
'content': fields.text( 'Comment', required=True ),
'create_date' : fields.datetime( 'Creation date', readonly=True),
'idea_id': fields.many2one('idea.idea', 'Idea', required=True, ondelete='cascade'),
'user_id': fields.many2one('res.users', 'User', required=True),
'content': fields.text('Comment', required=True),
'create_date': fields.datetime('Creation date', readonly=True),
}
_defaults = {
'user_id': lambda self, cr, uid, context: uid
}
_order = 'id desc'
idea_comment()
class idea_vote(osv.osv):
""" Apply Idea for Vote """
_name = 'idea.vote'
_description = 'Vote for Idea'
_rec_name = 'score'
_columns = {
'user_id': fields.many2one( 'res.users', 'User'),
'user_id': fields.many2one('res.users', 'User'),
'idea_id': fields.many2one('idea.idea', 'Idea', required=True, ondelete='cascade'),
'score': fields.selection( VoteValues, 'Score', required=True)
'score': fields.selection(VoteValues, 'Score', required=True)
}
_defaults = {
#'user_id': lambda self, cr, uid, context: uid,
'score': lambda *a: DefaultVoteValue,
}
idea_vote()
class idea_vote_stat(osv.osv):
""" Idea votes Statistics """
_name = 'idea.vote.stat'
_description = 'Idea Votes Statistics'
_auto = False
_rec_name = 'idea_id'
_columns = {
'idea_id': fields.many2one('idea.idea', 'Idea', readonly=True),
'score': fields.selection( VoteValues, 'Score', readonly=True),
'score': fields.selection(VoteValues, 'Score', readonly=True),
'nbr': fields.integer('Number of Votes', readonly=True),
}
def init(self, cr):
"""
initialize the sql view for the stats
@@ -207,6 +272,7 @@ class idea_vote_stat(osv.osv):
GROUP BY
i.id, v.score, i.id )
""")
idea_vote_stat()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+62 -9
View File
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Idea Category Form View -->
<menuitem name="Tools" id="base.menu_tools" icon="STOCK_PREFERENCES" sequence="15"/>
<record model="ir.ui.view" id="view_idea_category_form">
<field name="name">idea.category.form</field>
@@ -15,6 +18,9 @@
</form>
</field>
</record>
<!-- Idea Category Tree View -->
<record model="ir.ui.view" id="view_idea_category_tree">
<field name="name">idea.category.tree</field>
<field name="model">idea.category</field>
@@ -26,17 +32,25 @@
</tree>
</field>
</record>
<!-- Idea Category Action -->
<record model="ir.actions.act_window" id="action_idea_category">
<field name="name">Categories</field>
<field name="res_model">idea.category</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Configuration" parent="base.menu_tools"
id="base.menu_lunch_survey_root" sequence="6"/>
<!-- <menuitem name="Configuration" parent="menu_tools" id="menu_config"/>-->
<menuitem name="Ideas" parent="base.menu_lunch_survey_root" id="menu_ideas"/>
<menuitem name="Categories" parent="menu_ideas" id="menu_idea_category" action="action_idea_category"/>
<menuitem name="Categories" parent="menu_ideas"
id="menu_idea_category" action="action_idea_category" />
<!-- Idea Category Action -->
<record model="ir.actions.act_window" id="action_idea_category_tree">
<field name="name">Ideas by Categories</field>
@@ -44,12 +58,15 @@
<field name="view_type">tree</field>
<field name="domain">[('parent_id','=',False)]</field>
</record>
<menuitem name="Ideas" parent="base.menu_tools" id="menu_ideas1" sequence="4"/>
<menuitem
name="Ideas by Categories" parent="menu_ideas1"
id="menu_idea_category_tree"
action="action_idea_category_tree"/>
<!-- Oepn Ideas Action -->
<record model="ir.actions.act_window" id="action_idea_idea_categ_open">
<field name="name">Open Ideas</field>
@@ -58,6 +75,7 @@
<field name="view_mode">tree,form</field>
<field name="domain">[('state','=','open'),('category_id','child_of',[active_id])]</field>
</record>
<record model="ir.values" id="action_idea_idea_categ_open_val">
<field name="key2" eval=" 'tree_but_open'" />
<field name="model" eval="'idea.category'" />
@@ -66,6 +84,8 @@
<field name="object" eval="True" />
</record>
<!-- Idea statistics Form View -->
<record model="ir.ui.view" id="view_idea_stat_form">
<field name="name">idea.stat.form</field>
<field name="model">idea.stat</field>
@@ -79,6 +99,8 @@
</field>
</record>
<!--Vote For Idea Tree View -->
<record model="ir.ui.view" id="view_idea_vote_tree">
<field name="name">idea.vote.tree</field>
<field name="model">idea.vote</field>
@@ -91,6 +113,9 @@
</tree>
</field>
</record>
<!--Vote For Idea Form View -->
<record model="ir.ui.view" id="view_idea_vote_form">
<field name="name">idea.vote.form</field>
<field name="model">idea.vote</field>
@@ -104,6 +129,8 @@
</field>
</record>
<!-- New Idea Form View -->
<record model="ir.ui.view" id="view_idea_idea_form">
<field name="name">idea.idea.form</field>
<field name="model">idea.idea</field>
@@ -115,7 +142,6 @@
<field name="title" select="1" />
<field name="category_id" select="1"/>
<field name="user_id" select="1"/>
<!--<field name="my_vote"/>-->
<field name="vote_avg" />
<field name="description" colspan="4" select="2" widget="text_wiki"/>
<field name="state" select="2"/>
@@ -153,6 +179,8 @@
</field>
</record>
<!-- New Idea Tree View -->
<record model="ir.ui.view" id="view_idea_idea_tree">
<field name="name">idea.idea.tree</field>
<field name="model">idea.idea</field>
@@ -166,11 +194,14 @@
<field name="vote_avg" />
<field name="count_comments" />
<field name="count_votes" />
<button name="%(action_idea_post_vote)d" icon="gtk-execute" type="action" states="draft,open" string="Vote"/>
<button name="%(action_idea_post_vote)d" icon="gtk-execute"
type="action" states="draft,open" string="Vote" />
</tree>
</field>
</record>
<!-- Search Idea -->
<record model="ir.ui.view" id="view_idea_idea_search">
<field name="name">idea.idea.search</field>
<field name="model">idea.idea</field>
@@ -180,8 +211,10 @@
<group col="10" colspan="4">
<filter icon="gtk-execute" string="My" domain="[('user_id','=',uid)]" help="My Ideas"/>
<separator orientation="vertical"/>
<filter icon="gtk-execute" string="Draft" domain="[('state','=','draft')]" help="Draft Ideas"/>
<filter icon="gtk-execute" string="Open" domain="[('state','=','open')]" help="Open Ideas"/>
<filter icon="gtk-execute" string="Draft"
domain="[('state','=','draft')]" help="Draft Ideas" />
<filter icon="gtk-execute" string="Open"
domain="[('state','=','open')]" help="Open Ideas" />
<separator orientation="vertical"/>
<field name="title" select="1"/>
<field name="category_id" select="1"/>
@@ -191,6 +224,8 @@
</field>
</record>
<!-- Comments on Idea Tree View -->
<record model="ir.ui.view" id="view_idea_comment_tree">
<field name="name">idea.comment.tree</field>
<field name="model">idea.comment</field>
@@ -203,6 +238,9 @@
</tree>
</field>
</record>
<!-- Idea Action -->
<record model="ir.actions.act_window" id="action_idea_idea">
<field name="name">Ideas</field>
<field name="res_model">idea.idea</field>
@@ -210,8 +248,11 @@
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_idea_idea_search"/>
</record>
<menuitem name="Ideas" parent="menu_ideas1" id="menu_idea_idea" action="action_idea_idea"/>
<!-- Open Idea Action -->
<record model="ir.actions.act_window" id="action_idea_idea_open">
<field name="name">Open Ideas</field>
<field name="res_model">idea.idea</field>
@@ -221,6 +262,8 @@
<field name="filter" eval="True"/>
</record>
<!-- Idea Votes Statistics Graph View -->
<record model="ir.ui.view" id="view_idea_vote_stat_graph">
<field name="name">idea.vote_stat.graph</field>
<field name="model">idea.vote.stat</field>
@@ -233,6 +276,8 @@
</field>
</record>
<!-- Idea Votes Statistics Form View -->
<record model="ir.ui.view" id="view_idea_vote_stat_form">
<field name="name">idea.vote.stat.form</field>
<field name="model">idea.vote.stat</field>
@@ -245,6 +290,9 @@
</form>
</field>
</record>
<!-- Idea Votes Statistics Tree View -->
<record model="ir.ui.view" id="view_idea_vote_stat_tree">
<field name="name">idea.vote.stat.tree</field>
<field name="model">idea.vote.stat</field>
@@ -258,6 +306,8 @@
</field>
</record>
<!-- Idea Votes Statistics Action -->
<record model="ir.actions.act_window" id="action_idea_vote_stat">
<field name="name">Statistics on Votes</field>
<field name="res_model">idea.vote.stat</field>
@@ -265,17 +315,20 @@
<field name="view_mode">graph,tree</field>
</record>
<menuitem name="Reporting" parent="base.menu_tools" id="base.menu_lunch_reporting" sequence="5"/>
<!-- <menuitem name="Reporting" parent="menu_ideas1" id="menu_reporting"/>-->
<menuitem name="Idea" parent="base.menu_lunch_reporting" id="menu_idea_reporting"/>
<menuitem name="Vote Statistics" parent="menu_idea_reporting" id="menu_idea_vote_stat" action="action_idea_vote_stat"/>
<menuitem name="Vote Statistics" parent="menu_idea_reporting"
id="menu_idea_vote_stat" action="action_idea_vote_stat" />
<record model="ir.actions.act_window" id="action_idea_vote">
<!-- Vote For Idea Action -->
<record model="ir.actions.act_window" id="action_idea_vote">
<field name="name">Idea's vote</field>
<field name="res_model">idea.vote</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="All Votes" parent="menu_ideas" id="menu_idea_vote" action="action_idea_vote"/>
</data>
+1
View File
@@ -5,3 +5,4 @@
"access_idea_vote","idea.vote","model_idea_vote","base.group_user",1,1,1,1
"access_idea_vote_stat","idea.vote.stat","model_idea_vote_stat","base.group_user",1,0,0,0
"access_idea_category_system","idea.category system","model_idea_category","base.group_system",1,1,1,1
"idea_post_vote","idea.post.vote","model_idea_post_vote","base.group_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
5 access_idea_vote idea.vote model_idea_vote base.group_user 1 1 1 1
6 access_idea_vote_stat idea.vote.stat model_idea_vote_stat base.group_user 1 0 0 0
7 access_idea_category_system idea.category system model_idea_category base.group_system 1 1 1 1
8 idea_post_vote idea.post.vote model_idea_post_vote base.group_user 1 1 1 1
+4 -2
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -15,8 +15,10 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import idea_post_vote
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+19 -12
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -15,25 +15,29 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
class idea_post_vote(osv.osv_memory):
""" Post Vote For Idea """
_name = "idea.post.vote"
_description = "Post vote"
_columns = {
'vote': fields.selection([('-1', 'Not Voted'),
('0', 'Very Bad'),
('25', 'Bad'),
('50', 'Normal'),
('75', 'Good'),
'vote': fields.selection([('-1', 'Not Voted'),
('0', 'Very Bad'),
('25', 'Bad'),
('50', 'Normal'),
('75', 'Good'),
('100', 'Very Good') ], 'Post Vote', required=True)
}
def do_vote(self, cr, uid, ids, context):
"""
Create idea vote.
@param cr: the current row, from the database cursor,
@@ -41,10 +45,13 @@ class idea_post_vote(osv.osv_memory):
@param ids: List of Idea Post vote’s IDs.
@return: Dictionary {}
"""
data = context and context.get('active_id', False) or False
vote_obj = self.pool.get('idea.vote')
for data in self.read(cr, uid, ids):
score = str(data['vote'])
dic = {'idea_id': context['active_id'], 'user_id': uid, 'score': score }
for do_vote_obj in self.read(cr, uid, ids):
score = str(do_vote_obj['vote'])
dic = {'idea_id': data, 'user_id': uid, 'score': score }
vote = vote_obj.create(cr, uid, dic)
return {}
+11 -15
View File
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Post Idea for vote Form View -->
<record id="view_idea_post_vote" model="ir.ui.view">
<field name="name">idea.post.vote.form</field>
<field name="model">idea.post.vote</field>
@@ -18,32 +21,25 @@
</form>
</field>
</record>
<!-- Post Idea for vote Action -->
<record id="action_idea_post_vote" model="ir.actions.act_window">
<field name="name">Vote</field>
<field name="res_model">idea.post.vote</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_idea_post_vote"/>
<field name="view_id" ref="view_idea_post_vote"/>
<field name="target">new</field>
<field name="context">{'record_id':active_id}</field>
</record>
<!-- <record id="action_idea_post_vote_values" model="ir.values">
<field name="model_id" ref="idea.model_idea_idea" />
<field name="object" eval="1" />
<field name="name">vote</field>
<field name="key2">client_action_multi</field>
<field name="value" eval="'ir.actions.act_window,' + str(ref('action_idea_post_vote'))"/>
<field name="key">action</field>
<field name="model">idea.idea</field>
</record> -->
<!-- Post Idea for vote Action Window -->
<act_window id="action_idea_post_vote_values"
key2="client_action_multi" name="vote"
res_model="idea.post.vote" src_model="idea.idea"
view_mode="form" target="new" view_type="form" />
</data>
</openerp>
+11 -4
View File
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
@@ -25,18 +25,25 @@
"version": "0.1",
"depends": ["base"],
"category" : "Generic Modules/Others",
'description': """
The base module to manage lunch
keep track for the Lunch Order ,Cash Moves ,CashBox ,Product.
Apply Different Category for the product.
""",
"init_xml": [],
"update_xml": [
'security/ir.model.access.csv',
'wizard/lunch_order_cancel_view.xml',
'wizard/lunch_order_confirm_view.xml',
'wizard/lunch_cashbox_clean_view.xml',
'lunch_view.xml',
'wizard/lunch_cashbox_clean_view.xml',
'lunch_view.xml',
'lunch_report.xml',
#'process/lunch_process.xml'
],
"demo_xml": ['lunch_demo.xml'],
"installable": True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+115 -53
View File
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
@@ -23,24 +23,35 @@ from osv import osv, fields
import time
class lunch_category(osv.osv):
""" Lunch category """
_name = 'lunch.category'
_description = "Category"
_columns = {
'name': fields.char('Name', required=True, size=50),
}
_order = 'name'
lunch_category()
class lunch_product(osv.osv):
""" Lunch Product """
_name = 'lunch.product'
_description = "Lunch Product"
def _category_name_get(self, cr, uid, context={}):
""" Get category name
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param context: A standard dictionary for contextual values"""
obj = self.pool.get('lunch.category')
cat_ids= obj.search(cr,uid,[])
res = obj.read(cr,uid,cat_ids,['name', 'category'])
cat_ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, cat_ids, ['name', 'category'])
return [(str(r['id']), r['name']) for r in res]+ [('0','')]
_columns = {
@@ -57,101 +68,145 @@ class lunch_product(osv.osv):
lunch_product()
class lunch_cashbox(osv.osv):
_name='lunch.cashbox'
""" cashbox for Lunch """
_name = 'lunch.cashbox'
_description = "Cashbox for Lunch "
def amount_available(self, cr, uid, ids, field_name, arg, context):
cr.execute("SELECT box,sum(amount) from lunch_cashmove where active = 't' group by box")
r = dict(cr.fetchall())
for i in ids :
r.setdefault(i,0)
return r
_columns={
'manager':fields.many2one('res.users','Manager'),
'name':fields.char('Name',size=30,required=True, unique = True),
""" count available amount
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of create menu’s IDs
@param context: A standard dictionary for contextual values """
cr.execute("SELECT box,sum(amount) from lunch_cashmove where active = 't' group by box")
amount = dict(cr.fetchall())
for i in ids:
amount.setdefault(i, 0)
return amount
_columns = {
'manager': fields.many2one('res.users', 'Manager'),
'name': fields.char('Name', size=30, required=True, unique = True),
'sum_remain': fields.function(amount_available, method=True, string='Remained Total'),
}
lunch_cashbox()
class lunch_cashmove(osv.osv):
_name= 'lunch.cashmove'
""" Move cash """
_columns={
'name': fields.char('Name',size=128),
'user_cashmove': fields.many2one('res.users','User Name', required=True),
'amount': fields.float('Amount', digits=(16,2)),
'box':fields.many2one('lunch.cashbox','Box Name',size=30,required=True),
'active':fields.boolean('Active'),
_name = 'lunch.cashmove'
_description = "Move cash"
_columns = {
'name': fields.char('Name', size=128),
'user_cashmove': fields.many2one('res.users', 'User Name', required=True),
'amount': fields.float('Amount', digits=(16, 2)),
'box': fields.many2one('lunch.cashbox', 'Box Name', size=30, required=True),
'active': fields.boolean('Active'),
'create_date': fields.datetime('Created date', readonly=True),
}
_defaults={
_defaults = {
'active': lambda *a: True,
}
lunch_cashmove()
class lunch_order(osv.osv):
_name='lunch.order'
_rec_name= "user_id"
""" Apply lunch order """
_name = 'lunch.order'
_description = "Lunch Order"
_rec_name = "user_id"
def _price_get(self, cr, uid, ids, name, args, context=None):
""" Get Price of Product
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of Lunch order’s IDs
@param context: A standard dictionary for contextual values """
res = {}
for o in self.browse(cr, uid, ids):
res[o.id] = o.product.price
for price in self.browse(cr, uid, ids):
res[price.id] = price.product.price
return res
_columns={
'user_id': fields.many2one('res.users','User Name', required=True,
readonly=True, states={'draft':[('readonly',False)]}),
'product':fields.many2one('lunch.product','Product', required=True,
readonly=True, states={'draft':[('readonly',False)]}, change_default=True),
'date': fields.date('Date',readonly=True,states={'draft':[('readonly',False)]}),
'cashmove':fields.many2one('lunch.cashmove', 'CashMove' , readonly=True ),
'descript':fields.char('Description Order', readonly=True, size=50,
states={'draft':[('readonly',False)]}),
'state': fields.selection([('draft','Draft'), ('confirmed','Confirmed'),],
_columns = {
'user_id': fields.many2one('res.users', 'User Name', required=True, \
readonly=True, states={'draft':[('readonly', False)]}),
'product': fields.many2one('lunch.product', 'Product', required=True, \
readonly=True, states={'draft':[('readonly', False)]}, change_default=True),
'date': fields.date('Date', readonly=True, states={'draft':[('readonly', False)]}),
'cashmove': fields.many2one('lunch.cashmove', 'CashMove' , readonly=True),
'descript': fields.char('Description Order', readonly=True, size=50, \
states = {'draft':[('readonly', False)]}),
'state': fields.selection([('draft', 'Draft'), ('confirmed', 'Confirmed'), ], \
'State', readonly=True, select=True),
'price': fields.function(_price_get, method=True, string="Price"),
}
_defaults={
_defaults = {
'user_id': lambda self,cr,uid,context: uid,
'date': lambda self,cr,uid,context: time.strftime('%Y-%m-%d'),
'state': lambda self,cr,uid,context: 'draft',
}
def confirm(self,cr,uid,ids,box,context):
cashmove_ref= self.pool.get('lunch.cashmove')
for order in self.browse(cr,uid,ids):
def confirm(self, cr, uid, ids, box, context):
""" confirm order
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of confirm order’s IDs
@param context: A standard dictionary for contextual values """
cashmove_ref = self.pool.get('lunch.cashmove')
for order in self.browse(cr, uid, ids):
if order.state == 'confirmed':
continue
new_id= cashmove_ref.create(cr,uid,{'name': order.product.name+' order',
new_id = cashmove_ref.create(cr, uid, {'name': order.product.name+' order',
'amount':-order.product.price,
'user_cashmove':order.user_id.id,
'box':box,
'active':True,
})
self.write(cr,uid,[order.id],{'cashmove':new_id, 'state':'confirmed'})
self.write(cr, uid, [order.id], {'cashmove': new_id, 'state': 'confirmed'})
return {}
def lunch_order_cancel(self,cr,uid,ids,context):
orders= self.browse(cr,uid,ids)
def lunch_order_cancel(self, cr, uid, ids, context):
"""" cancel order
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of create menu’s IDs
@param context: A standard dictionary for contextual values """
orders = self.browse(cr, uid, ids)
for order in orders:
if not order.cashmove:
continue
if order.cashmove.id:
self.pool.get('lunch.cashmove').unlink(cr, uid, [order.cashmove.id])
self.write(cr,uid,ids,{'state':'draft'})
self.write(cr, uid, ids, {'state':'draft'})
return {}
def onchange_product(self, cr, uid, ids, product):
""" Get price for Product
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of create menu’s IDs
@product: Product To Ordered """
if not product:
return {'value': {'price': 0.0}}
price = self.pool.get('lunch.product').read(cr, uid, product, ['price'])['price']
@@ -159,19 +214,25 @@ class lunch_order(osv.osv):
lunch_order()
class report_lunch_amount(osv.osv):
_name='report.lunch.amount'
""" Lunch Amount Report """
_name = 'report.lunch.amount'
_description = "Amount available by user and box"
_auto = False
_rec_name= "user"
_rec_name = "user"
_columns = {
'user_id': fields.many2one('res.users','User Name',readonly=True),
'amount': fields.float('Amount', readonly=True, digits=(16,2)),
'box':fields.many2one('lunch.cashbox','Box Name',size=30,readonly=True),
'user_id': fields.many2one('res.users', 'User Name', readonly=True),
'amount': fields.float('Amount', readonly=True, digits=(16, 2)),
'box': fields.many2one('lunch.cashbox', 'Box Name', size=30, readonly=True),
}
def init(self, cr):
""" @param cr: the current row, from the database cursor"""
cr.execute("""
create or replace view report_lunch_amount as (
select
@@ -187,5 +248,6 @@ class report_lunch_amount(osv.osv):
)""")
report_lunch_amount()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+75 -27
View File
@@ -2,21 +2,25 @@
<openerp>
<data>
<menuitem icon="STOCK_PREFERENCES" id="base.menu_tools" name="Tools" sequence="15"/>
<!--<menuitem name="Tools" id="menu_tools" icon="STOCK_PREFERENCES"/>
<menuitem name="Lunch Order" parent="menu_tools" id="menu_lunch" sequence="1"/>
<menuitem name="Reporting" parent="menu_tools" id="menu_lunch_reporting" sequence="4"/>
<menuitem name="Lunch Orders" parent="menu_lunch_reporting" id="menu_lunch_reporting_order" sequence="1"/>
<menuitem name="Configuration" parent="menu_tools" id="menu_lunch_category_root" sequence="5"/>
<menuitem name="Tools" id="menu_tools" icon="STOCK_PREFERENCES"/>-->
<menuitem name="Lunch Order" parent="base.menu_tools"
id="menu_lunch" sequence="1" />
<menuitem name="Lunch Order" parent="base.menu_tools" id="menu_lunch" sequence="1"/>
<menuitem name="Reporting" parent="base.menu_tools" id="base.menu_lunch_reporting" sequence="5"/>
<menuitem name="Lunch Orders" parent="base.menu_lunch_reporting" id="menu_lunch_reporting_order" sequence="1"/>
<menuitem name="Configuration" parent="base.menu_tools" id="base.menu_lunch_survey_root" sequence="6"/>
<menuitem name="Reporting" parent="base.menu_tools"
id="base.menu_lunch_reporting" sequence="5" />
<menuitem name="Lunch Orders"
parent="base.menu_lunch_reporting"
id="menu_lunch_reporting_order" sequence="1" />
<menuitem name="Lunch" parent="base.menu_lunch_survey_root" id="menu_lunch_category_root_configuration" sequence="1"/>
<record model="ir.ui.view" id="view_lunch_order_form">
<menuitem name="Configuration" parent="base.menu_tools"
id="base.menu_lunch_survey_root" sequence="6" />
<menuitem name="Lunch" parent="base.menu_lunch_survey_root"
id="menu_lunch_category_root_configuration" sequence="1" />
<!-- Lunch order Form view -->
<record model="ir.ui.view" id="view_lunch_order_form">
<field name="name">Order</field>
<field name="model">lunch.order</field>
<field name="arch" type="xml">
@@ -34,6 +38,8 @@
</field>
</record>
<!-- Lunch order Tree view -->
<record model="ir.ui.view" id="view_lunch_order_tree">
<field name="name">Order</field>
<field name="model">lunch.order</field>
@@ -51,22 +57,18 @@
</field>
</record>
<!-- Lunch order Action -->
<record model="ir.actions.act_window" id="action_lunch_order_form">
<field name="name">Lunch Orders</field>
<field name="res_model">lunch.order</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Lunch Order" parent="menu_lunch" id="menu_lunch_order_form" action="action_lunch_order_form"/>
<!-- <record model="ir.actions.act_window" id="action_lunch_order_day_form">-->
<!-- <field name="name"> Order of the day</field>-->
<!-- <field name="res_model">lunch.order</field>-->
<!-- <field name="domain">[('date','=',time.strftime('%Y-%m-%d'))]</field>-->
<!---->
<!-- </record>-->
<!-- <menuitem name="Order of the day" parent="menu_lunch_order_form" id="menu_lunch_order_day_form" action="action_lunch_order_day_form"/>-->
<menuitem name="Lunch Order" parent="menu_lunch"
id="menu_lunch_order_form" action="action_lunch_order_form" />
<!-- Cash Box Form view -->
<record model="ir.ui.view" id="view_lunch_cashbox_form">
<field name="name">CashBox</field>
@@ -79,6 +81,8 @@
</field>
</record>
<!-- Cash Box Tree view -->
<record model="ir.ui.view" id="view_lunch_cashbox_tree">
<field name="name">CashBox</field>
<field name="model">lunch.cashbox</field>
@@ -92,11 +96,19 @@
</field>
</record>
<!-- Cash Box Action -->
<record model="ir.actions.act_window" id="action_lunch_cashbox_form">
<field name="name"> CashBox </field>
<field name="res_model">lunch.cashbox</field>
</record>
<menuitem name="CashBox" parent="menu_lunch_category_root_configuration" id="menu_lunch_cashbox_form" action="action_lunch_cashbox_form"/>
<menuitem name="CashBox"
parent="menu_lunch_category_root_configuration"
id="menu_lunch_cashbox_form"
action="action_lunch_cashbox_form" />
<!-- Cash Move Form view -->
<record model="ir.ui.view" id="view_lunch_cashmove_form">
<field name="name">CashMove</field>
@@ -113,6 +125,8 @@
</field>
</record>
<!-- Cash Move Tree view -->
<record model="ir.ui.view" id="view_lunch_cashmove_tree">
<field name="name">CashMove</field>
<field name="model">lunch.cashmove</field>
@@ -128,12 +142,18 @@
</field>
</record>
<!-- Cash Move Action -->
<record model="ir.actions.act_window" id="action_lunch_cashmove_form">
<field name="name">CashMove</field>
<field name="res_model">lunch.cashmove</field>
</record>
<menuitem name="Cash Moves" parent="menu_lunch" id="menu_lunch_cashmove_form" action="action_lunch_cashmove_form"/>
<menuitem name="Cash Moves" parent="menu_lunch"
id="menu_lunch_cashmove_form"
action="action_lunch_cashmove_form" />
<!-- Lunch Category Form view -->
<record model="ir.ui.view" id="view_lunch_category_form">
<field name="name"> Category of product </field>
@@ -146,6 +166,8 @@
</field>
</record>
<!-- Lunch Category Tree view -->
<record model="ir.ui.view" id="view_lunch_category_tree">
<field name="name">Category</field>
<field name="model">lunch.category</field>
@@ -157,12 +179,15 @@
</field>
</record>
<!-- Lunch Category Action -->
<record model="ir.actions.act_window" id="action_lunch_category_form">
<field name="name"> Category of product </field>
<field name="res_model">lunch.category</field>
</record>
<!-- Lunch Product Form view -->
<record model="ir.ui.view" id="view_lunch_product_form">
<field name="name">Products</field>
<field name="type">form</field>
@@ -178,6 +203,7 @@
</field>
</record>
<!-- Lunch Product Tree view -->
<record model="ir.ui.view" id="view_lunch_product_tree">
<field name="name">Products</field>
@@ -193,15 +219,29 @@
</field>
</record>
<!-- Lunch Product Action -->
<record model="ir.actions.act_window" id="action_lunch_product_form">
<field name="name">Product</field>
<field name="res_model">lunch.product</field>
</record>
<menuitem name="Tools/Lunch/Configuration/Products" id="menu_lunch_product_form" action="action_lunch_product_form" sequence="1"/>
<menuitem name="Products" parent="menu_lunch_category_root_configuration" id="menu_lunch_product_form" action="action_lunch_product_form" sequence="2"/>
<menuitem name="Category of product" parent="menu_lunch_category_root_configuration" id="menu_lunch_category_form" action="action_lunch_category_form" sequence="1"/>
<menuitem name="Tools/Lunch/Configuration/Products"
id="menu_lunch_product_form" action="action_lunch_product_form"
sequence="1" />
<menuitem name="Products"
parent="menu_lunch_category_root_configuration"
id="menu_lunch_product_form" action="action_lunch_product_form"
sequence="2" />
<menuitem name="Category of product"
parent="menu_lunch_category_root_configuration"
id="menu_lunch_category_form"
action="action_lunch_category_form" sequence="1" />
<!-- Lunch Amount Tree view -->
<record model="ir.ui.view" id="view_report_lunch_amount_tree">
<field name="name">Lunch amount</field>
@@ -216,6 +256,8 @@
</field>
</record>
<!-- Lunch Amount Form view -->
<record model="ir.ui.view" id="view_report_lunch_amount_form">
<field name="name">Lunch amount</field>
<field name="model">report.lunch.amount</field>
@@ -229,6 +271,7 @@
</field>
</record>
<!-- Lunch Amount Action -->
<record model="ir.actions.act_window" id="action_report_lunch_amount_tree">
<field name="name">Lunch amount</field>
@@ -236,7 +279,12 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Cash Position by User" parent="menu_lunch_reporting_order" action="action_report_lunch_amount_tree" id="menu_lunch_report_amount_tree"/>
<menuitem name="Cash Position by User"
parent="menu_lunch_reporting_order"
action="action_report_lunch_amount_tree"
id="menu_lunch_report_amount_tree" />
</data>
</openerp>
+9 -6
View File
@@ -1,7 +1,10 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_lunch_category","lunch.category","model_lunch_category",base.group_user,1,1,1,1
"access_lunch_product","lunch.product","model_lunch_product",base.group_user,1,1,1,1
"access_lunch_cashbox","lunch.cashbox","model_lunch_cashbox",base.group_user,1,1,1,1
"access_lunch_cashmove","lunch.cashmove","model_lunch_cashmove",base.group_user,1,1,1,1
"access_lunch_order","lunch.order","model_lunch_order",base.group_user,1,1,1,1
"access_report_lunch_amount","report.lunch.amount","model_report_lunch_amount",base.group_user,1,1,1,1
"access_lunch_category","lunch.category","model_lunch_category","base.group_user",1,1,1,1
"access_lunch_product","lunch.product","model_lunch_product","base.group_user",1,1,1,1
"access_lunch_cashbox","lunch.cashbox","model_lunch_cashbox","base.group_user",1,1,1,1
"access_lunch_cashmove","lunch.cashmove","model_lunch_cashmove","base.group_user",1,1,1,1
"access_lunch_order","lunch.order","model_lunch_order","base.group_user",1,1,1,1
"access_report_lunch_amount","report.lunch.amount","model_report_lunch_amount","base.group_user",1,1,1,1
"lunch_order_confirm ","lunch.order.confirm","model_lunch_order_confirm","base.group_user",1,1,1,1
"lunch_order_cancel","lunch.order.cancel","model_lunch_order_cancel","base.group_user",1,1,1,1
"lunch_cashbox_clean","lunch.cashbox.clean","model_lunch_cashbox_clean","base.group_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_lunch_category lunch.category model_lunch_category base.group_user 1 1 1 1
3 access_lunch_product lunch.product model_lunch_product base.group_user 1 1 1 1
4 access_lunch_cashbox lunch.cashbox model_lunch_cashbox base.group_user 1 1 1 1
5 access_lunch_cashmove lunch.cashmove model_lunch_cashmove base.group_user 1 1 1 1
6 access_lunch_order lunch.order model_lunch_order base.group_user 1 1 1 1
7 access_report_lunch_amount report.lunch.amount model_report_lunch_amount base.group_user 1 1 1 1
8 lunch_order_confirm lunch.order.confirm model_lunch_order_confirm base.group_user 1 1 1 1
9 lunch_order_cancel lunch.order.cancel model_lunch_order_cancel base.group_user 1 1 1 1
10 lunch_cashbox_clean lunch.cashbox.clean model_lunch_cashbox_clean base.group_user 1 1 1 1
+4 -2
View File
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,11 +15,13 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import lunch_order_confirm
import lunch_order_cancel
import lunch_cashbox_clean
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+22 -14
View File
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,17 +15,19 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
class lunch_cashbox_clean(osv.osv_memory):
_name = "lunch.cashbox.clean"
_description = "clean cashbox"
def set_to_zero(self, cr, uid, ids, context):
"""
clean Cashbox. set active fields False.
@param cr: the current row, from the database cursor,
@@ -33,22 +35,28 @@ class lunch_cashbox_clean(osv.osv_memory):
@param ids: List Lunch cashbox Clean’s IDs
@return:Dictionary {}.
"""
data = context and context.get('active_ids', []) or []
cashmove_ref = self.pool.get('lunch.cashmove')
cr.execute("select user_cashmove, box,sum(amount) from lunch_cashmove where active = 't' and box in (%s) group by user_cashmove, box" % ','.join(map(str, context['active_ids'])))
cr.execute("select user_cashmove, box,sum(amount) from lunch_cashmove \
where active = 't' and box in (%s) group by user_cashmove, \
box" % ','.join(map(str, data)))
res = cr.fetchall()
cr.execute("update lunch_cashmove set active = 'f' where active= 't' and box in (%s)" % ','.join(map(str, context['active_ids'])))
## to_unactive= {}.fromkeys([r[0] for r in cr.fetchall]).keys()
## print to_unactive
## cashmove_ref.write(cr,uid,to_unactive,{'active':False})
cr.execute("update lunch_cashmove set active = 'f' where active= 't' \
and box in (%s)" % ','.join(map(str, data)))
for (user_id, box_id, amount) in res:
cashmove_ref.create(cr, uid, {'name': 'Summary for user' + str(user_id),
'amount': amount,
'user_cashmove': user_id,
'box': box_id,
'active': True,
cashmove_ref.create(cr, uid, {'name': 'Summary for user' + str(user_id),
'amount': amount,
'user_cashmove': user_id,
'box': box_id,
'active': True,
})
return {}
lunch_cashbox_clean()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Lunch cashbox -->
<record id="view_lunch_cashbox_clean" model="ir.ui.view">
<field name="name">lunch.cashbox.clean.form</field>
<field name="model">lunch.cashbox.clean</field>
@@ -18,21 +21,21 @@
</form>
</field>
</record>
<record id="action_lunch_cashbox_clean" model="ir.actions.act_window">
<field name="name">Set CashBox to Zero</field>
<field name="res_model">lunch.cashbox.clean</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_lunch_cashbox_clean"/>
<field name="view_id" ref="view_lunch_cashbox_clean"/>
<field name="target">new</field>
<field name="context">{'record_id':active_id}</field>
</record>
<act_window id="action_lunch_cashbox_clean_values"
key2="client_action_multi" name="Set CashBox to Zero"
res_model="lunch.cashbox.clean" src_model="lunch.cashbox"
view_mode="form" target="new" view_type="form" />
</data>
</openerp>
+6 -5
View File
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
@@ -26,7 +26,7 @@ class lunch_order_cancel(osv.osv_memory):
"""
_name = "lunch.order.cancel"
_description = "Cancel Order"
def cancel(self, cr, uid, ids, context):
"""
Cancel cashmove entry from cashmoves and update state to draft.
@@ -34,8 +34,9 @@ class lunch_order_cancel(osv.osv_memory):
@param uid: the current user’s ID for security checks,
@param ids: List Lunch Order Cancel’s IDs
"""
return self.pool.get('lunch.order').lunch_order_cancel(cr, uid, context['active_ids'], context)
data = context and context.get('active_ids', []) or []
return self.pool.get('lunch.order').lunch_order_cancel(cr, uid, data, context)
lunch_order_cancel()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- cancel order -->
<record id="view_lunch_order_cancel" model="ir.ui.view">
<field name="name">lunch.order.cancel.form</field>
<field name="model">lunch.order.cancel</field>
@@ -18,21 +21,21 @@
</form>
</field>
</record>
<record id="action_lunch_order_cancel" model="ir.actions.act_window">
<field name="name">Cancel Order</field>
<field name="res_model">lunch.order.cancel</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_lunch_order_cancel"/>
<field name="view_id" ref="view_lunch_order_cancel"/>
<field name="target">new</field>
<field name="context">{'record_id':active_id}</field>
</record>
<act_window id="action_lunch_order_cancel_values"
key2="client_action_multi" name="Cancel Order"
res_model="lunch.order.cancel" src_model="lunch.order"
view_mode="form" target="new" view_type="form" />
</data>
</openerp>
+13 -10
View File
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,7 +15,7 @@
# 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 <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
@@ -27,22 +27,25 @@ class lunch_order_confirm(osv.osv_memory):
"""
_name = "lunch.order.confirm"
_description = "confirm Order"
_columns = {
'confirm_cashbox':fields.many2one('lunch.cashbox', 'Name of box', required=True),
'confirm_cashbox':fields.many2one('lunch.cashbox', 'Name of box', required=True),
}
def confirm(self, cr, uid, ids, context):
"""
confirm Lunch Order.Create cashmoves in launch cashmoves when state is
confirm Lunch Order.Create cashmoves in launch cashmoves when state is
confirm in lunch order.
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List Lunch Order confirm’s IDs
@return: Dictionary {}.
@return: Dictionary {}.
"""
data = context and context.get('active_ids', []) or []
order_ref = self.pool.get('lunch.order')
for data in self.read(cr, uid, ids):
order_ref.confirm(cr, uid, context['active_ids'], data['confirm_cashbox'], context)
for confirm_obj in self.read(cr, uid, ids):
order_ref.confirm(cr, uid, data, confirm_obj['confirm_cashbox'], context)
return {}
lunch_order_confirm()
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- confirm order -->
<record id="view_lunch_order_confirm" model="ir.ui.view">
<field name="name">lunch.order.confirm.form</field>
<field name="model">lunch.order.confirm</field>
@@ -20,21 +23,21 @@
</form>
</field>
</record>
<record id="action_lunch_order_confirm" model="ir.actions.act_window">
<field name="name">Confirm Order</field>
<field name="res_model">lunch.order.confirm</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_lunch_order_confirm"/>
<field name="view_id" ref="view_lunch_order_confirm"/>
<field name="target">new</field>
<field name="context">{'record_id':active_id}</field>
</record>
<act_window id="action_lunch_order_confirm_values"
key2="client_action_multi" name="Confirm Order"
res_model="lunch.order.confirm" src_model="lunch.order"
view_mode="form" target="new" view_type="form" />
</data>
</openerp>
+37 -96
View File
@@ -2,11 +2,8 @@
<openerp>
<data>
<!--
<!-- Wizard view for the load data -->
Wizard view for the load data
-->
<record id="bi_load_db_form" model="ir.ui.view">
<field name="name">bi.load.db.form</field>
<field name="model">bi.load.db.wizard</field>
@@ -37,9 +34,8 @@ Wizard view for the load data
</record>
<!--
Wizard For Olap Warehouse
-->
<!-- Wizard For Olap Warehouse -->
<record id="view_warehouse_bi" model="ir.ui.view">
<field name="name">Olap Warehouse</field>
<field name="model">olap.warehouse.wizard</field>
@@ -69,10 +65,8 @@ Wizard For Olap Warehouse
sequence="51"
parent="base.next_id_50"
/>
<!--
Wizard View for the parameters wizard
-->
<!-- Wizard View for the parameters wizard -->
<record id="view_config_bi" model="ir.ui.view">
<field name="name">Parameters Configuration</field>
@@ -116,11 +110,7 @@ Wizard View for the parameters wizard
</record>
<!--
Wizard view for the Auto Configuring the data
-->
<!-- Wizard view for the Auto Configuring the data -->
<record id="bi_auto_configure_form" model="ir.ui.view">
<field name="name">bi.auto.configure.form</field>
@@ -176,20 +166,25 @@ Wizard view for the Auto Configuring the data
<field name="loaded" colspan="3"/>
<button name="%(act_bi_load_db_wizard)d" string="Reload Structure" type="action" states="done"/>
<field name="configure" colspan="3"/>
<button name="%(bi_load_configuration_table)d" string="ReConfigure Structure" type="action" states="done"/>
<!-- <button string="Configure Manually" name="dbconfigure" states="dbload" target="new"/>-->
<button name="%(bi_load_configuration_table)d"
string="ReConfigure Structure" type="action"
states="done" />
<field name="ready" select="2" colspan="3"/>
<field name="note" colspan="4"/>
<field name="state" select="2" colspan="2" />
<group colspan="2">
<button string="Connect to Database" name="dbconnect" states="none"/>
<button string="Load Database Structure" name="%(act_bi_load_db_wizard)d" type="action" states="dbconnect" target="new" />
<button string="Load Database Structure"
name="%(act_bi_load_db_wizard)d" type="action"
states="dbconnect" target="new" />
<button string="Configure Manually" name="dbconfigure" states="dbload"/>
<button string="Mark as Configured" name="dbready" states="dbconfigure"/>
</group>
<separator string="Auto Application Configuration" colspan="4"/>
<field name="app_detect" nolabel="1" colspan="3"/>
<button string="Configure Automatically " name="%(act_bi_auto_configure)d" type="action" states="dbload" target="new"/>
<button string="Configure Automatically "
name="%(act_bi_auto_configure)d" type="action"
states="dbload" target="new" />
</form>
</field>
</record>
@@ -228,13 +223,16 @@ Wizard view for the Auto Configuring the data
<field name="field_id"/>
</tree>
</field>
<field name="available_table_ids" colspan="4" nolabel="1" readonly="0" domain="[('available_table_ids','in',available_table_ids)]" context="{'flag':True,'master_dim':context.get('d_id',False),'master_schema':context.get('parent_schema_id',False),'link_col':column_link_id}">
<tree string="Database Tables">
<field name="related_to" string="Joined Table"/>
<field name="name"/>
<field name="table_id" />
<field name="primary_key" />
</tree>
<field name="available_table_ids" colspan="4"
nolabel="1" readonly="0"
domain="[('available_table_ids','in',available_table_ids)]"
context="{'flag':True,'master_dim':context.get('d_id',False),'master_schema':context.get('parent_schema_id',False),'link_col':column_link_id}">
<tree string="Database Tables">
<field name="related_to" string="Joined Table" />
<field name="name" />
<field name="table_id" />
<field name="primary_key" />
</tree>
</field>
</form>
</field>
@@ -276,11 +274,6 @@ Wizard view for the Auto Configuring the data
<field name="schema_id" select="1" attrs="{'readonly':[('schema_id','!=','')]}"/>
<field name="query_log" select="2"/>
<field name="table_id" colspan="4" context="{'parent_schema_id':schema_id}"/>
<!--<separator colspan="4" string="Dimensions"/>
<field name="dimension_ids" colspan="4" nolabel="1"/>
<separator colspan="4" string="Measures"/>
<field name="measure_ids" colspan="4" nolabel="1"/>-->
</form>
</field>
</record>
@@ -319,19 +312,6 @@ Wizard view for the Auto Configuring the data
<form string="Olap dimension">
<field name="name" select="1"/>
<field name="cube_id" select="1" attrs="{'readonly':[('cube_id','!=','')]}"/>
<!-- <field name="cube_id" on_change="onchange_cube_id(cube_id)" select="1" attrs="{'readonly':[('cube_id','!=','')]}"/>
<field name="foreign_key_table" select="2"/>
<field name="foreign_key" select="2"/>
<separator colspan="4" string="Select In These Tables For Foreign Keys"/>
<field name="available_foreign_table_ids" nolabel="1" colspan="4" readonly="0">
<tree string="Database Tables">
<button string="Mark as Foreign Table" name="mark_foreign" context="{'parent_id':parent.id,'parent_name':parent.name,'parent_cube':parent.cube_id,'reload':1}" type="object"/>
<field name="table_id" />
<field name="name" string="Link Column"/>
</tree>
</field>
<separator colspan="4" string="Hierarchies"/>
<field name="hierarchy_ids" colspan="4" nolabel="1"/>-->
</form>
</field>
</record>
@@ -418,12 +398,13 @@ Wizard view for the Auto Configuring the data
<field name="arch" type="xml">
<form string="Olap level">
<field name="name" select="1" colspan="4"/>
<field name="column_name" select="1" on_change="onchange_column_name(column_name)" context="{'filter_cols_hier':hierarchy_id}"/>
<field name="column_name" select="1"
on_change="onchange_column_name(column_name)"
context="{'filter_cols_hier':hierarchy_id}" />
<field name="column_id_name" select="1"/>
<field name="type" select="1"/>
<field name="table_name" select="1"/>
<field name="sequence"/>
<!-- <field name="hierarchy_id" select="1"/>-->
<field name="hierarchy_id" select="1" attrs="{'readonly':[('hierarchy_id','!=','')]}"/>
</form>
</field>
@@ -466,21 +447,6 @@ Wizard view for the Auto Configuring the data
<field name="value_column_id_name" invisible="True"/>
<field name="table_name" invisible="True"/>
<field name="measure_type"/>
<!-- <notebook colspan="4">
<page string="Fact Table Column" >
<newline/>
<field name="value_column" select="1" on_change="onchange_measure_name(value_column)" context="{'filter_cols_cube':cube_id}"/>
<field name="agregator" select="2"/>
<field name="formatstring" select="2"/>
</page>
<page string="SQL Expression" attrs="{'invisible':[('measure_type','!=','sql_expr')]}">
<field name="value_sql" colspan="4" select="2"/>
<field name="datatype" select="2"/>
</page>
</notebook>
-->
<group colspan="4" attrs="{'invisible':[('measure_type','!=','fact_column')]}">
<newline/>
<field name="value_column" select="1" attrs="{'required':[('measure_type','=','fact_column')]}" on_change="onchange_measure_name(value_column)" context="{'filter_cols_cube':cube_id}"/>
@@ -489,7 +455,8 @@ Wizard view for the Auto Configuring the data
</group>
<group colspan="4" attrs="{'invisible':[('measure_type','!=','sql_expr')]}">
<newline/>
<field name="value_sql" colspan="4" select="2" attrs="{'required':[('measure_type','=','sql_expr')]}"/>
<field name="value_sql" colspan="4" select="2"
attrs="{'required':[('measure_type','=','sql_expr')]}" />
<field name="datatype" select="2"/>
</group>
</form>
@@ -569,11 +536,7 @@ Wizard view for the Auto Configuring the data
action="action_olap_saved_query_form"
id="menu_action_olap_saved_query_form"/>
<!--
All Logs
-->
<!-- All Logs -->
<record model="ir.ui.view" id="view_olap_query_logs_tree">
<field name="name">olap.query.logs</field>
@@ -608,22 +571,14 @@ All Logs
<field name="res_model">olap.query.logs</field>
<field name="view_type">form</field>
</record>
<menuitem
name="All Logs"
action="action_olap_query_logs_form"
id="menu_action_olap_query_logs_form"
parent="menu_bi_conf_tools"/>
<!--
All Logs / My logs
-->
<!-- All Logs / My logs -->
<record model="ir.ui.view" id="view_olap_query_logs_my_tree">
<field name="name">olap.query.logs</field>
@@ -649,6 +604,9 @@ All Logs / My logs
</tree>
</field>
</record>
<!-- Query Logs -->
<record model="ir.ui.view" id="view_olap_query_logs_my_form">
<field name="name">olap.query.logs.form</field>
<field name="model">olap.query.logs</field>
@@ -656,8 +614,6 @@ All Logs / My logs
<field name="arch" type="xml">
<form string="My Logs">
<field name="user_id" select="1" readonly="True"/>
<!-- domain="[('uid','=',uid)]"
/> -->
<field name="query" select="1" readonly="True"/>
<field name="time" select="2" readonly="True"/>
<field name="result_size" select="2" readonly="True"/>
@@ -666,8 +622,8 @@ All Logs / My logs
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_olap_query_logs_my_form">
<field name="name">My Logs</field>
<field name="res_model">olap.query.logs</field>
@@ -675,27 +631,12 @@ All Logs / My logs
<field name="view_mode">tree,form,mdx</field>
<field name="domain">[('user_id','=',uid)]</field>
</record>
<menuitem
name="My Logs"
action="action_olap_query_logs_my_form"
id="menu_action_olap_query_logs_my_form"
parent="menu_action_olap_query_logs_form"/>
<!--
Clear All Logs
-->
<!--
Clear My logs
-->
</data>
</openerp>
+12 -9
View File
@@ -2,22 +2,19 @@
<openerp>
<data>
<!-- <menuitem-->
<!-- name="Businesss Intelligence"-->
<!-- id="menu_bi"-->
<!-- icon="terp-account" parent="base.next_id_50"/>-->
<menuitem icon="terp-graph" id="base.reporting_menu" name="Reporting" sequence="8"/>
<menuitem
id="base.next_id_50"
name="Configuration"
parent="base.reporting_menu"
groups="base.group_system"
sequence="3"/>
<menuitem
name="Custom Reports" id="base.menu_custom_reports"
parent="base.reporting_menu" sequence="1"/>
<menuitem
name="Businesss Intelligence Configuration"
id="menu_bi_configuration"
@@ -49,18 +46,24 @@
<menuitem name="Clear Logs" action="action_view_olap_query_logs_clear" icon="STOCK_EXECUTE"
id="menu_bi_clear_logs" sequence="30" parent="menu_bi_conf_tools"/>
<record model="ir.actions.url" id="menu_url_cube_browser">
<field name="name">name_menu_url_cube_browser</field>
<field name="url">http://localhost:8080/browser</field>
</record>
<menuitem name="Cube Browser" id="menu_browser_url" type="url" action="menu_url_cube_browser" parent="base.menu_custom_reports" sequence="1"/>
<menuitem name="Cube Browser" id="menu_browser_url" type="url"
action="menu_url_cube_browser" parent="base.menu_custom_reports"
sequence="1" />
<record model="ir.actions.url" id="menu_url_cube_designer">
<field name="name">name_menu_url_cube_designer</field>
<field name="url">http://localhost:8080/designer</field>
</record>
<menuitem name="Cube Designer" sequence="60" action="menu_url_cube_designer" type="url" id="menu_designer_url" parent="base.next_id_50"/>
<menuitem name="Cube Designer" sequence="60"
action="menu_url_cube_designer" type="url" id="menu_designer_url"
parent="base.next_id_50" />
</data>
</openerp>
+237 -282
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -28,7 +28,6 @@
from osv import fields, osv
class olap_load_column(osv.osv_memory):
""" Load Database Column """
_name = "olap.load.column"
_description = "Olap Load Column"
@@ -38,11 +37,12 @@ class olap_load_column(osv.osv_memory):
@param cr: the current row, from the database cursor,
@param uid: the current user\'s ID for security checks,
@param ids: List of load column,
@return : dictionary of database columns window on give id
@return: dictionary of database columns window on give id
"""
data = context and context.get('active_id', False) or False
ids_cols = self.pool.get('olap.database.columns').search(cr, uid,\
([('table_id','=',context['active_id'])]),context={})
([('table_id','=',data)]),context={})
model_data_ids = self.pool.get('ir.model.data').search(cr,uid,\
[('model','=','ir.ui.view'),\
('name','=','view_olap_database_columns_form')],context={})
+4 -1
View File
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Open Column -->
<record id="view_olap_load_column" model="ir.ui.view">
<field name="name">Create Logs</field>
<field name="name">Open Columns</field>
<field name="model">olap.load.column</field>
<field name="type">form</field>
<field name="arch" type="xml">
+2 -1
View File
@@ -28,7 +28,6 @@
from osv import fields, osv
class olap_query_logs_clear(osv.osv_memory):
""" Clear the Logs for Given User """
_name = "olap.query.logs.clear"
_description = "Olap Query Logs Clear"
_columns = {
@@ -69,6 +68,7 @@ class olap_query_logs_clear(osv.osv_memory):
olap_query_logs_clear()
class olap_query_logs_clear_msg(osv.osv_memory):
""" Display clear log message """
_name = "olap.query.logs.clear.msg"
@@ -77,4 +77,5 @@ class olap_query_logs_clear_msg(osv.osv_memory):
}
olap_query_logs_clear_msg()
# vim: ts=4 sts=4 sw=4 si et
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Create Logs -->
<record id="view_olap_query_logs_clear" model="ir.ui.view">
<field name="name">Create Logs</field>
<field name="name">Clear Logs</field>
<field name="model">olap.query.logs.clear</field>
<field name="type">form</field>
<field name="arch" type="xml">
@@ -19,7 +22,7 @@
</record>
<record id="action_view_olap_query_logs_clear" model="ir.actions.act_window">
<field name="name">Create Logs </field>
<field name="name">Clear Logs </field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">olap.query.logs.clear</field>
<field name="view_type">form</field>
@@ -28,7 +31,7 @@
</record>
<record id="view_olap_query_logs_clear_msg" model="ir.ui.view">
<field name="name">Create Logs Message</field>
<field name="name">Clear Logs Message</field>
<field name="model">olap.query.logs.clear.msg</field>
<field name="type">form</field>
<field name="arch" type="xml">
+4
View File
@@ -6,3 +6,7 @@
"wiki_groups_link","wiki.groups.link","model_wiki_groups_link","base.group_system",1,1,1,1
"wiki_wiki_history","wiki.wiki.history","model_wiki_wiki_history","base.group_user",1,0,1,0
"wiki_wizard_wiki_history_show_diff","wizard.wiki.history.show_diff","model_wizard_wiki_history_show_diff","base.group_user",1,1,1,1
"wiki_wiki_page_open","wiki.wiki.page.open","model_wiki_wiki_page_open","base.group_user",1,1,1,1
"wiki_create_menu","wiki.create.menu","model_wiki_create_menu","base.group_user",1,1,1,1
"wiki_wiki_help_open","wiki.wiki.help.open","model_wiki_wiki_help_open","base.group_user",1,1,1,1
"wiki_make_index","wiki.make.index","model_wiki_make_index","base.group_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
6 wiki_groups_link wiki.groups.link model_wiki_groups_link base.group_system 1 1 1 1
7 wiki_wiki_history wiki.wiki.history model_wiki_wiki_history base.group_user 1 0 1 0
8 wiki_wizard_wiki_history_show_diff wizard.wiki.history.show_diff model_wizard_wiki_history_show_diff base.group_user 1 1 1 1
9 wiki_wiki_page_open wiki.wiki.page.open model_wiki_wiki_page_open base.group_user 1 1 1 1
10 wiki_create_menu wiki.create.menu model_wiki_create_menu base.group_user 1 1 1 1
11 wiki_wiki_help_open wiki.wiki.help.open model_wiki_wiki_help_open base.group_user 1 1 1 1
12 wiki_make_index wiki.make.index model_wiki_make_index base.group_user 1 1 1 1
+115 -68
View File
@@ -27,67 +27,89 @@
##############################################################################
from osv import fields, osv
import time
from StringIO import StringIO
from HTMLParser import HTMLParser
import difflib
class Wiki(osv.osv):
_name="wiki.wiki"
""" wiki """
_name = "wiki.wiki"
Wiki()
class WikiGroup(osv.osv):
""" Wiki Groups """
_name = "wiki.groups"
_description="Wiki Groups"
_description = "Wiki Groups"
_order = 'name'
_columns={
'name':fields.char('Wiki Group', size=256, select=True, required=True),
'page_ids':fields.one2many('wiki.wiki', 'group_id', 'Pages'),
'notes':fields.text("Description"),
'create_date':fields.datetime("Created Date", select=True),
'template': fields.text('Wiki Template'),
'section': fields.boolean("Make Section ?"),
'method':fields.selection([('list','List'),('page','Home Page'),('tree','Tree')],'Display Method'),
'home':fields.many2one('wiki.wiki', 'Pages'),
_columns = {
'name':fields.char('Wiki Group', size=256, select=True, required=True),
'page_ids':fields.one2many('wiki.wiki', 'group_id', 'Pages'),
'notes':fields.text("Description"),
'create_date':fields.datetime("Created Date", select=True),
'template': fields.text('Wiki Template'),
'section': fields.boolean("Make Section ?"),
'method':fields.selection([('list', 'List'), ('page', 'Home Page'), \
('tree', 'Tree')], 'Display Method'),
'home':fields.many2one('wiki.wiki', 'Pages'),
}
_defaults = {
'method': lambda *a: 'page',
'method': lambda *a: 'page',
}
WikiGroup()
class GroupLink(osv.osv):
""" Apply Group Link """
_name = "wiki.groups.link"
_description="Wiki Groups Links"
_description = "Wiki Groups Links"
_rec_name = 'action_id'
_columns={
'group_id':fields.many2one('wiki.groups', 'Parent Group', ondelete='set null'),
_columns = {
'group_id': fields.many2one('wiki.groups', 'Parent Group', ondelete='set null'),
'action_id': fields.many2one('ir.ui.menu', 'Menu')
}
GroupLink()
class Wiki(osv.osv):
_inherit="wiki.wiki"
_description="Wiki Page"
""" Wiki Page """
_inherit = "wiki.wiki"
_description = "Wiki Page"
_order = 'section,create_date desc'
_columns={
'name':fields.char('Title', size=256, select=True, required=True),
'write_uid':fields.many2one('res.users',"Last Author"),
'text_area':fields.text("Content"),
'create_uid':fields.many2one('res.users','Author', select=True),
'create_date':fields.datetime("Created on", select=True),
'write_date':fields.datetime("Modification Date", select=True),
'tags':fields.char('Tags', size=1024),
'history_id':fields.one2many('wiki.wiki.history','wiki_id','History Lines'),
'minor_edit':fields.boolean('Minor edit', select=True),
'summary':fields.char('Summary',size=256),
'section': fields.char('Sequence', size=32, help="Use page section code like 1.2.1"),
'group_id':fields.many2one('wiki.groups', 'Wiki Group', select=1, ondelete='set null'),
'toc':fields.boolean('Table of Contents'),
'review': fields.boolean('Need Review'),
'parent_id':fields.many2one('wiki.wiki', 'Parent Page'),
'child_ids':fields.one2many('wiki.wiki', 'parent_id', 'Child Pages'),
_columns = {
'name': fields.char('Title', size=256, select=True, required=True),
'write_uid': fields.many2one('res.users', "Last Author"),
'text_area': fields.text("Content"),
'create_uid': fields.many2one('res.users', 'Author', select=True),
'create_date': fields.datetime("Created on", select=True),
'write_date': fields.datetime("Modification Date", select=True),
'tags': fields.char('Tags', size=1024),
'history_id': fields.one2many('wiki.wiki.history', 'wiki_id', 'History Lines'),
'minor_edit': fields.boolean('Minor edit', select=True),
'summary': fields.char('Summary', size=256),
'section': fields.char('Sequence', size=32, help="Use page section code like 1.2.1"),
'group_id': fields.many2one('wiki.groups', 'Wiki Group', select=1, ondelete='set null'),
'toc': fields.boolean('Table of Contents'),
'review': fields.boolean('Need Review'),
'parent_id': fields.many2one('wiki.wiki', 'Parent Page'),
'child_ids': fields.one2many('wiki.wiki', 'parent_id', 'Child Pages'),
}
def onchange_group_id(self, cr, uid, ids, group_id, content, context={}):
""" @param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of wiki page’s IDs
@return: dictionay of open wiki page on give page section """
if (not group_id) or content:
return {}
grp = self.pool.get('wiki.groups').browse(cr, uid, group_id)
@@ -103,62 +125,85 @@ class Wiki(osv.osv):
section = '.'.join(s)
return {
'value':{
'text_area': template,
'text_area': template,
'section': section
}
}
def copy_data(self, cr, uid, id, default=None, context=None):
return super(Wiki, self).copy_data(cr, uid, id, {'wiki_id':False}, context)
""" @param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param id: Give wiki page's ID """
return super(Wiki, self).copy_data(cr, uid, id, {'wiki_id': False}, context)
def create(self, cr, uid, vals, context=None):
id = super(Wiki,self).create(cr, uid, vals, context)
""" @param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks, """
id = super(Wiki, self).create(cr, uid, vals, context)
history = self.pool.get('wiki.wiki.history')
if vals.get('text_area'):
res = {
'minor_edit':vals.get('minor_edit', True),
'text_area':vals.get('text_area',''),
'write_uid':uid,
'wiki_id' : id,
'summary':vals.get('summary','')
if vals.get('text_area'):
res = {
'minor_edit': vals.get('minor_edit', True),
'text_area': vals.get('text_area', ''),
'write_uid': uid,
'wiki_id': id,
'summary':vals.get('summary', '')
}
history.create(cr, uid, res)
return id
return id
def write(self, cr, uid, ids, vals, context=None):
result = super(Wiki,self).write(cr, uid, ids, vals, context)
""" @param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks, """
result = super(Wiki, self).write(cr, uid, ids, vals, context)
history = self.pool.get('wiki.wiki.history')
if vals.get('text_area'):
for id in ids:
res = {
'minor_edit':vals.get('minor_edit', True),
'text_area':vals.get('text_area',''),
'write_uid':uid,
'wiki_id' : id,
'summary':vals.get('summary','')
'minor_edit': vals.get('minor_edit', True),
'text_area': vals.get('text_area', ''),
'write_uid': uid,
'wiki_id': id,
'summary': vals.get('summary', '')
}
history.create(cr, uid, res)
return result
Wiki()
class History(osv.osv):
_name="wiki.wiki.history"
_description="Wiki History"
_rec_name="date_time"
""" Wiki History """
_name = "wiki.wiki.history"
_description = "Wiki History"
_rec_name = "date_time"
_order = 'id DESC'
_columns={
'create_date':fields.datetime("Date",select=True),
'text_area':fields.text("Text area"),
'minor_edit':fields.boolean('This is a major edit ?',select=True),
'summary':fields.char('Summary',size=256, select=True),
'write_uid':fields.many2one('res.users',"Modify By", select=True),
'wiki_id':fields.many2one('wiki.wiki','Wiki Id', select=True)
}
_columns = {
'create_date': fields.datetime("Date", select=True),
'text_area': fields.text("Text area"),
'minor_edit': fields.boolean('This is a major edit ?', select=True),
'summary': fields.char('Summary', size=256, select=True),
'write_uid': fields.many2one('res.users', "Modify By", select=True),
'wiki_id': fields.many2one('wiki.wiki', 'Wiki Id', select=True)
}
_defaults = {
'write_uid': lambda obj,cr,uid,context: uid,
'write_uid': lambda obj, cr, uid, context: uid,
}
def getDiff(self, cr, uid, v1, v2, context={}):
import difflib
""" @param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks, """
history_pool = self.pool.get('wiki.wiki.history')
text1 = history_pool.read(cr, uid, [v1], ['text_area'])[0]['text_area']
text2 = history_pool.read(cr, uid, [v2], ['text_area'])[0]['text_area']
@@ -166,5 +211,7 @@ class History(osv.osv):
line2 = text2.splitlines(1)
diff = difflib.HtmlDiff()
return diff.make_file(line1, line2, "Revision-%s" % (v1), "Revision-%s" % (v2), context=False)
History()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+47 -22
View File
@@ -1,12 +1,22 @@
<?xml version="1.0"?>
<openerp>
<data>
<menuitem name="Knowledge Management" icon="terp-stock" id="base.menu_document" sequence="4"/>
<menuitem name="Configuration" id="base.menu_document_configuration" parent="base.menu_document" sequence="50"/>
<menuitem name="Wiki" id="menu_wiki_configuration" parent="base.menu_document_configuration" sequence="2"/>
<menuitem id="base.menu_document2" name="Collaborative Content" parent="base.menu_document"/>
<menuitem name="Knowledge Management" icon="terp-stock"
id="base.menu_document" sequence="4" />
<record model="ir.ui.view" id="wiki_group_tree">
<menuitem name="Configuration"
id="base.menu_document_configuration"
parent="base.menu_document" sequence="50" />
<menuitem name="Wiki" id="menu_wiki_configuration"
parent="base.menu_document_configuration" sequence="2" />
<menuitem id="base.menu_document2" name="Collaborative Content"
parent="base.menu_document" />
<!-- Wiki Groups Tree view -->
<record model="ir.ui.view" id="wiki_group_tree">
<field name="name">wiki.groups.tree</field>
<field name="model">wiki.groups</field>
<field name="type">tree</field>
@@ -16,6 +26,9 @@
</tree>
</field>
</record>
<!-- Wiki Groups Form view -->
<record model="ir.ui.view" id="wiki_group_form">
<field name="name">wiki.groups.form</field>
<field name="model">wiki.groups</field>
@@ -26,8 +39,8 @@
<field name="name" select="1"/>
<field name="create_date" readonly="2"/>
<field name="method" select="1"/>
<field name="home" select="1" attrs="{'required':[('method','=','page')], 'readonly':[('method','!=','page')]}"/>
<!--field name="section"/-->
<field name="home" select="1"
attrs="{'required':[('method','=','page')], 'readonly':[('method','!=','page')]}" />
</group>
<notebook colspan="4">
<page string="Notes">
@@ -46,16 +59,15 @@
</field>
</record>
<!-- Wiki Groups Action -->
<record model="ir.actions.act_window" id="action_wiki_groups">
<field name="name">Wikis</field>
<field name="res_model">wiki.groups</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!-- <menuitem
parent="menu_document_configuration"
id="menu_action_wiki_groups"
action="action_wiki_groups"/>-->
<menuitem name="Wiki Groups"
parent="menu_wiki_configuration"
id="menu_action_wiki_groups"
@@ -66,10 +78,8 @@
<field name="res_model">wiki.groups</field>
<field name="view_type">tree</field>
</record>
<!-- <menuitem
parent="menu_document"
id="menu_action_wiki_groups_browse"
action="action_wiki_groups_browse"/>-->
<!-- wiki Tree view For child -->
<record id="view_wiki_tree_childs" model="ir.ui.view">
<field name="name">wiki.wiki.tree.childs</field>
@@ -88,6 +98,8 @@
</field>
</record>
<!-- wiki Tree view -->
<record model="ir.ui.view" id="view_wiki_tree">
<field name="name">wiki.wiki.tree</field>
<field name="model">wiki.wiki</field>
@@ -104,6 +116,8 @@
</field>
</record>
<!-- wiki Form view -->
<record model="ir.ui.view" id="view_wiki_form">
<field name="name">wiki.wiki.form</field>
<field name="model">wiki.wiki</field>
@@ -129,6 +143,8 @@
</field>
</record>
<!-- wiki Search view -->
<record id="view_wiki_filter" model="ir.ui.view">
<field name="name">wiki.wiki.search</field>
<field name="model">wiki.wiki</field>
@@ -147,6 +163,8 @@
</field>
</record>
<!-- search page for wiki -->
<record model="ir.actions.act_window" id="action_wiki">
<field name="name">Search Pages</field>
<field name="res_model">wiki.wiki</field>
@@ -156,9 +174,13 @@
<field name="context">{'section':'1'}</field>
<field name="search_view_id" ref="view_wiki_filter"/>
</record>
<menuitem parent="base.menu_document2" id="menu_action_wiki_wiki" name="Wiki Pages" action="action_wiki"/>
<!-- Pages Waiting Review -->
<menuitem parent="base.menu_document2"
id="menu_action_wiki_wiki" name="Wiki Pages"
action="action_wiki" />
<!-- Pages Waiting Review -->
<record model="ir.actions.act_window" id="action_wiki_review">
<field name="name">Pages Waiting Review</field>
<field name="res_model">wiki.wiki</field>
@@ -170,6 +192,8 @@
<field name="filter" eval="True"/>
</record>
<!-- History Tree view -->
<record model="ir.ui.view" id="view_wiki_history_tree">
<field name="name">wiki.wiki.history.tree</field>
<field name="model">wiki.wiki.history</field>
@@ -184,6 +208,8 @@
</field>
</record>
<!-- History Form view -->
<record model="ir.ui.view" id="wiki_history_form">
<field name="name">wiki.wiki.history.form</field>
<field name="model">wiki.wiki.history</field>
@@ -199,16 +225,14 @@
</field>
</record>
<!-- History Action -->
<record model="ir.actions.act_window" id="action_history">
<field name="name">All Page Histories</field>
<field name="res_model">wiki.wiki.history</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!-- <menuitem
parent="menu_document_configuration"
id="menu_action_history"
action="action_history"/>-->
<act_window domain="[('wiki_id', '=', active_id)]"
id="act_wiki_wiki_history"
@@ -226,8 +250,9 @@
<field name="key2">tree_but_open</field>
<field name="model">wiki.groups</field>
<field name="name">Search a Page</field>
<field eval="'ir.actions.wizard,%d'%wizard_open_page" name="value"/>
<field eval="'ir.actions.wizard,%d'%action_view_wiki_wiki_page_open" name="value"/>
<field eval="True" name="object"/>
</record>
</data>
</openerp>
+14 -3
View File
@@ -19,12 +19,20 @@
#
##############################################################################
from osv import fields,osv
from osv import fields, osv
from tools.translate import _
class showdiff(osv.osv_memory):
""" Disp[ay Difference for History """
_name = 'wizard.wiki.history.show_diff'
def _get_diff(self, cr, uid, ctx):
""" @param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
"""
history = self.pool.get('wiki.wiki.history')
ids = ctx.get('active_ids')
diff = ""
@@ -36,7 +44,7 @@ class showdiff(osv.osv_memory):
elif len(ids) == 1:
old = history.browse(cr, uid, ids[0])
nids = history.search(cr, uid, [('wiki_id','=',old.wiki_id.id)])
nids = history.search(cr, uid, [('wiki_id', '=', old.wiki_id.id)])
nids.sort()
diff = history.getDiff(cr, uid, ids[0], nids[-1])
else:
@@ -44,10 +52,13 @@ class showdiff(osv.osv_memory):
return diff
_columns = {
'diff': fields.text('Diff'),
'diff': fields.text('Diff'),
}
_defaults = {
'diff': _get_diff
}
showdiff()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+26 -24
View File
@@ -22,44 +22,46 @@
from osv import fields, osv
class wiki_create_menu(osv.osv_memory):
""" Create Menu """
_name = "wiki.create.menu"
_description = "Wizard Create Menu"
_columns = {
'menu_name': fields.char('Menu Name', size=256, select=True, required=True),
'menu_parent_id': fields.many2one('ir.ui.menu', 'Parent Menu', required=True),
'page': fields.many2one('wiki.wiki', 'Group Home Page'),
'menu_name': fields.char('Menu Name', size=256, select=True, required=True),
'menu_parent_id': fields.many2one('ir.ui.menu', 'Parent Menu', required=True),
'page': fields.many2one('wiki.wiki', 'Group Home Page'),
}
def wiki_menu_create(self, cr, uid, ids, context):
""" Create Menu On the base of Group id and Action id
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of create menu’s IDs
"""
mod_obj = self.pool.get('ir.model.data')
action_id = mod_obj._get_id(cr, uid, 'wiki', 'action_view_wiki_wiki_page_open')
for group in self.pool.get('wiki.groups').browse(cr, uid, ids):
for menu in self.pool.get('wiki.create.menu').browse(cr, uid, ids):
for menu in self.browse(cr, uid, ids):
menu_id = self.pool.get('ir.ui.menu').create(cr, uid, {
'name':menu.menu_name,
'parent_id':menu.menu_parent_id.id,
'icon': 'STOCK_DIALOG_QUESTION',
'action': 'ir.actions.act_window,'+ str(action_id)
}, context)
home = menu.page.id
group_id = menu.id
res = {
'home':home,
}
self.pool.get('wiki.groups').write(cr, uid, ids, res)
self.pool.get('wiki.groups.link').create(cr, uid,
{'group_id': group_id, 'action_id': menu_id})
mod_obj = self.pool.get('ir.model.data')
action_id = mod_obj._get_id(cr, uid, 'wiki', 'action_view_wiki_wiki_page_open')
menu_id = self.pool.get('ir.ui.menu').create(cr, uid, {
'name':menu.menu_name,
'parent_id':menu.menu_parent_id.id,
'icon': 'STOCK_DIALOG_QUESTION',
'action': 'ir.actions.act_window,'+ str(action_id)
}, context)
home = menu.page.id
group_id = menu.id
res = {
'home':home,
}
self.pool.get('wiki.groups').write(cr, uid, ids, res)
self.pool.get('wiki.groups.link').create(cr, uid,
{'group_id': group_id, 'action_id':menu_id})
return {}
return {}
wiki_create_menu()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Create Menu From view -->
<record id="view_wiki_create_menu" model="ir.ui.view">
<field name="name">Create Menu</field>
<field name="model">wiki.create.menu</field>
@@ -19,6 +22,8 @@
</field>
</record>
<!-- Create Menu Action -->
<record id="action_wiki_create_menu" model="ir.actions.act_window">
<field name="name">Create Menu</field>
<field name="type">ir.actions.act_window</field>
+16 -11
View File
@@ -2,19 +2,19 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2004-2010 Tiny SPRl (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# 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.
# 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.
# 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
# You should have received a copy of the GNU Affero General Public license
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
@@ -22,25 +22,29 @@
from osv import fields, osv
class wiki_make_index(osv.osv_memory):
""" Create Index For Selected Page """
_name = "wiki.make.index"
_description = "Create Index"
_columns = {
}
def wiki_do_index(self, cr, uid, ids, context):
""" Makes Index according to page hierarchy
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of wiki index’s IDs
@param ids: list of wiki index’s IDs
"""
for index_obj in self.browse(cr,uid,ids):
data = context and context.get('active_ids', []) or []
for index_obj in self.browse(cr, uid, ids):
wiki_pool = self.pool.get('wiki.wiki')
cr.execute("Select id, section from wiki_wiki where id = ANY(%s) \
order by section " ,(context['active_ids'],))
order by section ", (data,))
lst0 = cr.fetchall()
lst = []
s_ids = {}
for l in lst0:
s_ids[l[1]] = l[0]
lst.append(l[1])
@@ -80,6 +84,7 @@ class wiki_make_index(osv.osv_memory):
for rs in result:
wiki_pool.write(cr, uid, [rs[1]], {'section':rs[0]})
return {}
wiki_make_index()
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Create Index Form view -->
<record id="view_wiki_make_index" model="ir.ui.view">
<field name="name">Create Index</field>
<field name="model">wiki.make.index</field>
@@ -17,6 +20,8 @@
</field>
</record>
<!-- Create Index Action -->
<record id="action_view_wiki_make_index" model="ir.actions.act_window">
<field name="name">Create Index</field>
<field name="type">ir.actions.act_window</field>
@@ -27,6 +32,8 @@
<field name="context">{'record_id' : active_id}</field>
</record>
<!-- Create Index Action Window -->
<act_window id="action_view_wiki_make_index_values"
key2="client_action_multi" name="Create Index"
res_model="wiki.make.index" src_model="wiki.wiki"
+10 -9
View File
@@ -23,26 +23,27 @@
from osv import fields, osv
class wiki_wiki_help_open(osv.osv_memory):
""" Basic Wiki Editing """
_name = "wiki.wiki.help.open"
_description = "Basic Wiki Editing"
_columns = {
}
def open_wiki_page(self, cr, uid, ids, context):
""" Opens Wiki Page for Editing
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of wiki page’s IDs
"""
pages = self.pool.get('wiki.wiki').search(cr, uid, [('name','=','Basic Wiki Editing')])
pages = self.pool.get('wiki.wiki').search(cr, uid, [('name', '=', 'Basic Wiki Editing')])
value = {
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'wiki.wiki',
'view_id': False,
'res_id': pages[0],
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'wiki.wiki',
'view_id': False,
'res_id': pages[0],
'type': 'ir.actions.act_window',
}
return value
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Editing Page Form view -->
<record id="view_wiki_wiki_help_open" model="ir.ui.view">
<field name="name">Basic Wiki Editing</field>
<field name="model">wiki.wiki.help.open</field>
@@ -14,6 +17,8 @@
</field>
</record>
<!-- Editing Page Action -->
<record id="action_view_wiki_wiki_help_open" model="ir.actions.act_window">
<field name="name">Basic Wiki Editing</field>
<field name="type">ir.actions.act_window</field>
@@ -23,6 +28,8 @@
<field name="target">new</field>
</record>
<!-- Editing Page Action window -->
<act_window id="action_view_wiki_wiki_help_open_vals"
key2="client_action_multi" name="Basic Wiki Editing"
res_model="wiki.wiki.help.open" src_model="wiki.wiki"
+14 -14
View File
@@ -22,30 +22,30 @@
from osv import fields, osv
class wiki_wiki_page_open(osv.osv_memory):
""" wizard Open Page """
_name = "wiki.wiki.page.open"
_description = "wiz open page"
_columns = {
}
def open_wiki_page(self, cr, uid, ids, context):
""" Opens Wiki Page of Group
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param ids: List of open wiki page’s IDs
@return : dictionay of open wiki window on give group id
@return: dictionay of open wiki window on give group id
"""
for group in self.pool.get('wiki.groups').browse(cr, uid,ids):
for openpage in self.pool.get('wiki.wiki.page.open').browse(cr, uid,ids):
for group in self.pool.get('wiki.groups').browse(cr, uid, ids):
value = {
'domain': "[('group_id','=',%d)]" % (group.id),
'name': 'Wiki Page',
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'wiki.wiki',
'view_id': False,
'type': 'ir.actions.act_window',
'domain': "[('group_id','=',%d)]" % (group.id),
'name': 'Wiki Page',
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'wiki.wiki',
'view_id': False,
'type': 'ir.actions.act_window',
}
if group.method == 'page':
value['res_id'] = group.home.id
@@ -53,9 +53,9 @@ class wiki_wiki_page_open(osv.osv_memory):
value['view_type'] = 'form'
value['view_mode'] = 'tree,form'
elif group.method == 'tree':
view_id = pool.get('ir.ui.view').search(cr, uid, [('name','=','wiki.wiki.tree.childs')])
view_id = self.pool.get('ir.ui.view').search(cr, uid, [('name', '=', 'wiki.wiki.tree.childs')])
value['view_id'] = view_id
value['domain'] = [('group_id','=',group.id),('parent_id','=',False)]
value['domain'] = [('group_id', '=', group.id), ('parent_id', '=', False)]
value['view_type'] = 'tree'
return value
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Open Page Form view -->
<record id="view_wiki_wiki_page_open" model="ir.ui.view">
<field name="name">Open Page</field>
<field name="model">wiki.wiki.page.open</field>
@@ -14,6 +17,8 @@
</field>
</record>
<!-- Open Page Action -->
<record id="action_view_wiki_wiki_page_open" model="ir.actions.act_window">
<field name="name">Open Page</field>
<field name="type">ir.actions.act_window</field>
@@ -23,6 +28,8 @@
<field name="target">new</field>
</record>
<!-- Open Page Action window -->
<act_window id="action_view_wiki_wiki_page_open_vals"
key2="client_action_multi" name="Open Wiki Page"
res_model="wiki.wiki.page.open" src_model="wiki.groups"