bzr revid: nch@tinyerp.com-20080926044251-9h5jgyxs5nlsrbqk
This commit is contained in:
Naresh Choksy
2008-09-26 10:12:51 +05:30
24 changed files with 287 additions and 323 deletions
+3 -3
View File
@@ -38,7 +38,7 @@
"init_xml" : [
"base_data.xml",
"base_menu.xml",
"base_security.xml",
"security/base_security.xml",
"res/res_security.xml",
],
"demo_xml" : [
@@ -47,7 +47,6 @@
"res/partner/crm_demo.xml",
],
"update_xml" : [
"ir.model.access.csv",
"base_update.xml",
"ir/wizard/wizard_menu_view.xml",
"ir/ir.xml",
@@ -67,7 +66,8 @@
"res/partner/crm_view.xml",
"res/partner/partner_data.xml",
"res/ir_property_view.xml",
"base_security.xml",
"security/base_security.xml",
"security/ir.model.access.csv",
],
"active": True,
"installable": True,
+2 -2
View File
@@ -5,12 +5,12 @@
<field name="login">demo</field>
<field name="password">demo</field>
<field name="name">Demo User</field>
<field name="signature">Fabien Pinckaers</field>
<field name="signature">Mr Demo</field>
<field name="action_id" ref="action_menu_admin"/>
<field name="menu_id" ref="action_menu_admin"/>
<field name="address_id" ref="main_address"/>
<field name="company_id" ref="main_company"/>
<field name="groups_id" eval="('base.group_user')"/>
<field name="groups_id" eval="[(6,0,[ref('base.group_user')])]"/>
</record>
</data>
</openerp>
-160
View File
@@ -1,160 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
<!--
Users Groups
-->
<record model="res.groups" id="group_system">
<field name="name">Administrator / Configuration</field>
</record>
<record model="res.groups" id="group_erp_manager">
<field name="name">Administrator / Access Rights</field>
</record>
<record model="res.groups" id="group_user">
<field name="name">Employee</field>
</record>
<record model="res.groups" id="group_account_manager">
<field name="name">Account Manager</field>
</record>
<record model="res.groups" id="group_extended">
<field name="name">Useability / Extended View</field>
</record>
<record model="res.groups" id="group_no_one">
<field name="name">Useability / No One</field>
</record>
<!--
Users
-->
<record model="res.users" id="base.user_root">
<field name="signature">Administrator</field>
<field name="address_id" ref="main_address"/>
<field name="company_id" ref="main_company"/>
<field name="action_id" ref="action_menu_admin"/>
<field name="menu_id" ref="action_menu_admin"/>
</record>
<!--
Access
-->
<!--Don't remove after-->
<record model="ir.model.access" id="access_ir_actions_employee">
<field name="name">ir.actions.actions Employee</field>
<field model="ir.model" name="model_id" search="[('model', '=', 'ir.actions.actions')]"/>
<field name="group_id" ref="group_user"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_ir_actions_act_window_employee">
<field name="name">ir.actions.act_window Employee</field>
<field model="ir.model" name="model_id" search="[('model', '=', 'ir.actions.act_window')]"/>
<field name="group_id" ref="group_user"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_ir_actions_act_window_employee">
<field name="name">ir.actions.act_window_close System</field>
<field model="ir.model" name="model_id" search="[('model', '=', 'ir.actions.act_window_close')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_ir_actions_act_window_employee">
<field name="name">ir.actions.act_window_close System</field>
<field model="ir.model" name="model_id" search="[('model', '=', 'ir.actions.report.xml')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_ir_actions_act_window_employee">
<field name="name">ir.actions.act_window_close System</field>
<field model="ir.model" name="model_id" search="[('model', '=', 'ir.actions.wizard')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_workflow_group_system">
<field name="name">workflow group_system</field>
<field name="model_id" model="ir.model" search="[('model', '=', 'workflow')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_workflow_activity_group_system">
<field name="name">workflow_activity group_system</field>
<field name="model_id" model="ir.model" search="[('model', '=', 'workflow.activity')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_workflow_instance_group_system">
<field name="name">workflow_instance group_system</field>
<field name="model_id" model="ir.model" search="[('model', '=', 'workflow.instance')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_workflow_transition_group_system">
<field name="name">workflow_transition group_system</field>
<field name="model_id" model="ir.model" search="[('model', '=', 'workflow.transition')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_workflow_triggers_group_system">
<field name="name">workflow_triggers group_system</field>
<field name="model_id" model="ir.model" search="[('model', '=', 'workflow.triggers')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<record model="ir.model.access" id="access_workflow_workitem_group_system">
<field name="name">workflow_workitem group_system</field>
<field name="model_id" model="ir.model" search="[('model', '=', 'workflow.workitem')]"/>
<field name="group_id" ref="group_system"/>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/>
<field name="perm_unlink" eval="0"/>
</record>
<!--Don't remove before-->
</data>
</openerp>
+3 -3
View File
@@ -76,7 +76,7 @@
<field eval="18" name="priority"/>
<field name="arch" type="xml">
<form string="Users">
<field name="password"/>
<field name="password" password="True"/>
<label colspan="4" string="Please note that you will have to logout and relog if you change your password."/>
<field name="context_lang"/>
<field name="context_tz"/>
@@ -95,7 +95,7 @@
<field name="name" select="1"/>
<field name="active" select="1"/>
<field name="login" select="1"/>
<field name="password"/>
<field name="password" password="True"/>
<notebook colspan="4">
<page string="User">
<field name="address_id"/>
@@ -187,7 +187,7 @@
<newline/>
<field name="login" select="1"/>
<newline/>
<field name="password" required="1"/>
<field name="password" required="1" password="True" />
<field colspan="4" name="signature"/>
<separator string="Assign Groups to Define Access Rights" colspan="4"/>
<field colspan="4" name="groups_id" nolabel="1"/>
+1 -1
View File
@@ -28,11 +28,11 @@
#
##############################################################################
import ir_model
import ir_sequence
import ir_ui_menu
import ir_ui_view
import ir_default
import ir_model
import ir_actions
import ir_report_custom
import ir_attachment
+45 -41
View File
@@ -268,54 +268,58 @@ class ir_model_access(osv.osv):
'perm_create': fields.boolean('Create Access'),
'perm_unlink': fields.boolean('Delete Permission'),
}
def check_groups(self, cr, uid, group):
res = False
grouparr = group.split('.')
if grouparr:
cr.execute("select * from res_groups_users_rel where uid=" + str(uid) + " and gid in(select res_id from ir_model_data where module=%s and name=%s)", (grouparr[0], grouparr[1],))
r = cr.fetchall()
if not r:
res = False
else:
res = True
else:
res = False
return res
if not grouparr:
return False
cr.execute("select 1 from res_groups_users_rel where uid=%d and gid in(select res_id from ir_model_data where module=%s and name=%s)", (uid, grouparr[0], grouparr[1],))
return bool(cr.fetchone())
def check_groups_by_id(self, cr, uid, group_id):
cr.execute("select * from res_groups_users_rel where uid=%i and gid=%i", (uid, group_id,))
r = cr.fetchall()
if not r:
res = False
else:
res = True
return res
def check(self, cr, uid, model_name, mode='read',raise_exception=True):
cr.execute("select 1 from res_groups_users_rel where uid=%i and gid=%i", (uid, group_id,))
return bool(cr.fetchone())
def check(self, cr, uid, model_name, mode='read', raise_exception=True):
# Users root have all access (Todo: exclude xml-rpc requests)
if uid==1:
return True
assert mode in ['read','write','create','unlink'], 'Invalid access mode'
# We check if a specific rule exists
cr.execute('SELECT MAX(CASE WHEN perm_'+mode+' THEN 1 else 0 END) '
'from ir_model_access a join ir_model m on (m.id=a.model_id) '
'join res_groups_users_rel gu on (gu.gid = a.group_id) '
'where m.model=%s and gu.uid=%s', (model_name, uid,))
r = cr.fetchall()
if not r[0][0]:
if raise_exception:
msgs = {
'read': _('You can not read this document! (%s)'),
'write': _('You can not write in this document! (%s)'),
'create': _('You can not create this kind of document! (%s)'),
'unlink': _('You can not delete this document! (%s)'),
}
raise except_orm(_('AccessError'), msgs[mode] % model_name )
return r[0][0]
cr.execute('SELECT MAX(CASE WHEN perm_' + mode + ' THEN 1 ELSE 0 END) '
' FROM ir_model_access a '
' JOIN ir_model m ON (m.id = a.model_id) '
' JOIN res_groups_users_rel gu ON (gu.gid = a.group_id) '
' WHERE m.model = %s '
' AND gu.uid = %s '
, (model_name, uid,)
)
r = cr.fetchone()[0]
if r is None:
# there is no specific rule. We check the generic rule
cr.execute('SELECT MAX(CASE WHEN perm_' + mode + ' THEN 1 ELSE 0 END) '
' FROM ir_model_access a '
' JOIN ir_model m ON (m.id = a.model_id) '
' WHERE a.group_id IS NULL '
' AND m.model = %s '
, (model_name,)
)
r = cr.fetchone()[0]
if not r and raise_exception:
msgs = {
'read': _('You can not read this document! (%s)'),
'write': _('You can not write in this document! (%s)'),
'create': _('You can not create this kind of document! (%s)'),
'unlink': _('You can not delete this document! (%s)'),
}
raise except_orm(_('AccessError'), msgs[mode] % model_name )
return r
check = tools.cache()(check)
@@ -382,7 +386,7 @@ class ir_model_data(osv.osv):
def _update(self,cr, uid, model, module, values, xml_id=False, store=True, noupdate=False, mode='init', res_id=False):
warning = True
model_obj = self.pool.get(model)
context = {}
context = {}
if xml_id and ('.' in xml_id):
assert len(xml_id.split('.'))==2, _('"%s" contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id') % (xml_id)
warning = False
@@ -544,7 +548,7 @@ class ir_model_config(osv.osv):
'type': 'ir.actions.act_window',
'target':'new',
}
def action_update_pw(self, cr, uid, ids, context={}):
res = self.read(cr,uid,ids)[0]
root = self.pool.get('res.users').browse(cr, uid, [1])[0]
+17 -9
View File
@@ -66,16 +66,25 @@ class ir_ui_menu(osv.osv):
context=context)
if uid==1:
return ids
user_groups = self.pool.get('res.users').read(cr, uid, [uid])[0]['groups_id']
user_groups = set(self.pool.get('res.users').read(cr, uid, uid)['groups_id'])
result = []
for menu in self.browse(cr, uid, ids):
if not len(menu.groups_id):
result.append(menu.id)
restrict_to_groups = menu.groups_id
if not restrict_to_groups:
if menu.action:
# if the menu itself has no restrictions, we get the groups of
# the action of the menu
try:
m, oid = menu.action.split(',', 1)
data = self.pool.get(m).read(cr, uid, int(oid), context=context)
if data and 'groups_id' in data:
restrict_to_groups = data['groups_id']
except:
pass
if restrict_to_groups and not user_groups.intersection(restrict_to_groups):
continue
for g in menu.groups_id:
if g.id in user_groups:
result.append(menu.id)
break
result.append(menu.id)
return result
def _get_full_name(self, cr, uid, ids, name, args, context):
@@ -122,8 +131,7 @@ class ir_ui_menu(osv.osv):
('key2', '=', 'tree_but_open'), ('res_id', 'in', ids)],
context=context)
values_action = {}
for value in values_obj.browse(cursor, user, value_ids,
context=context):
for value in values_obj.browse(cursor, user, value_ids, context=context):
values_action[value.res_id] = value.value
for menu_id in ids:
res[menu_id] = values_action.get(menu_id, False)
+6 -6
View File
@@ -79,28 +79,28 @@ class view(osv.osv):
_constraints = [
(_check_xml, 'Invalid XML for View Architecture!', ['arch'])
]
def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'):
if not isinstance(ids, (list, tuple)):
ids = [ids]
result = super(view, self).read(cr, uid, ids, fields, context, load)
for rs in result:
if rs.get('model') == 'board.board':
cr.execute("select id,arch,ref_id from ir_ui_view_custom where user_id=%d and ref_id=%d", (uid, rs['id']))
oview = cr.dictfetchall()
if oview:
rs['arch'] = oview[0]['arch']
return result
def write(self, cr, uid, ids, vals, context={}):
if not isinstance(ids, (list, tuple)):
ids = [ids]
ids = [ids]
exist = self.pool.get('ir.ui.view').browse(cr, uid, ids[0])
if exist.model == 'board.board' and 'arch' in vals:
+18 -6
View File
@@ -268,7 +268,7 @@ class module(osv.osv):
raise orm.except_orm(_('Error'),
_('You try to remove a module that is installed or will be installed'))
return super(module, self).unlink(cr, uid, ids, context=context)
def state_update(self, cr, uid, ids, newstate, states_to_update, context={}, level=50):
if level<1:
raise orm.except_orm(_('Error'), _('Recursion error in modules dependencies !'))
@@ -471,14 +471,14 @@ class module(osv.osv):
match = re.search('-([a-zA-Z0-9\._-]+)(\.zip)', mod.url, re.I)
version = '0'
if match:
version = match.group(1)
version = match.group(1)
if vercmp(mod.installed_version or '0', version) >= 0:
continue
res.append(mod.url)
if not download:
continue
zipfile = urllib.urlopen(mod.url).read()
fname = addons.get_module_path(mod.name+'.zip')
fname = addons.get_module_path(mod.name+'.zip')
try:
fp = file(fname, 'wb')
fp.write(zipfile)
@@ -528,12 +528,12 @@ class module(osv.osv):
self.write(cr, uid, [id], {'category_id': p_id})
def action_install(self,cr,uid,ids,context=None):
self.write(cr , uid, ids ,{'state' : 'to install'})
self.write(cr , uid, ids ,{'state' : 'to install'})
self.download(cr, uid, ids, context=context)
for id in ids:
cr.execute("select m.id as id from ir_module_module_dependency d inner join ir_module_module m on (m.name=d.name) where d.module_id=%d and m.state='uninstalled'",(id,))
dep_ids = map(lambda x:x[0],cr.fetchall())
if len(dep_ids):
if len(dep_ids):
self.action_install(cr,uid,dep_ids,context=context)
def update_translations(self, cr, uid, ids, filter_lang=None):
@@ -550,7 +550,7 @@ class module(osv.osv):
for mod in self.browse(cr, uid, ids):
if mod.state != 'installed':
continue
for lang in filter_lang:
f = os.path.join(tools.config['addons_path'], mod.name, 'i18n', lang + '.po')
if os.path.exists(f):
@@ -680,6 +680,18 @@ class module_configuration(osv.osv_memory):
'type': item.action_id.type,
'target':item.action_id.target,
}
user_action=self.pool.get('res.users').browse(cr,uid,uid)
act_obj=self.pool.get(user_action.menu_id.type)
action_ids=act_obj.search(cr,uid,[('name','=',user_action.menu_id.name)])
action_open=act_obj.browse(cr,uid,action_ids)[0]
if context.get('menu',False):
return{
'view_type': action_open.view_type,
'view_id':action_open.view_id and [action_open.view_id.id] or False,
'res_model': action_open.res_model,
'type': action_open.type,
'domain':action_open.domain
}
return {'type':'ir.actions.act_window_close' }
module_configuration()
+4 -4
View File
@@ -151,8 +151,8 @@ class res_partner(osv.osv):
'credit_limit': fields.float(string='Credit Limit'),
'ean13': fields.char('EAN13', size=13),
'active': fields.boolean('Active'),
'customer': fields.boolean('Customer'),
'supplier': fields.boolean('Supplier'),
'customer': fields.boolean('Customer', help="Check this box if the partner if a customer."),
'supplier': fields.boolean('Supplier', help="Check this box if the partner if a supplier. If it's not checked, purchase people will not see it when encoding a purchase order."),
'city':fields.related('address','city',type='char', string='City'),
'country':fields.related('address','country_id',type='many2one', relation='res.country', string='Country'),
}
@@ -279,7 +279,7 @@ class res_partner_address(osv.osv):
_order = 'id'
_columns = {
'partner_id': fields.many2one('res.partner', 'Partner', ondelete='cascade', select=True),
'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type'),
'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."),
'function': fields.many2one('res.partner.function', 'Function'),
'title': fields.selection(_contact_title_get, 'Title', size=32),
'name': fields.char('Contact Name', size=64),
@@ -294,7 +294,7 @@ class res_partner_address(osv.osv):
'fax': fields.char('Fax', size=64),
'mobile': fields.char('Mobile', size=64),
'birthdate': fields.char('Birthdate', size=64),
'active': fields.boolean('Active'),
'active': fields.boolean('Active', help="Uncheck the active field to hide the contact."),
}
_defaults = {
'active': lambda *a: 1,
+9 -2
View File
@@ -115,6 +115,7 @@
<field name="name">ASUStek</field>
<field name="user_id" ref="user_demo"/>
<field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_agrolait" model="res.partner">
<field name="name">Agrolait</field>
@@ -123,9 +124,10 @@
<record id="res_partner_c2c" model="res.partner">
<field name="name">Camptocamp</field>
<field eval="[(6, 0, [ref('res_partner_category_10'), ref('res_partner_category_5')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_sednacom" model="res.partner">
<field name="name">Sednacom</field>
<field name="name">Syleam</field>
<field eval="[(6, 0, [ref('res_partner_category_5')])]" name="category_id"/>
</record>
<record id="res_partner_thymbra" model="res.partner">
@@ -133,8 +135,9 @@
<field eval="[(6, 0, [ref('res_partner_category_4')])]" name="category_id"/>
</record>
<record id="res_partner_desertic_hispafuentes" model="res.partner">
<field name="name">Desertic - Hispafuentes</field>
<field name="name">Axelor</field>
<field eval="[(6, 0, [ref('res_partner_category_4')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_tinyatwork" model="res.partner">
<field name="name">Tiny AT Work</field>
@@ -151,6 +154,7 @@
<record id="res_partner_4" model="res.partner">
<field name="name">Distrib PC</field>
<field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_5" model="res.partner">
<field name="name">Ecole de Commerce de Liege</field>
@@ -160,18 +164,21 @@
<field name="name">Elec Import</field>
<field name="user_id" ref="user_demo"/>
<field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_maxtor" model="res.partner">
<field name="name">Maxtor</field>
<field eval="32000.00" name="credit_limit"/>
<field name="user_id" ref="user_demo"/>
<field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_seagate" model="res.partner">
<field name="name">Seagate</field>
<field eval="5000.00" name="credit_limit"/>
<field name="user_id" ref="user_demo"/>
<field eval="[(6, 0, [ref('res_partner_category_9')])]" name="category_id"/>
<field name="supplier">1</field>
</record>
<record id="res_partner_8" model="res.partner">
<field name="website">http://mediapole.net</field>
+4 -1
View File
@@ -71,7 +71,10 @@ class res_currency(osv.osv):
_order = "code"
def round(self, cr, uid, currency, amount):
return round(amount / currency.rounding) * currency.rounding
if currency.rounding == 0:
return 0.0
else:
return round(amount / currency.rounding) * currency.rounding
def is_zero(self, cr, uid, currency, amount):
return abs(self.round(cr, uid, currency, amount)) < currency.rounding
+13 -5
View File
@@ -118,12 +118,18 @@ class users(osv.osv):
'context_tz': fields.selection(_tz_get, 'Timezone', size=64)
}
def read(self,cr, uid, ids, fields=None, context=None, load='_classic_read'):
def override_password(o):
if 'password' in o:
o['password'] = '********'
return o
result = super(users, self).read(cr, uid, ids, fields, context, load)
canwrite = self.pool.get('ir.model.access').check(cr, uid, 'res.users', 'write', raise_exception=False)
if not canwrite:
for r in result:
if 'password' in r:
r['password'] = '********'
if isinstance(ids, (int, float)):
result = override_password(result)
else:
result = map(override_password, result)
return result
_sql_constraints = [
@@ -189,7 +195,7 @@ class users(osv.osv):
default.update({'login': login+' (copy)'})
return super(users, self).copy(cr, uid, id, default, context)
def context_get(self, cr, uid, context={}):
def context_get(self, cr, uid, context=None):
user = self.browse(cr, uid, uid, context)
result = {}
for k in self._columns.keys():
@@ -249,7 +255,6 @@ class res_config_view(osv.osv_memory):
}
def action_cancel(self,cr,uid,ids,conect=None):
print ' Cancel action'
return {
'view_type': 'form',
"view_mode": 'form',
@@ -276,3 +281,6 @@ class res_config_view(osv.osv_memory):
}
res_config_view()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1 -1
View File
@@ -162,7 +162,7 @@
<rng:optional><rng:attribute name="on_change"/></rng:optional>
<rng:optional><rng:attribute name="domain"/></rng:optional>
<rng:optional><rng:attribute name="invisible"/></rng:optional>
<rng:optional><rng:attribute name="visible"/></rng:optional>
<rng:optional><rng:attribute name="password"/></rng:optional>
<rng:optional><rng:attribute name="sum"/></rng:optional>
<rng:optional><rng:attribute name="select"/></rng:optional>
<rng:optional><rng:attribute name="group"/></rng:optional>
@@ -0,0 +1,49 @@
<?xml version="1.0"?>
<openerp>
<!--<data noupdate="0">-->
<data>
<!--
Users Groups
-->
<record model="res.groups" id="group_system">
<field name="name">Administrator / Configuration</field>
</record>
<record model="res.groups" id="group_erp_manager">
<field name="name">Administrator / Access Rights</field>
</record>
<record model="res.groups" id="group_user">
<field name="name">Employee</field>
</record>
<record model="res.groups" id="group_account_manager">
<field name="name">Account Manager</field>
</record>
<record model="res.groups" id="group_extended">
<field name="name">Useability / Extended View</field>
</record>
<record model="res.groups" id="group_no_one">
<field name="name">Useability / No One</field>
</record>
<!--
Users
-->
<record model="res.users" id="base.user_root">
<field name="signature">Administrator</field>
<field name="address_id" ref="main_address"/>
<field name="company_id" ref="main_company"/>
<field name="action_id" ref="action_menu_admin"/>
<field name="menu_id" ref="action_menu_admin"/>
</record>
<record model="ir.ui.menu" id="base.menu_administration">
<field name="groups_id" eval="[(6,0, [ref('group_system'), ref('group_erp_manager')])]"/>
</record>
</data>
</openerp>
@@ -7,6 +7,7 @@ access_ir_exports_group_system,"ir_exports group_system",model_ir_exports,,1,1,1
access_ir_exports_line_group_system,"ir_exports_line group_system",model_ir_exports_line,,1,1,1,1
access_ir_model_group_system,"ir_model group_system",model_ir_model,,1,0,0,0
access_ir_model_access_group_system,"ir_model_access group_system",model_ir_model_access,,1,0,0,0
access_ir_model_grid_group_system,ir_model_access_grid_group_system,model_ir_model_grid,,1,0,0,0
access_ir_model_config_group_system,"ir_model_config group_system",model_ir_model_config,,1,0,0,0
access_ir_model_data_group_user,"ir_model_data group_user",model_ir_model_data,,1,0,0,0
access_ir_model_fields_group_user,"ir_model_fields group_user",model_ir_model_fields,,1,0,0,0
@@ -26,6 +27,7 @@ access_ir_sequence_type_group_user,"ir_sequence_type group_user",model_ir_sequen
access_ir_translation_group_system,"ir_translation group_system",model_ir_translation,,1,1,1,1
access_ir_ui_menu_group_user,"ir_ui_menu group_user",model_ir_ui_menu,,1,0,0,0
access_ir_ui_view_group_user,"ir_ui_view group_user",model_ir_ui_view,,1,0,0,0
access_ir_ui_view_custom_group_user,ir_ui_view_custom_group_user,model_ir_ui_view_custom,,1,0,0,0
access_ir_ui_view_sc_group_user,"ir_ui_view_sc group_user",model_ir_ui_view_sc,,1,1,1,1
access_ir_values_group_erp_manager,"ir_values group_erp_manager",model_ir_values,,1,1,1,1
access_wizard_ir_model_menu_create_group_system,"wizard_ir_model_menu_create group_system",model_wizard_ir_model_menu_create,group_system,1,1,1,1
@@ -74,3 +76,24 @@ access_res_request_link_group_system,"res_request_link group_system",model_res_r
access_res_request_link_group_user,"res_request_link group_user",model_res_request_link,,1,0,0,0
access_res_users_group_user,"res_users group_user",model_res_users,,1,0,0,0
access_res_users_group_erp_manager,"res_users group_erp_manager",model_res_users,group_erp_manager,1,1,1,1
access_ir_actions_employee,ir_actions_employee,model_ir_actions_actions,group_user,1,0,0,0
access_ir_actions_act_window_employee,ir_actions_act_window_employee,model_ir_actions_act_window,group_user,1,0,0,0
access_ir_actions_act_window_close_group_system,ir_actions_act_window_close_system,model_ir_actions_act_window_close,group_system,1,0,0,0
access_ir_actions_report_xml_group_system,ir_actions_report_xml_system,model_ir_actions_report_xml,group_system,1,0,0,0
access_ir_actions_wizard_group_system,ir_actions_wizard,model_ir_actions_wizard,group_system,1,0,0,0
access_workflow_group_system,workflow_group_system,model_workflow,group_system,1,0,0,0
access_workflow_activity_group_system,workflow_activity_group_system,model_workflow_activity,group_system,1,0,0,0
access_workflow_instance_group_system,workflow_instance_group_system,model_workflow_instance,group_system,1,0,0,0
access_workflow_transition_group_system,workflow_transition_group_system,model_workflow_transition,group_system,1,0,0,0
access_workflow_triggers_group_system,workflow_triggers_group_system,model_workflow_triggers,group_system,1,0,0,0
access_workflow_workitem_group_system,workflow_workitem_group_system,model_workflow_workitem,group_system,1,0,0,0
access_actions_report_custom_group_system,ir_actions_report_custom_group_system,model_ir_actions_report_custom,group_system,1,0,0,0
access_ir_actions_act_window_view_group_employee,ir_actions_act_window_view_group_employee,model_ir_actions_act_window_view,group_user,1,0,0,0
access_ir_actions_url_group_user,ir_actions_url_group_user,model_ir_actions_url,group_user,1,0,0,0
access_ir_server_object_lines_group_user,ir_server_object_lines_group_user,model_ir_server_object_lines,group_user,1,0,0,0
access_ir_actions_server_group_user,ir_actions_server_group_user,model_ir_actions_server,group_user,1,0,0,0
access_module_update_translations_group_user,wizard_update_translations_group_user,model_wizard_module_update_translations,group_user,1,1,1,1
access_res_bank_group_system,res_bank_group_system,model_res_bank,group_system,1,1,1,1
access_res_payterm_group_system,res_payterm_group_system,model_res_payterm,group_system,1,1,1,1
access_res_roles_group_erpmanager,res_roles_group_erp_manager,model_res_roles,group_erp_manager,1,1,1,1
access_res_config_view_group_erpmanager,res_config_view_erp_manager,model_res_config_view,group_erp_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
7 access_ir_exports_line_group_system ir_exports_line group_system model_ir_exports_line 1 1 1 1
8 access_ir_model_group_system ir_model group_system model_ir_model 1 0 0 0
9 access_ir_model_access_group_system ir_model_access group_system model_ir_model_access 1 0 0 0
10 access_ir_model_grid_group_system ir_model_access_grid_group_system model_ir_model_grid 1 0 0 0
11 access_ir_model_config_group_system ir_model_config group_system model_ir_model_config 1 0 0 0
12 access_ir_model_data_group_user ir_model_data group_user model_ir_model_data 1 0 0 0
13 access_ir_model_fields_group_user ir_model_fields group_user model_ir_model_fields 1 0 0 0
27 access_ir_translation_group_system ir_translation group_system model_ir_translation 1 1 1 1
28 access_ir_ui_menu_group_user ir_ui_menu group_user model_ir_ui_menu 1 0 0 0
29 access_ir_ui_view_group_user ir_ui_view group_user model_ir_ui_view 1 0 0 0
30 access_ir_ui_view_custom_group_user ir_ui_view_custom_group_user model_ir_ui_view_custom 1 0 0 0
31 access_ir_ui_view_sc_group_user ir_ui_view_sc group_user model_ir_ui_view_sc 1 1 1 1
32 access_ir_values_group_erp_manager ir_values group_erp_manager model_ir_values 1 1 1 1
33 access_wizard_ir_model_menu_create_group_system wizard_ir_model_menu_create group_system model_wizard_ir_model_menu_create group_system 1 1 1 1
76 access_res_request_link_group_user res_request_link group_user model_res_request_link 1 0 0 0
77 access_res_users_group_user res_users group_user model_res_users 1 0 0 0
78 access_res_users_group_erp_manager res_users group_erp_manager model_res_users group_erp_manager 1 1 1 1
79 access_ir_actions_employee ir_actions_employee model_ir_actions_actions group_user 1 0 0 0
80 access_ir_actions_act_window_employee ir_actions_act_window_employee model_ir_actions_act_window group_user 1 0 0 0
81 access_ir_actions_act_window_close_group_system ir_actions_act_window_close_system model_ir_actions_act_window_close group_system 1 0 0 0
82 access_ir_actions_report_xml_group_system ir_actions_report_xml_system model_ir_actions_report_xml group_system 1 0 0 0
83 access_ir_actions_wizard_group_system ir_actions_wizard model_ir_actions_wizard group_system 1 0 0 0
84 access_workflow_group_system workflow_group_system model_workflow group_system 1 0 0 0
85 access_workflow_activity_group_system workflow_activity_group_system model_workflow_activity group_system 1 0 0 0
86 access_workflow_instance_group_system workflow_instance_group_system model_workflow_instance group_system 1 0 0 0
87 access_workflow_transition_group_system workflow_transition_group_system model_workflow_transition group_system 1 0 0 0
88 access_workflow_triggers_group_system workflow_triggers_group_system model_workflow_triggers group_system 1 0 0 0
89 access_workflow_workitem_group_system workflow_workitem_group_system model_workflow_workitem group_system 1 0 0 0
90 access_actions_report_custom_group_system ir_actions_report_custom_group_system model_ir_actions_report_custom group_system 1 0 0 0
91 access_ir_actions_act_window_view_group_employee ir_actions_act_window_view_group_employee model_ir_actions_act_window_view group_user 1 0 0 0
92 access_ir_actions_url_group_user ir_actions_url_group_user model_ir_actions_url group_user 1 0 0 0
93 access_ir_server_object_lines_group_user ir_server_object_lines_group_user model_ir_server_object_lines group_user 1 0 0 0
94 access_ir_actions_server_group_user ir_actions_server_group_user model_ir_actions_server group_user 1 0 0 0
95 access_module_update_translations_group_user wizard_update_translations_group_user model_wizard_module_update_translations group_user 1 1 1 1
96 access_res_bank_group_system res_bank_group_system model_res_bank group_system 1 1 1 1
97 access_res_payterm_group_system res_payterm_group_system model_res_payterm group_system 1 1 1 1
98 access_res_roles_group_erpmanager res_roles_group_erp_manager model_res_roles group_erp_manager 1 1 1 1
99 access_res_config_view_group_erpmanager res_config_view_erp_manager model_res_config_view group_erp_manager 1 1 1 1
+21 -12
View File
@@ -223,7 +223,7 @@ class binary(_column):
val = v[name]
break
res.setdefault(i, val)
if context.get('get_binary_size', True):
if context.get('bin_size', False):
res[i] = tools.human_size(val)
return res
@@ -620,7 +620,7 @@ class function(_column):
else:
res = self._fnct(cr, obj._table, ids, name, self._arg, context)
if self._type == 'binary' and context.get('get_binary_size', True):
if self._type == 'binary' and context.get('bin_size', False):
# convert the data returned by the function with the size of that data...
res = dict(map(lambda (x, y): (x, tools.human_size(len(y))), res.items()))
return res
@@ -637,11 +637,19 @@ class function(_column):
class related(function):
def _fnct_search(self, cr, uid, ids, obj=None, name=None, context=None):
def _fnct_search(self, tobj, cr, uid, obj=None, name=None, context=None):
raise 'Not Implemented Yet'
# field_detail=self._field_get(cr,uid,obj,obj._name,name)
# print field_detail
# if field_detail[1] in ('many2one'):
# ids=obj.pool.get(field_detail[0] or obj._name).search(cr,uid,[('name','ilike',context[0][2])])
# print ids
# return [('id','in',[5,6,7])]
# return True
def _fnct_write(self,obj,cr, uid, ids, field_name, args, context=None):
raise 'Not Implemented Yet'
# def _fnct_write(self,obj,cr, uid, ids,values, field_name, args, context=None):
# raise 'Not Implemented Yet'
def _fnct_read(self,obj,cr, uid, ids, field_name, args, context=None):
if not ids: return {}
@@ -652,7 +660,7 @@ class related(function):
t_data=data
relation=obj._name
for i in range(len(self.arg)):
field_detail=self._field_get(cr,uid,relation,self.arg[i])
field_detail=self._field_get(cr,uid,obj,relation,self.arg[i])
relation=field_detail[0]
if not t_data[self.arg[i]]:
t_data = False
@@ -668,15 +676,16 @@ class related(function):
return res
def __init__(self,*arg,**args):
print arg
self.arg = arg
super(related, self).__init__(self._fnct_read, arg, fnct_inf=self._fnct_write, fnct_inv_arg=arg,method=True, fnct_search=self._fnct_search,**args)
super(related, self).__init__(self._fnct_read, arg, fnct_inv_arg=arg,method=True, fnct_search=self._fnct_search,**args)
# TODO: call field_get on the object, not in the DB
def _field_get(self, cr, uid, model_name, prop):
cr.execute('SELECT relation,ttype FROM ir_model_fields WHERE name=%s AND model=%s', (prop, model_name))
res = cr.fetchone()
return res
def _field_get(self, cr, uid, obj, model_name, prop):
fields=obj.pool.get(model_name).fields_get(cr,uid,[prop])
if fields.get(prop,False):
return(fields[prop].get('relation',False),fields[prop].get('type',False))
else:
raise 'Fields %s not exist in %s'%(prop,model_name)
# ---------------------------------------------------------
# Serialized fields
+19 -22
View File
@@ -324,7 +324,9 @@ class orm_template(object):
'relate': (f.relate and 1) or 0,
'relation': f._obj or 'NULL',
'view_load': (f.view_load and 1) or 0,
'select_level': str(f.select or 0)
'select_level': str(f.select or 0),
'readonly':(f.readonly and 1) or 0,
'required':(f.required and 1) or 0,
}
if k not in cols:
cr.execute('select nextval(%s)', ('ir_model_fields_id_seq',))
@@ -334,7 +336,7 @@ class orm_template(object):
id, model_id, model, name, field_description, ttype,
relate,relation,view_load,state,select_level
) VALUES (
%d,%s,%s,%s,%s,%s,%s,%s,%s,%s, %s
%d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s
)""", (
id, vals['model_id'], vals['model'], vals['name'], vals['field_description'], vals['ttype'],
bool(vals['relate']), vals['relation'], bool(vals['view_load']), 'base',
@@ -351,12 +353,12 @@ class orm_template(object):
cr.commit()
cr.execute("""UPDATE ir_model_fields SET
model_id=%s, field_description=%s, ttype=%s, relate=%s, relation=%s,
view_load=%s, select_level=%s
view_load=%s, select_level=%s, readonly=%s ,required=%s
WHERE
model=%s AND name=%s""", (
vals['model_id'], vals['field_description'], vals['ttype'], bool(vals['relate']),
vals['relation'], bool(vals['view_load']),
vals['select_level'], vals['model'], vals['name']
vals['select_level'], bool(vals['readonly']),bool(vals['required']), vals['model'], vals['name']
))
continue
cr.commit()
@@ -645,7 +647,7 @@ class orm_template(object):
if not fun(self, cr, uid, ids):
translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=msg) or msg
error_msgs.append(
_("Error occur when validation the fields %s: %s") % (','.join(fields), translated_msg)
_("Error occured while validating the field(s) %s: %s") % (','.join(fields), translated_msg)
)
if error_msgs:
cr.rollback()
@@ -773,23 +775,15 @@ class orm_template(object):
if result:
node.setAttribute('string', result.decode('utf-8'))
if node.nodeType == node.ELEMENT_NODE and node.hasAttribute('groups'):
groups = None
group_str = node.getAttribute('groups')
if ',' in group_str:
groups = group_str.split(',')
if node.getAttribute('groups'):
groups = node.getAttribute('groups').split(',')
readonly = False
access_pool = self.pool.get('ir.model.access')
for group in groups:
readonly = readonly and access_pool.check_groups(cr, user, group)
if readonly:
parent = node.parentNode
parent.removeChild(node)
else:
if not self.pool.get('ir.model.access').check_groups(cr, user, group_str):
parent = node.parentNode
parent.removeChild(node)
readonly = readonly or access_pool.check_groups(cr, user, group)
if not readonly:
node.setAttribute('invisible', '1')
node.removeAttribute('groups')
if node.nodeType == node.ELEMENT_NODE:
# translate view
@@ -835,7 +829,6 @@ class orm_template(object):
button.setAttribute('readonly', '0')
arch = node.toxml(encoding="utf-8").replace('\t', '')
fields = self.fields_get(cr, user, fields_def.keys(), context)
for field in fields_def:
fields[field].update(fields_def[field])
@@ -1120,12 +1113,14 @@ class orm_memory(orm_template):
fields_to_read = self._columns.keys()
result = []
if self.datas:
if isinstance(ids, (int, long)):
ids = [ids]
for id in ids:
r = {'id': id}
for f in fields_to_read:
if id in self.datas:
r[f] = self.datas[id].get(f, False)
if r[f] and isinstance(self._columns[f], fields.binary) and context.get('get_binary_size', True):
if r[f] and isinstance(self._columns[f], fields.binary) and context.get('bin_size', False):
r[f] = len(r[f])
result.append(r)
if id in self.datas:
@@ -1135,6 +1130,8 @@ class orm_memory(orm_template):
res2 = self._columns[f].get_memory(cr, self, ids, f, user, context=context, values=result)
for record in result:
record[f] = res2[record['id']]
if isinstance(ids, (int, long)):
return result[0]
return result
def write(self, cr, user, ids, vals, context=None):
@@ -1719,7 +1716,7 @@ class orm(orm_template):
def convert_field(f):
if f in ('create_date', 'write_date'):
return "date_trunc('second', %s) as %s" % (f, f)
if isinstance(self._columns[f], fields.binary) and context.get('get_binary_size', True):
if isinstance(self._columns[f], fields.binary) and context.get('bin_size', False):
return "length(%s) as %s" % (f,f)
return '"%s"' % (f,)
#fields_pre2 = map(lambda x: (x in ('create_date', 'write_date')) and ('date_trunc(\'second\', '+x+') as '+x) or '"'+x+'"', fields_pre)
+13 -8
View File
@@ -64,6 +64,7 @@ class report_int(netsvc.Service):
self.name = name
self.id = 0
self.name2 = '.'.join(name.split('.')[1:])
self.title = None
self.joinGroup('report')
self.exportMethod(self.create)
@@ -99,12 +100,16 @@ class report_rml(report_int):
# file('/tmp/terp.rml','wb+').write(rml)
pool = pooler.get_pool(cr.dbname)
ir_actions_report_xml_obj = pool.get('ir.actions.report.xml')
report_xml_ids = ir_actions_report_xml_obj.search(cr, uid,
[('report_name', '=', self.name[7:])], context=context)
ftitle = ir_actions_report_xml_obj.browse(cr,uid,report_xml_ids)[0].name
try:
report_xml_ids = ir_actions_report_xml_obj.search(cr, uid,
[('report_name', '=', self.name[7:])], context=context)
self.title = ir_actions_report_xml_obj.browse(cr,uid,report_xml_ids)[0].name
except:
print 'Report not Found !'
self.title = 'Unknown'
report_type = datas.get('report_type', 'pdf')
create_doc = self.generators[report_type]
pdf = create_doc(rml,title=ftitle)
pdf = create_doc(rml, title=self.title)
return (pdf, report_type)
def create_xml(self, cr, uid, ids, datas, context=None):
@@ -196,7 +201,7 @@ class report_rml(report_int):
result.freeDoc()
return xml
def create_pdf(self, xml, logo=None,title=None):
def create_pdf(self, xml, logo=None, title=None):
if logo:
self.bin_datas['logo'] = logo
else:
@@ -206,15 +211,15 @@ class report_rml(report_int):
obj.render()
return obj.get()
def create_html(self, xml, logo=None,title=None):
def create_html(self, xml, logo=None, title=None):
obj = render.rml2html(xml, self.bin_datas)
obj.render()
return obj.get()
def create_raw(self, xml, logo=None,title=None):
def create_raw(self, xml, logo=None, title=None):
return xml
def create_sxw(self, path, logo=None,title=None):
def create_sxw(self, path, logo=None, title=None):
return path
from report_sxw import report_sxw
+6 -6
View File
@@ -39,7 +39,7 @@ import libxml2
import libxslt
import time, os
ftitle=""
class report_printscreen_list(report_int):
def __init__(self, name):
report_int.__init__(self, name)
@@ -63,7 +63,6 @@ class report_printscreen_list(report_int):
return self._parse_node(dom)
def create(self, cr, uid, ids, datas, context=None):
global ftitle
if not context:
context={}
datas['ids'] = ids
@@ -71,10 +70,10 @@ class report_printscreen_list(report_int):
model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)])
if model_id:
model_desc = pool.get('ir.model').browse(cr, uid, model_id, context).name
ftitle=model_desc
self.title = model_desc
else:
model_desc = model._description
ftitle=model_desc
self.title = model_desc
model = pool.get(datas['model'])
result = model.fields_view_get(cr, uid, view_type='tree', context=context)
@@ -142,6 +141,8 @@ class report_printscreen_list(report_int):
line[f] = line[f][1]
if fields[f]['type'] in ('one2many','many2many') and line[f]:
line[f] = '( '+str(len(line[f])) + ' )'
if fields[f]['type'] in ('float','integer'):
line[f]=round(line[f],2)
col = new_doc.createElement("col")
col.setAttribute('tree','no')
if line[f] != None:
@@ -158,8 +159,7 @@ class report_printscreen_list(report_int):
doc = libxml2.parseDoc(new_doc.toxml())
rml_obj = style.applyStylesheet(doc, None)
rml = style.saveResultToString(rml_obj)
global ftitle
self.obj = render.rml(rml,ftitle)
self.obj = render.rml(rml, self.title)
self.obj.render()
return True
report_printscreen_list('report.printscreen.form')
+6 -8
View File
@@ -39,7 +39,7 @@ import libxml2
import libxslt
import time, os
ftitle=""
class report_printscreen_list(report_int):
def __init__(self, name):
report_int.__init__(self, name)
@@ -63,7 +63,6 @@ class report_printscreen_list(report_int):
return self._parse_node(dom)
def create(self, cr, uid, ids, datas, context=None):
global ftitle
if not context:
context={}
pool = pooler.get_pool(cr.dbname)
@@ -71,10 +70,10 @@ class report_printscreen_list(report_int):
model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)])
if model_id:
model_desc = pool.get('ir.model').browse(cr, uid, model_id[0], context).name
ftitle=model_desc
self.title = model_desc
else:
model_desc = model._description
ftitle=model_desc
self.title = model_desc
datas['ids'] = ids
model = pooler.get_pool(cr.dbname).get(datas['model'])
@@ -129,7 +128,6 @@ class report_printscreen_list(report_int):
t += fields[f].get('size', 80) / 28 + 1
l.append(s)
for pos in range(len(l)):
if not l[pos]:
s = fields[fields_order[pos]].get('size', 80) / 28 + 1
@@ -153,7 +151,6 @@ class report_printscreen_list(report_int):
count = len(fields_order)
for i in range(0,count):
tsum.append(0)
for line in results:
node_line = new_doc.createElement("row")
@@ -164,6 +161,8 @@ class report_printscreen_list(report_int):
line[f] = line[f][1]
if fields[f]['type'] in ('one2many','many2many') and line[f]:
line[f] = '( '+str(len(line[f])) + ' )'
if fields[f]['type'] in ('float','integer'):
line[f]=round(line[f],2)
col = new_doc.createElement("col")
col.setAttribute('para','yes')
col.setAttribute('tree','no')
@@ -202,8 +201,7 @@ class report_printscreen_list(report_int):
doc = libxml2.parseDoc(new_doc.toxml())
rml_obj = style.applyStylesheet(doc, None)
rml = style.saveResultToString(rml_obj)
global ftitle
self.obj = render.rml(rml,title=ftitle)
self.obj = render.rml(rml, title=self.title)
self.obj.render()
return True
report_printscreen_list('report.printscreen.list')
+21 -19
View File
@@ -60,7 +60,7 @@ from reportlab import platypus
import utils
import color
import os
ftitle=""
#
# Change this to UTF-8 if you plan tu use Reportlab's UTF-8 support
#
@@ -180,11 +180,12 @@ class _rml_styles(object):
return style
class _rml_doc(object):
def __init__(self, data, images={}, path='.'):
def __init__(self, data, images={}, path='.', title=None):
self.dom = xml.dom.minidom.parseString(data)
self.filename = self.dom.documentElement.getAttribute('filename')
self.images = images
self.path = path
self.title = title
def docinit(self, els):
from reportlab.lib.fonts import addMapping
@@ -229,28 +230,28 @@ class _rml_doc(object):
el = self.dom.documentElement.getElementsByTagName('template')
if len(el):
pt_obj = _rml_template(out, el[0], self, images=self.images, path=self.path)
pt_obj = _rml_template(out, el[0], self, images=self.images, path=self.path, title=self.title)
pt_obj.render(self.dom.documentElement.getElementsByTagName('story'))
else:
self.canvas = canvas.Canvas(out)
pd = self.dom.documentElement.getElementsByTagName('pageDrawing')[0]
pd_obj = _rml_canvas(self.canvas, None, self, self.images, path=self.path)
pd_obj = _rml_canvas(self.canvas, None, self, self.images, path=self.path, title=self.title)
pd_obj.render(pd)
self.canvas.showPage()
self.canvas.save()
class _rml_canvas(object):
def __init__(self, canvas, doc_tmpl=None, doc=None, images={}, path='.'):
def __init__(self, canvas, doc_tmpl=None, doc=None, images={}, path='.', title=None):
self.canvas = canvas
self.styles = doc.styles
self.doc_tmpl = doc_tmpl
self.doc = doc
self.images = images
self.path = path
global ftitle
if ftitle:
self.canvas.setTitle(ftitle)
self.title = title
if self.title:
self.canvas.setTitle(self.title)
def _textual(self, node, x=0, y=0):
rc = ''
@@ -324,7 +325,7 @@ class _rml_canvas(object):
self.canvas.circle(x_cen=utils.unit_get(node.getAttribute('x')), y_cen=utils.unit_get(node.getAttribute('y')), r=utils.unit_get(node.getAttribute('radius')), **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
def _place(self, node):
flows = _rml_flowable(self.doc, images=self.images, path=self.path).render(node)
flows = _rml_flowable(self.doc, images=self.images, path=self.path, title=self.title).render(node)
infos = utils.attr_get(node, ['x','y','width','height'])
infos['y']+=infos['height']
@@ -450,25 +451,27 @@ class _rml_canvas(object):
break
class _rml_draw(object):
def __init__(self, node, styles, images={}, path='.'):
def __init__(self, node, styles, images={}, path='.', title=None):
self.node = node
self.styles = styles
self.canvas = None
self.images = images
self.path = path
self.canvas_title = title
def render(self, canvas, doc):
canvas.saveState()
cnv = _rml_canvas(canvas, doc, self.styles, images=self.images, path=self.path)
cnv = _rml_canvas(canvas, doc, self.styles, images=self.images, path=self.path, title=self.canvas_title)
cnv.render(self.node)
canvas.restoreState()
class _rml_flowable(object):
def __init__(self, doc, images={}, path='.'):
def __init__(self, doc, images={}, path='.', title=None):
self.doc = doc
self.styles = doc.styles
self.images = images
self.path = path
self.title = title
def _textual(self, node):
rc = ''
@@ -569,7 +572,7 @@ class _rml_flowable(object):
return (self.width, self.height)
def draw(self):
canvas = self.canv
drw = _rml_draw(self.node, self.styles, images=self.self2.images, path=self.self2.path)
drw = _rml_draw(self.node, self.styles, images=self.self2.images, path=self.self2.path, title=self.self2.title)
drw.render(self.canv, None)
return Illustration(node, self.styles, self)
@@ -741,9 +744,10 @@ class TinyDocTemplate(platypus.BaseDocTemplate):
self.canv._pageNumber = 0
class _rml_template(object):
def __init__(self, out, node, doc, images={}, path='.'):
def __init__(self, out, node, doc, images={}, path='.', title=None):
self.images= images
self.path = path
self.title = title
if not node.hasAttribute('pageSize'):
pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm'))
else:
@@ -764,7 +768,7 @@ class _rml_template(object):
frames.append( frame )
gr = pt.getElementsByTagName('pageGraphics')
if len(gr):
drw = _rml_draw(gr[0], self.doc, images=images, path=self.path)
drw = _rml_draw(gr[0], self.doc, images=images, path=self.path, title=self.title)
self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) ))
else:
self.page_templates.append( platypus.PageTemplate(frames=frames, **utils.attr_get(pt, [], {'id':'str'}) ))
@@ -772,7 +776,7 @@ class _rml_template(object):
def render(self, node_stories):
fis = []
r = _rml_flowable(self.doc,images=self.images, path=self.path)
r = _rml_flowable(self.doc,images=self.images, path=self.path, title=self.title)
for node_story in node_stories:
fis += r.render(node_story)
if node_story==node_stories[-1]:
@@ -784,9 +788,7 @@ class _rml_template(object):
self.doc_tmpl.build(fis)
def parseString(data, fout=None, images={}, path='.',title=None):
r = _rml_doc(data, images, path)
global ftitle
ftitle=title
r = _rml_doc(data, images, path, title=title)
if fout:
fp = file(fout,'wb')
r.render(fp)
-1
View File
@@ -566,7 +566,6 @@ class report_sxw(report_rml):
if not context:
context={}
context = context.copy()
context['get_binary_size'] = False
pool = pooler.get_pool(cr.dbname)
ir_actions_report_xml_obj = pool.get('ir.actions.report.xml')
+3 -3
View File
@@ -327,7 +327,7 @@ def reverse_enumerate(l):
#----------------------------------------------------------
# Emails
#----------------------------------------------------------
def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, on_error=False, reply_to=False, tinycrm=False):
def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, on_error=False, reply_to=False, tinycrm=False, ssl=False, debug=False):
"""Send an email."""
if not email_cc:
email_cc=[]
@@ -358,12 +358,12 @@ def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=Non
if debug:
s.debuglevel = 5
s.connect(config['smtp_server'], config['smtp_port'])
if ssl:
s.ehlo()
s.starttls()
s.ehlo()
s.connect(config['smtp_server'], config['smtp_port'])
if config['smtp_user'] or config['smtp_password']:
s.login(config['smtp_user'], config['smtp_password'])
s.sendmail(email_from, flatten([email_to, email_cc, email_bcc]), msg.as_string())
@@ -423,12 +423,12 @@ def email_send_attach(email_from, email_to, subject, body, email_cc=None, email_
if debug:
s.debuglevel = 5
s.connect(config['smtp_server'], config['smtp_port'])
if ssl:
s.ehlo()
s.starttls()
s.ehlo()
s.connect(config['smtp_server'], config['smtp_port'])
if config['smtp_user'] or config['smtp_password']:
s.login(config['smtp_user'], config['smtp_password'])
s.sendmail(email_from, flatten([email_to, email_cc, email_bcc]), msg.as_string())