diff --git a/addons/auction/i18n/bg.po b/addons/auction/i18n/bg.po
index 62643ecb9e2..ec0d6815581 100644
--- a/addons/auction/i18n/bg.po
+++ b/addons/auction/i18n/bg.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-20 04:36+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: auction
diff --git a/addons/auction/i18n/pt_BR.po b/addons/auction/i18n/pt_BR.po
index af1925e9ff4..d94054a792c 100644
--- a/addons/auction/i18n/pt_BR.po
+++ b/addons/auction/i18n/pt_BR.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-20 04:36+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: auction
diff --git a/addons/audittrail/i18n/pt_BR.po b/addons/audittrail/i18n/pt_BR.po
index 884f1538e1c..bd8800a027c 100644
--- a/addons/audittrail/i18n/pt_BR.po
+++ b/addons/audittrail/i18n/pt_BR.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-21 04:34+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: audittrail
diff --git a/addons/base_calendar/__init__.py b/addons/base_calendar/__init__.py
index f2664029c43..c127cc7c124 100644
--- a/addons/base_calendar/__init__.py
+++ b/addons/base_calendar/__init__.py
@@ -20,5 +20,6 @@
##############################################################################
import base_calendar
+import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_calendar/__terp__.py b/addons/base_calendar/__terp__.py
index 747958cde38..49b3a2d7389 100644
--- a/addons/base_calendar/__terp__.py
+++ b/addons/base_calendar/__terp__.py
@@ -42,6 +42,8 @@
"demo_xml" : [],
"update_xml" : [
'security/ir.model.access.csv',
+ 'base_calendar_wizard.xml',
+ 'base_calendar_view.xml'
],
"installable" : True,
"active" : False,
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 6a93b22e7da..1cb79407476 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -22,7 +22,7 @@
from datetime import datetime, timedelta
from dateutil import parser
from dateutil.rrule import *
-from osv import osv
+from osv import osv, fields
import pooler
import re
import vobject
@@ -59,6 +59,22 @@ def openobjectid2uid(cr, uidval, oomodel):
value = 'OpenObject-%s_%s@%s' % (oomodel, uidval, cr.dbname)
return value
+def get_attribute_mapping(cr, uid, model, context={}):
+ pool = pooler.get_pool(cr.dbname)
+ field_obj = pool.get('basic.calendar.fields')
+ fids = field_obj.search(cr, uid, [('object_id.model', '=', model)])
+ res = {}
+ for field in field_obj.browse(cr, uid, fids):
+ attr = field.attribute
+ res[attr] = {}
+ res[attr]['field'] = field.field_id.name
+ res[attr]['type'] = field.field_id.ttype
+ if res[attr]['type'] in ('one2many', 'many2many', 'many2one'):
+ res[attr]['object'] = field.field_id.relation
+ elif res[attr]['type'] in ('selection') and field.mapping:
+ res[attr]['mapping'] = eval(field.mapping)
+ return res
+
def map_data(cr, uid, obj):
vals = {}
for map_dict in obj.__attribute__:
@@ -101,8 +117,8 @@ def map_data(cr, uid, obj):
return vals
class CalDAV(object):
- __attribute__ = {
- }
+ __attribute__ = {}
+
def get_recurrent_dates(self, rrulestring, exdate, startdate=None):
if not startdate:
startdate = datetime.now()
@@ -129,8 +145,6 @@ class CalDAV(object):
val = ','.join(map(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'), val))
else:
val = val.strftime('%Y-%m-%d %H:%M:%S')
- if valtype and valtype == 'integer' and val:
- val = int(val)
return val
else:
return self.__attribute__.get(name, None)
@@ -142,6 +156,7 @@ class CalDAV(object):
return True
def export_ical(self, cr, uid, datas, vobj=None, context={}):
+ self.__attribute__ = get_attribute_mapping(cr, uid, self._name, context)
ical = vobject.iCalendar()
for data in datas:
vevent = ical.add(vobj)
@@ -177,7 +192,7 @@ class CalDAV(object):
vevent = alarm_obj.export_ical(cr, uid, model, \
data[map_field][0], vevent, context=context)
elif data[map_field]:
- if map_type == "text":
+ if map_type in ("char", "text"):
vevent.add(field).value = str(data[map_field])
elif map_type == 'datetime' and data[map_field]:
if field in ('exdate'):
@@ -188,13 +203,19 @@ class CalDAV(object):
vevent.add(field).value = timedelta(hours=data[map_field])
elif map_type == "many2one":
vevent.add(field).value = [data.get(map_field)[1]]
- if self.__attribute__.get(field).has_key('mapping'):
- for key1, val1 in self.ical_get(field, 'mapping').items():
- if val1 == data[map_field]:
- vevent.add(field).value = key1
+ elif map_type in ("float", "integer"):
+ vevent.add(field).value = [data.get(map_field)]
+ elif map_type == "selection":
+ if not self.ical_get(field, 'mapping'):
+ vevent.add(field).value = (data[map_field]).upper()
+ else:
+ for key1, val1 in self.ical_get(field, 'mapping').items():
+ if val1 == data[map_field]:
+ vevent.add(field).value = key1
return ical
def import_ical(self, cr, uid, ical_data):
+ self.__attribute__ = get_attribute_mapping(cr, uid, self._name)
parsedCal = vobject.readOne(ical_data)
att_data = []
res = []
@@ -222,7 +243,7 @@ class CalDAV(object):
return res
-class Calendar(CalDAV, osv.osv_memory):
+class Calendar(CalDAV, osv.osv):
_name = 'basic.calendar'
__attribute__ = {
'prodid': None, # Use: R-1, Type: TEXT, Specifies the identifier for the product that created the iCalendar object.
@@ -236,11 +257,65 @@ class Calendar(CalDAV, osv.osv_memory):
'vjournal': None, # Use: O-n, Type: Collection of Journal class
'vfreebusy': None, # Use: O-n, Type: Collection of FreeBusy class
'vtimezone': None, # Use: O-n, Type: Collection of Timezone class
-
+ }
+ _columns = {
+ 'name': fields.char("Name", size=64),
+ 'line_ids': fields.one2many('basic.calendar.lines', 'calendar_id', 'Calendar Lines')
}
Calendar()
+
+class basic_calendar_line(osv.osv):
+ _name = 'basic.calendar.lines'
+ _description = 'Calendar Lines'
+ _columns = {
+ 'name': fields.selection([('event', 'Event'), ('todo', 'TODO'), \
+ ('alarm', 'Alarm'), \
+ ('attendee', 'Attendee')], \
+ string="Type", size=64),
+ 'object_id': fields.many2one('ir.model', 'Object'),
+ 'calendar_id': fields.many2one('basic.calendar', 'Calendar', required=True),
+ 'mapping_ids': fields.one2many('basic.calendar.fields', 'type_id', 'Fields Mapping')
+ }
+
+basic_calendar_line()
+
+class basic_calendar_attribute(osv.osv):
+ _name = 'basic.calendar.attributes'
+ _description = 'Calendar attributes'
+ _columns = {
+ 'name': fields.char("Name", size=64, required=True),
+ 'type': fields.selection([('event', 'Event'), ('todo', 'TODO'), \
+ ('alarm', 'Alarm'), \
+ ('attendee', 'Attendee')], \
+ string="Type", size=64, required=True),
+ }
+
+basic_calendar_attribute()
+
+class basic_calendar_fields(osv.osv):
+ _name = 'basic.calendar.fields'
+ _description = 'Calendar fields'
+
+ _columns = {
+ 'field_id': fields.many2one('ir.model.fields', 'OpenObject Field'),
+ 'name': fields.many2one('basic.calendar.attributes', 'Name', required=True),
+ 'type_id': fields.many2one('basic.calendar.lines', 'Type', required=True),
+ 'expr': fields.char("Expression", size=64),
+ 'fn': fields.selection( [('field', 'Use the field'),
+ ('const', 'Expression as constant'),
+ ('hours', 'Interval in hours'),
+ ],'Function'),
+ 'mapping': fields.text('Mapping'),
+ }
+
+ _defaults = {
+ 'fn': lambda *a: 'field',
+ }
+
+basic_calendar_fields()
+
class Event(CalDAV, osv.osv_memory):
_name = 'basic.calendar.event'
__attribute__ = {
@@ -397,7 +472,7 @@ class Alarm(CalDAV, osv.osv_memory):
# Compute other details
valarm.add('DESCRIPTION').value = alarm_data['name']
valarm.add('ACTION').value = alarm_data['action']
-
+ return vevent
def import_ical(self, cr, uid, ical_data):
for child in ical_data.getChildren():
@@ -461,9 +536,11 @@ class Attendee(CalDAV, osv.osv_memory):
def export_ical(self, cr, uid, model, attendee_ids, vevent, context={}):
attendee_object = self.pool.get(model)
+ self.__attribute__ = get_attribute_mapping(cr, uid, self._name, context)
for attendee in attendee_object.read(cr, uid, attendee_ids, []):
attendee_add = vevent.add('attendee')
- for a_key, a_val in attendee_object.__attribute__.items():
+ cn_val = ''
+ for a_key, a_val in self.__attribute__.items():
if attendee[a_val['field']] and a_val['field'] != 'cn':
if a_val['type'] == 'text':
attendee_add.params[a_key] = [str(attendee[a_val['field']])]
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
new file mode 100644
index 00000000000..1dc534db87f
--- /dev/null
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+ Basic Calendar
+ basic.calendar
+ form
+
+
+
+
+
+
+
+
+ Calendar
+ ir.actions.act_window
+ basic.calendar
+ form
+ tree,form
+
+
+
+
+
+
+
+
diff --git a/addons/base_calendar/base_calendar_wizard.xml b/addons/base_calendar/base_calendar_wizard.xml
new file mode 100644
index 00000000000..153b490750c
--- /dev/null
+++ b/addons/base_calendar/base_calendar_wizard.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/caldav/wizard/__init__.py b/addons/base_calendar/wizard/__init__.py
similarity index 100%
rename from addons/caldav/wizard/__init__.py
rename to addons/base_calendar/wizard/__init__.py
diff --git a/addons/caldav/wizard/wizard_cal_edit_event.py b/addons/base_calendar/wizard/wizard_cal_edit_event.py
similarity index 100%
rename from addons/caldav/wizard/wizard_cal_edit_event.py
rename to addons/base_calendar/wizard/wizard_cal_edit_event.py
diff --git a/addons/caldav/wizard/wizard_cal_export.py b/addons/base_calendar/wizard/wizard_cal_export.py
similarity index 92%
rename from addons/caldav/wizard/wizard_cal_export.py
rename to addons/base_calendar/wizard/wizard_cal_export.py
index 4b32f02420f..8431e9d1c71 100644
--- a/addons/caldav/wizard/wizard_cal_export.py
+++ b/addons/base_calendar/wizard/wizard_cal_export.py
@@ -51,15 +51,16 @@ class cal_event_export_wizard(wizard.interface):
model_obj = pooler.get_pool(cr.dbname).get(model)
calendar = model_obj.export_cal(cr, uid, data['ids'], context)
return {'file_path': base64.encodestring(calendar), \
- 'name': 'OpenERP Events.ics'}
+ 'name': 'OpenERP %s.ics' % (model_obj._description)}
states = {
'init': {
'actions': [_process_export_ics],
'result': {'type': 'form', 'arch':form1, 'fields':form1_fields, \
- 'state': [('end', '_Cancel', 'gtk-cancel'), ('end', 'Ok', 'gtk-ok')]}},
+ 'state': [('end', '_Cancel', 'gtk-cancel'), \
+ ('end', 'Ok', 'gtk-ok')]}},
}
-cal_event_export_wizard('caldav.event.export')
+cal_event_export_wizard('calendar.event.export')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/caldav/wizard/wizard_cal_import.py b/addons/base_calendar/wizard/wizard_cal_import.py
similarity index 98%
rename from addons/caldav/wizard/wizard_cal_import.py
rename to addons/base_calendar/wizard/wizard_cal_import.py
index 259b3b48b03..d7295f9ce53 100644
--- a/addons/caldav/wizard/wizard_cal_import.py
+++ b/addons/base_calendar/wizard/wizard_cal_import.py
@@ -81,6 +81,6 @@ class cal_event_import_wizard(wizard.interface):
},
}
-cal_event_import_wizard('caldav.event.import')
+cal_event_import_wizard('calendar.event.import')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/caldav/wizard/wizard_cal_subscribe.py b/addons/base_calendar/wizard/wizard_cal_subscribe.py
similarity index 98%
rename from addons/caldav/wizard/wizard_cal_subscribe.py
rename to addons/base_calendar/wizard/wizard_cal_subscribe.py
index 4fcdeffd89f..c4dceab660c 100644
--- a/addons/caldav/wizard/wizard_cal_subscribe.py
+++ b/addons/base_calendar/wizard/wizard_cal_subscribe.py
@@ -90,6 +90,6 @@ class cal_event_subscribe_wizard(wizard.interface):
},
}
-cal_event_subscribe_wizard('caldav.event.subscribe')
+cal_event_subscribe_wizard('calendar.event.subscribe')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_contact/base_contact.py b/addons/base_contact/base_contact.py
index ec529a96865..457a96a1c6b 100644
--- a/addons/base_contact/base_contact.py
+++ b/addons/base_contact/base_contact.py
@@ -39,6 +39,13 @@ class res_partner_contact(osv.osv):
res = [(r['shortcut'], r['name']) for r in res if r['domain']=='contact']
return res
+ def _main_job(self, cr, uid, ids, fields, arg, context=None):
+ res = dict.fromkeys(ids, False)
+ for contact in self.browse(cr, uid, ids, context):
+ if contact.job_ids:
+ res[contact.id] = contact.job_ids[0].name_get()[0]
+ return res
+
_columns = {
'name': fields.char('Last Name', size=30,required=True),
'first_name': fields.char('First Name', size=30),
@@ -52,7 +59,7 @@ class res_partner_contact(osv.osv):
'active' : fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the partner contact without removing it."),
'partner_id':fields.related('job_ids','address_id','partner_id',type='many2one', relation='res.partner', string='Main Employer'),
'function_id':fields.related('job_ids','function_id',type='many2one', relation='res.partner.function', string='Main Function'),
- 'job_id':fields.related('job_ids',type='many2one', relation='res.partner.job', string='Main Job'),
+ 'job_id': fields.function(_main_job, method=True, type='many2one', relation='res.partner.job', string='Main Job'),
'email': fields.char('E-Mail', size=240),
'comment' : fields.text('Notes', translate=True),
'photo' : fields.binary('Image'),
@@ -81,6 +88,12 @@ res_partner_contact()
class res_partner_address(osv.osv):
+ def search(self, cr, user, args, offset=0, limit=None, order=None,
+ context=None, count=False):
+ if context and context.has_key('address_partner_id' ) and context['address_partner_id']:
+ args.append(('partner_id', '=', context['address_partner_id']))
+ return super(res_partner_address, self).search(cr, user, args, offset, limit, order, context, count)
+
#overriding of the name_get defined in base in order to remove the old contact name
def name_get(self, cr, user, ids, context={}):
if not len(ids):
@@ -155,7 +168,7 @@ class res_partner_job(osv.osv):
_defaults = {
'sequence_contact' : lambda *a: 0,
- 'state' : lambda *a: 'current',
+ 'state' : lambda *a: 'current',
}
res_partner_job()
diff --git a/addons/base_contact/base_contact_view.xml b/addons/base_contact/base_contact_view.xml
index db7ea54314e..6123e7ed938 100644
--- a/addons/base_contact/base_contact_view.xml
+++ b/addons/base_contact/base_contact_view.xml
@@ -48,16 +48,13 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -385,7 +382,7 @@
-
+
diff --git a/addons/base_module_record/wizard/base_module_record_objects.py b/addons/base_module_record/wizard/base_module_record_objects.py
index bd2fb95a67e..c74dd744bdf 100644
--- a/addons/base_module_record/wizard/base_module_record_objects.py
+++ b/addons/base_module_record/wizard/base_module_record_objects.py
@@ -56,7 +56,7 @@ def _info_default(self, cr, uid, data, context):
cr.execute('select max(create_date) from ir_model_data')
c=(cr.fetchone())[0].split('.')[0]
c = time.strptime(c,"%Y-%m-%d %H:%M:%S")
- sec=c.tm_sec + 1
+ sec=c.tm_sec!=59 and c.tm_sec + 1
c=(c[0],c[1],c[2],c[3],c[4],sec,c[6],c[7],c[8])
data['form']['check_date']=time.strftime("%Y-%m-%d %H:%M:%S",c)
return data['form']
@@ -108,7 +108,7 @@ class base_module_record_objects(wizard.interface):
('record', 'Record', 'gtk-ok'),
]
}
- },
+ },
'record': {
'actions': [],
'result': {'type':'action','action':_record_objects,'state':'intro'}
@@ -124,7 +124,7 @@ class base_module_record_objects(wizard.interface):
('save', 'Continue', 'gtk-ok'),
]
},
- },
+ },
'save': {
'actions': [inter_call],
'result': {
diff --git a/addons/base_report_creator/base_report_creator.py b/addons/base_report_creator/base_report_creator.py
index 5cbe50cf9df..36547f68ae5 100644
--- a/addons/base_report_creator/base_report_creator.py
+++ b/addons/base_report_creator/base_report_creator.py
@@ -64,8 +64,12 @@ class report_creator(osv.osv):
fields = {}
i = 0
for f in report.field_ids:
- fields['field'+str(i)] = models[f.field_id.model][f.field_id.name]
- i+=1
+ if f.field_id.model:
+ fields['field'+str(i)] = models[f.field_id.model][f.field_id.name]
+ i+=1
+ else:
+ fields['column_count'] = {'readonly': True, 'type': 'integer', 'string': 'Count', 'size': 64, 'name': 'column_count'}
+
return fields
#
@@ -81,8 +85,12 @@ class report_creator(osv.osv):
fields = {}
i = 0
for f in report.field_ids:
- fields['field'+str(i)] = models[f.field_id.model][f.field_id.name]
- i+=1
+ if f.field_id.model:
+ fields['field'+str(i)] = models[f.field_id.model][f.field_id.name]
+ i+=1
+ else:
+ fields['column_count'] = {'readonly': True, 'type': 'integer', 'string': 'Count', 'size': 64, 'name': 'column_count'}
+
arch = '\n'
if view_type=='graph':
arch +='' % (report.name, report.view_graph_type,report.view_graph_orientation)
@@ -90,8 +98,12 @@ class report_creator(osv.osv):
i = 0
for f in report.field_ids:
if f.graph_mode==val:
- arch += '' % ('field'+str(i),)
- i+=1
+ if f.field_id.model:
+ arch += '' % ('field'+str(i),)
+ i+=1
+ else:
+ arch += '' % ('column_count',)
+
elif view_type=='calendar':
required_types = ['date_start','date_delay','color']
set_dict = {'view_type':view_type,'string':report.name}
@@ -99,13 +111,21 @@ class report_creator(osv.osv):
i=0
for f in report.field_ids:
if f.calendar_mode and f.calendar_mode in required_types:
- set_dict[f.calendar_mode] = 'field'+str(i)
- i+=1
+ if f.field_id.model:
+ field_cal = 'field'+str(i)
+ i+=1
+ else:
+ field_cal = 'column_count'
+ set_dict[f.calendar_mode] = field_cal
del required_types[required_types.index(f.calendar_mode)]
else:
- temp_list.append('''''' % {'name':'field'+str(i)})
- i+=1
+ if f.field_id.model:
+ temp_list.append('''''' % {'name':'field'+str(i)})
+ i+=1
+ else:
+ temp_list.append('''''' % {'name':'column_count'})
+
arch += '''<%(view_type)s string="%(string)s" date_start="%(date_start)s" ''' %set_dict
if set_dict.get('date_delay',False):
arch +=''' date_delay="%(date_delay)s" '''%set_dict
@@ -121,8 +141,11 @@ class report_creator(osv.osv):
arch += '<%s string="%s">\n' % (view_type, report.name)
i = 0
for f in report.field_ids:
- arch += '' % ('field'+str(i),)
- i+=1
+ if f.field_id.model:
+ arch += '' % ('field'+str(i),)
+ i+=1
+ else:
+ arch += '' % ('column_count',)
arch += '%s>' % (view_type,)
result = {
'arch': arch,
@@ -166,14 +189,20 @@ class report_creator(osv.osv):
i = 0
fields = {}
for f in report.field_ids:
- fields['field'+str(i)] = (f.field_id.model, f.field_id.name)
- i+=1
+ if f.field_id.model:
+ fields['field'+str(i)] = (f.field_id.model, f.field_id.name)
+ i+=1
+ else:
+ fields['column_count'] = (False, 'Count')
newargs = []
newargs2 = []
for a in args:
- res = self.pool.get(fields[a[0]][0])._where_calc(cr, user, [[fields[a[0]][1],a[1],a[2]]], active_test=False, context=context)
- newargs+=res[0]
- newargs2+=res[1]
+ if fields[a[0]][0]:
+ res = self.pool.get(fields[a[0]][0])._where_calc(cr, user, [[fields[a[0]][1],a[1],a[2]]], active_test=False, context=context)
+ newargs+=res[0]
+ newargs2+=res[1]
+ else:
+ newargs += [("count(*) " + a[1] +" " + str(a[2]))]
ctx = context or {}
ctx['getid'] = True
report = self._sql_query_get(cr, user, [context['report_id']], 'sql_query', None, ctx, where_plus=newargs, limit=limit, offset=offset)
@@ -198,7 +227,7 @@ class report_creator(osv.osv):
filter_list = []
for model in models:
model_dict[model.model] = self.pool.get(model.model)._table
-
+
model_list = model_dict.keys()
reference_model_dict = {}
for model in model_dict:
@@ -207,10 +236,22 @@ class report_creator(osv.osv):
rest_list.remove(model)
model_pool = self.pool.get(model)
fields_get = model_pool.fields_get(cr,uid)
- fields_filter = dict(filter(lambda x:x[1].get('relation',False)
- and x[1].get('relation') in rest_list
- and x[1].get('type')=='many2one'
- and not (isinstance(model_pool._columns[x[0]],fields.function) or isinstance(model_pool._columns[x[0]],fields.related) or isinstance(model_pool._columns[x[0]],fields.dummy)), fields_get.items()))
+ model_columns = {}
+
+ def _get_inherit_fields(obj):
+ pool_model = self.pool.get(obj)
+ #Adding the columns of the model itself
+ model_columns.update(pool_model._columns)
+ #Adding the columns of its _inherits
+ for record in pool_model._inherits.keys():
+ _get_inherit_fields(record)
+
+ _get_inherit_fields(model)
+
+ fields_filter = dict(filter(lambda x:x[1].get('relation',False)
+ and x[1].get('relation') in rest_list
+ and x[1].get('type')=='many2one'
+ and not (isinstance(model_columns[x[0]],fields.function) or isinstance(model_columns[x[0]],fields.related)), fields_get.items()))
if fields_filter:
model in model_list and model_list.remove(model)
model_count = reference_model_dict.get(model,False)
@@ -225,9 +266,10 @@ class report_creator(osv.osv):
reference_model_dict[v.get('relation')] = relation_count+1
else:
reference_model_dict[v.get('relation')]=1
-
- str_where = model_dict.get(model)+"."+ k + "=" + model_dict.get(v.get('relation'))+'.id'
- where_list.append(str_where)
+ if k in self.pool.get(model)._columns:
+ str_where = model_dict.get(model)+"."+ k + "=" + model_dict.get(v.get('relation'))+'.id'
+ where_list.append(str_where)
+
if reference_model_dict:
self.model_set_id = model_dict.get(reference_model_dict.keys()[reference_model_dict.values().index(min(reference_model_dict.values()))])
if model_list and not len(model_dict.keys()) == 1:
@@ -250,6 +292,7 @@ class report_creator(osv.osv):
if where_list:
+ where_list = list(set(where_list))
ret_str+="\n where \n"+" and\n".join(where_list)
ret_str = ret_str.strip()
if filter_list:
@@ -272,12 +315,16 @@ class report_creator(osv.osv):
groupby = []
i = 0
for f in obj.field_ids:
+ # Allowing to use count(*)
+ if not f.field_id.model and f.group_method == 'count':
+ fields.insert(0,('count(*) as column_count'))
+ continue
t = self.pool.get(f.field_id.model_id.model)._table
if f.group_method == 'group':
fields.append('\t'+t+'.'+f.field_id.name+' as field'+str(i))
- groupby.append(t+'.'+f.field_id.name)
else:
fields.append('\t'+f.group_method+'('+t+'.'+f.field_id.name+')'+' as field'+str(i))
+ groupby.append(t+'.'+f.field_id.name)
i+=1
models = self._path_get(cr, uid, obj.model_ids, obj.filter_ids)
check = self._id_get(cr, uid, ids[0], context)
@@ -336,6 +383,9 @@ class report_creator(osv.osv):
this_objs = self.browse(cr, uid, ids)
for obj in this_objs:
for fld in obj.field_ids:
+ # Allowing to use count(*)
+ if not fld.field_id.model and fld.group_method == 'count':
+ continue
model_column = self.pool.get(fld.field_id.model)._columns[fld.field_id.name]
if (isinstance(model_column,fields.function) or isinstance(model_column,fields.related)) and not model_column.store:
return False
@@ -347,7 +397,10 @@ class report_creator(osv.osv):
this_objs = self.browse(cr, uid, ids)
for obj in this_objs:
for fld in obj.field_ids:
- model_column = self.pool.get(fld.field_id.model)._columns[fld.field_id.name]
+ # Allowing to use count(*)
+ if not fld.field_id.model and fld.group_method == 'count':
+ continue
+ model_column = self.pool.get(fld.field_id.model)._columns[fld.field_id.name]
if model_column._type not in aggregate_columns and fld.group_method in apply_functions:
return False
return True
@@ -359,6 +412,9 @@ class report_creator(osv.osv):
for obj in this_objs:
if obj.view_type1=='calendar' or obj.view_type2=='calendar' or obj.view_type3=='calendar':
for fld in obj.field_ids:
+ # Allowing to use count(*)
+ if not fld.field_id.model and fld.group_method == 'count':
+ continue
model_column = self.pool.get(fld.field_id.model)._columns[fld.field_id.name]
if fld.calendar_mode in ('date_start','date_end') and model_column._type not in ('date','datetime'):
return False
diff --git a/addons/base_report_creator/base_report_creator_view.xml b/addons/base_report_creator/base_report_creator_view.xml
index 0d102b18c24..30c6b3735a9 100644
--- a/addons/base_report_creator/base_report_creator_view.xml
+++ b/addons/base_report_creator/base_report_creator_view.xml
@@ -67,7 +67,7 @@
-
+
diff --git a/addons/base_report_creator/wizard/base_report_creator_open.py b/addons/base_report_creator/wizard/base_report_creator_open.py
index a342114d119..be7420c5744 100644
--- a/addons/base_report_creator/wizard/base_report_creator_open.py
+++ b/addons/base_report_creator/wizard/base_report_creator_open.py
@@ -25,13 +25,15 @@ import netsvc
import time
import pooler
from osv import osv
-
+from tools.translate import _
class report_creator_open(wizard.interface):
def _open_report(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
+ if context.get('report_id',False):
+ raise wizard.except_wizard(_('UserError'),_('No Wizards available for this object!'))
rep = pool.get('base_report_creator.report').browse(cr, uid, data['id'], context)
view_mode = rep.view_type1
if rep.view_type2:
diff --git a/addons/base_report_creator/wizard/wiz_set_filter_fields.py b/addons/base_report_creator/wizard/wiz_set_filter_fields.py
index 82083cb3858..cf4accf56e9 100644
--- a/addons/base_report_creator/wizard/wiz_set_filter_fields.py
+++ b/addons/base_report_creator/wizard/wiz_set_filter_fields.py
@@ -22,6 +22,7 @@
import wizard
import netsvc
import pooler
+import tools
relation_type=['one2many','many2one','many2many']
char_type = ['char','text','selection']
@@ -121,7 +122,7 @@ def _set_filter_value(self, cr, uid, data, context):
model_pool = pooler.get_pool(cr.dbname).get(model_name)
table_name = model_pool._table
model_name = model_pool._description
-
+
if field_type:
if field_type == 'boolean':
if value_data == 1:
@@ -138,12 +139,12 @@ def _set_filter_value(self, cr, uid, data, context):
fields_list = set_field_operator(self,table_name+"."+field_data['name'],field_data['ttype'],form_data['operator'],value_data)
if fields_list:
create_dict = {
- 'name':model_name + "/" +field_data['field_description'] +" "+ mapping_fields[form_data['operator']] + " " + str(fields_list[2]) + " ",
- 'expression':' '.join(map(str,fields_list)),
+ 'name':model_name + "/" +field_data['field_description'] +" "+ mapping_fields[form_data['operator']] + " " + tools.ustr(fields_list[2]) + " ",
+ 'expression':' '.join(map(tools.ustr,fields_list)),
'report_id':data['id'],
'condition' : form_data['condition']
}
- pooler.get_pool(cr.dbname).get('base_report_creator.report.filter').create(cr,uid,create_dict)
+ pooler.get_pool(cr.dbname).get('base_report_creator.report.filter').create(cr,uid,create_dict,context)
#end if field_type == 'many2many' and value_data and len(value_data):
# pooler.get_pool(cr.dbname).get('custom.report.filter').create(cr,uid,form_data)
#end if field_type:
diff --git a/addons/caldav/__init__.py b/addons/caldav/__init__.py
index 88bf2e4389f..7197809ab2c 100644
--- a/addons/caldav/__init__.py
+++ b/addons/caldav/__init__.py
@@ -20,6 +20,5 @@
##############################################################################
import caldav
-import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/caldav/__terp__.py b/addons/caldav/__terp__.py
index 76ead234c03..7360019a638 100644
--- a/addons/caldav/__terp__.py
+++ b/addons/caldav/__terp__.py
@@ -41,8 +41,7 @@
"demo_xml" : [],
"update_xml" : [
'security/ir.model.access.csv',
- 'caldav_view.xml',
- 'caldav_wizard.xml',
+ 'caldav_view.xml'
],
"installable" : True,
"active" : False,
diff --git a/addons/caldav/caldav.py b/addons/caldav/caldav.py
index 00d39433d1f..e5739983324 100644
--- a/addons/caldav/caldav.py
+++ b/addons/caldav/caldav.py
@@ -69,19 +69,7 @@ class calendar_attendee(osv.osv):
_description = 'Attendee information'
_rec_name = 'cutype'
- __attribute__ = {
- 'cutype': {'field':'cutype', 'type':'text'},
- 'member': {'field':'member', 'type':'text'},
- 'role': {'field':'role', 'type':'selection'},
- 'partstat': {'field':'state', 'type':'text'},
- 'rsvp': {'field':'rsvp', 'type':'boolean'},
- 'delegated-to': {'field':'delegated_to', 'type':'text'},
- 'delegated-from': {'field':'delegated_from', 'type':'text'},
- 'sent-by': {'field':'sent_by', 'type':'text'},
- 'cn': {'field':'cn', 'type':'text'},
- 'dir': {'field':'dir', 'type':'text'},
- 'language': {'field':'language', 'type':'text'},
- }
+ __attribute__ = {}
def _get_address(self, name=None, email=None):
if name and email:
@@ -231,7 +219,7 @@ calendar_attendee()
class res_alarm(osv.osv):
_name = 'res.alarm'
- _description = 'basic alarm information'
+ _description = 'Basic Alarm Information'
_columns = {
'name':fields.char('Name', size=256, required=True),
'trigger_occurs': fields.selection([('before', 'Before'), ('after', 'After')], \
@@ -310,19 +298,7 @@ class calendar_alarm(osv.osv):
_name = 'calendar.alarm'
_description = 'Event alarm information'
_inherits = {'res.alarm': "alarm_id"}
- __attribute__ = {
- 'action': {'field': 'action', 'type': 'text'},
- 'description': {'field': 'name', 'type': 'text'},
- 'summary': {'field': 'description', 'type': 'text'},
- 'attendee': {'field': 'attendee_ids', 'type': 'text'},
- 'trigger_related': {'field': 'trigger_related', 'type': 'text'},
- 'trigger_duration': {'field': 'trigger_duration', 'type': 'text'},
- 'trigger_occurs': {'field': 'trigger_occurs', 'type': 'text'},
- 'trigger_interval': {'field': 'trigger_interval', 'type': 'text'},
- 'duration': {'field': 'duration', 'type': 'text'},
- 'repeat': {'field': 'repeat', 'type': 'text'},
- 'attach': {'field': 'attach', 'type': 'text'},
- }
+ __attribute__ = {}
_columns = {
'alarm_id': fields.many2one('res.alarm', 'Basic Alarm', ondelete='cascade'),
@@ -434,41 +410,7 @@ calendar_alarm()
class calendar_event(osv.osv):
_name = "calendar.event"
_description = "Calendar Event"
-
- #kept it until fields mapping implemented
- __attribute__ = {
- 'class': {'field': 'class', 'type': 'selection'},
- 'created': {'field': 'create_date', 'type': 'datetime'},
- 'description': {'field': 'description', 'type': 'text'},
- 'dtstart': {'field': 'date', 'type': 'datetime'},
- 'location': {'field': 'location', 'type': 'text'},
- #'organizer': {'field': 'partner_id', 'sub-field': 'name', 'type': 'many2one'},
- 'priority': {'field': 'priority', 'type': 'int'},
- 'dtstamp': {'field': 'date', 'type': 'datetime'},
- 'seq': None,
- 'status': {'field': 'state', 'type': 'selection', 'mapping': \
- {'tentative': 'draft', 'confirmed': 'open', \
- 'cancelled': 'cancel'}},
- 'summary': {'field': 'name', 'type': 'text'},
- 'transp': {'field': 'transparent', 'type': 'text'},
- 'uid': {'field': 'id', 'type': 'text'},
- 'url': {'field': 'caldav_url', 'type': 'text'},
- 'recurrence-id': {'field': 'recurrent_id', 'type': 'datetime'},
- 'attendee': {'field': 'attendee_ids', 'type': 'many2many', 'object': 'calendar.attendee'},
-# 'categories': {'field': 'categ_id', 'type': 'many2one', 'object': 'crm.meeting.categ'},
- 'comment': None,
- 'contact': None,
- 'exdate': {'field': 'exdate', 'type': 'datetime'},
- 'exrule': {'field': 'exrule', 'type': 'text'},
- 'rstatus': None,
- 'related': None,
- 'resources': None,
- 'rdate': None,
- 'rrule': {'field': 'rrule', 'type': 'text'},
- 'x-openobject-model': {'value': _name, 'type': 'text'},
- 'dtend': {'field': 'date_deadline', 'type': 'datetime'},
- 'valarm': {'field': 'caldav_alarm_id', 'type': 'many2one', 'object': 'calendar.alarm'},
- }
+ __attribute__ = {}
def onchange_rrule_type(self, cr, uid, ids, rtype, *args, **argv):
if rtype == 'none' or not rtype:
@@ -501,6 +443,7 @@ class calendar_event(osv.osv):
return True
_columns = {
+ 'id': fields.integer('ID'),
'name': fields.char('Description', size=64, required=True),
'date': fields.datetime('Date'),
'date_deadline': fields.datetime('Deadline'),
@@ -537,8 +480,6 @@ rule or repeating pattern for anexception to a recurrence set"),
ids = map(lambda x: caldav_id2real_id(x), ids)
event_data = self.read(cr, uid, ids)
event_obj = self.pool.get('basic.calendar.event')
- event = self.pool.get('calendar.event')
- event_obj.__attribute__.update(event.__attribute__)
ical = event_obj.export_ical(cr, uid, event_data, context={'model': self._name})
cal_val = ical.serialize()
cal_val = cal_val.replace('"', '').strip()
@@ -547,17 +488,6 @@ rule or repeating pattern for anexception to a recurrence set"),
def import_cal(self, cr, uid, data, context={}):
file_content = base64.decodestring(data)
event_obj = self.pool.get('basic.calendar.event')
- event = self.pool.get('calendar.event')
- event_obj.__attribute__.update(event.__attribute__)
-
- attendee_obj = self.pool.get('basic.calendar.attendee')
- attendee = self.pool.get('calendar.attendee')
- attendee_obj.__attribute__.update(attendee.__attribute__)
-
- alarm_obj = self.pool.get('basic.calendar.alarm')
- alarm = self.pool.get('calendar.alarm')
- alarm_obj.__attribute__.update(alarm.__attribute__)
-
vals = event_obj.import_ical(cr, uid, file_content)
ids = []
for val in vals:
@@ -793,65 +723,17 @@ class calendar_todo(osv.osv):
'duration': fields.integer('Duration'),
}
- #kept it until fields mapping implemented
- __attribute__ = {
- 'class': {'field': 'class', 'type': 'text'},
- 'completed': {'field': 'date_close', 'type': 'datetime'},
-# 'created': {'field': 'field', 'type': 'text'},
- 'description': {'field': 'description', 'type': 'text'},
-# 'dtstamp': {'field': 'field', 'type': 'text'},
- 'dtstart': {'field': 'date_start', 'type': 'datetime'},
- 'duration': {'field': 'planned_hours', 'type': 'timedelta'},
- 'due': {'field': 'date_deadline', 'type': 'datetime'},
-# 'geo': {'field': 'field', 'type': 'text'},
-# 'last-mod ': {'field': 'field', 'type': 'text'},
- 'location': {'field': 'location', 'type': 'text'},
- 'organizer': {'field': 'partner_id', 'type': 'many2one', 'object': 'res.partner'},
- 'percent': {'field': 'progress_rate', 'type': 'int'},
- 'priority': {'field': 'priority', 'type': 'text'},
-# 'recurid': {'field': 'field', 'type': 'text'},
- 'seq': {'field': 'sequence', 'type': 'text'},
- 'status': {'field': 'state', 'type': 'selection', \
- 'mapping': {'needs-action': 'draft', \
- 'completed': 'done', 'in-process': 'open', \
- 'cancelled': 'cancelled'}},
- 'summary': {'field': 'name', 'type': 'text'},
- 'uid': {'field': 'id', 'type': 'int'},
- 'url': {'field': 'caldav_url', 'type': 'text'},
-# 'attach': {'field': 'field', 'type': 'text'},
- 'attendee': {'field': 'attendee_ids', 'type': 'many2many', 'object': 'calendar.attendee'},
- 'comment': {'field': 'notes', 'type': 'text'},
-# 'contact': {'field': 'field', 'type': 'text'},
- 'exdate': {'field':'exdate', 'type':'datetime'},
- 'exrule': {'field':'exrule', 'type':'text'},
-# 'rstatus': {'field': 'field', 'type': 'text'},
-# 'related': {'field': 'field', 'type': 'text'},
-# 'resources': {'field': 'field', 'type': 'text'},
-# 'rdate': {'field': 'field', 'type': 'text'},
- 'rrule': {'field': 'rrule', 'type': 'text'},
- 'valarm': {'field':'caldav_alarm_id', 'type':'many2one', 'object': 'calendar.alarm'},
- }
+ __attribute__ = {}
def import_cal(self, cr, uid, data, context={}):
file_content = base64.decodestring(data)
todo_obj = self.pool.get('basic.calendar.todo')
- todo = self.pool.get('calendar.todo')
- todo_obj.__attribute__.update(todo.__attribute__)
-
- attendee_obj = self.pool.get('basic.calendar.attendee')
- crm_attendee = self.pool.get('calendar.attendee')
- attendee_obj.__attribute__.update(crm_attendee.__attribute__)
-
- alarm_obj = self.pool.get('basic.calendar.alarm')
- crm_alarm = self.pool.get('calendar.alarm')
- alarm_obj.__attribute__.update(crm_alarm.__attribute__)
-
vals = todo_obj.import_ical(cr, uid, file_content)
for val in vals:
obj_tm = self.pool.get('res.users').browse(cr, uid, uid, context).company_id.project_time_mode_id
if not val.has_key('planned_hours'):
# 'Computes duration' in days
- start = datetime.strptime(val['date_start'], '%Y-%m-%d %H:%M:%S')
+ start = datetime.strptime(val['date'], '%Y-%m-%d %H:%M:%S')
end = datetime.strptime(val['date_deadline'], '%Y-%m-%d %H:%M:%S')
diff = end - start
plan = (diff.seconds/float(86400) + diff.days) * obj_tm.factor
@@ -877,18 +759,7 @@ class calendar_todo(osv.osv):
task.pop('planned_hours')
tasks.append(task)
todo_obj = self.pool.get('basic.calendar.todo')
- todo = self.pool.get('calendar.todo')
- todo_obj.__attribute__.update(todo.__attribute__)
-
- attendee_obj = self.pool.get('basic.calendar.attendee')
- attendee = self.pool.get('calendar.attendee')
- attendee_obj.__attribute__.update(attendee.__attribute__)
-
- alarm_obj = self.pool.get('basic.calendar.alarm')
- alarm = self.pool.get('calendar.alarm')
- alarm_obj.__attribute__.update(alarm.__attribute__)
-
- ical = todo_obj.export_ical(cr, uid, tasks, {'model': 'project.task'})
+ ical = todo_obj.export_ical(cr, uid, tasks, context={'model': self._name})
calendar_val = ical.serialize()
calendar_val = calendar_val.replace('"', '').strip()
return calendar_val
diff --git a/addons/caldav/caldav_wizard.xml b/addons/caldav/caldav_wizard.xml
deleted file mode 100644
index 62a035889e3..00000000000
--- a/addons/caldav/caldav_wizard.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/crm/crm_meeting_data.xml b/addons/crm/crm_meeting_data.xml
index 9d8cbba044e..180d52314b1 100644
--- a/addons/crm/crm_meeting_data.xml
+++ b/addons/crm/crm_meeting_data.xml
@@ -1,30 +1,31 @@
-
-
+
+
-
- Customer Meeting
-
-
-
-
- Internal Meeting
-
-
-
-
- Phone Call
-
-
-
+
+ Customer Meeting
+
+
+
-
- Case Meeting
- crm.meeting
-
-
+
+ Internal Meeting
+
+
+
-
+
+ Phone Call
+
+
+
+
+
+ Case Meeting
+ crm.meeting
+
+
+
diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml
index 6892e8bc78f..58a6fa4246a 100644
--- a/addons/crm/crm_meeting_view.xml
+++ b/addons/crm/crm_meeting_view.xml
@@ -98,7 +98,7 @@
diff --git a/addons/crm/crm_meeting_wizard.xml b/addons/crm/crm_meeting_wizard.xml
index f4fba30056e..4f6f2e9b0a9 100644
--- a/addons/crm/crm_meeting_wizard.xml
+++ b/addons/crm/crm_meeting_wizard.xml
@@ -2,17 +2,17 @@
+ name="calendar.event.import" id="base_calendar.wizard_cal_event_import" multi="True" />
+ model="crm.meeting" name="calendar.event.subscribe"
+ id="base_calendar.wizard_cal_event_subscribe" multi="True" />
+ name="calendar.event.export" id="base_calendar.wizard_cal_event_export" multi="True" />
diff --git a/addons/crm/crm_segmentation.py b/addons/crm/crm_segmentation.py
index c65bedfd3a0..2f0e2a1c650 100644
--- a/addons/crm/crm_segmentation.py
+++ b/addons/crm/crm_segmentation.py
@@ -41,7 +41,7 @@ class crm_segmentation(osv.osv):
'segmentation_line': fields.one2many('crm.segmentation.line', 'segmentation_id', 'Criteria', required=True),
'som_interval': fields.integer('Days per Periode', help="A period is the average number of days between two cycle of sale or purchase for this segmentation. It's mainly used to detect if a partner has not purchased or buy for a too long time, so we suppose that his state of mind has decreased because he probably bought goods to another supplier. Use this functionality for recurring businesses."),
'som_interval_max': fields.integer('Max Interval', help="The computation is made on all events that occured during this interval, the past X periods."),
- 'som_interval_decrease': fields.float('Decrease (0>1)', help="If the partner has not purchased (or buied) during a period, decrease the state of mind by this factor. It\'s a multiplication"),
+ 'som_interval_decrease': fields.float('Decrease (0>1)', help="If the partner has not purchased (or bought) during a period, decrease the state of mind by this factor. It\'s a multiplication"),
'som_interval_default': fields.float('Default (0=None)', help="Default state of mind for period preceeding the 'Max Interval' computation. This is the starting state of mind by default if the partner has no event."),
'sales_purchase_active': fields.boolean('Use The Sales Purchase Rules', help='Check if you want to use this tab as part of the segmentation rule. If not checked, the criteria beneath will be ignored')
}
diff --git a/addons/crm/i18n/pt_BR.po b/addons/crm/i18n/pt_BR.po
index 8fa3989ff89..daf4ec1fb0c 100644
--- a/addons/crm/i18n/pt_BR.po
+++ b/addons/crm/i18n/pt_BR.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-21 04:34+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: crm
diff --git a/addons/crm_hr/__terp__.py b/addons/crm_hr/__terp__.py
index afa94c81178..3faec9b3b96 100644
--- a/addons/crm_hr/__terp__.py
+++ b/addons/crm_hr/__terp__.py
@@ -26,21 +26,21 @@
'version': '1.0',
'category': 'Generic Modules/CRM & SRM',
'description': """
- This module provide Store the Job
+ This module provide Store the Job
""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
- 'depends': ['crm','hr','board_crm_configuration'],
+ 'depends': ['crm','hr','board_crm_configuration','survey'],
'init_xml': [
'crm_hr_data.xml'
],
'update_xml': [
- 'crm_hr_wizard.xml',
+ 'crm_hr_wizard.xml',
'crm_hr_view.xml',
'crm_hr_menu.xml',
'report_crm_hr_view.xml',
'security/crm_hr_security.xml',
- 'board_crm_hr_statistical_view.xml',
+ 'board_crm_hr_statistical_view.xml',
],
'demo_xml': [
'crm_hr_demo.xml'
diff --git a/addons/crm_hr/crm_hr_data.xml b/addons/crm_hr/crm_hr_data.xml
index 94a47be6d2f..8d8f6c2ee94 100644
--- a/addons/crm_hr/crm_hr_data.xml
+++ b/addons/crm_hr/crm_hr_data.xml
@@ -1,76 +1,479 @@
-
+
-
+
Salesman
-
+
-
+
Junior Developer
-
-
-
+
+
+
-
+
Graduate
-
-
+
+
Licenced
-
+ > Bac +5
-
+
-
+
-
+
Initial Jobs Demand
-
+ First Interview
-
+ Second Interview
-
+ Contract Proposed
-
+ Contract Signed
-
+ Refused by Employee
-
+ Refused by Company
-
+
+
+
+
+
+
+ Job Survey
+ draft
+
+
+
+
+
+ Default Section
+
+
+
+
+
+
+ Education & Activities
+
+
+
+
+
+
+ Importance
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ From which university will you graduate?
+
+ single_textbox
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Rate the Importance
+
+ matrix_of_choices_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Education
+
+ comment
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Knowledge
+
+ comment
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ What is your gender?
+
+ multiple_choice_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+ Male
+
+
+
+
+
+ Female
+
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ What age group do you belong to?
+
+ multiple_choice_only_one_ans
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+ 0 - 15
+
+
+
+
+ 16 - 20
+
+
+
+
+ 21 - 30
+
+
+
+
+ 31 - 40
+
+
+
+
+ 41 - 50
+
+
+
+
+ 51 - 60
+
+
+
+
+ 61 - 70
+
+
+
+
+ 71 +
+
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Exprience
+
+ comment
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+
+ do_not_validate
+ do_not_validate
+ Please enter a comment.
+ The choices need to add up to [enter sum here].
+
+ The comment you entered is in an invalid format.
+
+ This question requires an answer.
+
+ Activities
+
+ comment
+ The comment you entered is in an invalid format.
+
+
+
+ Other
+
+
+
+
+
+
+
+ Not important
+
+
+
+
+
+
+
+ Somewhat important
+
+
+
+
+
+
+
+ Important
+
+
+
+
+
+
+
+ Very important
+
+
+
+
+
+
+
+ Most important
+
+
+
+
+
+
+
+ Good pay
+
+
+
+
+
+
+ Getting on with colleagues
+
+
+
+
+
+
+ Office environment (décor, light, space etc)
+
+
+
+
+
+
+ Desk space
+
+
+
+
+
+
+ State of the art technology
+
+
+
+
+
+
+ Office location (proximity to home)
+
+
+
+
+
+
+ Good management/boss
+
+
+
+
+
+
+ Freebies such as tea, coffee and stationery
+
+
+
+
+
+
+ Perks such as free parking, gym passes etc
+
+
+
+
+
+
+ No out of hours working
+
+
+
+
+
+
+ Dress code
+
+
+
+
+
+
+ Regular meetings
+
+
+
+
+
+
+ Good social life (office nights out, good Christmas parties etc)
+
+
+
+
+
diff --git a/addons/crm_hr/report_crm_hr_view.xml b/addons/crm_hr/report_crm_hr_view.xml
index d2ce5854d0f..7359b6ecade 100644
--- a/addons/crm_hr/report_crm_hr_view.xml
+++ b/addons/crm_hr/report_crm_hr_view.xml
@@ -35,7 +35,7 @@
-
+
report.crm.job.user.graphreport.crm.job.user
@@ -59,7 +59,7 @@
-
+
Jobs by User and Sectionreport.crm.job.user
@@ -68,9 +68,14 @@
+
-
+
@@ -137,7 +142,7 @@
-
+
@@ -187,6 +192,6 @@
-
+
diff --git a/addons/crm_profiling/__terp__.py b/addons/crm_profiling/__terp__.py
index 1ce0af585b9..b155e806e0f 100644
--- a/addons/crm_profiling/__terp__.py
+++ b/addons/crm_profiling/__terp__.py
@@ -25,12 +25,11 @@
'version': '1.3',
'category': 'Generic Modules/CRM & SRM',
'description': """
- This module allow users to perform segmentation within partners.
- It use the profiles criteria from the earlier segmentation module and improve it thanks to the new concept of questionnaire. You can now regroup questions into a questionnaire and directly use it on a partner.
+ This module allows users to perform segmentation within partners.
+ It uses the profiles criteria from the earlier segmentation module and improve it. Thanks to the new concept of questionnaire. You can now regroup questions into a questionnaire and directly use it on a partner.
It also has been merged with the earlier CRM & SRM segmentation tool because they were overlapping.
-
The menu items related are in "CRM & SRM\Configuration\Segmentations"
diff --git a/addons/crm_profiling/crm_profiling_view.xml b/addons/crm_profiling/crm_profiling_view.xml
index 8ff3c67e6dc..e2ac5c4d1fc 100644
--- a/addons/crm_profiling/crm_profiling_view.xml
+++ b/addons/crm_profiling/crm_profiling_view.xml
@@ -172,7 +172,7 @@
-
+
diff --git a/addons/document/__terp__.py b/addons/document/__terp__.py
index bb9f41bfa6b..a9d7026776b 100644
--- a/addons/document/__terp__.py
+++ b/addons/document/__terp__.py
@@ -27,6 +27,12 @@
'description': """This is a complete document management system:
* User Authentication
* Document Indexation
+
+ ATTENTION:
+ - When you install this module in a running company that have already PDF files stored into the database,
+ you will lose them all.
+ - After installing this module PDF's are not longer stored into the database,
+ but in the servers rootpad like /server/bin/filestore.
""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
diff --git a/addons/document/document_storage.py b/addons/document/document_storage.py
index 54e4ad3f9cf..d09bc62d325 100644
--- a/addons/document/document_storage.py
+++ b/addons/document/document_storage.py
@@ -25,6 +25,7 @@ import os
import tools
import base64
from tools.misc import ustr
+from tools.translate import _
from osv.orm import except_orm
diff --git a/addons/document_change/document_change.py b/addons/document_change/document_change.py
index e3cac86b493..0b248289469 100644
--- a/addons/document_change/document_change.py
+++ b/addons/document_change/document_change.py
@@ -64,7 +64,7 @@ class doucment_change_process_phase(osv.osv):
'name': fields.char("Name", size=64, required=True),
'process_id':fields.many2one('document.change.process','Process Change'),
'sequence': fields.integer('Sequence'),
- 'update_document': fields.selection([('at_endPhase', 'End Phase'),('at_endprocess', 'End Porcess')], 'Update Document', required=True),
+ 'update_document': fields.selection([('at_endPhase', 'End Phase'),('at_endprocess', 'End Process')], 'Update Document', required=True),
'type': fields.selection([('control_required', 'Control Required'),('no_control', 'No Control')], 'Type'),
'date_control': fields.date('Control Date', select=True),
'phase_ids':fields.many2one('document.change.process.phase','Phase Type'),
@@ -73,6 +73,7 @@ class doucment_change_process_phase(osv.osv):
}
_defaults = {
'state': lambda *a: 'draft',
+ 'update_document': lambda *a:'at_endPhase',
'type':lambda *a: 'no_control',
}
doucment_change_process_phase()
@@ -154,4 +155,4 @@ class doucment_change_process(osv.osv):
'state': lambda *a: 'draft',
}
-doucment_change_process()
\ No newline at end of file
+doucment_change_process()
diff --git a/addons/document_ics/document_ics.py b/addons/document_ics/document_ics.py
index 150d44df4b6..acda761b279 100644
--- a/addons/document_ics/document_ics.py
+++ b/addons/document_ics/document_ics.py
@@ -30,6 +30,7 @@ import random
import tools
import re
+from tools.translate import _
from document.nodes import node_content
from tools.safe_eval import safe_eval
diff --git a/addons/hr/hr_department.py b/addons/hr/hr_department.py
index db771abd408..83c1f7101fd 100644
--- a/addons/hr/hr_department.py
+++ b/addons/hr/hr_department.py
@@ -97,7 +97,7 @@ class res_users(osv.osv):
result[user_id] = parent_ids
return result
- def _parent_search(self, cr, uid, obj, name, args):
+ def _parent_search(self, cr, uid, obj, name, args, context):
parent = []
for arg in args:
if arg[0] == 'parent_id':
@@ -132,7 +132,7 @@ class res_users(osv.osv):
result[manager_id] = child_ids
return result
- def _child_search(self, cr, uid, obj, name, args):
+ def _child_search(self, cr, uid, obj, name, args, context):
parent = []
for arg in args:
if arg[0] == 'child_ids':
diff --git a/addons/hr_attendance/wizard/print_attendance_error.py b/addons/hr_attendance/wizard/print_attendance_error.py
index 234a878eb2e..cdddcaa0ddb 100644
--- a/addons/hr_attendance/wizard/print_attendance_error.py
+++ b/addons/hr_attendance/wizard/print_attendance_error.py
@@ -22,6 +22,7 @@
import wizard
import time
import pooler
+from tools.translate import _
_date_form = '''
diff --git a/addons/hr_evaluation/__terp__.py b/addons/hr_evaluation/__terp__.py
index 4dc5cb4eecd..27e55d16cf7 100644
--- a/addons/hr_evaluation/__terp__.py
+++ b/addons/hr_evaluation/__terp__.py
@@ -25,7 +25,7 @@
"author" : "Tiny",
"category" : "Generic Modules/Human Resources",
"website" : "http://www.openerp.com",
- "depends" : ["hr","survey"],
+ "depends" : ["hr",'crm_hr'],
"description": "Ability to create employees evaluation.",
"init_xml" : [],
"demo_xml" : ["hr_evaluation_demo.xml"],
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index df24164e497..41056d70dbc 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -52,7 +52,7 @@ class hr_evaluation_plan_phase(osv.osv):
('bottom-up','Bottom-Up Appraisal Requests'),
('self','Self Appraisal Requests'),
('final','Final Interview')], 'Action', required=True),
- 'survey_id': fields.many2one('survey','Appraisal Form'),
+ 'survey_id': fields.many2one('survey','Appraisal Form',required=True),
'send_answer_manager': fields.boolean('All Answers',
help="Send all answers to the manager"),
'send_answer_employee': fields.boolean('All Answers',
diff --git a/addons/hr_evaluation/hr_evaluation_data.xml b/addons/hr_evaluation/hr_evaluation_data.xml
index ba1951558f4..2a3d72d3ccd 100644
--- a/addons/hr_evaluation/hr_evaluation_data.xml
+++ b/addons/hr_evaluation/hr_evaluation_data.xml
@@ -1287,4 +1287,98 @@ Once the form had been filled, the employee send it to his supervisor.
+
+
+
+
+ waiting_answer
+
+
+ fp@tinyerp.com
+ 2010-02-21
+
+
+
+
+
+
+ Manager's Evaluation Plan
+
+
+
+
+
+
+
+ Send to Subordinates
+
+
+
+ bottom-up
+
+
+
+
+
+
+
+
+
+
+ Send to Managers
+
+
+
+ top-down
+
+
+
+
+
+
+
+
+
+
+ Send to Employee
+
+
+
+ self
+
+
+
+
+
+
+
+
+
+
+ Final Interview With Manager
+
+
+
+ final
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ draft
+
+ 2010-01-21
+
+
+
+
+
+
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml
index 451763fde0c..58aa5f4a3fc 100644
--- a/addons/hr_evaluation/hr_evaluation_view.xml
+++ b/addons/hr_evaluation/hr_evaluation_view.xml
@@ -54,6 +54,7 @@
form
+
@@ -124,7 +125,7 @@
-
+
diff --git a/addons/hr_holidays/hr.py b/addons/hr_holidays/hr.py
index 048b80b0744..3d07e506ea1 100755
--- a/addons/hr_holidays/hr.py
+++ b/addons/hr_holidays/hr.py
@@ -164,24 +164,6 @@ class hr_holidays(osv.osv):
}
_order = 'date_from desc'
- def create(self, cr, uid, vals, context={}):
- if context:
- if context.has_key('type'):
- vals['type'] = context['type']
- if context.has_key('allocation_type'):
- vals['allocation_type'] = context['allocation_type']
- return super(osv.osv,self).create(cr, uid, vals, context)
-
- #~ def _check_date(self, cr, uid, ids):
- #~ if ids:
- #~ cr.execute('select number_of_days from hr_holidays where id in ('+','.join(map(str, ids))+')')
- #~ res = cr.fetchall()
- #~ if res and res[0][0] <= 0:
- #~ return False
- #~ return True
-
- #_constraints = [(_check_date, 'Start date should not be greater than end date! ', ['number_of_days'])]
-
def onchange_date_from(self, cr, uid, ids, date_to, date_from):
result = {}
if date_to and date_from:
@@ -197,6 +179,51 @@ class hr_holidays(osv.osv):
}
return result
+ def _update_user_holidays(self, cr, uid, ids):
+ for record in self.browse(cr, uid, ids):
+ if record.state=='validate':
+ holiday_id=self.pool.get('hr.holidays.per.user').search(cr, uid, [('employee_id','=', record.employee_id.id),('holiday_status','=',record.holiday_status.id)])
+ if holiday_id:
+ obj_holidays_per_user=self.pool.get('hr.holidays.per.user').browse(cr, uid,holiday_id[0])
+ self.pool.get('hr.holidays.per.user').write(cr,uid,obj_holidays_per_user.id,{'leaves_taken':obj_holidays_per_user.leaves_taken - record.number_of_days})
+ if record.case_id:
+ if record.case_id.state <> 'draft':
+ raise osv.except_osv(_('Warning !'),
+ _('You can not cancel this holiday request. first You have to make its case in draft state.'))
+ else:
+ self.pool.get('crm.case').unlink(cr,uid,[record.case_id.id])
+
+ def _check_date(self, cr, uid, ids):
+ if ids:
+ cr.execute('select number_of_days from hr_holidays where id in ('+','.join(map(str, ids))+')')
+ res = cr.fetchall()
+ if res and res[0][0] < 0:
+ return False
+ return True
+
+ _constraints = [(_check_date, 'Start date should not be larger than end date! ', ['number_of_days'])]
+
+ def create(self, cr, uid, vals, *args, **kwargs):
+ id_holiday = super(hr_holidays, self).create(cr, uid, vals, *args, **kwargs)
+ self._create_holiday(cr, uid, [id_holiday])
+ return id_holiday
+
+ def unlink(self, cr, uid, ids, context={}):
+ self._update_user_holidays(cr, uid, ids)
+ return super(hr_holidays, self).unlink(cr, uid, ids, context)
+
+ def _create_holiday(self, cr, uid, ids):
+ holidays_user_obj = self.pool.get('hr.holidays.per.user')
+ holidays_data = self.browse(cr, uid, ids[0])
+ list_holiday = []
+ ids_user_hdays = holidays_user_obj.search(cr, uid, [('employee_id', '=', holidays_data.employee_id.id),('holiday_status', '=', holidays_data.holiday_status.id)])
+ for hdays in holidays_user_obj.browse(cr, uid, ids_user_hdays):
+ for req in hdays.holiday_ids:
+ list_holiday.append(req.id)
+ list_holiday.append(ids[0])
+ holidays_user_obj.write(cr, uid, ids_user_hdays, {'holiday_ids': [(6, 0, list_holiday)]})
+ return True
+
def onchange_date_to(self, cr, uid, ids, date_from, date_to):
result = {}
if date_from and date_to:
@@ -290,16 +317,7 @@ class hr_holidays(osv.osv):
return True
def holidays_cancel(self, cr, uid, ids, *args):
- for record in self.browse(cr, uid, ids):
- if record.state=='validate':
- if record.case_id:
- self.pool.get('crm.case').unlink(cr,uid,[record.case_id.id])
- if record.linked_request_ids:
- list_ids = []
- for id in record.linked_request_ids:
- list_ids.append(id.id)
- self.holidays_cancel(cr,uid,list_ids)
- self.unlink(cr,uid,list_ids)
+ self._update_user_holidays(cr, uid, ids)
self.write(cr, uid, ids, {
'state':'cancel'
})
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
index 4595665d5c9..41e65e2d8fc 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
@@ -72,7 +72,7 @@ account_analytic_account()
class account_analytic_line(osv.osv):
_inherit = 'account.analytic.line'
_columns = {
- 'invoice_id': fields.many2one('account.invoice', 'Invoice'),
+ 'invoice_id': fields.many2one('account.invoice', 'Invoice', ondelete="set null"),
'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Type of Invoicing'),
}
diff --git a/addons/hr_timesheet_invoice/report/cost_ledger.py b/addons/hr_timesheet_invoice/report/cost_ledger.py
index f2ede84438f..9bde3837790 100644
--- a/addons/hr_timesheet_invoice/report/cost_ledger.py
+++ b/addons/hr_timesheet_invoice/report/cost_ledger.py
@@ -87,7 +87,7 @@ class account_analytic_cost_ledger(report_sxw.rml_parse):
revenue = 0.0
if lines[id].amount < 0 and lines[id].product_id and lines[id].product_uom_id and lines[id].account_id.pricelist_id:
ctx = {'uom': lines[id].product_uom_id.id}
- price = price_obj.price_get(self.cr, self.uid, [lines[id].pricelist_id.id], lines[id].product_id.id, lines[id].unit_amount, ctx)[lines[id].pricelist_id.id]
+ price = price_obj.price_get(self.cr, self.uid, [lines[id].account_id.pricelist_id.id], lines[id].product_id.id, lines[id].unit_amount, ctx)[lines[id].account_id.pricelist_id.id]
revenue = round(price * lines[id].unit_amount, 2)
r['revenue'] = revenue
self.sum_revenue[account_id] += revenue
diff --git a/addons/hr_timesheet_invoice/wizard/account_analytic_profit.py b/addons/hr_timesheet_invoice/wizard/account_analytic_profit.py
index 41fec24ae74..c2d4aecd171 100644
--- a/addons/hr_timesheet_invoice/wizard/account_analytic_profit.py
+++ b/addons/hr_timesheet_invoice/wizard/account_analytic_profit.py
@@ -22,6 +22,7 @@
import wizard
import datetime
import pooler
+from tools.translate import _
form='''
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
index 66bc45c8f7b..a7a0a4b6a51 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
@@ -35,6 +35,13 @@ class invoice_create(wizard.interface):
def _get_accounts(self, cr, uid, data, context):
if not len(data['ids']):
return {}
+ #Checking whether the analytic line is invoiced or not
+ pool = pooler.get_pool(cr.dbname)
+ analytic_line_obj = pool.get('account.analytic.line').browse(cr, uid, data['ids'], context)
+ for obj_acc in analytic_line_obj:
+ if obj_acc.invoice_id and obj_acc.invoice_id.state !='cancel':
+ raise wizard.except_wizard(_('Warning'),_('The analytic entry "%s" is already invoiced!')%(obj_acc.name,))
+
cr.execute("SELECT distinct(account_id) from account_analytic_line where id IN (%s)"% (','.join(map(str,data['ids'])),))
account_ids = cr.fetchall()
return {'accounts': [x[0] for x in account_ids]}
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index 836df03b0f9..c63e19bd582 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -319,9 +319,12 @@ class hr_timesheet_sheet(osv.osv):
context, load='_classic_write')]
def unlink(self, cr, uid, ids, context=None):
- sheets = self.read(cr, uid, ids, ['state'])
- if any(s['state'] in ('confirm', 'done') for s in sheets):
- raise osv.except_osv(_('Invalid action !'), _('Cannot delete Sheet(s) which are already confirmed !'))
+ sheets = self.read(cr, uid, ids, ['state','total_attendance'])
+ for sheet in sheets:
+ if sheet['state'] in ('confirm', 'done'):
+ raise osv.except_osv(_('Invalid action !'), _('Cannot delete Sheet(s) which are already confirmed !'))
+ elif sheet['total_attendance'] <> 0.00:
+ raise osv.except_osv(_('Invalid action !'), _('Cannot delete Sheet(s) which have attendance entries encoded !'))
return super(hr_timesheet_sheet, self).unlink(cr, uid, ids, context=context)
hr_timesheet_sheet()
@@ -362,7 +365,7 @@ class hr_timesheet_line(osv.osv):
res[line_id] = False
return res
- def _sheet_search(self, cursor, user, obj, name, args):
+ def _sheet_search(self, cursor, user, obj, name, args, context):
if not len(args):
return []
sheet_obj = self.pool.get('hr_timesheet_sheet.sheet')
diff --git a/addons/idea/__init__.py b/addons/idea/__init__.py
index e9243780570..2aa68d00eff 100644
--- a/addons/idea/__init__.py
+++ b/addons/idea/__init__.py
@@ -20,5 +20,6 @@
##############################################################################
import idea
+import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/idea/__terp__.py b/addons/idea/__terp__.py
index beaccca5a54..c56d89e669a 100644
--- a/addons/idea/__terp__.py
+++ b/addons/idea/__terp__.py
@@ -30,10 +30,11 @@
'depends': ['base'],
'init_xml': [],
'update_xml': [
+ 'idea_wizard.xml',
'idea_view.xml',
'idea_workflow.xml',
'security/idea_security.xml',
- 'security/ir.model.access.csv'
+ 'security/ir.model.access.csv',
],
'demo_xml': [],
'installable': True,
diff --git a/addons/idea/idea.py b/addons/idea/idea.py
index 518ff4808a5..195140e99ba 100644
--- a/addons/idea/idea.py
+++ b/addons/idea/idea.py
@@ -174,6 +174,7 @@ class idea_vote(osv.osv):
'score': fields.selection( VoteValues, 'Score', required=True)
}
_defaults = {
+ #'user_id': lambda self, cr, uid, context: uid,
'score': lambda *a: DefaultVoteValue,
}
idea_vote()
diff --git a/addons/idea/idea_view.xml b/addons/idea/idea_view.xml
index 1dd97ab5f9b..64401748e62 100644
--- a/addons/idea/idea_view.xml
+++ b/addons/idea/idea_view.xml
@@ -113,7 +113,7 @@
-
+
@@ -131,6 +131,9 @@
+
+
+
@@ -161,6 +164,7 @@
+
@@ -204,7 +208,7 @@
tree,form
-
+
Open Ideas
diff --git a/addons/idea/idea_wizard.xml b/addons/idea/idea_wizard.xml
new file mode 100644
index 00000000000..206be1dfcaf
--- /dev/null
+++ b/addons/idea/idea_wizard.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/addons/idea/wizard/__init__.py b/addons/idea/wizard/__init__.py
new file mode 100644
index 00000000000..2db6aa6982c
--- /dev/null
+++ b/addons/idea/wizard/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+import idea_vote
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/idea/wizard/idea_vote.py b/addons/idea/wizard/idea_vote.py
new file mode 100644
index 00000000000..c040aa45be5
--- /dev/null
+++ b/addons/idea/wizard/idea_vote.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import wizard
+import ir
+from mx.DateTime import now
+import pooler
+import netsvc
+
+vote_form = """
+
+
+
"""
+
+vote_fields = {
+ 'vote': {'string': 'Post Vote', 'type': 'selection',
+ 'selection': [('-1','Not Voted'),('0','Very Bad'),('25', 'Bad'),('50','Normal'),('75','Good'),('100','Very Good') ]},
+}
+
+
+
+class idea_vote(wizard.interface):
+ def _do_vote(self, cr, uid, data, context):
+ pool = pooler.get_pool(cr.dbname)
+ vote_obj = pool.get('idea.vote')
+ score=str(data['form']['vote'])
+ dic={'idea_id' : data['id'], 'user_id' : uid, 'score' : score }
+ vote=vote_obj.create(cr,uid,dic)
+ return True
+
+ states = {
+ 'init':{
+ 'actions': [],
+ 'result': {'type':'form', 'arch':vote_form, 'fields':vote_fields, 'state':[('end', 'Cancel'), ('post', 'Post Vote')] },
+ },
+ 'post':{
+ 'actions': [],
+ 'result': {'type':'action', 'action': _do_vote, 'state':'end'},
+ },
+ }
+idea_vote('idea.post.vote')
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/l10n_be/account_pcmn_belgium.xml b/addons/l10n_be/account_pcmn_belgium.xml
index e657d259e60..9281d3c45ac 100644
--- a/addons/l10n_be/account_pcmn_belgium.xml
+++ b/addons/l10n_be/account_pcmn_belgium.xml
@@ -7021,8 +7021,8 @@
VI 0percent
-
-
+
+ sale
diff --git a/addons/l10n_chart_uk_minimal/account_tax.xml b/addons/l10n_chart_uk_minimal/account_tax.xml
index a030925f8fa..42f214e5685 100755
--- a/addons/l10n_chart_uk_minimal/account_tax.xml
+++ b/addons/l10n_chart_uk_minimal/account_tax.xml
@@ -21,6 +21,7 @@
Input VAT
+
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index df41baf7bc2..1f3be7c0943 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -544,7 +544,7 @@ class mrp_production(osv.osv):
#TODO Review materials in function in_prod and prod_end.
def action_production_end(self, cr, uid, ids):
- move_ids = []
+# move_ids = []
for production in self.browse(cr, uid, ids):
for res in production.move_lines:
for move in production.move_created_ids:
@@ -552,7 +552,7 @@ class mrp_production(osv.osv):
cr.execute('INSERT INTO stock_move_history_ids \
(parent_id, child_id) VALUES (%s,%s)',
(res.id, move.id))
- move_ids.append(res.id)
+# move_ids.append(res.id)
vals= {'state':'confirmed'}
new_moves = [x.id for x in production.move_created_ids]
self.pool.get('stock.move').write(cr, uid, new_moves, vals)
@@ -562,7 +562,7 @@ class mrp_production(osv.osv):
self.pool.get('stock.move').check_assign(cr, uid, new_moves)
self.pool.get('stock.move').action_done(cr, uid, new_moves)
self._costs_generate(cr, uid, production)
- self.pool.get('stock.move').action_done(cr, uid, move_ids)
+# self.pool.get('stock.move').action_done(cr, uid, move_ids)
self.write(cr, uid, ids, {'state': 'done'})
return True
@@ -1009,7 +1009,7 @@ class mrp_procurement(osv.osv):
self.write(cr, uid, ids, {'state':'confirmed','message':''})
return True
- def action_move_assigned(self, cr, uid, ids):
+ def action_move_assigned(self, cr, uid, ids, context={}):
self.write(cr, uid, ids, {'state':'running','message':_('from stock: products assigned.')})
return True
@@ -1085,11 +1085,13 @@ class mrp_procurement(osv.osv):
newdate = newdate - DateTime.RelativeDateTime(days=company.po_lead)
newdate = newdate - procurement.product_id.seller_ids[0].delay
- context.update({'lang':partner.lang})
+ #Passing partner_id to context for purchase order line integrity of Line name
+ context.update({'lang':partner.lang, 'partner_id':partner_id})
+
product=self.pool.get('product.product').browse(cr,uid,procurement.product_id.id,context=context)
line = {
- 'name': product.name,
+ 'name': product.partner_ref,
'product_qty': qty,
'product_id': procurement.product_id.id,
'product_uom': uom_id,
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 40145749a22..34ea506fb23 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -717,9 +717,8 @@
-
+
-
diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py
index 1848470ad15..8a6efa625bb 100644
--- a/addons/mrp_operations/mrp_operations.py
+++ b/addons/mrp_operations/mrp_operations.py
@@ -141,7 +141,16 @@ class mrp_production_workcenter_line(osv.osv):
return True
def action_done(self, cr, uid, ids):
- self.write(cr, uid, ids, {'state':'done', 'date_finnished': time.strftime('%Y-%m-%d %H:%M:%S')})
+ delay = 0.0
+ date_now = time.strftime('%Y-%m-%d %H:%M:%S')
+ obj_line = self.browse(cr, uid, ids[0])
+
+ date_start = datetime.datetime.strptime(obj_line.date_start,'%Y-%m-%d %H:%M:%S')
+ date_finished = datetime.datetime.strptime(date_now,'%Y-%m-%d %H:%M:%S')
+ delay += (date_finished-date_start).days * 24
+ delay += (date_finished-date_start).seconds / float(60*60)
+
+ self.write(cr, uid, ids, {'state':'done', 'date_finnished': date_now,'delay':delay})
self.modify_production_order_state(cr,uid,ids,'done')
return True
@@ -337,7 +346,7 @@ class mrp_operations_operation(osv.osv):
a = datetime.datetime.strptime(time_lst[i-1],'%Y-%m-%d %H:%M:%S')
b = datetime.datetime.strptime(time_lst[i],'%Y-%m-%d %H:%M:%S')
diff += (b-a).days * 24
- diff += (b-a).seconds / (60*60)
+ diff += (b-a).seconds / float(60*60)
return diff
def check_operation(self,cr,uid,vals):
@@ -412,6 +421,7 @@ class mrp_operations_operation(osv.osv):
if code.start_stop=='start':
tmp=self.pool.get('mrp.production.workcenter.line').action_start_working(cr,uid,wc_op_id)
wf_service.trg_validate(uid, 'mrp.production.workcenter.line', wc_op_id[0], 'button_start_working', cr)
+
if code.start_stop=='done':
tmp=self.pool.get('mrp.production.workcenter.line').action_done(cr,uid,wc_op_id)
@@ -433,9 +443,17 @@ class mrp_operations_operation(osv.osv):
if not self.check_operation(cr, uid, vals):
return
delay=self.calc_delay(cr, uid, vals)
- self.pool.get('mrp.production.workcenter.line').write(cr,uid,wc_op_id,{'delay':delay})
+ line_vals = {}
+ line_vals['delay'] = delay
+ if vals.get('date_start',False):
+ if code.start_stop == 'done':
+ line_vals['date_finnished'] = vals['date_start']
+ elif code.start_stop == 'start':
+ line_vals['date_start'] = vals['date_start']
- return super(mrp_operations_operation, self).create(cr, uid, vals, context=context)
+ self.pool.get('mrp.production.workcenter.line').write(cr, uid, wc_op_id, line_vals, context=context)
+
+ return super(mrp_operations_operation, self).create(cr, uid, vals, context=context)
_columns={
'production_id':fields.many2one('mrp.production','Production',required=True),
diff --git a/addons/mrp_repair/i18n/it.po b/addons/mrp_repair/i18n/it.po
index c86e908b72e..e8ee5ec9f18 100644
--- a/addons/mrp_repair/i18n/it.po
+++ b/addons/mrp_repair/i18n/it.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-21 04:34+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: mrp_repair
diff --git a/addons/multi_company/i18n/pt_BR.po b/addons/multi_company/i18n/pt_BR.po
index 622358152e7..5a0be538147 100644
--- a/addons/multi_company/i18n/pt_BR.po
+++ b/addons/multi_company/i18n/pt_BR.po
@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-21 04:34+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: multi_company
diff --git a/addons/point_of_sale/pos.py b/addons/point_of_sale/pos.py
index e9c89570729..7115495a647 100644
--- a/addons/point_of_sale/pos.py
+++ b/addons/point_of_sale/pos.py
@@ -510,19 +510,20 @@ class pos_order(osv.osv):
if line.qty < 0:
location_id, stock_dest_id = stock_dest_id, location_id
- self.pool.get('stock.move').create(cr, uid, {
- 'name': 'Stock move (POS %d)' % (order.id, ),
- 'product_uom': line.product_id.uom_id.id,
- 'product_uos': line.product_id.uom_id.id,
- 'picking_id': picking_id,
- 'product_id': line.product_id.id,
- 'product_uos_qty': abs(line.qty),
- 'product_qty': abs(line.qty),
- 'tracking_id': False,
- 'state': 'waiting',
- 'location_id': location_id,
- 'location_dest_id': stock_dest_id,
- })
+ self.pool.get('stock.move').create(cr, uid, {
+ 'name': 'Stock move (POS %d)' % (order.id, ),
+ 'product_uom': line.product_id.uom_id.id,
+ 'product_uos': line.product_id.uom_id.id,
+ 'picking_id': picking_id,
+ 'product_id': line.product_id.id,
+ 'product_uos_qty': abs(line.qty),
+ 'product_qty': abs(line.qty),
+ 'tracking_id': False,
+ 'pos_line_id': line.id,
+ 'state': 'waiting',
+ 'location_id': location_id,
+ 'location_dest_id': stock_dest_id,
+ })
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
diff --git a/addons/product/i18n/pt.po b/addons/product/i18n/pt.po
index 834f6089932..944683e81a5 100644
--- a/addons/product/i18n/pt.po
+++ b/addons/product/i18n/pt.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-12-08 00:53+0000\n"
+"PO-Revision-Date: 2010-01-22 00:10+0000\n"
"Last-Translator: Paulino \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-12-16 05:15+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: product
#: view:product.pricelist.item:0
msgid "Max. Margin"
-msgstr "Margem Máxima"
+msgstr "Margem máxima"
#. module: product
#: view:product.pricelist.item:0
@@ -32,6 +32,8 @@ msgid ""
"The cost of the product for accounting stock valuation. It can serves as a "
"base price for supplier price."
msgstr ""
+"O custo do artigo para valorização contabilística do stock. Pode servir como "
+"base do preço de fornecedor."
#. module: product
#: selection:product.template,type:0
@@ -44,13 +46,13 @@ msgid ""
"Determine if the product is visible in the list of products within a "
"selection from a purchase order line."
msgstr ""
-"Determina se o produto é visível na lista de produtos dentro da selecção da "
-"linha de ordem de compra."
+"Determina se o artigo é visível na lista de artigos dentro duma selecção a "
+"partir de uma linha de ordem de compra."
#. module: product
#: help:product.supplierinfo,name:0
msgid "Supplier of this product"
-msgstr "Fornecedor do produto"
+msgstr "Fornecedor do artigo"
#. module: product
#: model:product.template,name:product.product_product_ram512_product_template
@@ -60,7 +62,7 @@ msgstr "DDR 512MB PC400"
#. module: product
#: model:product.template,name:product.product_product_0_product_template
msgid "Onsite Senior Intervention"
-msgstr "Intervenção Senior no Sítio"
+msgstr "Intervenção sénior no local"
#. module: product
#: help:product.supplierinfo,qty:0
@@ -69,7 +71,7 @@ msgid ""
"unit of measure."
msgstr ""
"A quantidade mínima de encomenda para esse fornecedor expressa na unidade de "
-"medida por defeito"
+"medida pré-definida"
#. module: product
#: field:product.template,weight_net:0
@@ -82,8 +84,8 @@ msgid ""
"Quantities of products that are planned to arrive in selected locations or "
"all internal if none have been selected."
msgstr ""
-"Quantidades dos produtos que está planeado chegarem aos locais seleccionados "
-"(ou todos, se nenhum tiver sido escolhido)"
+"Quantidades de artigos planeada para chegar aos locais seleccionados ou "
+"todos, se nenhum foi indicado."
#. module: product
#: help:product.product,virtual_available:0
@@ -92,6 +94,9 @@ msgid ""
"internal if none have been selected. Computed as: Real Stock - Outgoing + "
"Incoming."
msgstr ""
+"Saldo futuro para este artigo de acordo com a localização seleccionada ou "
+"todas se nenhuma for seleccionada. Calculado como: Saldo Real - Saídas + "
+"entradas."
#. module: product
#: field:product.packaging,width:0
@@ -104,11 +109,13 @@ msgid ""
"Set a template if this rule only apply to a template of product. Keep empty "
"for all products"
msgstr ""
+"Especifique um modelo de artigos se esta regra aplica-se apenas a um modelo. "
+"Deixe vazio para aplicar a todos os artigos."
#. module: product
#: field:product.template,procure_method:0
msgid "Procure Method"
-msgstr "Método de Aquisição"
+msgstr "Método de aprovisionamento."
#. module: product
#: constraint:ir.actions.act_window:0
@@ -118,17 +125,17 @@ msgstr "Nome de modelo inválido na definição da acção"
#. module: product
#: model:process.process,name:product.process_process_productprocess0
msgid "Product Process"
-msgstr "Processo do produto"
+msgstr "Processo de artigos"
#. module: product
#: help:product.price.type,field:0
msgid "Associated field in the product form."
-msgstr "Campo associado no formulário do produto"
+msgstr "Campo associado no formulário do artigo"
#. module: product
#: selection:product.template,cost_method:0
msgid "Standard Price"
-msgstr "Preço Standard"
+msgstr "Preço padrão"
#. module: product
#: help:product.packaging,height:0
@@ -138,7 +145,7 @@ msgstr "Altura da embalagem"
#. module: product
#: view:product.pricelist:0
msgid "Products Price List"
-msgstr "Lista de preços de produtos"
+msgstr "Lista de preços dos artigos"
#. module: product
#: model:product.category,name:product.cat1
@@ -168,7 +175,7 @@ msgstr "Empresa"
#. module: product
#: field:product.template,rental:0
msgid "Rentable Product"
-msgstr ""
+msgstr "Artigo alugável"
#. module: product
#: field:product.product,lst_price:0
@@ -184,7 +191,7 @@ msgstr "Tipos de preços"
#. module: product
#: selection:product.template,type:0
msgid "Stockable Product"
-msgstr "Produto estocável"
+msgstr "Artigo armazenável"
#. module: product
#: model:product.category,name:product.product_category_services
@@ -218,7 +225,7 @@ msgstr "Nome desse tipo de preço"
#. module: product
#: help:product.pricelist.version,date_start:0
msgid "Starting date for this pricelist version to be valid."
-msgstr ""
+msgstr "Data de início da validade desta versão da lista de preços."
#. module: product
#: field:product.product,incoming_qty:0
@@ -248,17 +255,17 @@ msgid ""
"type. Purchase will trigger purchase orders when requested."
msgstr ""
"Produzir gerará a ordem de produção ou tarefas, de acordo com o tipo de "
-"produto. A compra activará ordens de compra quando pedida."
+"artigo. A compra activará ordens de compra quando solicitado."
#. module: product
#: model:process.transition,note:product.process_transition_supplierofproduct0
msgid "You can see the list of suppliers for that product."
-msgstr ""
+msgstr "Pode ver a lista de fornecedores para esse artigo."
#. module: product
#: help:product.packaging,rows:0
msgid "The number of layer on a palet or box"
-msgstr ""
+msgstr "Número de camadas numa palete ou caixa"
#. module: product
#: model:product.pricelist.type,name:product.pricelist_type_sale
@@ -278,7 +285,7 @@ msgstr "Se outra lista de preços"
#: model:ir.ui.menu,name:product.menu_products
#: view:product.product:0
msgid "Products"
-msgstr "Produtos"
+msgstr "Artigos"
#. module: product
#: help:product.pricelist.item,price_round:0
@@ -315,8 +322,8 @@ msgid ""
"Set a product if this rule only apply to one product. Keep empty for all "
"products"
msgstr ""
-"Selecionar um produto se essa regra se aplica apenas a um produto. Deixar "
-"vazio para todos os produtos."
+"Indicar um artigo se essa regra se aplica apenas a um artigo. Deixar vazio "
+"para todos os artigos."
#. module: product
#: model:ir.model,name:product.model_product_pricelist_type
@@ -349,7 +356,7 @@ msgstr "Configuração"
#. module: product
#: field:product.packaging,rows:0
msgid "Number of Layer"
-msgstr ""
+msgstr "Número de camadas"
#. module: product
#: constraint:product.category:0
@@ -375,7 +382,7 @@ msgstr "Lista de preços de fornecedores"
#: view:product.packaging:0
#: view:product.product:0
msgid "Pallet Dimension"
-msgstr ""
+msgstr "Dimensão da palete"
#. module: product
#: field:product.pricelist.item,base:0
@@ -409,6 +416,9 @@ msgid ""
"at the end of the year), Average Price: the cost price is recomputed at each "
"reception of products."
msgstr ""
+"Preço Padrão: o preço de custo é fixado e recalculado periodicamente "
+"(geralmente no final do ano); Preço Médio: o preço de custo é recalculado a "
+"cada recepção de artigos."
#. module: product
#: field:product.pricelist,name:0
@@ -428,7 +438,7 @@ msgstr "Preço Médio"
#. module: product
#: model:process.node,note:product.process_node_product0
msgid "Create new Product"
-msgstr "Criar um novo Produto"
+msgstr "Cria um novo artigo"
#. module: product
#: help:product.pricelist.item,name:0
@@ -458,7 +468,7 @@ msgstr "Em produção"
#. module: product
#: field:product.category,child_id:0
msgid "Child Categories"
-msgstr ""
+msgstr "Categorias dependentes"
#. module: product
#: model:product.category,name:product.product_category_accessories
@@ -510,7 +520,7 @@ msgstr "UdM"
#. module: product
#: model:product.uom,name:product.product_uom_unit
msgid "PCE"
-msgstr ""
+msgstr "PCE"
#. module: product
#: model:ir.actions.act_window,name:product.product_pricelist_action2
@@ -522,7 +532,7 @@ msgstr "Listas de preços"
#. module: product
#: field:product.supplierinfo,product_name:0
msgid "Partner Product Name"
-msgstr "Designação do produto do parceiro"
+msgstr "Nome do artigo no parceiro"
#. module: product
#: view:product.product:0
@@ -533,7 +543,7 @@ msgstr "Miscelânea"
#. module: product
#: help:product.pricelist.item,base:0
msgid "The mode for computing the price for this rule."
-msgstr ""
+msgstr "O modo de cálculo do preço para esta regra."
#. module: product
#: model:ir.actions.act_window,name:product.product_uom_form_action
@@ -566,8 +576,8 @@ msgid ""
"is used by the scheduler to order requests based on reordering delays."
msgstr ""
"Este é o atraso médio nos dias entre a confirmação do pedido de compra e a "
-"recepção dos bens deste produto e para o fornecedor por defeito. É usado "
-"pelo agendador para requisitar os pedidos baseados em pedidos em atrasos."
+"recepção dos bens deste artigo e para o fornecedor pré-definido. É usado "
+"pelo agendador para emitir pedidos baseado em reordenar atrasos."
#. module: product
#: field:product.template,seller_delay:0
@@ -577,7 +587,7 @@ msgstr "Tempo de produção no fornecedor"
#. module: product
#: model:product.pricelist.version,name:product.ver0
msgid "Default Public Pricelist Version"
-msgstr ""
+msgstr "Versão pública pré-definida da lista de preços"
#. module: product
#: field:product.pricelist.type,key:0
@@ -622,7 +632,7 @@ msgstr "A moeda do campo está em"
#. module: product
#: help:product.template,weight:0
msgid "The gross weight in Kg."
-msgstr ""
+msgstr "Peso bruto em Kg."
#. module: product
#: selection:product.ul,type:0
@@ -640,8 +650,8 @@ msgid ""
"Determine if the product can be visible in the list of product within a "
"selection from a sale order line."
msgstr ""
-"Determina se um produto pode ser visível na lista de produção dentro de uma "
-"selecção da linha de ordem de venda."
+"Determina se um artigo pode ser visível na lista de artigos numa selecção a "
+"partir de uma linha de ordem de venda."
#. module: product
#: constraint:product.template:0
@@ -673,11 +683,13 @@ msgid ""
"Quantities of products that are planned to leave in selected locations or "
"all internal if none have been selected."
msgstr ""
+"As quantidades de artigos que estão programadas para sair em locais "
+"seleccionados ou todos se nenhum for seleccionado."
#. module: product
#: field:product.packaging,weight:0
msgid "Total Package Weight"
-msgstr ""
+msgstr "Peso total da embalagem"
#. module: product
#: help:product.template,procure_method:0
@@ -697,7 +709,7 @@ msgstr "Aquisição"
#: model:ir.actions.act_window,name:product.product_category_action
#: model:ir.ui.menu,name:product.menu_product_category_action
msgid "Products by Category"
-msgstr "Produtos por categoria"
+msgstr "Artigos por categoria"
#. module: product
#: model:product.template,name:product.product_product_hdd1_product_template
@@ -720,7 +732,7 @@ msgstr "HDD Seagate 7200.8 160GB"
#. module: product
#: view:product.product:0
msgid "Product Variant"
-msgstr "Variante de produto"
+msgstr "Artigo variante"
#. module: product
#: field:product.packaging,ul:0
@@ -767,7 +779,7 @@ msgstr "Tipo de medida"
#. module: product
#: model:product.uom.categ,name:product.product_uom_categ_kgm
msgid "Weight"
-msgstr ""
+msgstr "Peso"
#. module: product
#: model:product.template,name:product.product_product_22_product_template
@@ -780,6 +792,8 @@ msgid ""
"Name of the product for this partner, will be used when printing a request "
"for quotation. Keep empty to use the internal one."
msgstr ""
+"Nome do artigo para este parceiro, será utilizado na impressão de um pedido "
+"de cotação. Mantenha vazio para utilizar o nome interno."
#. module: product
#: field:product.template,supply_method:0
@@ -789,7 +803,7 @@ msgstr "Método de fornecimento"
#. module: product
#: model:product.category,name:product.product_category_11
msgid "IT components kits"
-msgstr ""
+msgstr "Kits de componentes de TI"
#. module: product
#: view:product.uom.categ:0
@@ -838,7 +852,7 @@ msgstr "Descrições"
#. module: product
#: model:process.transition,name:product.process_transition_supplierofproduct0
msgid "Suppliers of Product"
-msgstr ""
+msgstr "Fornecedores do artigo"
#. module: product
#: field:product.pricelist.version,date_start:0
@@ -856,7 +870,8 @@ msgid ""
"Current quantities of products in selected locations or all internal if none "
"have been selected."
msgstr ""
-"Quantidades de produtos actuais selecionadas ou todos se nenhuma selecionada"
+"Quantidades actuais de artigos nos locais seleccionados ou todos se nenhuma "
+"for indicada."
#. module: product
#: model:product.template,name:product.product_product_pc1_product_template
@@ -878,6 +893,7 @@ msgstr "Categoria"
msgid ""
"The rule only applies if the partner buys/sells more than this quantity."
msgstr ""
+"A regra aplica-se apenas se o parceiro compra/vende mais que esta quantidade."
#. module: product
#: model:product.template,name:product.product_product_ram_product_template
@@ -892,7 +908,7 @@ msgstr "Stock Real"
#. module: product
#: view:product.category:0
msgid "Product Categories"
-msgstr "Categorias de produto"
+msgstr "Categorias de artigos"
#. module: product
#: help:product.uom,category_id:0
@@ -900,11 +916,13 @@ msgid ""
"Unit of Measure of a category can be converted between each others in the "
"same category."
msgstr ""
+"A unidade de medida de uma categoria pode ser convertida em qualquer outra "
+"da mesma categoria."
#. module: product
#: model:ir.model,name:product.model_product_uom
msgid "Product Unit of Measure"
-msgstr "Unidade de medida do produto"
+msgstr "Unidade de medida do artigo"
#. module: product
#: field:product.template,sale_ok:0
@@ -936,7 +954,7 @@ msgstr "Taxa"
#. module: product
#: view:product.pricelist.item:0
msgid "Products Listprices Items"
-msgstr "Itens de lista de preço dos produtos"
+msgstr "Itens da lista de preços dos artigos"
#. module: product
#: field:product.uom,rounding:0
@@ -1004,7 +1022,7 @@ msgstr "Preço público"
#. module: product
#: field:product.pricelist.item,price_max_margin:0
msgid "Max. Price Margin"
-msgstr ""
+msgstr "Margem de preço máxima"
#. module: product
#: view:res.partner:0
@@ -1034,12 +1052,12 @@ msgstr "UdM da Encomenda"
#. module: product
#: view:product.price.type:0
msgid "Products Price Type"
-msgstr "Tipo de preço do produto"
+msgstr "Tipo de preço dos artigos"
#. module: product
#: field:product.template,product_manager:0
msgid "Product Manager"
-msgstr "Gestor de produto"
+msgstr "Gestor do artigo"
#. module: product
#: field:product.product,price_extra:0
@@ -1054,7 +1072,7 @@ msgstr "Ventoinha de caixa regular 80mm"
#. module: product
#: model:ir.model,name:product.model_product_supplierinfo
msgid "Information about a product supplier"
-msgstr "Informação sobre o fornecedor do produto"
+msgstr "Informação sobre o fornecedor de um artigo"
#. module: product
#: field:product.price.type,active:0
@@ -1107,7 +1125,7 @@ msgstr "Segundo UdM"
#. module: product
#: model:product.category,name:product.product_category_4
msgid "Dello Computer"
-msgstr ""
+msgstr "Computador Dello"
#. module: product
#: view:product.product:0
@@ -1123,7 +1141,7 @@ msgstr "O tamanho da embalagem"
#. module: product
#: field:product.pricelist.item,price_min_margin:0
msgid "Min. Price Margin"
-msgstr ""
+msgstr "Margem de preço mínima"
#. module: product
#: help:product.packaging,ean:0
@@ -1141,7 +1159,7 @@ msgid ""
"Gives the different ways to package the same product. This has no impact on "
"the packing order and is mainly used if you use the EDI module."
msgstr ""
-"Mostra as maneiras diferentes de empacotar o mesmo produto. Isto não tem "
+"Mostra as maneiras diferentes de empacotar o mesmo artigo. Isto não tem "
"nenhum impacto na ordem da empacotamento e é utilizado principalmente se "
"você usa o módulo do EDI."
@@ -1149,12 +1167,12 @@ msgstr ""
#: model:ir.model,name:product.model_product_category
#: field:product.pricelist.item,categ_id:0
msgid "Product Category"
-msgstr "Categoria de produto"
+msgstr "Categoria do artigo"
#. module: product
#: field:product.price.type,field:0
msgid "Product Field"
-msgstr "Campo produto"
+msgstr "Campo artigo"
#. module: product
#: model:ir.actions.act_window,name:product.product_pricelist_type_action
@@ -1165,17 +1183,17 @@ msgstr "Tipos de listas de preço"
#. module: product
#: help:product.template,state:0
msgid "Tells the user if he can use the product or not."
-msgstr "Diz ao utilizador se ele pode ou não utilizar o produto"
+msgstr "Diz ao utilizador se ele pode ou não utilizar o artigo"
#. module: product
#: field:product.supplierinfo,product_code:0
msgid "Partner Product Code"
-msgstr "Código do produto do parceiro"
+msgstr "Código do artigo no parceiro"
#. module: product
#: model:product.category,name:product.product_category_3
msgid "Computer Stuff"
-msgstr ""
+msgstr "Material informático"
#. module: product
#: field:product.packaging,code:0
@@ -1218,7 +1236,7 @@ msgstr ""
#: field:product.product,product_tmpl_id:0
#: view:product.template:0
msgid "Product Template"
-msgstr "Produto modelo"
+msgstr "Artigo modelo"
#. module: product
#: model:ir.model,name:product.model_product_ul
@@ -1231,6 +1249,8 @@ msgid ""
"The computed quantity will be a multiple of this value. Use 1.0 for products "
"that can not be split."
msgstr ""
+"A quantidade calculada será um múltiplo deste valor. Use 1 para artigos que "
+"não podem ser divididos"
#. module: product
#: field:product.packaging,height:0
@@ -1245,7 +1265,7 @@ msgstr "PC Personalizado"
#. module: product
#: help:product.pricelist.version,date_end:0
msgid "Ending date for this pricelist version to be valid."
-msgstr ""
+msgstr "Data de fim da validade desta versão da lista de preços"
#. module: product
#: field:pricelist.partnerinfo,suppinfo_id:0
@@ -1257,7 +1277,7 @@ msgstr "Informação de parceiro"
#: view:product.template:0
#: field:product.template,type:0
msgid "Product Type"
-msgstr "Tipo de produto"
+msgstr "Tipo de artigo"
#. module: product
#: model:product.category,name:product.product_category_7
@@ -1268,7 +1288,7 @@ msgstr "Intervenção no sítio"
#. module: product
#: model:product.category,name:product.cat0
msgid "All products"
-msgstr "Todos os produtos"
+msgstr "Todos os artigos"
#. module: product
#: wizard_button:product.price_list,init,end:0
@@ -1278,7 +1298,7 @@ msgstr "Cancelar"
#. module: product
#: help:product.packaging,qty:0
msgid "The total number of products you can put by palet or box."
-msgstr "Número total de produtos que se pode pôr numa paleta ou caixa"
+msgstr "Número total de artigos que se pode pôr por palete ou caixa"
#. module: product
#: model:ir.model,name:product.model_product_pricelist_item
@@ -1326,7 +1346,7 @@ msgstr "Informação"
#. module: product
#: view:product.product:0
msgid "Codes"
-msgstr ""
+msgstr "Códigos"
#. module: product
#: constraint:ir.model:0
@@ -1368,6 +1388,8 @@ msgid ""
"Code of the product for this partner, will be used when printing a request "
"for quotation. Keep empty to use the internal one."
msgstr ""
+"Código do artigo para este parceiro, será usado na impressão de um pedido de "
+"cotação. Deixe vazio para utilizar o interno."
#. module: product
#: selection:product.template,state:0
@@ -1377,7 +1399,7 @@ msgstr "Obsoleto"
#. module: product
#: selection:product.ul,type:0
msgid "Pallet"
-msgstr ""
+msgstr "Palete"
#. module: product
#: field:pricelist.partnerinfo,price:0
@@ -1392,7 +1414,7 @@ msgstr "Garantia (meses)"
#. module: product
#: field:product.packaging,ul_qty:0
msgid "Package by layer"
-msgstr ""
+msgstr "Embalagem por camadas"
#. module: product
#: help:product.template,type:0
@@ -1405,7 +1427,7 @@ msgstr ""
#. module: product
#: model:process.node,note:product.process_node_supplier0
msgid "Product suppliers, with their product name, price, etc."
-msgstr ""
+msgstr "Fornecedores do artigo, com a sua designação, preço, etc"
#. module: product
#: model:ir.model,name:product.model_product_price_type
@@ -1421,7 +1443,7 @@ msgstr "Tipo de preço"
#: field:product.supplierinfo,product_id:0
#: model:res.request.link,name:product.req_link_product
msgid "Product"
-msgstr "Produto"
+msgstr "Artigo"
#. module: product
#: field:product.template,volume:0
@@ -1446,7 +1468,7 @@ msgstr "EAN"
#: view:product.product:0
#: view:product.template:0
msgid "Product Description"
-msgstr "Descrição do produto"
+msgstr "Descrição do artigo"
#. module: product
#: view:product.pricelist.item:0
@@ -1464,7 +1486,7 @@ msgstr ""
#. module: product
#: model:ir.model,name:product.model_product_uom_categ
msgid "Product uom categ"
-msgstr "udm da categoria do produto"
+msgstr "Categoria da UdM de artigos"
#. module: product
#: wizard_field:product.price_list,init,qty3:0
@@ -1474,7 +1496,7 @@ msgstr "Quantidade-3"
#. module: product
#: model:product.ul,name:product.product_ul_box
msgid "Box 20x20x40"
-msgstr ""
+msgstr "Caixa 20x20x40"
#. module: product
#: selection:product.template,supply_method:0
@@ -1494,7 +1516,7 @@ msgstr "Acréscimo de preço"
#. module: product
#: constraint:product.pricelist.version:0
msgid "You cannot have 2 pricelist versions that overlap!"
-msgstr ""
+msgstr "Não pode ter duas versões de listas de preços sobrepostas"
#. module: product
#: view:product.pricelist.item:0
@@ -1530,7 +1552,7 @@ msgstr "Data Final"
#: model:ir.actions.act_window,name:product.product_category_action_form
#: model:ir.ui.menu,name:product.menu_product_category_action_form
msgid "Products Categories"
-msgstr "Categorias de produtos"
+msgstr "Categorias de artigos"
#. module: product
#: field:product.product,packaging:0
@@ -1587,7 +1609,7 @@ msgstr "Método de custo"
#: view:product.packaging:0
#: view:product.product:0
msgid "Palletization"
-msgstr ""
+msgstr "Pelatização"
#. module: product
#: view:product.product:0
@@ -1598,7 +1620,7 @@ msgstr "Preços e Fornecedores"
#. module: product
#: help:product.packaging,weight:0
msgid "The weight of a full of products palet or box."
-msgstr "O peso de uma palete ou caixa completa de produtos"
+msgstr "O peso de uma palete ou caixa cheia de artigos"
#. module: product
#: selection:product.template,state:0
@@ -1608,7 +1630,7 @@ msgstr "Fim de ciclo de vida"
#. module: product
#: model:ir.module.module,shortdesc:product.module_meta_information
msgid "Products & Pricelists"
-msgstr ""
+msgstr "Artigos e listas de preços"
#. module: product
#: help:product.uom,factor:0
@@ -1620,7 +1642,7 @@ msgstr ""
#. module: product
#: help:product.template,weight_net:0
msgid "The net weight in Kg."
-msgstr ""
+msgstr "Peso líquido em kg."
#. module: product
#: model:product.template,name:product.product_product_tow1_product_template
@@ -1657,10 +1679,9 @@ msgid ""
"this product. Different delays will be summed for all levels and purchase "
"orders."
msgstr ""
-"Tempo médio a produzir este produto. Isto é somente para o pedido de "
-"produção e, se é uma conta de material multi-nível, é somente para o nível "
-"deste produto. Os atrasos diferentes serão somados para todos os níveis e "
-"pedidos de compra."
+"Tempo médio a produzir este artigo. Isto é somente para ordem de produção e, "
+"se é uma lista de materiais multi-nível, é apenas para o nível deste artigo. "
+"Os diferentes atrasos serão somados para todos os níveis e ordens de compra."
#. module: product
#: wizard_field:product.price_list,init,qty1:0
@@ -1684,6 +1705,9 @@ msgid ""
"reception of the products in your warehouse. Used by the scheduler for "
"automatic computation of the purchase order planning."
msgstr ""
+"Intervalo (em dias) entre a confirmação da ordem de compra e a recepção dos "
+"artigos no seu armazém. Usado pelo planificador para calendarização "
+"automática das ordens de compra."
#. module: product
#: help:product.template,uom_po_id:0
@@ -1710,28 +1734,28 @@ msgid ""
"Set a category of product if this rule only apply to products of a category "
"and his childs. Keep empty for all products"
msgstr ""
-"Selecionar uma categoria de produto se essa regra se aplica apenas a "
-"produtos dessa categoria. Deixar vazio para todos os produtos."
+"Defina a categoria se esta regra aplica-se apenas a artigos dessa categoria "
+"e dependentes. Deixe vazio para todos os artigos."
#. module: product
#: model:ir.actions.report.xml,name:product.report_product_label
msgid "Products Labels"
-msgstr "Rótulos de produtos"
+msgstr "Rótulos de artigos"
#. module: product
#: help:product.template,volume:0
msgid "The volume in m3."
-msgstr ""
+msgstr "Volume em m3"
#. module: product
#: model:product.ul,name:product.product_ul_big_box
msgid "Box 30x40x60"
-msgstr ""
+msgstr "Caixa 30x40x60"
#. module: product
#: model:product.uom,name:product.product_uom_kgm
msgid "KGM"
-msgstr ""
+msgstr "KGM"
#. module: product
#: field:product.pricelist.item,price_discount:0
diff --git a/addons/profile_accounting/i18n/pt_BR.po b/addons/profile_accounting/i18n/pt_BR.po
index 70456f1f18e..6803245141b 100644
--- a/addons/profile_accounting/i18n/pt_BR.po
+++ b/addons/profile_accounting/i18n/pt_BR.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-21 04:34+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: profile_accounting
diff --git a/addons/project/project.py b/addons/project/project.py
index 815f69ecf3d..f90e2b65e0e 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -362,7 +362,7 @@ class task(osv.osv):
'delegated_user_id': fields.related('child_ids','user_id',type='many2one', relation='res.users', string='Delegated To'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'work_ids': fields.one2many('project.task.work', 'task_id', 'Work done'),
- 'manager_id': fields.related('project_id','manager', type='many2one', relation='res.users', string='Project Manager'),
+ 'manager_id': fields.related('project_id','category_id','user_id', type='many2one', relation='res.users', string='Project Manager'),
'company_id': fields.many2one('res.company', 'Company'),
}
_defaults = {
@@ -491,9 +491,11 @@ class task(osv.osv):
def next_type(self, cr, uid, ids, *args):
for typ in self.browse(cr, uid, ids):
typeid = typ.type.id
- types = map(lambda x:x.id, typ.project_id.type_ids)
+ types = map(lambda x:x.id, typ.project_id.type_ids or [])
if types:
- if typeid and typeid in types and types.index(typeid) != len(types)-1 :
+ if not typeid:
+ self.write(cr, uid, typ.id, {'type': types[0]})
+ elif typeid and typeid in types and types.index(typeid) != len(types)-1 :
index = types.index(typeid)
self.write(cr, uid, typ.id, {'type': types[index+1]})
return True
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index b0f7ca4df52..cde3f076df9 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -471,10 +471,6 @@
-
-
-
-
@@ -488,6 +484,11 @@
+
+
+
+
+
diff --git a/addons/project/wizard/task_delegate.py b/addons/project/wizard/task_delegate.py
index 49f8ea4bcc7..35fe2019ea6 100644
--- a/addons/project/wizard/task_delegate.py
+++ b/addons/project/wizard/task_delegate.py
@@ -63,7 +63,7 @@ class wizard_delegate(wizard.interface):
'child_ids': [],
'work_ids': []
})
- task_obj.write(cr, uid, data['id'], {
+ task_obj.write(cr, uid, [data['id']], {
'remaining_hours': data['form']['planned_hours_me'],
'name': newname
})
diff --git a/addons/project_calendar/project_calendar_wizard.xml b/addons/project_calendar/project_calendar_wizard.xml
index b0f17cae08a..25ac4cfa82f 100644
--- a/addons/project_calendar/project_calendar_wizard.xml
+++ b/addons/project_calendar/project_calendar_wizard.xml
@@ -1,17 +1,17 @@
+ name="calendar.event.import" id="base_calendar.wizard_cal_event_import" multi="True" />
+ model="project.task" name="calendar.event.subscribe"
+ id="base_calendar.wizard_cal_event_subscribe" multi="True" />
+ name="calendar.event.export" id="base_calendar.wizard_cal_event_export" multi="True" />
diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py
index a6df9823cf1..943ecc2c7d0 100644
--- a/addons/project_gtd/project_gtd.py
+++ b/addons/project_gtd/project_gtd.py
@@ -19,9 +19,6 @@
#
##############################################################################
-from xml import dom
-from lxml import etree
-
from mx import DateTime
from mx.DateTime import now
import time
@@ -29,6 +26,16 @@ import tools
import netsvc
from osv import fields, osv
import ir
+from tools.translate import _
+
+import sys
+from tools.translate import _
+
+try:
+ from lxml import etree
+except ImportError:
+ sys.stderr.write("ERROR: Import lxml module\n")
+ sys.stderr.write("ERROR: Try to install the python-lxml package\n")
class project_gtd_context(osv.osv):
_name = "project.gtd.context"
@@ -148,9 +155,12 @@ class project_task(osv.osv):
timebox_ids = timebox_obj.search(cr,uid,[])
for task in self.browse(cr,uid,ids):
timebox = task.timebox_id.id
- if timebox and timebox_ids.index(timebox) != 0 :
- index = timebox_ids.index(timebox)
- self.write(cr, uid, task.id, {'timebox_id': timebox_ids[index - 1]})
+ if timebox:
+ if timebox_ids.index(timebox):
+ index = timebox_ids.index(timebox)
+ self.write(cr, uid, task.id, {'timebox_id': timebox_ids[index - 1]})
+ else:
+ self.write(cr, uid, task.id, {'timebox_id': False})
return True
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
@@ -159,7 +169,7 @@ class project_task(osv.osv):
timebox_obj = self.pool.get('project.gtd.timebox')
if res['type'] == 'search':
tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]))
- search_extended ='''''' % (len(tt)+6,)
+ search_extended ='''''' % (len(tt)+6,_('Getting Things Done'))
search_extended += ''''''
search_extended += ''''''
for time in tt:
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py
index d4ff62184bd..063d9937fd4 100644
--- a/addons/project_timesheet/project_timesheet.py
+++ b/addons/project_timesheet/project_timesheet.py
@@ -110,11 +110,13 @@ class project_work(osv.osv):
return super(project_work,self).write(cr, uid, ids, vals, context)
def unlink(self, cr, uid, ids, *args, **kwargs):
- timesheet_id = self.pool.get('project.task.work').browse(cr, uid, ids)[0].hr_analytic_timesheet_id
-# delete entry from timesheet too while deleting entry to task.
- list_avail_ids = self.pool.get('hr.analytic.timesheet').search(cr, uid, [])
- if timesheet_id in list_avail_ids:
- obj = self.pool.get('hr.analytic.timesheet').unlink(cr, uid, [timesheet_id], *args, **kwargs)
+ pool_analytic_timesheet = self.pool.get('hr.analytic.timesheet')
+ for work_id in ids:
+ timesheet_id = self.read(cr, uid, work_id, ['hr_analytic_timesheet_id'])['hr_analytic_timesheet_id']
+# delete entry from timesheet too while deleting entry to task.
+ list_avail_ids = pool_analytic_timesheet.search(cr, uid, [])
+ if timesheet_id in list_avail_ids:
+ obj = pool_analytic_timesheet.unlink(cr, uid, [timesheet_id], *args, **kwargs)
return super(project_work,self).unlink(cr, uid, ids, *args, **kwargs)
@@ -124,6 +126,40 @@ class project_work(osv.osv):
project_work()
+class task(osv.osv):
+ _inherit = "project.task"
+ _description = "Tasks"
+
+ def unlink(self, cr, uid, ids, *args, **kwargs):
+ for task_obj in self.browse(cr, uid, ids, *args, **kwargs):
+ if task_obj.work_ids:
+ work_ids = [x.id for x in task_obj.work_ids]
+ self.pool.get('project.task.work').unlink(cr, uid, work_ids, *args, **kwargs)
+
+ return super(task,self).unlink(cr, uid, ids, *args, **kwargs)
+
+ def write(self, cr, uid, ids,vals,context={}):
+ if (vals.has_key('project_id') and vals['project_id']) or (vals.has_key('name') and vals['name']):
+ vals_line = {}
+ hr_anlytic_timesheet = self.pool.get('hr.analytic.timesheet')
+ task_obj_l = self.browse(cr, uid, ids, context)
+ if (vals.has_key('project_id') and vals['project_id']):
+ project_obj = self.pool.get('project.project').browse(cr, uid, vals['project_id'])
+ acc_id = project_obj.category_id.id
+
+ for task_obj in task_obj_l:
+ if len(task_obj.work_ids):
+ for task_work in task_obj.work_ids:
+ line_id = task_work.hr_analytic_timesheet_id
+ if (vals.has_key('project_id') and vals['project_id']):
+ vals_line['account_id'] = acc_id
+ if (vals.has_key('name') and vals['name']):
+ vals_line['name'] = '%s: %s' % (tools.ustr(vals['name']), tools.ustr(task_work.name) or '/')
+ hr_anlytic_timesheet.write(cr, uid, [line_id], vals_line, {})
+ return super(task,self).write(cr, uid, ids, vals, context)
+
+task()
+
class project_project(osv.osv):
_inherit = "project.project"
def name_get(self, cr, user, ids, context=None):
diff --git a/addons/purchase/i18n/pt.po b/addons/purchase/i18n/pt.po
index c8921b57b89..ce7425d5a01 100644
--- a/addons/purchase/i18n/pt.po
+++ b/addons/purchase/i18n/pt.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-01-21 04:34+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: purchase
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index 6943dc2e03c..c7700a757c1 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -151,20 +151,17 @@ class purchase_order(osv.osv):
'partner_ref': fields.char('Supplier Reference', size=64),
'date_order':fields.date('Date Ordered', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}, help="Date on which this document has been created."),
'date_approve':fields.date('Date Approved', readonly=1),
- 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}, change_default=True),
- 'partner_address_id':fields.many2one('res.partner.address', 'Supplier Address', required=True, states={'posted':[('readonly',True)]}),
-
+ 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, change_default=True),
+ 'partner_address_id':fields.many2one('res.partner.address', 'Address', required=True, states={'posted':[('readonly',True)]}),
'dest_address_id':fields.many2one('res.partner.address', 'Destination Address', states={'posted':[('readonly',True)]},
help="Put an address if you want to deliver directly from the supplier to the customer." \
"In this case, it will remove the warehouse link and set the customer location."
),
'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', states={'posted':[('readonly',True)]}),
'location_id': fields.many2one('stock.location', 'Destination', required=True),
-
- 'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}, help="The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities."),
-
+ 'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, help="The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities."),
'state': fields.selection([('draft', 'Request for Quotation'), ('wait', 'Waiting'), ('confirmed', 'Waiting Supplier Ack'), ('approved', 'Approved'),('except_picking', 'Shipping Exception'), ('except_invoice', 'Invoice Exception'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, help="The state of the purchase order or the quotation request. A quotation is a purchase order in a 'Draft' state. Then the order has to be confirmed by the user, the state switch to 'Confirmed'. Then the supplier must confirm the order to change the state to 'Approved'. When the purchase order is paid and received, the state becomes 'Done'. If a cancel action occurs in the invoice or in the reception of goods, the state becomes in exception.", select=True),
- 'order_line': fields.one2many('purchase.order.line', 'order_id', 'Order Lines', states={'approved':[('readonly',True)]}),
+ 'order_line': fields.one2many('purchase.order.line', 'order_id', 'Order Lines', states={'approved':[('readonly',True)],'done':[('readonly',True)]}),
'validator' : fields.many2one('res.users', 'Validated by', readonly=True),
'notes': fields.text('Notes', translate=True),
'invoice_id': fields.many2one('account.invoice', 'Invoice', readonly=True),
@@ -396,7 +393,7 @@ class purchase_order(osv.osv):
continue
if order_line.product_id.product_tmpl_id.type in ('product', 'consu'):
dest = order.location_id.id
- self.pool.get('stock.move').create(cr, uid, {
+ move = self.pool.get('stock.move').create(cr, uid, {
'name': 'PO:'+order_line.name,
'product_id': order_line.product_id.id,
'product_qty': order_line.product_qty,
@@ -408,12 +405,14 @@ class purchase_order(osv.osv):
'location_dest_id': dest,
'picking_id': picking_id,
'move_dest_id': order_line.move_dest_id.id,
- 'state': 'assigned',
+ 'state': 'draft',
'purchase_line_id': order_line.id,
'company_id': order.company_id.id,
})
if order_line.move_dest_id:
self.pool.get('stock.move').write(cr, uid, [order_line.move_dest_id.id], {'location_id':order.location_id.id})
+ self.pool.get('stock.move').action_confirm(cr, uid, [move])
+ self.pool.get('stock.move').force_assign(cr,uid, [move])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
return picking_id
@@ -493,15 +492,6 @@ class purchase_order_line(osv.osv):
uom = prod_uom_po
if not date_order:
date_order = time.strftime('%Y-%m-%d')
- if price_unit:
- price = price_unit
- else:
- price = self.pool.get('product.pricelist').price_get(cr,uid,[pricelist],
- product, qty or 1.0, partner_id, {
- 'uom': uom,
- 'date': date_order,
- })[pricelist]
-
qty = qty or 1.0
seller_delay = 0
for s in prod.seller_ids:
@@ -510,7 +500,14 @@ class purchase_order_line(osv.osv):
temp_qty = s.qty # supplier _qty assigned to temp
if qty < temp_qty: # If the supplier quantity is greater than entered from user, set minimal.
qty = temp_qty
-
+ if price_unit:
+ price = price_unit
+ else:
+ price = self.pool.get('product.pricelist').price_get(cr,uid,[pricelist],
+ product, qty or 1.0, partner_id, {
+ 'uom': uom,
+ 'date': date_order,
+ })[pricelist]
dt = (DateTime.now() + DateTime.RelativeDateTime(days=seller_delay or 0.0)).strftime('%Y-%m-%d %H:%M:%S')
prod_name = self.pool.get('product.product').name_get(cr, uid, [prod.id])[0][1]
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 01f2ff22e84..9480f3327c3 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -245,6 +245,7 @@
tree
+
diff --git a/addons/purchase/security/ir.model.access.csv b/addons/purchase/security/ir.model.access.csv
index 68be681fdf5..5fb968e6ce1 100644
--- a/addons/purchase/security/ir.model.access.csv
+++ b/addons/purchase/security/ir.model.access.csv
@@ -7,3 +7,4 @@
"access_stock_move_purchase_user","stock.move purchase_user","stock.model_stock_move","purchase.group_purchase_user",1,1,1,1
"access_purchase_order_stock_worker","purchase.order stock_worker","model_purchase_order","stock.group_stock_user",1,0,0,0
"access_purchase_order_line_stock_worker","purchase.order.line stock_worker","model_purchase_order_line","stock.group_stock_user",1,0,0,0
+"access_account_tax_purchase_user","account.tax purchase_user","account.model_account_tax","purchase.group_purchase_user",1,0,0,0
\ No newline at end of file
diff --git a/addons/purchase_manual/wizard/wizard_purchase_line_invoice.py b/addons/purchase_manual/wizard/wizard_purchase_line_invoice.py
index 0982d5bbba6..0e30368d41b 100644
--- a/addons/purchase_manual/wizard/wizard_purchase_line_invoice.py
+++ b/addons/purchase_manual/wizard/wizard_purchase_line_invoice.py
@@ -24,6 +24,7 @@ import netsvc
import ir
import pooler
from osv import osv
+from tools.translate import _
invoice_form = """
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 8643b0775b9..5f6e0db3448 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -148,7 +148,7 @@ class sale_order(osv.osv):
res[sale.id] = False
return res
- def _invoiced_search(self, cursor, user, obj, name, args):
+ def _invoiced_search(self, cursor, user, obj, name, args, context):
if not len(args):
return []
clause = ''
@@ -453,7 +453,23 @@ class sale_order(osv.osv):
self.pool.get('sale.order.line').write(cr, uid, [line.id], {'invoiced': invoiced})
self.write(cr, uid, ids, {'state': 'invoice_except', 'invoice_ids': False})
return True
-
+
+ def action_invoice_end(self, cr, uid, ids, context={}):
+ for order in self.browse(cr, uid, ids):
+ val = {'invoiced': True}
+ if order.state == 'invoice_except':
+ val['state'] = 'progress'
+
+ for line in order.order_line:
+ towrite = []
+ if line.state == 'exception':
+ towrite.append(line.id)
+ if towrite:
+ self.pool.get('sale.order.line').write(cr, uid, towrite, {'state': 'confirmed'}, context=context)
+ self.write(cr, uid, [order.id], val)
+
+ return True
+
def action_cancel(self, cr, uid, ids, context={}):
ok = True
sale_order_line_obj = self.pool.get('sale.order.line')
@@ -517,25 +533,9 @@ class sale_order(osv.osv):
notcanceled = False
write_done_ids = []
write_cancel_ids = []
- stock_move_obj = self.pool.get('stock.move')
for order in self.browse(cr, uid, ids, context={}):
-
- #check for pending deliveries
- pending_deliveries = False
- # check => if order_lines do not exist,don't proceed for any mode.
- if not order.order_line:
- return False
for line in order.order_line:
- move_ids = stock_move_obj.search(cr, uid, [('sale_line_id','=', line.id)])
- for move in stock_move_obj.browse( cr, uid, move_ids ):
- #if one of the related order lines is in state draft, auto or confirmed
- #this order line is not yet delivered
- if move.state in ('draft', 'waiting', 'confirmed'):
- pending_deliveries = True
- # Reason => if there are no move lines,the following condition will always set to be true,and will set SO to 'DONE'.
- # Added move_ids check to SOLVE.
- if move_ids and ((not line.procurement_id) or (line.procurement_id.state=='done')) and not pending_deliveries:
-# finished = True
+ if (not line.procurement_id) or (line.procurement_id.state=='done'):
if line.state != 'done':
write_done_ids.append(line.id)
else:
diff --git a/addons/sale/sale_workflow.xml b/addons/sale/sale_workflow.xml
index 15b6f359175..6a7e7b6a8ee 100644
--- a/addons/sale/sale_workflow.xml
+++ b/addons/sale/sale_workflow.xml
@@ -75,7 +75,8 @@
invoice_end
- dummy
+ function
+ action_invoice_end()
diff --git a/addons/sale_crm/wizard/makesale.py b/addons/sale_crm/wizard/makesale.py
index e366ceae814..c5ad6a92a72 100644
--- a/addons/sale_crm/wizard/makesale.py
+++ b/addons/sale_crm/wizard/makesale.py
@@ -25,6 +25,7 @@ import wizard
import netsvc
import ir
import pooler
+from tools.translate import _
sale_form = """
@@ -119,7 +120,7 @@ class make_sale(wizard.interface):
value['tax_id'] = [(6,0,value['tax_id'])]
sale_line_obj.create(cr, uid, value)
- case_obj.write(cr, uid, case.id, {'ref': 'sale.order,%s' % new_id})
+ case_obj.write(cr, uid, [case.id], {'ref': 'sale.order,%s' % new_id})
new_ids.append(new_id)
if data['form']['close']:
diff --git a/addons/stock/i18n/de.po b/addons/stock/i18n/de.po
index 8ba706c49be..61e055a1404 100644
--- a/addons/stock/i18n/de.po
+++ b/addons/stock/i18n/de.po
@@ -658,6 +658,11 @@ msgstr "Erledigt am"
msgid "Expected Shipping Date"
msgstr "Erwartete Auslieferung"
+#. module: stock
+#: rml:stock.picking.list:0
+msgid "Shipping Address :"
+msgstr "Lieferanschrift:"
+
#. module: stock
#: view:stock.tracking:0
msgid "Tracking/Serial"
diff --git a/addons/stock/i18n/fr.po b/addons/stock/i18n/fr.po
index 5210b7e2f92..22bca72c8ca 100644
--- a/addons/stock/i18n/fr.po
+++ b/addons/stock/i18n/fr.po
@@ -673,6 +673,11 @@ msgstr "Date de fin"
msgid "Expected Shipping Date"
msgstr "Date d'envoi prévue"
+#. module: stock
+#: rml:stock.picking.list:0
+msgid "Shipping Address :"
+msgstr "Adresse de livraison :"
+
#. module: stock
#: view:stock.tracking:0
msgid "Tracking/Serial"
diff --git a/addons/stock/i18n/pt.po b/addons/stock/i18n/pt.po
index 1bacbeb6457..550541f5d47 100644
--- a/addons/stock/i18n/pt.po
+++ b/addons/stock/i18n/pt.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-12-09 01:29+0000\n"
+"PO-Revision-Date: 2010-01-22 00:53+0000\n"
"Last-Translator: Paulino \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-12-16 05:03+0000\n"
+"X-Launchpad-Export-Date: 2010-01-22 04:34+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: stock
@@ -39,7 +39,7 @@ msgstr "Sub Produtos"
#. module: stock
#: selection:stock.location,icon:0
msgid "terp-account"
-msgstr ""
+msgstr "terp-account"
#. module: stock
#: constraint:ir.actions.act_window:0
@@ -50,12 +50,12 @@ msgstr "Nome de modelo inválido na definição da acção"
#: model:ir.module.module,shortdesc:stock.module_meta_information
#: model:ir.ui.menu,name:stock.menu_stock_root
msgid "Inventory Management"
-msgstr ""
+msgstr "Inventários"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_SORT_ASCENDING"
-msgstr ""
+msgstr "STOCK_SORT_ASCENDING"
#. module: stock
#: field:stock.production.lot.revision,indice:0
@@ -65,7 +65,7 @@ msgstr "Revisão"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_MEDIA_FORWARD"
-msgstr ""
+msgstr "STOCK_MEDIA_FORWARD"
#. module: stock
#: rml:lot.location:0
@@ -75,7 +75,7 @@ msgstr "Total:"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_ZOOM_100"
-msgstr ""
+msgstr "STOCK_ZOOM_100"
#. module: stock
#: rml:lot.stock.overview:0
@@ -86,7 +86,7 @@ msgstr "UdM"
#. module: stock
#: model:ir.actions.wizard,name:stock.return_picking
msgid "Return packing"
-msgstr "Retornar embalagens"
+msgstr "Embalagem de retorno"
#. module: stock
#: field:product.category,property_stock_journal:0
@@ -96,31 +96,31 @@ msgstr "Diário de stock"
#. module: stock
#: wizard_view:stock.fill_inventory,init:0
msgid "Fill Inventory for specific location"
-msgstr ""
+msgstr "Preencha o inventário para a localização específica"
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_picking_list
#: view:stock.picking:0
#: field:stock.picking.move.wizard,picking_id:0
msgid "Packing list"
-msgstr "Lista de recolhas"
+msgstr "Lista de recolha"
#. module: stock
#: rml:lot.stock.overview:0
#: rml:lot.stock.overview_all:0
msgid "Amount"
-msgstr ""
+msgstr "Montante"
#. module: stock
#: view:stock.picking:0
msgid "Products Received"
-msgstr ""
+msgstr "Artigos recebidos"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree4
#: model:ir.ui.menu,name:stock.menu_action_picking_tree4
msgid "Incoming Products"
-msgstr ""
+msgstr "Artigos a entrar"
#. module: stock
#: field:stock.picking,name:0
@@ -131,17 +131,17 @@ msgstr "Referência"
#. module: stock
#: wizard_field:stock.invoice_onshipping,init,group:0
msgid "Group by partner"
-msgstr "Agrupar por terceiros"
+msgstr "Agrupar por parceiro"
#. module: stock
#: field:stock.picking,address_id:0
msgid "Partner"
-msgstr "Terceiro"
+msgstr "Parceiro"
#. module: stock
#: help:product.product,track_incoming:0
msgid "Force to use a Production Lot during receptions"
-msgstr ""
+msgstr "Forçar o uso de lotes de produção nas recepções"
#. module: stock
#: field:stock.move,move_history_ids:0
@@ -159,12 +159,12 @@ msgstr "Lote de produção"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_NEW"
-msgstr ""
+msgstr "STOCK_NEW"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_CANCEL"
-msgstr ""
+msgstr "STOCK_CANCEL"
#. module: stock
#: selection:stock.location,usage:0
@@ -174,7 +174,7 @@ msgstr "Localização interna"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_PRINT"
-msgstr ""
+msgstr "STOCK_PRINT"
#. module: stock
#: rml:stock.picking.list:0
@@ -184,7 +184,7 @@ msgstr "Estado"
#. module: stock
#: field:stock.location,stock_real_value:0
msgid "Real Stock Value"
-msgstr ""
+msgstr "Valor Real do Stock"
#. module: stock
#: view:stock.move:0
@@ -196,7 +196,7 @@ msgstr "UdM"
#: selection:stock.picking,state:0
#: field:stock.production.lot,stock_available:0
msgid "Available"
-msgstr ""
+msgstr "Disponível"
#. module: stock
#: view:stock.move:0
@@ -206,12 +206,12 @@ msgstr "Fazer Pacote"
#. module: stock
#: wizard_view:stock.partial_picking,end2:0
msgid "Packing result"
-msgstr ""
+msgstr "Resultado do empacotamento"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_QUIT"
-msgstr ""
+msgstr "STOCK_QUIT"
#. module: stock
#: field:stock.warehouse,lot_output_id:0
@@ -221,70 +221,70 @@ msgstr "Localização de saída"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_GOTO_TOP"
-msgstr ""
+msgstr "STOCK_GOTO_TOP"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_ABOUT"
-msgstr ""
+msgstr "STOCK_ABOUT"
#. module: stock
#: selection:stock.location,icon:0
msgid "terp-hr"
-msgstr ""
+msgstr "terp-hr"
#. module: stock
#: field:stock.location,usage:0
msgid "Location Type"
-msgstr ""
+msgstr "Tipo de Localização"
#. module: stock
#: selection:stock.location,icon:0
msgid "terp-purchase"
-msgstr ""
+msgstr "terp-purchase"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_DND"
-msgstr ""
+msgstr "STOCK_DND"
#. module: stock
#: rml:stock.picking.list:0
msgid "["
-msgstr ""
+msgstr "["
#. module: stock
#: view:stock.picking:0
msgid "Products Sent"
-msgstr ""
+msgstr "Artigos enviados"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_GOTO_FIRST"
-msgstr ""
+msgstr "STOCK_GOTO_FIRST"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree6
#: model:ir.ui.menu,name:stock.menu_action_picking_tree6
msgid "Internal Moves"
-msgstr ""
+msgstr "Movimentos internos"
#. module: stock
#: field:stock.move,product_packaging:0
msgid "Packaging"
-msgstr "Embalagem"
+msgstr "Empacotamento"
#. module: stock
#: rml:stock.picking.list:0
msgid "Order(Origin)"
-msgstr ""
+msgstr "Ordem (origem)"
#. module: stock
#: rml:lot.location:0
#: rml:lot.stock.overview:0
#: rml:lot.stock.overview_all:0
msgid "Grand Total:"
-msgstr ""
+msgstr "Total global"
#. module: stock
#: view:stock.location:0
@@ -295,17 +295,17 @@ msgstr "Informação adicional"
#. module: stock
#: selection:stock.invoice_onshipping,init,type:0
msgid "Customer Refund"
-msgstr ""
+msgstr "Nota de crédito a clientes"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_FLOPPY"
-msgstr ""
+msgstr "STOCK_FLOPPY"
#. module: stock
#: view:stock.production.lot.revision:0
msgid "Production Lot Revisions"
-msgstr "Revisões do lote de produção"
+msgstr "Revisões de lotes de produção"
#. module: stock
#: view:stock.location:0
@@ -321,7 +321,7 @@ msgstr "Nome da localização"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_UNINDENT"
-msgstr ""
+msgstr "STOCK_UNINDENT"
#. module: stock
#: view:stock.move:0
@@ -332,7 +332,7 @@ msgstr "Informação de movimentos"
#. module: stock
#: view:stock.picking:0
msgid "Unreceived Products"
-msgstr ""
+msgstr "Artigos não recebidos"
#. module: stock
#: field:stock.inventory,state:0
@@ -349,22 +349,22 @@ msgstr "Clientes"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_UNDERLINE"
-msgstr ""
+msgstr "STOCK_UNDERLINE"
#. module: stock
#: view:stock.picking.move.wizard:0
msgid "Move Lines"
-msgstr "Linhas de movimentos"
+msgstr "Linhas de movimento"
#. module: stock
#: wizard_field:stock.fill_inventory,init,recursive:0
msgid "Include all childs for the location"
-msgstr ""
+msgstr "Incluir todos os dependentes da localização"
#. module: stock
#: field:product.template,property_stock_procurement:0
msgid "Procurement Location"
-msgstr "Localizção de obtenção"
+msgstr "Localizção de aprovisionamento"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_production_lot_form
@@ -375,12 +375,12 @@ msgstr "Lotes de produção"
#. module: stock
#: rml:stock.picking.list:0
msgid "Recipient"
-msgstr "Receptor"
+msgstr "Recipiente"
#. module: stock
#: model:ir.actions.wizard,name:stock.track_line
msgid "Track line"
-msgstr "Linha de procura"
+msgstr "Linha de rastreio"
#. module: stock
#: field:stock.location,child_ids:0
@@ -390,17 +390,17 @@ msgstr "Contém"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_BOLD"
-msgstr ""
+msgstr "STOCK_BOLD"
#. module: stock
#: selection:stock.location,icon:0
msgid "terp-graph"
-msgstr ""
+msgstr "terp-graph"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_PREFERENCES"
-msgstr ""
+msgstr "STOCK_PREFERENCES"
#. module: stock
#: rml:lot.location:0
@@ -414,7 +414,7 @@ msgstr "Quantidade"
#. module: stock
#: view:stock.picking:0
msgid "Process Now"
-msgstr ""
+msgstr "Processar agora"
#. module: stock
#: field:stock.location,address_id:0
@@ -424,17 +424,17 @@ msgstr "Endereço de localização"
#. module: stock
#: help:stock.move,prodlot_id:0
msgid "Production lot is used to put a serial number on the production"
-msgstr "Lote de produção é usado para inserir um numero de serie na produção"
+msgstr "Lote de produção é usado para atribuir um numero de serie à produção"
#. module: stock
#: model:stock.location,name:stock.stock_location_13
msgid "Stock Level 1"
-msgstr ""
+msgstr "Nivel de Stock 1"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_MEDIA_REWIND"
-msgstr ""
+msgstr "STOCK_MEDIA_REWIND"
#. module: stock
#: field:stock.warehouse,lot_input_id:0
@@ -454,33 +454,33 @@ msgstr "Fazer empacotamento"
#. module: stock
#: model:stock.location,name:stock.location_procurement
msgid "Procurements"
-msgstr "Obtenções"
+msgstr "Aprovisionamentos"
#. module: stock
#: model:stock.location,name:stock.stock_location_3
msgid "IT Suppliers"
-msgstr ""
+msgstr "Fornecedores de TI"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_move_form3
#: model:ir.ui.menu,name:stock.menu_action_move_form3
msgid "Draft Moves"
-msgstr "Movimentos em rascunhos"
+msgstr "Movimentos rascunho"
#. module: stock
#: field:report.stock.lines.date,product_id:0
msgid "Product Id"
-msgstr ""
+msgstr "ID do artigo"
#. module: stock
#: view:res.partner:0
msgid "Sales & Purchases"
-msgstr "Vendas e compras"
+msgstr "Vendas & Compras"
#. module: stock
#: selection:stock.invoice_onshipping,init,type:0
msgid "Customer Invoice"
-msgstr ""
+msgstr "Factura a Clientes"
#. module: stock
#: field:product.template,property_stock_inventory:0
@@ -495,7 +495,7 @@ msgstr ""
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_CUT"
-msgstr ""
+msgstr "STOCK_CUT"
#. module: stock
#: help:product.template,property_stock_inventory:0
@@ -504,7 +504,7 @@ msgid ""
"instead of the default one, as the source location for stock moves generated "
"when you do an inventory"
msgstr ""
-"Para o actual produto (modelo), esta localização do stock será utilizado, em "
+"Para o artigo actual (modelo), esta localização do stock será utilizado, em "
"vez do padrão, como o local de origem para o movimentos de stock gerados "
"quando você faz um inventario"
@@ -516,7 +516,7 @@ msgstr "Esta conta será usada para validar o stock de saída"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_ZOOM_FIT"
-msgstr ""
+msgstr "STOCK_ZOOM_FIT"
#. module: stock
#: help:product.category,property_stock_journal:0
@@ -530,22 +530,22 @@ msgstr ""
#: model:ir.actions.act_window,name:stock.action_picking_calendar_delivery
#: model:ir.ui.menu,name:stock.menu_picking_calendar_delivery
msgid "Calendar of Deliveries"
-msgstr ""
+msgstr "Calendário de Entregas"
#. module: stock
#: field:product.product,track_incoming:0
msgid "Track Incomming Lots"
-msgstr ""
+msgstr "Rastrear lotes à entrada"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_stock_product_location_open
msgid "Stock by Location"
-msgstr ""
+msgstr "Stock por localização"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_SAVE_AS"
-msgstr ""
+msgstr "STOCK_SAVE_AS"
#. module: stock
#: model:ir.model,name:stock.model_stock_report_prodlots
@@ -555,17 +555,17 @@ msgstr ""
#. module: stock
#: field:stock.location,stock_virtual:0
msgid "Virtual Stock"
-msgstr ""
+msgstr "Stock virtual"
#. module: stock
#: selection:stock.location,usage:0
msgid "View"
-msgstr "Ver"
+msgstr "Vista"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_DIALOG_ERROR"
-msgstr ""
+msgstr "STOCK_DIALOG_ERROR"
#. module: stock
#: field:stock.location,parent_left:0
@@ -580,12 +580,12 @@ msgstr ""
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_INDEX"
-msgstr ""
+msgstr "STOCK_INDEX"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_GOTO_BOTTOM"
-msgstr ""
+msgstr "STOCK_GOTO_BOTTOM"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_form
@@ -619,7 +619,7 @@ msgstr ""
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_GO_FORWARD"
-msgstr ""
+msgstr "STOCK_GO_FORWARD"
#. module: stock
#: field:stock.production.lot.revision,author_id:0
@@ -629,31 +629,36 @@ msgstr "Autor"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_UNDELETE"
-msgstr ""
+msgstr "STOCK_UNDELETE"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_EXECUTE"
-msgstr ""
+msgstr "STOCK_EXECUTE"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_DIALOG_QUESTION"
-msgstr ""
+msgstr "STOCK_DIALOG_QUESTION"
#. module: stock
#: selection:stock.location,chained_auto_packing:0
msgid "Manual Operation"
-msgstr ""
+msgstr "Operação Manual"
#. module: stock
#: field:stock.picking,date_done:0
msgid "Date Done"
-msgstr ""
+msgstr "Data de conclusão"
#. module: stock
#: rml:stock.picking.list:0
msgid "Expected Shipping Date"
+msgstr "Data esperada de envio"
+
+#. module: stock
+#: rml:stock.picking.list:0
+msgid "Shipping Address :"
msgstr ""
#. module: stock
@@ -664,23 +669,25 @@ msgstr "Rastrear/Serial"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_SELECT_FONT"
-msgstr ""
+msgstr "STOCK_SELECT_FONT"
#. module: stock
#: selection:stock.location,icon:0
msgid "STOCK_PASTE"
-msgstr ""
+msgstr "STOCK_PASTE"
#. module: stock
#: model:stock.location,name:stock.stock_location_locations_partner
msgid "Partner Locations"
-msgstr "Localizações do terceiro"
+msgstr "Localizações do parceiro"
#. module: stock
#: help:stock.move,tracking_id:0
msgid ""
"Tracking lot is the code that will be put on the logistical unit/pallet"
msgstr ""
+"Rastreamento do lote é o código que será colocado na unidade /palete "
+"logística"
#. module: stock
#: view:stock.tracking:0
@@ -690,12 +697,12 @@ msgstr "Numero de rastreio"
#. module: stock
#: model:stock.location,name:stock.stock_location_7
msgid "European Customers"
-msgstr ""
+msgstr "Clientes Europeus"
#. module: stock
#: selection:stock.location,icon:0
msgid "terp-stock"
-msgstr ""
+msgstr "Stock-terp"
#. module: stock
#: rml:stock.picking.list:0
diff --git a/addons/stock/i18n/stock.pot b/addons/stock/i18n/stock.pot
index 0cb2bb5dc63..2d4c615b7c1 100644
--- a/addons/stock/i18n/stock.pot
+++ b/addons/stock/i18n/stock.pot
@@ -646,6 +646,11 @@ msgstr ""
msgid "Expected Shipping Date"
msgstr ""
+#. module: stock
+#: rml:stock.picking.list:0
+msgid "Shipping Address :"
+msgstr ""
+
#. module: stock
#: view:stock.tracking:0
msgid "Tracking/Serial"
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 04a044077ac..1ea6aa998b2 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -533,8 +533,8 @@ class stock_picking(osv.osv):
def force_assign(self, cr, uid, ids, *args):
wf_service = netsvc.LocalService("workflow")
for pick in self.browse(cr, uid, ids):
-# move_ids = [x.id for x in pick.move_lines if x.state == 'confirmed']
- move_ids = [x.id for x in pick.move_lines]
+ move_ids = [x.id for x in pick.move_lines if x.state in ['confirmed','waiting']]
+# move_ids = [x.id for x in pick.move_lines]
self.pool.get('stock.move').force_assign(cr, uid, move_ids)
wf_service.trg_write(uid, 'stock.picking', pick.id, cr)
return True
@@ -770,7 +770,7 @@ class stock_picking(osv.osv):
tax_ids = self._get_taxes_invoice(cursor, user, move_line, type)
account_analytic_id = self._get_account_analytic_invoice(cursor,
user, picking, move_line)
-
+
#set UoS if it's a sale and the picking doesn't have one
uos_id = move_line.product_uos and move_line.product_uos.id or False
if not uos_id and type in ('out_invoice', 'out_refund'):
@@ -819,6 +819,18 @@ class stock_picking(osv.osv):
return False
return True
+ def unlink(self, cr, uid, ids, context=None):
+ for pick in self.browse(cr, uid, ids, context=context):
+ if pick.state in ['done','cancel']:
+ raise osv.except_osv(_('Error'), _('You cannot remove the picking which is in %s state !')%(pick.state,))
+ elif pick.state in ['confirmed','assigned']:
+ ids2 = [move.id for move in pick.move_lines]
+ context.update({'call_unlink':True})
+ self.pool.get('stock.move').action_cancel(cr, uid, ids2, context)
+ else:
+ continue
+ return super(stock_picking, self).unlink(cr, uid, ids, context=context)
+
stock_picking()
@@ -864,7 +876,7 @@ class stock_production_lot(osv.osv):
res.update(dict(cr.fetchall()))
return res
- def _stock_search(self, cr, uid, obj, name, args):
+ def _stock_search(self, cr, uid, obj, name, args, context):
locations = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'internal')])
cr.execute('''select
prodlot_id,
@@ -1016,8 +1028,8 @@ class stock_move(osv.osv):
( \
(move.product_id.track_production and move.location_id.usage=='production') or \
(move.product_id.track_production and move.location_dest_id.usage=='production') or \
- (move.product_id.track_incoming and move.location_id.usage=='supplier') or \
- (move.product_id.track_outgoing and move.location_dest_id.usage=='customer') \
+ (move.product_id.track_incoming and move.location_id.usage in ('supplier','internal')) or \
+ (move.product_id.track_outgoing and move.location_dest_id.usage in ('customer','internal')) \
)):
return False
return True
@@ -1149,25 +1161,25 @@ class stock_move(osv.osv):
'message': 'You are moving %.2f products but only %.2f available in this lot.' % (product_qty, prodlot.stock_available or 0.0)
}
return {'warning': warning}
-
+
def onchange_quantity(self, cr, uid, ids, product_id, product_qty, product_uom, product_uos):
result = {
'product_uos_qty': 0.00
}
-
+
if (not product_id) or (product_qty <=0.0):
return {'value': result}
-
+
product_obj = self.pool.get('product.product')
uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff'])
-
+
if product_uos and product_uom and (product_uom != product_uos):
result['product_uos_qty'] = product_qty * uos_coeff['uos_coeff']
else:
result['product_uos_qty'] = product_qty
-
+
return {'value': result}
-
+
def onchange_product_id(self, cr, uid, ids, prod_id=False, loc_id=False, loc_dest_id=False):
if not prod_id:
return {}
@@ -1180,7 +1192,7 @@ class stock_move(osv.osv):
'product_qty': 1.00,
'product_uos_qty' : self.pool.get('stock.move').onchange_quantity(cr, uid, ids, prod_id, 1.00, product.uom_id.id, uos_id)['value']['product_uos_qty']
}
-
+
if loc_id:
result['location_id'] = loc_id
if loc_dest_id:
@@ -1323,14 +1335,14 @@ class stock_move(osv.osv):
pickings[move.picking_id.id] = True
if move.move_dest_id and move.move_dest_id.state == 'waiting':
self.write(cr, uid, [move.move_dest_id.id], {'state': 'assigned'})
- if move.move_dest_id.picking_id:
+ if context.get('call_unlink',False) and move.move_dest_id.picking_id:
wf_service = netsvc.LocalService("workflow")
wf_service.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr)
self.write(cr, uid, ids, {'state': 'cancel', 'move_dest_id': False})
-
- for pick in self.pool.get('stock.picking').browse(cr, uid, pickings.keys()):
- if all(move.state == 'cancel' for move in pick.move_lines):
- self.pool.get('stock.picking').write(cr, uid, [pick.id], {'state': 'cancel'})
+ if not context.get('call_unlink',False):
+ for pick in self.pool.get('stock.picking').browse(cr, uid, pickings.keys()):
+ if all(move.state == 'cancel' for move in pick.move_lines):
+ self.pool.get('stock.picking').write(cr, uid, [pick.id], {'state': 'cancel'})
wf_service = netsvc.LocalService("workflow")
for id in ids:
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 0d0de9525b4..9d0c9016e05 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -259,7 +259,7 @@
-
+
@@ -281,7 +281,7 @@
-
+
diff --git a/addons/stock/wizard/wizard_partial_picking.py b/addons/stock/wizard/wizard_partial_picking.py
index be5226956fc..d9a40cc8690 100644
--- a/addons/stock/wizard/wizard_partial_picking.py
+++ b/addons/stock/wizard/wizard_partial_picking.py
@@ -58,6 +58,8 @@ def _get_moves(self, cr, uid, data, context):
_moves_arch_lst = ['', '
']
for m in pick.move_lines:
+ if m.state in ('done', 'cancel'):
+ continue
quantity = m.product_qty
if m.state<>'assigned':
quantity = 0
diff --git a/addons/survey/report/survey_analysis_report.py b/addons/survey/report/survey_analysis_report.py
index b246ebfcaae..4df20cbe319 100755
--- a/addons/survey/report/survey_analysis_report.py
+++ b/addons/survey/report/survey_analysis_report.py
@@ -58,6 +58,22 @@ class survey_analysis(report_rml):