openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #00341
[Merge] lp:~openerp-dev/openobject-addons/ksa-addons2 into lp:~openerp-dev/openobject-addons/trunk-dev-addons2
ksa(OpenERP) has proposed merging lp:~openerp-dev/openobject-addons/ksa-addons2 into lp:~openerp-dev/openobject-addons/trunk-dev-addons2.
Requested reviews:
OpenERP R&D Team (openerp-dev)
Apply rights for purchase & Procurment module
--
https://code.launchpad.net/~openerp-dev/openobject-addons/ksa-addons2/+merge/40500
Your team OpenERP R&D Team is requested to review the proposed merge of lp:~openerp-dev/openobject-addons/ksa-addons2 into lp:~openerp-dev/openobject-addons/trunk-dev-addons2.
=== modified file 'account/account_view.xml'
--- account/account_view.xml 2010-11-02 17:05:10 +0000
+++ account/account_view.xml 2010-11-10 05:38:01 +0000
@@ -405,7 +405,7 @@
<field name="arch" type="xml">
<form string="Account Journal">
<group colspan="4" col="6">
- <field name="name" select="1"/>
+ <field name="name" select="1" colspan="4"/>
<field name="code" select="1"/>
<field name="type" on_change="onchange_type(type, currency)"/>
</group>
@@ -465,7 +465,6 @@
<field name="view_mode">tree,form</field>
</record>
<menuitem action="action_account_journal_form" id="menu_action_account_journal_form" parent="account_account_menu"/>
-
<record id="view_account_bank_statement_filter" model="ir.ui.view">
<field name="name">account.cash.statement.select</field>
<field name="model">account.bank.statement</field>
@@ -490,7 +489,6 @@
</search>
</field>
</record>
-
<record id="view_bank_statement_tree" model="ir.ui.view">
<field name="name">account.bank.statement.tree</field>
<field name="model">account.bank.statement</field>
@@ -950,7 +948,6 @@
<field name="domain">[('parent_id','=',False)]</field>
</record>
<menuitem action="action_tax_form" id="menu_action_tax_form" parent="next_id_27"/>
-
<record id="action_tax_code_tree" model="ir.actions.act_window">
<field name="name">Chart of Taxes</field>
<field name="res_model">account.tax.code</field>
@@ -1418,6 +1415,10 @@
<field name="period_id"/>
</group>
<newline/>
+ <group col="10" colspan="4">
+ <field name="journal_id" widget="selection" context="{'journal_id':self, 'visible_id':self or 0, 'normal_view':False}"/>
+ <field name="period_id" widget="selection" context="{'period_id':self}"/>
+ </group>
<group expand="0" string="Group By..." colspan="12" col="10">
<filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
<separator orientation="vertical"/>
@@ -2573,7 +2574,6 @@
</tree>
</field>
</record>
-
<record id="view_bank_statement_form2" model="ir.ui.view">
<field name="name">account.bank.statement.form</field>
<field name="model">account.bank.statement</field>
@@ -2588,7 +2588,6 @@
<field name="period_id" select="1"/>
<field name="currency" invisible="1"/>
</group>
-
<notebook colspan="4">
<page string="Cash Transactions" attrs="{'invisible': [('state','=','draft')]}">
<field colspan="4" name="line_ids" nolabel="1">
=== modified file 'account_analytic_analysis/security/ir.model.access.csv'
--- account_analytic_analysis/security/ir.model.access.csv 2010-10-16 16:47:09 +0000
+++ account_analytic_analysis/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -1,3 +1,3 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_account_analytic_analysis_summary_user,account_analytic_analysis.summary.user,model_account_analytic_analysis_summary_user,account.group_account_manager,1,0,0,0
-access_account_analytic_analysis_summary_month,account_analytic_analysis.summary.month,model_account_analytic_analysis_summary_month,account.group_account_manager,1,0,0,0
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_account_analytic_analysis_summary_user","account_analytic_analysis.summary.user","model_account_analytic_analysis_summary_user","account.group_account_manager",1,0,0,0
+"access_account_analytic_analysis_summary_month","account_analytic_analysis.summary.month","model_account_analytic_analysis_summary_month","account.group_account_manager",1,0,0,0
=== modified file 'base_action_rule/base_action_rule.py'
--- base_action_rule/base_action_rule.py 2010-09-30 15:29:42 +0000
+++ base_action_rule/base_action_rule.py 2010-11-10 05:38:01 +0000
@@ -24,7 +24,7 @@
from datetime import datetime
from datetime import timedelta
from tools.safe_eval import safe_eval
-import pooler
+import pooler
import re
import time
import tools
@@ -34,7 +34,7 @@
_name = 'base.action.rule'
_description = 'Action Rules'
-
+
def _state_get(self, cr, uid, context={}):
""" Get State
@param self: The object pointer
@@ -50,7 +50,7 @@
@param uid: the current userâs ID for security checks,
@param context: A standard dictionary for contextual values """
return [('', '')]
-
+
def priority_get(self, cr, uid, context={}):
""" Get Priority
@param self: The object pointer
@@ -60,57 +60,57 @@
return [('', '')]
_columns = {
- 'name': fields.char('Rule Name', size=64, required=True),
- 'model_id': fields.many2one('ir.model', 'Object', required=True),
- 'create_date': fields.datetime('Create Date', readonly=1),
+ 'name': fields.char('Rule Name', size=64, required=True),
+ 'model_id': fields.many2one('ir.model', 'Object', required=True),
+ 'create_date': fields.datetime('Create Date', readonly=1),
'active': fields.boolean('Active', help="If the active field is set to False,\
- it will allow you to hide the rule without removing it."),
+ it will allow you to hide the rule without removing it."),
'sequence': fields.integer('Sequence', help="Gives the sequence order \
-when displaying a list of rules."),
+when displaying a list of rules."),
'trg_date_type': fields.selection([
- ('none', 'None'),
- ('create', 'Creation Date'),
- ('action_last', 'Last Action Date'),
- ('date', 'Date'),
- ('deadline', 'Deadline'),
- ], 'Trigger Date', size=16),
+ ('none', 'None'),
+ ('create', 'Creation Date'),
+ ('action_last', 'Last Action Date'),
+ ('date', 'Date'),
+ ('deadline', 'Deadline'),
+ ], 'Trigger Date', size=16),
'trg_date_range': fields.integer('Delay after trigger date', \
help="Delay After Trigger Date,\
specifies you can put a negative number. If you need a delay before the \
-trigger date, like sending a reminder 15 minutes before a meeting."),
+trigger date, like sending a reminder 15 minutes before a meeting."),
'trg_date_range_type': fields.selection([('minutes', 'Minutes'), ('hour', 'Hours'), \
- ('day', 'Days'), ('month', 'Months')], 'Delay type'),
- 'trg_user_id': fields.many2one('res.users', 'Responsible'),
- 'trg_partner_id': fields.many2one('res.partner', 'Partner'),
- 'trg_partner_categ_id': fields.many2one('res.partner.category', 'Partner Category'),
- 'trg_state_from': fields.selection(_state_get, 'State', size=16),
- 'trg_state_to': fields.selection(_state_get, 'Button Pressed', size=16),
+ ('day', 'Days'), ('month', 'Months')], 'Delay type'),
+ 'trg_user_id': fields.many2one('res.users', 'Responsible'),
+ 'trg_partner_id': fields.many2one('res.partner', 'Partner'),
+ 'trg_partner_categ_id': fields.many2one('res.partner.category', 'Partner Category'),
+ 'trg_state_from': fields.selection(_state_get, 'State', size=16),
+ 'trg_state_to': fields.selection(_state_get, 'Button Pressed', size=16),
- 'act_method': fields.char('Call Object Method', size=64),
- 'act_user_id': fields.many2one('res.users', 'Set Responsible to'),
- 'act_state': fields.selection(_state_get, 'Set State to', size=16),
+ 'act_method': fields.char('Call Object Method', size=64),
+ 'act_user_id': fields.many2one('res.users', 'Set Responsible to'),
+ 'act_state': fields.selection(_state_get, 'Set State to', size=16),
'act_email_cc': fields.char('Add Watchers (Cc)', size=250, help="\
These people will receive a copy of the future communication between partner \
-and users by email"),
+and users by email"),
'act_remind_partner': fields.boolean('Remind Partner', help="Check \
-this if you want the rule to send a reminder by email to the partner."),
+this if you want the rule to send a reminder by email to the partner."),
'act_remind_user': fields.boolean('Remind Responsible', help="Check \
-this if you want the rule to send a reminder by email to the user."),
- 'act_reply_to': fields.char('Reply-To', size=64),
- 'act_remind_attach': fields.boolean('Remind with Attachment', help="Check this if you want that all documents attached to the object be attached to the reminder email sent."),
+this if you want the rule to send a reminder by email to the user."),
+ 'act_reply_to': fields.char('Reply-To', size=64),
+ 'act_remind_attach': fields.boolean('Remind with Attachment', help="Check this if you want that all documents attached to the object be attached to the reminder email sent."),
'act_mail_to_user': fields.boolean('Mail to Responsible', help="Check\
- this if you want the rule to send an email to the responsible person."),
- 'act_mail_to_watchers': fields.boolean('Mail to Watchers (CC)',
+ this if you want the rule to send an email to the responsible person."),
+ 'act_mail_to_watchers': fields.boolean('Mail to Watchers (CC)',
help="Check this if you want \
-the rule to mark CC(mail to any other person defined in actions)."),
+the rule to mark CC(mail to any other person defined in actions)."),
'act_mail_to_email': fields.char('Mail to these Emails', size=128, \
- help="Email-id of the persons whom mail is to be sent"),
- 'act_mail_body': fields.text('Mail body', help="Content of mail"),
+ help="Email-id of the persons whom mail is to be sent"),
+ 'act_mail_body': fields.text('Mail body', help="Content of mail"),
'regex_name': fields.char('Regex on Resource Name', size=128, help="Regular expression for matching name of the resource\
\ne.g.: 'urgent.*' will search for records having name starting with the string 'urgent'\
-\nNote: This is case sensitive search."),
- 'server_action_id': fields.many2one('ir.actions.server', 'Server Action', help="Describes the action name.\neg:on which object which action to be taken on basis of which condition"),
- 'filter_id':fields.many2one('ir.filters', 'Filter', required=False),
+\nNote: This is case sensitive search."),
+ 'server_action_id': fields.many2one('ir.actions.server', 'Server Action', help="Describes the action name.\neg:on which object which action to be taken on basis of which condition"),
+ 'filter_id':fields.many2one('ir.filters', 'Filter', required=False),
'act_email_from' : fields.char('Email From', size=64, required=False,
help="Use a python expression to specify the right field on which one than we will use for the 'From' field of the header"),
'act_email_to' : fields.char('Email To', size=64, required=False,
@@ -118,17 +118,17 @@
}
_defaults = {
- 'active': lambda *a: True,
- 'trg_date_type': lambda *a: 'none',
- 'trg_date_range_type': lambda *a: 'day',
- 'act_mail_to_user': lambda *a: 0,
- 'act_remind_partner': lambda *a: 0,
- 'act_remind_user': lambda *a: 0,
- 'act_mail_to_watchers': lambda *a: 0,
+ 'active': lambda *a: True,
+ 'trg_date_type': lambda *a: 'none',
+ 'trg_date_range_type': lambda *a: 'day',
+ 'act_mail_to_user': lambda *a: 0,
+ 'act_remind_partner': lambda *a: 0,
+ 'act_remind_user': lambda *a: 0,
+ 'act_mail_to_watchers': lambda *a: 0,
}
-
+
_order = 'sequence'
-
+
def onchange_model_id(self, cr, uid, ids, name):
#This is not a good solution as it will affect the domain only on onchange
res = {'domain':{'filter_id':[]}}
@@ -165,7 +165,7 @@
self.pre_action(cr, uid, [new_id], model, context=context)
return new_id
return make_call_old
-
+
def _write(self, old_write, model, context=None):
if not context:
context = {}
@@ -191,9 +191,9 @@
return True
def create(self, cr, uid, vals, context=None):
res_id = super(base_action_rule, self).create(cr, uid, vals, context)
- self._register_hook(cr, uid, [res_id], context=context)
+ self._register_hook(cr, uid, [res_id], context=context)
return res_id
-
+
def write(self, cr, uid, ids, vals, context=None):
res = super(base_action_rule, self).write(cr, uid, ids, vals, context)
self._register_hook(cr, uid, ids, context=context)
@@ -207,7 +207,7 @@
rule_pool = self.pool.get('base.action.rule')
rule_ids = rule_pool.search(cr, uid, [], context=context)
return self._register_hook(cr, uid, rule_ids, context=context)
-
+
def format_body(self, body):
""" Foramat Action rule's body
@@ -219,18 +219,18 @@
@param self: The object pointer """
data = {
- 'object_id': obj.id,
- 'object_subject': hasattr(obj, 'name') and obj.name or False,
- 'object_date': hasattr(obj, 'date') and obj.date or False,
- 'object_description': hasattr(obj, 'description') and obj.description or False,
- 'object_user': hasattr(obj, 'user_id') and (obj.user_id and obj.user_id.name) or '/',
+ 'object_id': obj.id,
+ 'object_subject': hasattr(obj, 'name') and obj.name or False,
+ 'object_date': hasattr(obj, 'date') and obj.date or False,
+ 'object_description': hasattr(obj, 'description') and obj.description or False,
+ 'object_user': hasattr(obj, 'user_id') and (obj.user_id and obj.user_id.name) or '/',
'object_user_email': hasattr(obj, 'user_id') and (obj.user_id and \
- obj.user_id.address_id and obj.user_id.address_id.email) or '/',
+ obj.user_id.address_id and obj.user_id.address_id.email) or '/',
'object_user_phone': hasattr(obj, 'user_id') and (obj.user_id and\
- obj.user_id.address_id and obj.user_id.address_id.phone) or '/',
- 'partner': hasattr(obj, 'partner_id') and (obj.partner_id and obj.partner_id.name) or '/',
+ obj.user_id.address_id and obj.user_id.address_id.phone) or '/',
+ 'partner': hasattr(obj, 'partner_id') and (obj.partner_id and obj.partner_id.name) or '/',
'partner_email': hasattr(obj, 'partner_address_id') and (obj.partner_address_id and\
- obj.partner_address_id.email) or '/',
+ obj.partner_address_id.email) or '/',
}
return self.format_body(body % data)
@@ -259,7 +259,7 @@
emailfrom = tools.ustr(emailfrom)
reply_to = emailfrom
if not emailfrom:
- raise osv.except_osv(_('Error!'),
+ raise osv.except_osv(_('Error!'),
_("No E-Mail ID Found for your Company address!"))
return tools.email_send(emailfrom, emails, name, body, reply_to=reply_to, openobject_id=str(obj.id))
@@ -272,7 +272,7 @@
@param context: A standard dictionary for contextual values """
if context is None:
context = {}
- ok = True
+ ok = True
if action.filter_id:
if action.model_id.model == action.filter_id.model_id:
context.update(eval(action.filter_id.context))
@@ -418,10 +418,10 @@
base = datetime.strptime(obj.date, '%Y-%m-%d %H:%M:%S')
if base:
fnct = {
- 'minutes': lambda interval: timedelta(minutes=interval),
- 'day': lambda interval: timedelta(days=interval),
- 'hour': lambda interval: timedelta(hours=interval),
- 'month': lambda interval: timedelta(months=interval),
+ 'minutes': lambda interval: timedelta(minutes=interval),
+ 'day': lambda interval: timedelta(days=interval),
+ 'hour': lambda interval: timedelta(hours=interval),
+ 'month': lambda interval: timedelta(months=interval),
}
d = base + fnct[action.trg_date_range_type](action.trg_date_range)
dt = d.strftime('%Y-%m-%d %H:%M:%S')
@@ -463,15 +463,15 @@
return True
_constraints = [
- (_check_mail, 'Error: The mail is not well formated', ['act_mail_body']),
+ (_check_mail, 'Error: The mail is not well formated', ['act_mail_body']),
]
base_action_rule()
class ir_cron(osv.osv):
- _inherit = 'ir.cron'
-
+ _inherit = 'ir.cron'
+
def _poolJobs(self, db_name, check=False):
try:
db = pooler.get_db(db_name)
=== modified file 'base_calendar/test/base_calendar_test.yml'
--- base_calendar/test/base_calendar_test.yml 2010-10-27 08:12:24 +0000
+++ base_calendar/test/base_calendar_test.yml 2010-11-10 05:38:01 +0000
@@ -42,8 +42,8 @@
name: All day test event
rrule_type: none
- |
- In order to check reminder I will first create reminder
--
+ In order to check reminder I will first create reminder
+-
!record {model: res.alarm, id: res_alarm_daybeforeeventstarts0}:
name: 1 Day before event starts
trigger_duration: 1
@@ -57,7 +57,7 @@
self.write(cr, uid, [ref("calendar_event_alldaytestevent0")], {'alarm_id': ref("res_alarm_daybeforeeventstarts0")})
- |
In order to assign attendee I will invite Demo user
--
+-
!record {model: base_calendar.invite.attendee, id: base_calendar_invite_attendee_0}:
type: internal
send_mail: False
=== removed file 'base_module_quality/unit_test/__init__.py'
--- base_module_quality/unit_test/__init__.py 2010-01-12 09:18:39 +0000
+++ base_module_quality/unit_test/__init__.py 1970-01-01 00:00:00 +0000
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). All Rights Reserved
-# $Id$
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
=== removed file 'base_module_quality/unit_test/unit_test.py'
--- base_module_quality/unit_test/unit_test.py 2010-10-26 13:22:54 +0000
+++ base_module_quality/unit_test/unit_test.py 1970-01-01 00:00:00 +0000
@@ -1,114 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). All Rights Reserved
-# $Id$
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-import os
-
-from osv import fields, osv
-from tools.translate import _
-import pooler
-import addons
-from base_module_quality import base_module_quality
-
-class quality_test(base_module_quality.abstract_quality_check):
-
- def __init__(self):
- super(quality_test, self).__init__()
- self.bool_installed_only = True
- self.name = _("Unit Test")
- self.note = _("""
-This test checks the Unit Test(PyUnit) Cases of the module. Note that 'unit_test/test.py' is needed in module.
-
-""")
- self.min_score = 0
- self.message = 'This test does not calculate score'
- self.bool_count_score = False
- return None
-
- def run_test(self, cr, uid, module_path):
- pool = pooler.get_pool(cr.dbname)
- module_name = module_path.split('/')[-1]
- test_file = addons.get_module_resource(module_name) + '/unit_test/test.py'
- if not os.path.isfile(test_file):
- self.result += _("Module does not have 'unit_test/test.py' file")
- return None
- module_obj = pool.get('ir.module.module')
- module_ids = module_obj.search(cr, uid, [('name', '=', module_name)])
- module = module_obj.browse(cr, uid, module_ids)
- if not len(module):
- self.result += _("Error! Module is not properly loaded/installed")
- return None
- module = module[0]
- test = module.name + '.' + 'unit_test.test'
- test_module = __import__(test)
- test_file = getattr(test_module, 'unit_test')
- test_obj = getattr(test_file, 'test')
-
- test_result = test_obj.runTest(cr,uid)
- self.result = self.get_result(test_result)
- self.result_details += self.get_result_details(test_result)
- return None
-
- def get_result(self, data_list):
- header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-40s \n', [_('Summary'), _('Status')])
- result_unit = {}
- res_list = []
- if data_list[0]:
- res = data_list[1].split('\n')
- res_list.append(res[-4:][0])
- res_list.append(res[-4:][2])
- result_unit['unit_test'] = res_list
- return self.format_table(header, data_list=result_unit)
- return "Unit Test Fail"
-
- def get_result_details(self, data_list):
- detail = '''<html><head>%s</head><body><table class="tablestyle">
- <tr><th class="tdatastyle">Test Cases</th ><th class="tdatastyle">Result</th>'''%(self.get_style())
- html = ''
-
- if data_list[0] == True:
- data = data_list[1].split('... ok')
- for case in map(lambda x:x[0].replace('\n',''),map(lambda x: x.split(' ('),data)):
- if case.find('Ran') != -1:
- case = case[case.index('Ran'):-2]
- html += '<tr><th class="tdatastyle">%s</th><th class="tdatastyle">OK</th></tr>'%(case)
- else:
- html += '<tr><td class="tdatastyle">%s</td><td class="tdatastyle">OK</td></tr>'%(case)
- res = detail + html + '</table></body></html>'
- return res
- else:
- detail_dict = {}
- detail += '''<th class="tdatastyle">Details</th></tr>'''
- data = data_list[1].split("======================================================================")
- test = data[0].split('\n')
- for err in (data_list[0].failures,data_list[0].errors):
- for value in err:
- detail_dict[value[0]._testMethodName] = value[1]
- for case in map(lambda x:x.split('...'), test):
- if len(case[0]) < 2:
- continue
- test_name = case[0].split(' (')[0]
- if not detail_dict.has_key(test_name):
- detail_dict[test_name] = ''
- html += '<tr><th class="tdatastyle">%s</th><th class="tdatastyle">%s</th><td class="tdatastyle">%s</td></tr>'%(test_name, case[1], detail_dict[test_name])
- return detail + html +'</tr></table></body></html>'
- return ''
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
=== modified file 'crm/crm_lead.py'
--- crm/crm_lead.py 2010-10-17 18:28:33 +0000
+++ crm/crm_lead.py 2010-11-10 05:38:01 +0000
@@ -100,7 +100,7 @@
_columns = {
# Overridden from res.partner.address:
- 'partner_id': fields.many2one('res.partner', 'Partner', ondelete='set null',
+ 'partner_id': fields.many2one('res.partner', 'Partner', ondelete='set null',
select=True, help="Optional linked partner, usually after conversion of the lead"),
# From crm.case
@@ -124,7 +124,7 @@
domain="['|',('section_id','=',section_id),('section_id','=',False)]"),
'channel_id': fields.many2one('res.partner.canal', 'Channel'),
- 'contact_name': fields.char('Contact Name', size=64),
+ 'contact_name': fields.char('Contact Name', size=64),
'partner_name': fields.char("Customer Name", size=64),
'optin': fields.boolean('Opt-In', help="If opt-in is checked, this contact has accepted to receive emails."),
'optout': fields.boolean('Opt-Out', help="If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign."),
@@ -147,7 +147,7 @@
help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\
\nWhen the case is over, the state is set to \'Done\'.\
- \nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
+ \nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
}
@@ -341,7 +341,7 @@
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current userâs ID for security checks,
- @param ids: List of update mailâs IDs
+ @param ids: List of update mailâs IDs
"""
if isinstance(ids, (str, int, long)):
=== modified file 'crm/crm_meeting.py'
--- crm/crm_meeting.py 2010-10-18 07:00:37 +0000
+++ crm/crm_meeting.py 2010-11-10 05:38:01 +0000
@@ -45,12 +45,12 @@
_inherit = ['mailgate.thread',"calendar.event"]
_columns = {
# From crm.case
- 'name': fields.char('Summary', size=124, required=True, states={'done': [('readonly', True)]}),
- 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),
+ 'name': fields.char('Summary', size=124, required=True, states={'done': [('readonly', True)]}),
+ 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
- domain="[('partner_id','=',partner_id)]", states={'done': [('readonly', True)]}),
+ domain="[('partner_id','=',partner_id)]", states={'done': [('readonly', True)]}),
'section_id': fields.many2one('crm.case.section', 'Sales Team', states={'done': [('readonly', True)]}, \
- select=True, help='Sales team to which Case belongs to.'),
+ select=True, help='Sales team to which Case belongs to.'),
'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, help="These people will receive email."),
'id': fields.integer('ID'),
'create_date': fields.datetime('Creation Date' , readonly=True),
@@ -76,7 +76,7 @@
}
_defaults = {
- 'state': lambda *a: 'draft',
+ 'state': lambda *a: 'draft',
'active': lambda *a: 1,
'user_id': lambda self, cr, uid, ctx: uid,
}
=== modified file 'crm/report/crm_lead_report.py'
--- crm/report/crm_lead_report.py 2010-10-05 13:13:07 +0000
+++ crm/report/crm_lead_report.py 2010-11-10 05:38:01 +0000
@@ -107,7 +107,7 @@
c.partner_id,
c.country_id,
c.planned_revenue,
- c.planned_revenue*(c.probability/100) as probable_revenue,
+ c.planned_revenue*(c.probability/100) as probable_revenue,
1 as nbr,
(SELECT count(id) FROM mailgate_message WHERE model='crm.lead' AND res_id=c.id AND history=True) AS email,
date_trunc('day',c.create_date) as create_date,
=== modified file 'crm/report/crm_phonecall_report.py'
--- crm/report/crm_phonecall_report.py 2010-10-12 05:58:58 +0000
+++ crm/report/crm_phonecall_report.py 2010-11-10 05:38:01 +0000
@@ -38,7 +38,6 @@
_name = "crm.phonecall.report"
_description = "Phone calls by user and section"
_auto = False
-
_columns = {
'name': fields.char('Year', size=64, required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
@@ -53,7 +52,7 @@
('09', 'September'), ('10', 'October'),\
('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'create_date': fields.datetime('Create Date', readonly=True),
- 'day': fields.char('Day', size=128, readonly=True),
+ 'day': fields.char('Day', size=128, readonly=True),
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
'duration': fields.float('Duration', digits=(16,2),readonly=True, group_operator="avg"),
'delay_open': fields.float('Delay to open',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"),
=== modified file 'crm/security/crm_security.xml'
--- crm/security/crm_security.xml 2010-10-18 09:28:40 +0000
+++ crm/security/crm_security.xml 2010-11-10 05:38:01 +0000
@@ -20,6 +20,7 @@
<field name="domain_force">['|',('user_id','=',user.id),('user_id','=',False)]</field>
<field name="groups" eval="[(4, ref('base.group_sale_salesman'))]"/>
</record>
+
<record id="crm_rule_all_lead" model="ir.rule">
<field name="name">All Leads</field>
<field ref="model_crm_lead" name="model_id"/>
=== modified file 'crm_claim/report/crm_claim_report.py'
--- crm_claim/report/crm_claim_report.py 2010-10-04 06:03:16 +0000
+++ crm_claim/report/crm_claim_report.py 2010-11-10 05:38:01 +0000
@@ -45,7 +45,6 @@
_name = "crm.claim.report"
_auto = False
_description = "CRM Claim Report"
-
_columns = {
'name': fields.char('Year', size=64, required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
@@ -60,7 +59,7 @@
('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'create_date': fields.datetime('Create Date', readonly=True),
- 'day': fields.char('Day', size=128, readonly=True),
+ 'day': fields.char('Day', size=128, readonly=True),
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True),
'categ_id': fields.many2one('crm.case.categ', 'Category',\
=== modified file 'crm_fundraising/report/crm_fundraising_report.py'
--- crm_fundraising/report/crm_fundraising_report.py 2010-09-20 13:59:10 +0000
+++ crm_fundraising/report/crm_fundraising_report.py 2010-11-10 05:38:01 +0000
@@ -36,7 +36,6 @@
_name = "crm.fundraising.report"
_auto = False
_description = "CRM Fundraising Report"
-
_columns = {
'name': fields.char('Year', size=64, required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
@@ -51,7 +50,7 @@
('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'create_date': fields.datetime('Create Date', readonly=True),
- 'day': fields.char('Day', size=128, readonly=True),
+ 'day': fields.char('Day', size=128, readonly=True),
'categ_id': fields.many2one('crm.case.categ', 'Category', \
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.fundraising')]"),
=== modified file 'document/document_storage.py'
--- document/document_storage.py 2010-08-10 12:29:57 +0000
+++ document/document_storage.py 2010-11-10 05:38:01 +0000
@@ -54,7 +54,7 @@
Have (ir.attachment, context), we modify the file (save, update, rename etc).
Have (directory, context), we create a file.
Have (path, context), we create or modify a file.
-
+
Note that in all above cases, we don't explicitly choose the storage media,
but always require a context to be present.
@@ -63,7 +63,7 @@
media + directory.
The algorithm says that in any of the above cases, our first goal is to locate
-the node for any combination of search criteria. It would be wise NOT to
+the node for any combination of search criteria. It would be wise NOT to
represent each node in the path (like node[/] + node[/dir1] + node[/dir1/dir2])
but directly jump to the end node (like node[/dir1/dir2]) whenever possible.
@@ -100,7 +100,7 @@
if mode.endswith('b'):
mode = mode[:-1]
self.mode = mode
-
+
for attr in ('closed', 'read', 'write', 'seek', 'tell'):
setattr(self,attr, getattr(self.__file, attr))
@@ -117,7 +117,7 @@
filename = par.path
if isinstance(filename, (tuple, list)):
filename = '/'.join(filename)
-
+
try:
mime, icont = cntIndex.doIndex(None, filename=filename,
content_type=None, realfname=fname)
@@ -167,7 +167,7 @@
nodes.node_descriptor.__init__(self, parent)
if mode.endswith('b'):
mode = mode[:-1]
-
+
if mode in ('r', 'r+'):
cr = ira_browse._cr # reuse the cursor of the browse object, just now
cr.execute('SELECT db_datas FROM ir_attachment WHERE id = %s',(ira_browse.id,))
@@ -198,7 +198,7 @@
filename = par.path
if isinstance(filename, (tuple, list)):
filename = '/'.join(filename)
-
+
try:
mime, icont = cntIndex.doIndex(data, filename=filename,
content_type=None, realfname=None)
@@ -235,7 +235,7 @@
class nodefd_db64(StringIO, nodes.node_descriptor):
""" A descriptor to db data, base64 (the old way)
-
+
It stores the data in base64 encoding at the db. Not optimal, but
the transparent compression of Postgres will save the day.
"""
@@ -243,7 +243,7 @@
nodes.node_descriptor.__init__(self, parent)
if mode.endswith('b'):
mode = mode[:-1]
-
+
if mode in ('r', 'r+'):
StringIO.__init__(self, base64.decodestring(ira_browse.db_datas))
elif mode in ('w', 'w+'):
@@ -271,7 +271,7 @@
filename = par.path
if isinstance(filename, (tuple, list)):
filename = '/'.join(filename)
-
+
try:
mime, icont = cntIndex.doIndex(data, filename=filename,
content_type=None, realfname=None)
@@ -312,7 +312,7 @@
media.
The referring document.directory-ies will control the placement of data
into the storage.
-
+
It is a bad idea to have multiple document.storage objects pointing to
the same tree of filesystem storage.
"""
@@ -367,12 +367,12 @@
def __prepare_realpath(self, cr, file_node, ira, store_path, do_create=True):
""" Cleanup path for realstore, create dirs if needed
-
+
@param file_node the node
@param ira ir.attachment browse of the file_node
@param store_path the path of the parent storage object, list
@param do_create create the directories, if needed
-
+
@return tuple(path "/var/filestore/real/dir/", npath ['dir','fname.ext'] )
"""
file_node.fix_ppath(cr, ira)
@@ -406,7 +406,7 @@
boo = self.browse(cr, uid, id, context)
if not boo.online:
raise IOError(errno.EREMOTE, 'medium offline')
-
+
if fil_obj:
ira = fil_obj
else:
@@ -421,10 +421,10 @@
boo = self.browse(cr, uid, id, context)
if not boo.online:
raise IOError(errno.EREMOTE, 'medium offline')
-
+
if boo.readonly and mode not in ('r', 'rb'):
raise IOError(errno.EPERM, "Readonly medium")
-
+
ira = self.pool.get('ir.attachment').browse(cr, uid, file_node.file_id, context=context)
if boo.type == 'filestore':
if not ira.store_fname:
@@ -464,7 +464,7 @@
elif boo.type == 'virtual':
raise ValueError('Virtual storage does not support static files')
-
+
else:
raise TypeError("No %s storage" % boo.type)
@@ -529,7 +529,7 @@
if not boo.online:
raise IOError(errno.EREMOTE, 'medium offline')
-
+
if boo.readonly:
raise IOError(errno.EPERM, "Readonly medium")
@@ -546,7 +546,7 @@
fp.close()
self._doclog.debug( "Saved data to %s" % fname)
filesize = len(data) # os.stat(fname).st_size
-
+
# TODO Here, an old file would be left hanging.
except Exception, e:
@@ -623,7 +623,7 @@
if not storage_bo.online:
raise IOError(errno.EREMOTE, 'medium offline')
-
+
if storage_bo.readonly:
raise IOError(errno.EPERM, "Readonly medium")
@@ -660,7 +660,7 @@
""" A preparation for a file rename.
It will not affect the database, but merely check and perhaps
rename the realstore file.
-
+
@return the dict of values that can safely be be stored in the db.
"""
sbro = self.browse(cr, uid, file_node.storage_id, context=context)
@@ -668,7 +668,7 @@
if not sbro.online:
raise IOError(errno.EREMOTE, 'medium offline')
-
+
if sbro.readonly:
raise IOError(errno.EPERM, "Readonly medium")
@@ -700,7 +700,7 @@
""" A preparation for a file move.
It will not affect the database, but merely check and perhaps
move the realstore file.
-
+
@param ndir_bro a browse object of document.directory, where this
file should move to.
@return the dict of values that can safely be be stored in the db.
@@ -710,7 +710,7 @@
if not sbro.online:
raise IOError(errno.EREMOTE, 'medium offline')
-
+
if sbro.readonly:
raise IOError(errno.EPERM, "Readonly medium")
@@ -735,11 +735,11 @@
return ValueError("Tried to rename a non-stored file")
path = sbro.path
oldpath = os.path.join(path, fname)
-
+
for ch in ('*', '|', "\\", '/', ':', '"', '<', '>', '?', '..'):
if ch in new_name:
raise ValueError("Invalid char %s in name %s" %(ch, new_name))
-
+
file_node.fix_ppath(cr, ira)
npath = file_node.full_path() or []
dpath = [path,]
=== modified file 'document_ftp/wizard/ftp_configuration.py'
--- document_ftp/wizard/ftp_configuration.py 2010-10-12 06:26:08 +0000
+++ document_ftp/wizard/ftp_configuration.py 2010-11-10 05:38:01 +0000
@@ -18,7 +18,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
-
from osv import osv, fields
from tools import config
@@ -27,7 +26,7 @@
_name='document.ftp.configuration'
_description = 'Auto Directory Configuration'
_inherit = 'res.config'
- _rec_name = 'host'
+
_columns = {
'host': fields.char('Address', size=64,
help="Server address or IP and port to which users should connect to for DMS access",
=== modified file 'document_webdav/webdav_server.py'
--- document_webdav/webdav_server.py 2010-10-15 09:27:58 +0000
+++ document_webdav/webdav_server.py 2010-11-10 05:38:01 +0000
@@ -262,6 +262,17 @@
return True
return OpenERPAuthProvider.authenticate(self, db, user, passwd, client_address)
+from service.http_server import reg_http_service,OpenERPAuthProvider
+
+class DAVAuthProvider(OpenERPAuthProvider):
+ def authenticate(self, db, user, passwd, client_address):
+ """ authenticate, but also allow the False db, meaning to skip
+ authentication when no db is specified.
+ """
+ if db is False:
+ return True
+ return OpenERPAuthProvider.authenticate(self, db, user, passwd, client_address)
+
try:
if (config.get_misc('webdav','enable',True)):
=== modified file 'event/test/test_event.yml'
--- event/test/test_event.yml 2010-09-27 14:48:08 +0000
+++ event/test/test_event.yml 2010-11-10 05:38:01 +0000
@@ -1,17 +1,17 @@
- |
- In order to test the "Event Organisation" in Association system.
+ In order to test the "Event Organisation" in Association system.
- |
I want to organize one conference event on "OpenERP Business".
- |
I'm creating new product "Ticket for Conference" to specify registration Cost of conference.
--
+-
!record {model: product.product, id: product_product_ticketforconcert0}:
categ_id: product.cat1
list_price: 68.0
- name: Ticket for Conference
+ name: Ticket for Conference
- |
I'm creating Event type "Conference".
--
+-
!record {model: event.type, id: event_type_conference0}:
name: Conferences
- |
@@ -26,31 +26,31 @@
reply_to: 'info@xxxxxxxxxxxx'
- |
Check that the new conference event is "Draft" or not.
--
+-
!assert {model: event.event, id: event_event_conference0}:
- state == 'draft', "Event should be in draft by default when first time created"
- |
Need Minimum 10 Registrations to confirm/start this Conference Event and does not allowed more than 100 Registrations.
- |
So I set Minimum and Maximum Registrations limit.
--
+-
!python {model: event.event}: |
self.write(cr, uid, [ref('event_event_conference0')], {'register_max': 100, 'register_min': 10})
- |
I'm doing to confirm that conference event.
--
+-
!python {model: event.event}: |
self.button_confirm(cr, uid, [ref("event_event_conference0")])
- |
- But this conference event need minimum 10 Confirmed Registrations. so Check that Event is not "confirmed".
--
+ But this conference event need minimum 10 Confirmed Registrations. so Check that Event is not "confirmed".
+-
!assert {model: event.event, id: event_event_conference0}:
- state != 'confirm', "Event should not confirmed if minimum registrations does not reached"
- |
"Mark Johnson" want to subscribe/join into "Conference on OpenERP Business" with 10 tickets.
-- |
+- |
I'm creating new partner "Mark Johnson" with his email "info@xxxxxxxxxxxxxx".
--
+-
!record {model: res.partner, id: res_partner_markjohnson0}:
address:
- city: Bruxelles
@@ -66,10 +66,10 @@
zip: '1000'
email: 'info@xxxxxxxxxxxxxx'
name: Mark Johnson
-
+
- |
- I'm creating Registration for "Mark Johnson" on "Conference on OpenERP Business" with 10 tickets.
--
+ I'm creating Registration for "Mark Johnson" on "Conference on OpenERP Business" with 10 tickets.
+-
!record {model: event.registration, id: event_registration_registrationjacot0}:
contact_id: base_contact.res_partner_contact_jacot0
event_id: event.event_event_conference0
@@ -79,28 +79,28 @@
unit_price: 68.0
nb_register: 10
- |
- I'm going to Open that Registration.
--
+ I'm going to Open that Registration.
+-
!python {model: event.registration}: |
self.check_confirm(cr, uid, [ref("event_registration_registrationjacot0")])
- |
Check that Registration is in "Open" state or not.
--
- !assert {model: event.registration, id: event_registration_registrationjacot0}:
+-
+ !assert {model: event.registration, id: event_registration_registrationjacot0}:
- state == 'open', "Registration should be open here."
- |
I'm again trying to confirm that conference event.
--
+-
!python {model: event.event}: |
self.button_confirm(cr, uid, [ref("event_event_conference0")])
-
+
- |
- Now Minimum requirement of Registration is fulfil. so Check that Event is "confirmed" or not.
--
+ Now Minimum requirement of Registration is fulfil. so Check that Event is "confirmed" or not.
+-
!assert {model: event.event, id: event_event_conference0}:
- state == 'confirm', "Event should be confirmed here."
-
+
- |
I'm creating invoice of Registration of "Mark Johnson" on "Conference on OpenERP Business".
-
@@ -108,22 +108,22 @@
self.action_invoice_create(cr, uid, [ref("event_registration_registrationjacot0")])
- |
- Check Invoice of Registration of "Mark Johnson" is created or not.
--
+ Check Invoice of Registration of "Mark Johnson" is created or not.
+-
!assert {model: event.registration, id: event_registration_registrationjacot0}:
- invoice_id != False, "Invoice should be generated"
- |
- Check Registration of "Mark Johnson" is closed or not after invoice generated.
--
+ Check Registration of "Mark Johnson" is closed or not after invoice generated.
+-
!assert {model: event.registration, id: event_registration_registrationjacot0}:
- state != 'done', "Registration should be closed after invoice generated"
-
+
- |
Now "Mark Johnson" want to another registration on "Conference on OpenERP Business" with 120 tickets.
- |
I'm creating new registration for "Mark Johnson" with 100 tickets.
--
+-
!record {model: event.registration, id: event_registration_registrationzen0}:
event_id: event.event_event_conference0
partner_id: event.res_partner_markjohnson0
@@ -131,42 +131,42 @@
event_product: Ticket for Conference
unit_price: 68.0
nb_register: 100
-
+
- |
- I'm going to open "Mark Johnson" registration.
--
+ I'm going to open "Mark Johnson" registration.
+-
!python {model: event.registration}: |
self.check_confirm(cr, uid, [ref("event_registration_registrationzen0")])
- |
- But conference event does not allow more than 100 Registrations. so Check that registration is not in "open" state.
--
+ But conference event does not allow more than 100 Registrations. so Check that registration is not in "open" state.
+-
!assert {model: event.registration, id: event_registration_registrationzen0}:
- state == 'draft', "Registration should be in draft by default."
- |
- Now I'm modifying number of tickets of "Mark Johnson"'s registration with 90 tickets.
--
+ Now I'm modifying number of tickets of "Mark Johnson"'s registration with 90 tickets.
+-
!python {model: event.registration}: |
self.write(cr, uid, [ref("event_registration_registrationzen0")], {'nb_register': 90})
- |
- I'm again try to open "Mark Johnson" registration.
--
+ I'm again try to open "Mark Johnson" registration.
+-
!python {model: event.registration}: |
self.check_confirm(cr, uid, [ref("event_registration_registrationzen0")])
- |
- Check that registration "open" or not.
--
+ Check that registration "open" or not.
+-
!assert {model: event.registration, id: event_registration_registrationzen0}:
- state == 'open', "Registration should be open here."
- |
I'm closing "Conference on OpenERP Business" Conference event
--
+-
!python {model: event.event}: |
self.button_done(cr, uid, [ref("event_event_conference0")])
- |
- Check that conference is in "close" state or not.
--
+ Check that conference is in "close" state or not.
+-
!assert {model: event.event, id: event_event_conference0}:
- state == 'done', "Registration should be Closed here."
-
+
=== modified file 'hr_attendance/hr_attendance_view.xml'
--- hr_attendance/hr_attendance_view.xml 2010-10-16 09:19:07 +0000
+++ hr_attendance/hr_attendance_view.xml 2010-11-10 05:38:01 +0000
@@ -116,7 +116,7 @@
<field name="view_id" ref="view_attendance_reason"/>
</record>
- <menuitem
+ <menuitem
sequence="2" id="hr.menu_open_view_attendance_reason_new_config" parent="hr.menu_hr_configuration" name="Attendances"
groups="base.group_extended"/>
<menuitem action="open_view_attendance_reason" id="menu_open_view_attendance_reason" parent="hr.menu_open_view_attendance_reason_new_config"/>
=== modified file 'hr_timesheet/security/ir.model.access.csv'
--- hr_timesheet/security/ir.model.access.csv 2010-10-09 05:27:04 +0000
+++ hr_timesheet/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -6,3 +6,4 @@
"access_product_template_hr_timesheet","product.template.hr.timesheet","product.model_product_template","base.group_hr_user",1,1,1,1
"access_product_uom_hr_timesheet","product.uom.hr.timesheet","product.model_product_uom","base.group_hr_user",1,1,1,1
"access_account_fiscalyear_hr_user","account.account.fiscalyear.user","account.model_account_fiscalyear","base.group_hr_user",1,1,1,1
+"access_hr_analytic_timesheet","hr.analytic.timesheet","model_hr_analytic_timesheet","project.group_project_finance_user",1,0,0,0
=== modified file 'hr_timesheet_invoice/security/ir.model.access.csv'
--- hr_timesheet_invoice/security/ir.model.access.csv 2010-10-09 05:27:04 +0000
+++ hr_timesheet_invoice/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -14,3 +14,4 @@
"access_account_invoice_hr_user","account.invoice.hr.user","account.model_account_invoice","base.group_hr_user",1,1,1,1
"access_account_invoice_tax_hr_manager","account.invoice.tax.hr.manager","account.model_account_invoice_tax","base.group_hr_manager",1,1,1,1
"access_report_timesheet_line_employee","report.timesheet.line.employee","model_report_timesheet_line","base.group_hr_user",1,1,1,1
+"access_hr_timesheet_invoice_factor","hr_timesheet_invoice.factor","model_hr_timesheet_invoice_factor","project.group_project_finance_user",1,1,0,0
=== modified file 'hr_timesheet_sheet/hr_timesheet_sheet_view.xml'
--- hr_timesheet_sheet/hr_timesheet_sheet_view.xml 2010-10-28 05:01:35 +0000
+++ hr_timesheet_sheet/hr_timesheet_sheet_view.xml 2010-11-10 05:38:01 +0000
@@ -181,8 +181,9 @@
<menuitem
id="base.menu_project_management_time_tracking"
name="Time Tracking"
- parent="base.menu_main_pm" sequence="5"/>
-
+ parent="base.menu_main_pm" sequence="5" groups="project.group_project_finance_user"/>
+ <menuitem action="hr_timesheet_sheet.act_hr_timesheet_sheet_form" id="menu_act_project_management_timesheet_sheet_form" parent="base.menu_project_management_time_tracking"
+ sequence="5"/>
<menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking"
sequence="2"/>
=== modified file 'hr_timesheet_sheet/security/ir.model.access.csv'
--- hr_timesheet_sheet/security/ir.model.access.csv 2010-10-15 16:53:15 +0000
+++ hr_timesheet_sheet/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -1,4 +1,5 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_hr_timesheet_report","hr.timesheet.report","model_hr_timesheet_report","base.group_hr_manager",1,0,0,0
"access_hr_timesheet_sheet_sheet_user","hr_timesheet_sheet.sheet.user","model_hr_timesheet_sheet_sheet","base.group_hr_user",1,1,1,1
"access_hr_timesheet_sheet_sheet_system_user","hr_timesheet_sheet.sheet.system.user","model_hr_timesheet_sheet_sheet","base.group_user",1,0,0,0
"access_hr_timesheet_sheet_sheet_day","hr_timesheet_sheet.sheet.day","model_hr_timesheet_sheet_sheet_day","base.group_hr_user",1,1,1,1
=== modified file 'idea/idea.py'
--- idea/idea.py 2010-09-16 12:51:36 +0000
+++ idea/idea.py 2010-11-10 05:38:01 +0000
@@ -33,6 +33,7 @@
_name = "idea.category"
_description = "Idea Category"
+ _log_create=True
_columns = {
'name': fields.char('Category', size=64, required=True),
@@ -303,6 +304,7 @@
_name = 'idea.vote'
_description = 'Idea Vote'
_rec_name = 'score'
+ _log_create = True
_columns = {
'user_id': fields.many2one('res.users', 'User', readonly="True"),
=== modified file 'idea/wizard/idea_post_vote.py'
--- idea/wizard/idea_post_vote.py 2010-09-06 05:05:43 +0000
+++ idea/wizard/idea_post_vote.py 2010-11-10 05:38:01 +0000
@@ -109,6 +109,7 @@
for do_vote_obj in self.read(cr, uid, ids):
score = str(do_vote_obj['vote'])
comment = do_vote_obj.get('note', False)
+ for vote_id in vote_ids:
vote = {
'idea_id': vote_id,
'user_id': uid,
=== modified file 'mail_gateway/mail_gateway.py'
--- mail_gateway/mail_gateway.py 2010-10-27 12:59:05 +0000
+++ mail_gateway/mail_gateway.py 2010-11-10 05:38:01 +0000
@@ -396,7 +396,6 @@
model_pool = self.pool.get(model)
res_id = False
-
# Create New Record into particular model
def create_record(msg):
att_ids = []
@@ -551,7 +550,6 @@
if not len(res_ids):
new_res_id, attachment_ids = create_record(msg)
res_ids = [new_res_id]
-
# Store messages
context.update({'model' : model})
if hasattr(model_pool, 'history'):
=== modified file 'mrp/mrp.py'
--- mrp/mrp.py 2010-10-27 12:59:05 +0000
+++ mrp/mrp.py 2010-11-10 05:38:01 +0000
@@ -446,18 +446,18 @@
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.production', context=c),
}
_order = 'priority desc, date_planned asc';
-
+
def _check_qty(self, cr, uid, ids):
orders = self.browse(cr, uid, ids)
for order in orders:
if order.product_qty <= 0:
return False
return True
-
+
_constraints = [
(_check_qty, 'Order quantity cannot be negative or zero !', ['product_qty']),
]
-
+
def unlink(self, cr, uid, ids, context=None):
productions = self.read(cr, uid, ids, ['state'])
unlink_ids = []
@@ -639,16 +639,16 @@
@param production_mode: specify production mode (consume/consume&produce).
@return: True
"""
-
+
stock_mov_obj = self.pool.get('stock.move')
production = self.browse(cr, uid, production_id)
-
+
final_product_todo = []
produced_qty = 0
if production_mode == 'consume_produce':
produced_qty = production_qty
-
+
for produced_product in production.move_created_ids2:
if (produced_product.scrapped) or (produced_product.product_id.id<>production.product_id.id):
continue
@@ -658,7 +658,7 @@
consumed_products = {}
check = {}
scrapped = map(lambda x:x.scrapped,production.move_lines2).count(True)
-
+
for consumed_product in production.move_lines2:
consumed = consumed_product.product_qty
if consumed_product.scrapped:
@@ -671,9 +671,9 @@
if (len(production.move_lines2) - scrapped) > len(production.product_lines):
check[consumed_product.product_id.id] += consumed_product.product_qty
consumed = check[consumed_product.product_id.id]
- rest_consumed = produced_qty * f.product_qty / production.product_qty - consumed
+ rest_consumed = produced_qty * f.product_qty / production.product_qty - consumed
consumed_products[consumed_product.product_id.id] = rest_consumed
-
+
for raw_product in production.move_lines:
for f in production.product_lines:
if f.product_id.id == raw_product.product_id.id:
@@ -712,7 +712,7 @@
new_parent_ids.append(final_product.id)
for new_parent_id in new_parent_ids:
stock_mov_obj.write(cr, uid, [raw_product.id], {'move_history_ids': [(4,new_parent_id)]})
-
+
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'mrp.production', production_id, 'button_produce_done', cr)
return True
@@ -827,7 +827,7 @@
'company_id': production.company_id.id,
}
res_final_id = move_obj.create(cr, uid, data)
-
+
self.write(cr, uid, [production.id], {'move_created_ids': [(6, 0, [res_final_id])]})
moves = []
for line in production.product_lines:
@@ -879,7 +879,7 @@
'company_id': production.company_id.id,
})
wf_service.trg_validate(uid, 'procurement.order', proc_id, 'button_confirm', cr)
- proc_ids.append(proc_id)
+ proc_ids.append(proc_id)
wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
self.write(cr, uid, [production.id], {'picking_id': picking_id, 'move_lines': [(6,0,moves)], 'state':'confirmed'})
message = _("Manufacturing order '%s' is scheduled for the %s.") % (
=== modified file 'mrp/security/ir.model.access.csv'
--- mrp/security/ir.model.access.csv 2010-10-16 16:47:09 +0000
+++ mrp/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -67,3 +67,4 @@
"access_stock_picking_mrp_manager","stock.picking mrp_manager","stock.model_stock_picking","mrp.group_mrp_manager",1,0,0,0
"access_report_mrp_inout_user","report.mrp.inout user","model_report_mrp_inout","mrp.group_mrp_user",1,0,0,0
"access_report_workcenter_load_user","report.workcenter.load.user","model_report_workcenter_load","mrp.group_mrp_user",1,0,0,0
+"access_mrp_production","mrp.production user","model_mrp_production","purchase.group_purchase_user",1,0,0,0
=== modified file 'project/project_view.xml'
--- project/project_view.xml 2010-10-27 05:51:19 +0000
+++ project/project_view.xml 2010-11-10 05:38:01 +0000
@@ -546,6 +546,7 @@
</page>
</field>
</record>
+
<act_window context="{'search_default_user_id': [active_id]}" domain="[('state', '<>', 'cancelled'),('state', '<>', 'done')]" id="act_res_users_2_project_task_opened" name="Assigned tasks" res_model="project.task" src_model="res.users" view_mode="tree,form,gantt,calendar,graph" view_type="form"/>
<act_window context="{'search_default_user_id': [active_id]}" domain="[('date', '>=', time.strftime('%Y-%m-01'))]" id="act_res_users_2_project_task_work_month" name="Month works" res_model="project.task.work" src_model="res.users" view_mode="tree,form" view_type="form"/>
</data>
=== modified file 'project_issue/report/project_issue_report.py'
--- project_issue/report/project_issue_report.py 2010-10-12 14:21:09 +0000
+++ project_issue/report/project_issue_report.py 2010-11-10 05:38:01 +0000
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -16,7 +16,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/>.
#
##############################################################################
=== modified file 'project_issue/security/project_issue_security.xml'
--- project_issue/security/project_issue_security.xml 2010-10-15 14:51:56 +0000
+++ project_issue/security/project_issue_security.xml 2010-11-10 05:38:01 +0000
@@ -4,5 +4,15 @@
<record id="group_project_supporter" model="res.groups">
<field name="name">Project / Support Manager</field>
</record>
+
+ <record model="ir.rule" id="project_issue_rule">
+ <field name="name" >Issues according to Users or Members</field>
+ <field name="model_id" ref="model_project_issue"/>
+ <field eval="1" name="perm_read"/>
+ <field eval="1" name="perm_create"/>
+ <field eval="1" name="perm_write"/>
+ <field name="groups" eval="[(6, 0, [ref('project.group_project_user')])]"/>
+ <field name="domain_force">['|',('members','in',[user.id]),('user_id','=',user.id)]</field>
+ </record>
</data>
</openerp>
=== added directory 'project_mailgate/security.moved'
=== added file 'project_mailgate/security.moved/ir.model.access.csv'
--- project_mailgate/security.moved/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ project_mailgate/security.moved/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -0,0 +1,3 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_mailgate_message_project_manager","project.mailgate.message.manager","mail_gateway.model_mailgate_message","project.group_project_manager",1,1,1,0
+"access_mailgate_message_project_user","project.mailgate.message.user","mail_gateway.model_mailgate_message","project.group_project_user",1,1,1,0
=== modified file 'purchase/purchase.py'
--- purchase/purchase.py 2010-11-04 12:53:29 +0000
+++ purchase/purchase.py 2010-11-10 05:38:01 +0000
@@ -282,6 +282,8 @@
self.log(cr, uid, po.id, message)
# current_name = self.name_get(cr, uid, ids)[0][1]
self.pool.get('purchase.order.line').action_confirm(cr, uid, todo, context)
+ message = _('confirm Order') + " ' " + po.name
+ self.log(cr,uid,po,message)
for id in ids:
self.write(cr, uid, [id], {'state' : 'confirmed', 'validator' : uid})
return True
=== modified file 'purchase/security/ir.model.access.csv'
--- purchase/security/ir.model.access.csv 2010-10-17 21:30:29 +0000
+++ purchase/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -7,8 +7,8 @@
"access_stock_warehouse_purchase_user","stock.warehouse","stock.model_stock_warehouse","group_purchase_user",1,0,0,0
"access_stock_picking_purchase_user","stock.picking","stock.model_stock_picking","group_purchase_user",1,1,1,1
"access_stock_move_purchase_user","stock.move","stock.model_stock_move","group_purchase_user",1,1,1,1
-"access_purchase_order_stock_worker","purchase.order","model_purchase_order","stock.group_stock_user",1,0,0,0
-"access_purchase_order_line_stock_worker","purchase.order.line","model_purchase_order_line","stock.group_stock_user",1,0,0,0
+"access_purchase_order_stock_worker","purchase.order","model_purchase_order","stock.group_stock_user",1,1,1,0
+"access_purchase_order_line_stock_worker","purchase.order.line","model_purchase_order_line","stock.group_stock_user",1,0,1,0
"access_account_tax_purchase_user","account.tax","account.model_account_tax","group_purchase_user",1,0,0,0
"access_report_purchase_order","purchase.report","model_purchase_report","group_purchase_manager",1,1,1,1
"access_report_purchase_order_user","purchase.report user","model_purchase_report","group_purchase_user",1,0,0,0
@@ -42,3 +42,5 @@
"access_account_move_reconcile","account.move.reconcile","account.model_account_move_reconcile","group_purchase_user",1,1,1,1
"access_report_stock_move","report.stock.move.manager","stock.model_report_stock_move","group_purchase_manager",1,1,1,1
"access_report_stock_move_user","report.stock.move.user","stock.model_report_stock_move","group_purchase_user",1,0,0,0
+"access_stock_production_lot_user","stock.production.lot user","stock.model_stock_production_lot","group_purchase_user",1,0,1,0
+"access_stock_production_lot_revision","stock.production.lot.revision","stock.model_stock_production_lot_revision","group_purchase_user",1,0,1,0
=== modified file 'purchase_requisition/security/ir.model.access.csv'
--- purchase_requisition/security/ir.model.access.csv 2010-08-07 06:34:14 +0000
+++ purchase_requisition/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -3,3 +3,5 @@
"access_purchase_requisition_line","purchase.requisition.line","model_purchase_requisition_line","purchase.group_purchase_user",1,1,1,1
"access_purchase_requisition_manager","purchase.requisition manager","model_purchase_requisition","purchase.group_purchase_manager",1,0,0,0
"access_purchase_requisition_line_manager","purchase.requisition.line manager","model_purchase_requisition_line","purchase.group_purchase_manager",1,0,0,0
+"access_purchase_requisition","purchase.requisition","model_purchase_requisition","stock.group_stock_manager",1,0,1,0
+"access_purchase_requisition_line","purchase.requisition.line","model_purchase_requisition_line","stock.group_stock_manager",1,0,1,0
=== modified file 'sale/sale.py'
--- sale/sale.py 2010-11-04 08:56:12 +0000
+++ sale/sale.py 2010-11-10 05:38:01 +0000
@@ -1065,7 +1065,7 @@
'title': _('Picking Information !'),
'message': warn_msg
}
- result['product_uom_qty'] = qty
+ result['product_uom_qty'] = pack.qty
uom2 = False
if uom:
=== modified file 'sale_crm/wizard/crm_make_sale.py'
--- sale_crm/wizard/crm_make_sale.py 2010-10-22 07:23:46 +0000
+++ sale_crm/wizard/crm_make_sale.py 2010-11-10 05:38:01 +0000
@@ -154,5 +154,4 @@
'close': True,
'partner_id': _selectPartner,
}
-
crm_make_sale()
=== modified file 'stock/security/ir.model.access.csv'
--- stock/security/ir.model.access.csv 2010-10-16 16:47:09 +0000
+++ stock/security/ir.model.access.csv 2010-11-10 05:38:01 +0000
@@ -10,11 +10,11 @@
"access_stock_tracking_user","stock.tracking user","model_stock_tracking","stock.group_stock_user",1,1,1,1
"access_stock_tracking_manager","stock.tracking manager","model_stock_tracking","stock.group_stock_manager",1,0,0,0
"access_stock_picking_user","stock.picking user","model_stock_picking","stock.group_stock_user",1,1,1,1
-"access_stock_picking_manager","stock.picking manager","model_stock_picking","stock.group_stock_manager",1,0,0,0
+"access_stock_picking_manager","stock.picking manager","model_stock_picking","stock.group_stock_manager",1,1,0,0
"access_stock_production_lot_manager","stock.production.lot manager","model_stock_production_lot","stock.group_stock_manager",1,0,0,0
"access_stock_production_lot_user","stock.production.lot user","model_stock_production_lot","stock.group_stock_user",1,1,1,1
"access_stock_production_lot_revision","stock.production.lot.revision","model_stock_production_lot_revision","stock.group_stock_user",1,1,1,1
-"access_stock_move_manager","stock.move manager","model_stock_move","stock.group_stock_manager",1,0,0,0
+"access_stock_move_manager","stock.move manager","model_stock_move","stock.group_stock_manager",1,1,0,0
"access_stock_move_user","stock.move user","model_stock_move","stock.group_stock_user",1,1,1,1
"access_stock_inventory_user","stock.inventory user","model_stock_inventory","stock.group_stock_user",1,1,1,1
"access_stock_inventory_manager","stock.inventory manager","model_stock_inventory","stock.group_stock_manager",1,0,0,0
=== modified file 'stock/stock_view.xml'
--- stock/stock_view.xml 2010-10-29 05:22:01 +0000
+++ stock/stock_view.xml 2010-11-10 05:38:01 +0000
@@ -304,7 +304,7 @@
<page string="Stock Moves">
<field colspan="2" name="move_ids" nolabel="1" widget="one2many_list">
<tree string="Stock Moves">
- <field name="picking_id" string="Reference"/>
+ <field name="picking_id" string="Reference"/>
<field name="origin"/>
<field name="partner_id"/>
<field name="product_id"/>
@@ -317,7 +317,7 @@
<field name="location_dest_id"/>
<field name="state"/>
</tree>
- </field>
+ </field>
</page>
</notebook>
</form>
@@ -658,6 +658,10 @@
groups="base.group_extended"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
+ <button name="%(split_into)d" string="Put in a new pack" type="action"
+ groups="base.group_extended"
+ icon="terp-stock_effects-object-colorize"
+ states="draft,assigned,confirmed,done"/>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="date_expected" string="Date Expected"/>
Follow ups