Merge lp:~fabien-morin/unifield-server/fm-us-2619-2661-merged into lp:unifield-server

Proposed by jftempo
Status: Rejected
Rejected by: jftempo
Proposed branch: lp:~fabien-morin/unifield-server/fm-us-2619-2661-merged
Merge into: lp:unifield-server
Diff against target: 2792 lines (+2080/-112)
16 files modified
bin/addons/base/i18n/fr.po (+12/-0)
bin/addons/base/ir/ir_actions.py (+1/-1)
bin/addons/import_data/import_data.py (+4/-1)
bin/addons/msf_doc_import/__init__.py (+1/-0)
bin/addons/msf_doc_import/__openerp__.py (+1/-0)
bin/addons/msf_doc_import/doc_import_report.xml (+11/-0)
bin/addons/msf_doc_import/msf_import_export.py (+792/-0)
bin/addons/msf_doc_import/msf_import_export_conf.py (+530/-0)
bin/addons/msf_doc_import/report/export_generic.mako (+137/-0)
bin/addons/msf_doc_import/report/import_generic_template.mako (+21/-0)
bin/addons/msf_doc_import/report/import_generic_template.py (+52/-0)
bin/addons/msf_doc_import/view/msf_import_export_view.xml (+96/-0)
bin/addons/msf_doc_import/wizard/abstract_wizard_import.py (+16/-3)
bin/addons/msf_profile/i18n/fr_MF.po (+364/-96)
bin/addons/product_nomenclature/product_nomenclature.py (+1/-1)
bin/osv/orm.py (+41/-10)
To merge this branch: bzr merge lp:~fabien-morin/unifield-server/fm-us-2619-2661-merged
Reviewer Review Type Date Requested Status
UniField Reviewer Team Pending
Review via email: mp+326749@code.launchpad.net
To post a comment you must log in.
4325. By Fabien MORIN

US-2619-2661 [FIX] do not apply this change in the context of
sync_update_execution as both the import and the update execution uses the same
import_data method.

4326. By Fabien MORIN

US-2619-2661 [MERGE] with latest trunk

Unmerged revisions

4326. By Fabien MORIN

US-2619-2661 [MERGE] with latest trunk

4325. By Fabien MORIN

US-2619-2661 [FIX] do not apply this change in the context of
sync_update_execution as both the import and the update execution uses the same
import_data method.

4324. By Fabien MORIN

US-2619 US-2661 [FIX] do not allow new line charcter in strings at import

4323. By Fabien MORIN

US-2619 US-2661 [MERGE] with 2619 improvments

4322. By Fabien MORIN

US-2619 US-2661 [MERGE] small fix from US-2661

4321. By Fabien MORIN

US-2619 - US-2661 [MERGE] last modification of US-2661

4320. By Fabien MORIN

US-2619 - US-2661 [MERGE] both ticket in a same branch

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bin/addons/base/i18n/fr.po'
--- bin/addons/base/i18n/fr.po 2016-12-15 16:14:13 +0000
+++ bin/addons/base/i18n/fr.po 2017-09-12 08:08:04 +0000
@@ -9695,3 +9695,15 @@
9695#: selection:base.language.install,lang:09695#: selection:base.language.install,lang:0
9696msgid "Russian / русский язык"9696msgid "Russian / русский язык"
9697msgstr "Russie / русский язык"9697msgstr "Russie / русский язык"
9698
9699#. module: base
9700#: code:addons/orm.py:935
9701#, python-format
9702msgid "New line characters in the field '%s' not allowed. Please fix entry :\n'%s'"
9703msgstr "Le caractère de retour à la ligne dans le champ '%s' est interdit. Veuillez corriger l'entrée:\n'%s'"
9704
9705#. module: base
9706#: code:addons/orm.py:1042
9707#, python-format
9708msgid "Line %s: %s"
9709msgstr "Ligne %s: %s"
96989710
=== modified file 'bin/addons/base/ir/ir_actions.py'
--- bin/addons/base/ir/ir_actions.py 2017-05-18 12:16:12 +0000
+++ bin/addons/base/ir/ir_actions.py 2017-09-12 08:08:04 +0000
@@ -150,7 +150,7 @@
150 _name = 'ir.actions.act_window'150 _name = 'ir.actions.act_window'
151 _table = 'ir_act_window'151 _table = 'ir_act_window'
152 _sequence = 'ir_actions_id_seq'152 _sequence = 'ir_actions_id_seq'
153 _order = 'name'153 _order = 'name, id'
154 _replace_exported_fields = {154 _replace_exported_fields = {
155 'groups_txt': [155 'groups_txt': [
156 (['groups_id', 'Groups'], 10)156 (['groups_id', 'Groups'], 10)
157157
=== modified file 'bin/addons/import_data/import_data.py'
--- bin/addons/import_data/import_data.py 2016-05-24 08:44:23 +0000
+++ bin/addons/import_data/import_data.py 2017-09-12 08:08:04 +0000
@@ -46,7 +46,10 @@
4646
47 if data.get('parent_id', False):47 if data.get('parent_id', False):
48 n_obj = self.pool.get('product.nomenclature')48 n_obj = self.pool.get('product.nomenclature')
49 parent_ids = n_obj.search(cr, uid, [('msfid', '=', data['parent_id'])], limit=1)49 if isinstance(data['parent_id'], (int, long)):
50 parent_ids = [data['parent_id']]
51 else:
52 parent_ids = n_obj.search(cr, uid, [('msfid', '=', data['parent_id'])], limit=1)
50 if parent_ids:53 if parent_ids:
51 parent_id = parent_ids[0]54 parent_id = parent_ids[0]
5255
5356
=== modified file 'bin/addons/msf_doc_import/__init__.py'
--- bin/addons/msf_doc_import/__init__.py 2016-05-17 12:05:25 +0000
+++ bin/addons/msf_doc_import/__init__.py 2017-09-12 08:08:04 +0000
@@ -54,3 +54,4 @@
54import product_list54import product_list
55import supplier_catalogue55import supplier_catalogue
56import report56import report
57import msf_import_export
5758
=== modified file 'bin/addons/msf_doc_import/__openerp__.py'
--- bin/addons/msf_doc_import/__openerp__.py 2017-05-22 16:04:34 +0000
+++ bin/addons/msf_doc_import/__openerp__.py 2017-09-12 08:08:04 +0000
@@ -51,6 +51,7 @@
51 'view/stock_picking_import_lines_view.xml',51 'view/stock_picking_import_lines_view.xml',
52 'view/replenishment_rules_view.xml',52 'view/replenishment_rules_view.xml',
53 'view/supplier_catalogue_view.xml',53 'view/supplier_catalogue_view.xml',
54 'view/msf_import_export_view.xml',
54 'wizard/wizard_import_po_line_view.xml',55 'wizard/wizard_import_po_line_view.xml',
55 'wizard/wizard_import_fo_line.xml',56 'wizard/wizard_import_fo_line.xml',
56 'wizard/wizard_import_tender_line.xml',57 'wizard/wizard_import_tender_line.xml',
5758
=== modified file 'bin/addons/msf_doc_import/doc_import_report.xml'
--- bin/addons/msf_doc_import/doc_import_report.xml 2016-07-27 08:54:22 +0000
+++ bin/addons/msf_doc_import/doc_import_report.xml 2017-09-12 08:08:04 +0000
@@ -45,5 +45,16 @@
45 auto="False"45 auto="False"
46 string="Import Generic template" />46 string="Import Generic template" />
4747
48 <report
49 id="wizard_export_generic"
50 model="msf.import.export"
51 name="wizard.export.generic"
52 file="msf_doc_import/report/export_generic.mako"
53 report_type="webkit"
54 header="False"
55 menu="False"
56 auto="False"
57 string="Generic Export" />
58
48 </data>59 </data>
49</openerp>60</openerp>
5061
=== added file 'bin/addons/msf_doc_import/msf_import_export.py'
--- bin/addons/msf_doc_import/msf_import_export.py 1970-01-01 00:00:00 +0000
+++ bin/addons/msf_doc_import/msf_import_export.py 2017-09-12 08:08:04 +0000
@@ -0,0 +1,792 @@
1# encoding: utf-8
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2017 MSF, TeMPO Consulting
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22import base64
23import time
24import threading
25import logging
26
27import pooler
28import tools
29
30from osv import fields
31from osv import osv
32from tools.translate import _
33
34from tempfile import TemporaryFile
35from lxml import etree
36from lxml.etree import XMLSyntaxError
37
38from msf_doc_import.wizard.abstract_wizard_import import ImportHeader
39from msf_doc_import.msf_import_export_conf import MODEL_DICT
40from msf_doc_import.msf_import_export_conf import MODEL_DATA_DICT
41
42MIN_COLUMN_SIZE = 40
43MAX_COLUMN_SIZE = 400
44
45class msf_import_export(osv.osv_memory):
46 _name = 'msf.import.export'
47 _description = 'MSF Import Export'
48 _inherit = 'abstract.wizard.import'
49
50 def _get_model_list(self, cr, uid, context=None):
51 """The list of available model depend on the menu entry selected
52 """
53 if context is None:
54 context = {}
55 domain_type = None
56 if 'domain_type' in context:
57 domain_type = context['domain_type']
58 result_list = [(key, _(value['name'])) for key, value in MODEL_DICT.items() if value['domain_type'] == domain_type]
59 return [('', '')] + sorted(result_list, key=lambda a: a[0])
60
61 _columns = {
62 'display_file_import': fields.boolean('File Import'),
63 'display_file_export': fields.boolean('File Export'),
64 'model_list_selection': fields.selection(selection=_get_model_list, string='Object to Import/Export', required=True),
65 'import_file': fields.binary('File to import .xml'),
66 'hide_download_3_entries': fields.boolean('Hide export 3 entries button'),
67 'hide_download_all_entries': fields.boolean('Hide export all entries button'),
68 'display_test_import_button': fields.boolean('Display test import button'),
69 }
70
71 _default = {
72 'display_file_import': lambda *a: False,
73 'display_file_export': lambda *a: False,
74 'hide_download_3_entries': lambda *a: False,
75 'hide_download_all_entries': lambda *a: False,
76 'display_test_import_button': lambda *a: False,
77 }
78
79 def get_filename(self, cr, uid, model, selection, template_only=False, context=None):
80 """Generate a filename for the import/export
81 """
82 model_obj = self.pool.get(model)
83 file_name = _(MODEL_DICT[selection]['name'])
84 file_name = file_name.replace(' ', '_')
85 if template_only:
86 file_name = _('%s_Import_Template') % file_name
87 else:
88 file_name = _('%s_Export_%s') % (file_name, time.strftime('%Y%m%d'))
89 return file_name
90
91 def generic_download(self, cr, uid, ids, template_only=False,
92 nb_lines=None, context=None):
93 """Mutualise the code of all download buttons in one place
94 """
95 if context is None:
96 context = {}
97 if isinstance(ids, (int, long)):
98 ids = [ids]
99
100 wiz = self.browse(cr, uid, ids[0])
101 selection = wiz.model_list_selection
102 model = MODEL_DICT[selection]['model']
103 if selection not in MODEL_DATA_DICT:
104 raise osv.except_osv(_('Error'),
105 _('Selection \'%s\' not found. '
106 'Please contact the support team.') % (selection))
107
108 if 'header_list' not in MODEL_DATA_DICT[selection]:
109 raise osv.except_osv(_('Error'),
110 _('The header_list for report \'%s\' is not'
111 ' defined. Please contact the support team.') % (selection))
112 fields = MODEL_DATA_DICT[selection]['header_list']
113 domain = MODEL_DICT[selection].get('domain', [])
114 context['translate_selection_field'] = True
115 data = {
116 'model': model,
117 'fields': fields,
118 'nb_lines': nb_lines,
119 'template_only': template_only,
120 'domain': domain,
121 'target_filename': self.get_filename(cr, uid, model, selection, template_only),
122 }
123 return {
124 'type': 'ir.actions.report.xml',
125 'report_name': 'wizard.export.generic',
126 'datas': data,
127 'context': context,
128 }
129
130 def download_all_entries_file(self, cr, uid, ids, context=None):
131 """Download a template filled with all datas of the modele
132 """
133 return self.generic_download(cr, uid, ids, context=context)
134
135 def download_3_entries_file(self, cr, uid, ids, context=None):
136 """Download a template filled with the first 3 lines of data
137 """
138 return self.generic_download(cr, uid, ids, nb_lines=3, context=context)
139
140 def download_template_file(self, cr, uid, ids, context=None):
141 """Download the template file (without any data)
142 """
143 return self.generic_download(cr, uid, ids, template_only=True,
144 context=context)
145
146 def get_excel_size_from_string(self, string):
147 """Compute the string to get the size of it in a excel
148 understandable value
149 :param string: the str chain to get the excel size
150 :return: A int instance
151 """
152 # this calculation is used to translate the
153 # character len to an excel understandable len
154
155 max_digit_width = 7 # For Calabri 11 which is the font used in our reports
156 conversion_factor = 3/4. # to convert from pixel to points
157 padding = 15
158
159 # this formule partially come from readings here:
160 # http://stackoverflow.com/questions/4577546/calculating-height-width-and-ysplit-xsplit-for-open-xml-spreadsheets?answertab=votes#tab-top
161 size = round(max_digit_width*len(string)*conversion_factor+padding)
162
163 # set a max and min len for the columns to avoid ridiculus column size
164 size = min(size, MAX_COLUMN_SIZE)
165 size = max(size, MIN_COLUMN_SIZE)
166 return size
167
168 def get_child_field(self, cr, uid, field, model, fields_get_dict,
169 context=None):
170 if context is None:
171 context = {}
172 if '.' in field:
173 model_obj = self.pool.get(model)
174 if model not in fields_get_dict:
175 fields_get_res = model_obj.fields_get(cr, uid, context=context)
176 fields_get_dict[model] = fields_get_res
177 else:
178 fields_get_res = fields_get_dict[model]
179
180
181 child_field = field.split('.')[0]
182 rest = '.'.join(field.split('.')[1:])
183
184 if child_field not in fields_get_res:
185 raise osv.except_osv(_('Error'),
186 _('field \'%s\' not found for model \'%s\'. Please contact the support team.')
187 % (child_field, model))
188
189 #if child and child !='id' and fields_get_res[child_field].get('relation'):
190 child_model = fields_get_res[child_field]['relation']
191 if child_model not in fields_get_dict:
192 model_obj = self.pool.get(child_model)
193 fields_get_res = model_obj.fields_get(cr, uid, context=context)
194 fields_get_dict[child_model] = fields_get_res
195 return self.get_child_field(cr, uid, rest, child_model, fields_get_dict,
196 context=context)
197 else:
198 return field, model
199
200 def _get_headers(self, cr, uid, model, selection=None, field_list=None, rows=None, context=None):
201 """Generate a list of ImportHeader objects using the data that retived
202 from the field name.
203 :param model: Model of the object imported/exported
204 :param selection: requried to get the list of fields to compose the header
205 :param field_list: if known, the list of the fields to display in the
206 header can be passed
207 :param rows: Data rows to export. In case of export, the size of the
208 columns matter and can be determinied according to the data string length
209 :param context: Context of the call, this is particularly important to
210 get the language for tranlsating the fields.
211 :return: A list of ImportHeader
212 """
213 if context is None:
214 context = {}
215 headers = []
216 if not field_list:
217 field_list = MODEL_DATA_DICT[selection]['header_list']
218 model_obj = self.pool.get(model)
219
220 fields_get_dict = {} # keep fields_get result in cache
221 fields_get_dict[model] = model_obj.fields_get(cr, uid, context=context)
222
223 for field_index, field in enumerate(field_list):
224 res = {'tech_name': field}
225 if selection and field in MODEL_DATA_DICT[selection]['required_field_list']:
226 res['required'] = True
227 child_field, child_model = self.get_child_field(cr, uid, field, model,
228 fields_get_dict, context=context)
229 first_part = field.split('.')[0]
230 if first_part not in fields_get_dict[model]:
231 raise osv.except_osv(_('Error'),
232 _('field \'%s\' not found for model \'%s\'. Please contact the support team.')
233 % (first_part, model))
234 if first_part != child_field:
235 if child_field not in fields_get_dict[child_model]:
236 raise osv.except_osv(_('Error'),
237 _('field \'%s\' not found for model \'%s\'. Please contact the support team.')
238 % (child_field, child_model))
239 res['name'] = '%s / %s' % (fields_get_dict[model][first_part]['string'],
240 fields_get_dict[child_model][child_field]['string'])
241 else:
242 res['name'] = fields_get_dict[model][first_part]['string']
243
244
245 field_type = fields_get_dict[child_model][child_field]['type']
246 if field_type == 'boolean':
247 res['ftype'] = 'Boolean'
248 elif field_type == 'float':
249 res['ftype'] = 'Float'
250 elif field_type == 'integer':
251 res['ftype'] = 'Number'
252 else:
253 res['ftype'] = 'String'
254
255 if not rows:
256 # if no data passed, set the column size with the size of the header name
257 res['size'] = self.get_excel_size_from_string(res['name'])
258 else:
259 # automatically set the width of the column by searching for the
260 # biggest string in this column
261 all_cells_chain = [tools.ustr(x[field_index]) for x in rows]
262 res['size'] = MIN_COLUMN_SIZE
263 if all_cells_chain:
264 longest_chain = max(all_cells_chain, key=len)
265 if longest_chain:
266 res['size'] = self.get_excel_size_from_string(longest_chain)
267 headers.append(ImportHeader(**res))
268 return headers
269
270 def domain_type_change(self, cr, uid, ids, model_list_selection, context=None):
271 """When the type of object to import/export change, change the buttons
272 to display or not according to the new object model
273 """
274 if context is None:
275 context = {}
276 result = {'value': {}}
277 result['value']['display_file_import'] = True
278 result['value']['display_file_export'] = True
279 if model_list_selection:
280 if model_list_selection and model_list_selection in MODEL_DATA_DICT:
281 hide_export = MODEL_DATA_DICT[model_list_selection].get('hide_export', False)
282 result['value']['display_file_export'] = not hide_export
283 hide_3 = MODEL_DATA_DICT[model_list_selection].get('hide_download_3_entries', False)
284 result['value']['hide_download_3_entries'] = hide_3
285 hide_all = MODEL_DATA_DICT[model_list_selection].get('hide_download_all_entries', False)
286 result['value']['hide_download_all_entries'] = hide_all
287 else:
288 result['value']['hide_download_3_entries'] = False
289 result['value']['hide_download_all_entries'] = False
290 return result
291
292 def file_change(self, cr, uid, obj_id, import_file, context=None):
293 """Display the import button only if a file as been selected
294 """
295 if context is None:
296 context = {}
297 result = {'value': {'display_test_import_button': False}}
298 if import_file:
299 result['value']['display_test_import_button'] = True
300 return result
301
302 def check_xml_syntax(self, cr, uid, xml_string, context=None):
303 """Try to parse the xml file and raise if there is an error
304 """
305 try:
306 file_dom = etree.fromstring(xml_string)
307 except XMLSyntaxError as e:
308 raise osv.except_osv(_('Error'), _('File structure is incorrect, '
309 'please correct. You may generate a template with the File '
310 'export functionality.'))
311
312 def test_import(self, cr, uid, ids, context=None):
313 """Warn if file structure is correct
314 """
315 if self.check_import(cr, uid, ids, context=context):
316 raise osv.except_osv(_('Info'), _('File structure is correct.'))
317
318 def check_import(self, cr, uid, ids, context=None):
319 """Verify that a file has been selected and all columns expected are
320 present
321 """
322 obj = self.read(cr, uid, ids[0])
323 if not obj['import_file']:
324 raise osv.except_osv(_('Error'), _('Nothing to import.'))
325 fileobj = TemporaryFile('w+')
326 try:
327 xml_string = base64.decodestring(obj['import_file'])
328 self.check_xml_syntax(cr, uid, xml_string, context=context)
329 for wiz in self.browse(cr, uid, ids, context=context):
330 selection = wiz.model_list_selection
331 model = MODEL_DICT[selection]['model']
332 if model == 'user.access.configurator':
333 continue
334 rows, nb_rows = self.read_file(wiz, context=context)
335 head = rows.next()
336 self.check_missing_columns(cr, uid, wiz, head, context=context)
337 finally:
338 fileobj.close()
339 return True
340
341 def excel_col(self, col):
342 """Covert column number (1,2,...26,27,28...) to excel-style column label
343 letters (A,B,..Z,AA,AB,...)."""
344 quot, rem = divmod(col-1,26)
345 return self.excel_col(quot) + chr(rem+ord('A')) if col!=0 else ''
346
347 def check_missing_columns(self, cr, uid, wizard_brw, head, context=None):
348 """Check that the column names in the file match the expected property
349 names, raise if any column is missing.
350 """
351 selection = wizard_brw.model_list_selection
352 model = MODEL_DICT[selection]['model']
353 model_obj = self.pool.get(model)
354 header_columns = [head[i].data for i in range(0, len(head))]
355 missing_columns = []
356 field_list = MODEL_DATA_DICT[selection]['header_list']
357
358 fields_get_dict = {} # keep fields_get result in cache
359 fields_get_dict[model] = model_obj.fields_get(cr, uid, context=context)
360 fields_get_res = model_obj.fields_get(cr, uid,
361 [x.split('.')[0] for x in field_list], context=context)
362 if len(field_list) != len(header_columns):
363 raise osv.except_osv(_('Info'), _('The number of column is not same ' \
364 'than expected (get %s, expected %s). Check your import file and ' \
365 'the Object to import/export.') % (len(header_columns), len(field_list)))
366
367 for field_index, field in enumerate(field_list):
368 child_field, child_model = self.get_child_field(cr, uid, field, model,
369 fields_get_dict, context=context)
370 first_part = field.split('.')[0]
371 if first_part not in fields_get_dict[model]:
372 raise osv.except_osv(_('Error'),
373 _('field \'%s\' not found for model \'%s\'. Please contact the support team.')
374 % (first_part, model))
375 if first_part != child_field:
376 if child_field not in fields_get_dict[child_model]:
377 raise osv.except_osv(_('Error'),
378 _('field \'%s\' not found for model \'%s\'. Please contact the support team.')
379 % (child_field, child_model))
380 column_name = '%s / %s' % (fields_get_dict[model][first_part]['string'],
381 fields_get_dict[child_model][child_field]['string'])
382 else:
383 column_name = fields_get_dict[model][first_part]['string']
384
385 if column_name.upper() != header_columns[field_index].upper():
386 missing_columns.append(_('Column %s: get \'%s\' expected \'%s\'.')
387 % (self.excel_col(field_index+1), header_columns[field_index], column_name))
388 if missing_columns:
389 raise osv.except_osv(_('Info'), _('The following columns '
390 'are missing in the imported file:\n%s') % ',\n'.join(missing_columns))
391
392 def import_xml(self, cr, uid, ids, context=None):
393 """Create a thread to import the data after import checking
394 """
395 if context is None:
396 context = {}
397 if isinstance(ids, (int, long)):
398 ids = [ids]
399
400 self.check_import(cr, uid, ids, context=context)
401
402 for wiz in self.browse(cr, uid, ids, context=context):
403 rows, nb_rows = self.read_file(wiz, context=context)
404 head = rows.next()
405 selection = wiz.model_list_selection
406 model = MODEL_DICT[selection]['model']
407
408 if model == 'user.access.configurator':
409 # special case handling for this one
410 model_obj = self.pool.get(model)
411 wizard_id = model_obj.create(cr, uid, {}, context)
412 model_obj.write(cr, uid, [wizard_id], {'file_to_import_uac':
413 wiz.import_file}, context=context)
414 return model_obj.do_process_uac(cr, uid, [wizard_id], context=context)
415
416 expected_headers = self._get_headers(cr, uid, model, selection=selection, context=context)
417 if model != 'user.access.configurator':
418 self.check_headers(head, expected_headers, context=context)
419
420 self.write(cr, uid, [wiz.id], {
421 'total_lines_to_import': nb_rows,
422 'state': 'progress',
423 'start_date': time.strftime('%Y-%m-%d %H:%M:%S'),
424 'info_message': _('Import in progress, please leave this window open and press the button \'Update\' '
425 'to show the progression of the import. Otherwise, you can continue to use Unifield'),
426 }, context=context)
427 wiz.total_lines_to_import = nb_rows
428
429 thread = threading.Thread(
430 target=self.bg_import,
431 args=(cr.dbname, uid, wiz, expected_headers, rows, context),
432 )
433 thread.start()
434 # for now we don't want background but foreground
435 # in case background is needed, just set a value to wait time
436 wait_time = None
437 thread.join(wait_time)
438 return True
439
440 def bg_import(self, dbname, uid, import_brw, headers, rows, context=None):
441 """
442 Run the import of lines in background
443 :param dbname: Name of the database
444 :param uid: ID of the res.users that calls this method
445 :param import_brw: browse_record of a wizard.import.batch
446 :param headers: List of expected headers
447 :param rows: Iterator on file rows
448 :param context: Context of the call
449 :return: True
450 """
451 if context is None:
452 context = {}
453 cr = pooler.get_db(dbname).cursor()
454 model = MODEL_DICT[import_brw.model_list_selection]['model']
455 impobj = self.pool.get(model)
456
457 import_data_obj = self.pool.get('import_data')
458 prod_nomenclature_obj = self.pool.get('product.nomenclature')
459
460 # Manage errors
461 import_errors = {}
462
463 def save_error(errors, row_index):
464 if not isinstance(errors, list):
465 errors = [errors]
466 import_errors.setdefault(row_index+2, [])
467 import_errors[row_index+2].extend(errors)
468
469 # Manage warnings
470 import_warnings = {}
471
472 def save_warnings(warnings):
473 if not isinstance(warnings, list):
474 warnings = [warnings]
475 import_warnings.setdefault(row_index+2, [])
476 import_warnings[row_index+2].extend(warnings)
477
478 start_time = time.time()
479
480 if model == 'product.product':
481 # Create the cache
482 if not hasattr(self, '_cache'):
483 self._cache = {}
484 self._cache.setdefault(dbname, {})
485
486 if not hasattr(prod_nomenclature_obj, '_cache'):
487 prod_nomenclature_obj._cache = {}
488 prod_nomenclature_obj._cache.setdefault(dbname, {})
489
490 # Clear the cache
491 self._cache[dbname] = {'product.nomenclature': {'name': {}, 'complete_name': {}},
492 'product.uom': {'name': {}},
493 'product.asset.type': {'name': {}},
494 'product.international.status': {'name': {}},
495 }
496 # Product nomenclature
497 cr.execute('SELECT name, id FROM product_nomenclature;')
498 for nv in cr.dictfetchall():
499 self._cache[dbname]['product.nomenclature']['name'].update({nv['name']: nv['id']})
500 # Product category
501 cr.execute('SELECT id, family_id FROM product_category;')
502 for pc in cr.dictfetchall():
503 prod_nomenclature_obj._cache[dbname].update({pc['family_id']: pc['id']})
504 # Product nomenclature complete name
505 cr.execute('''SELECT id, name FROM
506(
507(SELECT
508 n0.id, n0.name AS name
509FROM product_nomenclature n0
510WHERE n0.level = 0)
511UNION
512(SELECT n1.id, n0.name ||' | '|| n1.name AS name
513FROM product_nomenclature n1
514 LEFT JOIN product_nomenclature n0 ON n1.parent_id = n0.id
515WHERE n1.level = 1)
516UNION
517(SELECT n2.id, n0.name ||' | '|| n1.name ||' | '|| n2.name AS name
518FROM product_nomenclature n1
519 LEFT JOIN product_nomenclature n0 ON n1.parent_id = n0.id
520 LEFT JOIN product_nomenclature n2 ON n2.parent_id = n1.id
521WHERE n2.level = 2)
522UNION
523(SELECT n3.id, n0.name ||' | '|| n1.name ||' | '|| n2.name ||' | '|| n3.name AS name
524FROM product_nomenclature n1
525 LEFT JOIN product_nomenclature n0 ON n1.parent_id = n0.id
526 LEFT JOIN product_nomenclature n2 ON n2.parent_id = n1.id
527 LEFT JOIN product_nomenclature n3 ON n3.parent_id = n2.id
528WHERE n3.level = 3)
529) AS cn''')
530 for cnv in cr.dictfetchall():
531 self._cache[dbname]['product.nomenclature']['complete_name'].update({cnv['name']: cnv['id']})
532 # Product UoM
533 cr.execute('SELECT name, id FROM product_uom;')
534 for uv in cr.dictfetchall():
535 self._cache[dbname]['product.uom']['name'].update({uv['name']: uv['id']})
536 # Asset type
537 cr.execute('SELECT name, id FROM product_asset_type;')
538 for av in cr.dictfetchall():
539 self._cache[dbname]['product.asset.type']['name'].update({av['name']: av['id']})
540 # International status
541 cr.execute('SELECT name, id FROM product_international_status;')
542 for iv in cr.dictfetchall():
543 self._cache[dbname]['product.international.status']['name'].update({iv['name']: iv['id']})
544
545 fields_def = impobj.fields_get(cr, uid, context=context)
546 i = 0
547
548 def _get_obj(header, value, fields_def):
549 list_obj = header.split('.')
550 relation = fields_def[list_obj[0]]['relation']
551 if impobj._name == 'product.product' and value in self._cache.get(dbname, {}).get(relation, {}).get(list_obj[1], {}):
552 return self._cache[dbname][relation][list_obj[1]][value]
553 new_obj = self.pool.get(relation)
554 newids = new_obj.search(cr, uid, [(list_obj[1], '=', value)], limit=1)
555 if not newids:
556 # no obj
557 raise osv.except_osv(_('Warning !'), _('%s \'%s\' does not exist') % (new_obj._description, value,))
558
559 if impobj._name == 'product.product':
560 self._cache[dbname].setdefault(relation, {})
561 self._cache[dbname][relation].setdefault(list_obj[1], {})
562 self._cache[dbname][relation][list_obj[1]][value] = newids[0]
563 return newids[0]
564
565 def process_data(field, value, fields_def):
566 if value is None or field not in fields_def:
567 return
568 if '.' not in field:
569 if fields_def[field]['type'] == 'selection':
570 if impobj == 'product.product' and self._cache[dbname].get('product.product.%s.%s' % (field, value), False):
571 value = self._cache[dbname]['product.product.%s.%s' % (field, value)]
572 else:
573 for key, val in fields_def[field]['selection']:
574 if value.lower() in [tools.ustr(key).lower(), tools.ustr(val).lower()]:
575 value = key
576 if impobj == 'product.product':
577 self._cache[dbname].setdefault('product.product.%s' % field, {})
578 self._cache[dbname]['product.product.%s.%s' % (field, value)] = key
579 break
580 return value
581
582 else:
583 if fields_def[field.split('.')[0]]['type'] in 'many2one':
584 return _get_obj(field, value, fields_def)
585
586 raise osv.except_osv(_('Warning !'), _('%s does not exist')%(value,))
587
588 i = 1
589 nb_error = 0
590 nb_succes = 0
591 nb_update_success = 0
592 col_datas = {}
593 nb_imported_lines = 0
594 header_codes = [x[3] for x in headers]
595 if import_data_obj.pre_hook.get(impobj._name):
596 # for headers mod.
597 col_datas = import_data_obj.pre_hook[impobj._name](impobj, cr, uid, header_codes, {}, col_datas)
598
599 for row_index, row in enumerate(rows):
600 res, errors, line_data = self.check_error_and_format_row(import_brw.id, row, headers, context=context)
601 if res < 0:
602 save_error(errors, row_index)
603 continue
604
605 if all(not x for x in line_data):
606 save_warnings(
607 _('Line seemed empty, so this line was ignored')
608 )
609 continue
610
611 newo2m = False
612 delimiter = False
613 o2mdatas = {}
614 i += 1
615 data = {}
616 try:
617 if model == 'hq.entries':
618 hq_entries_obj = self.pool.get('hq.entries.import')
619 hq_entries_obj.update_hq_entries(cr, uid, line_data, context=context)
620 continue
621
622 n = 0
623 line_ok = True
624 if import_data_obj.pre_hook.get(impobj._name):
625 import_data_obj.pre_hook[impobj._name](impobj, cr, uid, header_codes, line_data, col_datas)
626
627 for n, h in enumerate(header_codes):
628 if isinstance(line_data[n], basestring):
629 line_data[n] = line_data[n].rstrip()
630 if len(line_data[n].splitlines()) > 1:
631 # US-2661 do not allowed newline character in char fields
632 save_error(_("New line characters in the field '%s' not allowed. Please fix entry :\n'%s'") % (h, line_data[n]), row_index)
633 nb_error += 1
634 line_ok = False
635 break
636
637 # UFTP-327
638 # if required reject cells with exceeded field length
639 if 'import_data_field_max_size' in context:
640 if h in context['import_data_field_max_size']:
641 max_size = context['import_data_field_max_size'][h]
642 if len(line_data[n]) > max_size:
643 msg_tpl = "field '%s' value exceed field length of %d"
644 msg = msg_tpl % (h , max_size, )
645 logging.getLogger('import data').info(
646 'Error %s'% (msg, ))
647 cr.rollback()
648 error = "Line %s, row: %s, %s" % (i, n, msg, )
649 save_error(error, row_index)
650 nb_error += 1
651 line_ok = False
652 break
653
654 if newo2m and ('.' not in h or h.split('.')[0] != newo2m or h.split('.')[1] == delimiter):
655 data.setdefault(newo2m, []).append((0, 0, o2mdatas.copy()))
656 o2mdatas = {}
657 delimiter = False
658 newo2m = False
659 if '.' not in h:
660 # type datetime, date, bool, int, float
661 value = process_data(h, line_data[n], fields_def)
662 if value is not None:
663 data[h] = value
664 else:
665 points = h.split('.')
666 if row[n] and fields_def[points[0]]['type'] == 'one2many':
667 newo2m = points[0]
668 delimiter = points[1]
669 new_fields_def = self.pool.get(fields_def[newo2m]['relation']).fields_get(cr, uid, context=context)
670 o2mdatas[points[1]] = process_data('.'.join(points[1:]), line_data[n], new_fields_def)
671 elif fields_def[points[0]]['type'] in 'many2one':
672 if not line_data[n]:
673 data[points[0]] = False
674 elif line_data[n]:
675 data[points[0]] = _get_obj(h, line_data[n], fields_def) or False
676 elif fields_def[points[0]]['type'] in 'many2many' and line_data[n]:
677 data.setdefault(points[0], []).append((4, _get_obj(h, line_data[n], fields_def)))
678 if not line_ok:
679 continue
680 if newo2m and o2mdatas:
681 data.setdefault(newo2m, []).append((0, 0, o2mdatas.copy()))
682
683 if import_data_obj.post_hook.get(impobj._name):
684 import_data_obj.post_hook[impobj._name](impobj, cr, uid, data, line_data, header_codes)
685
686 # Search if an object already exist. If not, create it.
687 ids_to_update = []
688
689 if impobj._name == 'product.product':
690 # Allow to update the product, use xmlid_code or default_code
691 if 'xmlid_code' in data:
692 ids_to_update = impobj.search(cr, uid, [('xmlid_code',
693 '=', data['xmlid_code'])], order='NO_ORDER')
694 if 'default_code' in data:
695 ids_to_update = impobj.search(cr, uid, [('default_code',
696 '=', data['default_code'])], order='NO_ORDER')
697 elif impobj._name == 'product.nomenclature':
698 ids_to_update = impobj.search(cr, uid, [('msfid', '=',
699 data['msfid'])], order='NO_ORDER')
700 elif impobj._name == 'product.category':
701 ids_to_update = impobj.search(cr, uid, [('msfid', '=',
702 data['msfid'])], order='NO_ORDER')
703
704 if ids_to_update:
705 #UF-2170: remove the standard price value from the list for update product case
706 if 'standard_price' in data:
707 del data['standard_price']
708 impobj.write(cr, uid, ids_to_update, data)
709 nb_update_success += 1
710
711 else:
712 impobj.create(cr, uid, data, context={'from_import_menu': True})
713 nb_succes += 1
714 except osv.except_osv, e:
715 logging.getLogger('import data').info('Error %s' % e.value)
716 cr.rollback()
717 save_error(e.value, row_index)
718 nb_error += 1
719 except Exception, e:
720 cr.rollback()
721 logging.getLogger('import data').info('Error %s' % e)
722 save_error(e, row_index)
723 nb_error += 1
724 else:
725 nb_imported_lines += 1
726
727 self.write(cr, uid, [import_brw.id], {'total_lines_imported': nb_imported_lines}, context=context)
728
729 warn_msg = ''
730 for line_number in sorted(import_warnings.keys()):
731 warnings = import_warnings[line_number]
732 for warn in warnings:
733 warn_msg += _('Line %s: %s') % (line, warn)
734 if not warn_msg.endswith('\n'):
735 warn_msg += '\n'
736
737 err_msg = ''
738 for line_number in sorted(import_errors.keys()):
739 errors = import_errors[line_number]
740 for err in errors:
741 err_msg += _('Line %s: %s') % (line_number, err)
742 if not err_msg.endswith('\n'):
743 err_msg += '\n'
744
745 if err_msg:
746 cr.rollback()
747
748 info_msg = _('''Processing of file completed in %s second(s)!
749- Total lines to import: %s
750- Total lines %s: %s %s
751- Total lines with errors: %s %s
752%s
753 ''') % (
754 str(round(time.time() - start_time, 1)),
755 import_brw.total_lines_to_import-1,
756 err_msg and _('without errors') or _('imported'),
757 nb_imported_lines,
758 warn_msg and _('(%s line(s) with warning - see warning messages below)') % (
759 len(import_warnings.keys()) or '',
760 ),
761 err_msg and len(import_errors.keys()) or 0,
762 err_msg and _('(see error messages below)'),
763 err_msg and _("no data will be imported until all the error messages are corrected") or '',
764 )
765
766 self.write(cr, uid, [import_brw.id], {
767 'error_message': err_msg,
768 'show_error': err_msg and True or False,
769 'warning_message': warn_msg,
770 'show_warning': warn_msg and True or False,
771 'info_message': info_msg,
772 'state': 'done',
773 'end_date': time.strftime('%Y-%m-%d %H:%M:%S'),
774 }, context=context)
775
776 if import_data_obj.post_load_hook.get(impobj._name):
777 import_data_obj.post_load_hook[impobj._name](impobj, cr, uid)
778
779 if impobj == 'product.product':
780 # Clear the cache
781 self._cache[dbname] = {}
782 prod_nomenclature_obj._cache[dbname] = {}
783
784
785 cr.commit()
786 cr.close()
787
788 return True
789
790msf_import_export()
791
792# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0793
=== added file 'bin/addons/msf_doc_import/msf_import_export_conf.py'
--- bin/addons/msf_doc_import/msf_import_export_conf.py 1970-01-01 00:00:00 +0000
+++ bin/addons/msf_doc_import/msf_import_export_conf.py 2017-09-12 08:08:04 +0000
@@ -0,0 +1,530 @@
1# encoding: utf-8
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2017 MSF, TeMPO Consulting
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from tools.translate import _
23
24MODEL_DICT = {
25 # SUPPLY
26 'products': {
27 'name': 'Products',
28 'domain_type': 'supply',
29 'model': 'product.product',
30 },
31 'product_nomenclature': {
32 'name': 'Product Nomenclature',
33 'domain_type': 'supply',
34 'model': 'product.nomenclature',
35 },
36 'product_category': {
37 'name': 'Product Categories',
38 'domain_type': 'supply',
39 'model': 'product.category',
40 },
41 'suppliers': {
42 'name': 'Suppliers',
43 'domain_type': 'supply',
44 'model': 'res.partner',
45 'domain': [('supplier', '=', True)],
46 },
47 'supplier_catalogues': {
48 'name': 'Supplier Catalogues',
49 'domain_type': 'supply',
50 'model': 'supplier.catalogue',
51 },
52 'supplier_catalogues_lines': {
53 'name': 'Supplier catalogue lines',
54 'domain_type': 'supply',
55 'model': 'supplier.catalogue.line',
56 },
57
58
59 # FINANCE
60 'gl_accounts': {
61 'name': 'GL Accounts',
62 'domain_type': 'finance',
63 'model': 'account.account'
64 },
65 'gl_journals': {
66 'name': 'GL Journals',
67 'domain_type': 'finance',
68 'model': 'account.journal'
69 },
70 'analytic_accounts': {
71 'name': 'Analytic Accounts',
72 'domain_type': 'finance',
73 'model': 'account.analytic.account'
74 },
75 'analytic_journals': {
76 'name': 'Analytic Journals',
77 'domain_type': 'finance',
78 'model': 'account.analytic.journal'
79 },
80 'employees': {
81 'name': 'Employees',
82 'domain_type': 'finance',
83 'model': 'hr.employee'
84 },
85 'hq_entries': {
86 'name': 'HQ Entries',
87 'domain_type': 'finance',
88 'model': 'hq.entries'
89 },
90 'currency_rate': {
91 'name': 'Currencies Rates',
92 'domain_type': 'finance',
93 'model': 'res.currency.rate'
94 },
95
96
97 # NON FUNCTIONNAL
98 'user_groups': {
99 'name': 'User Groups',
100 'domain_type': 'non_functionnal',
101 'model': 'res.groups'
102 },
103 'user_access': {
104 'name': 'User Access',
105 'domain_type': 'non_functionnal',
106 'model': 'user.access.configurator'
107 },
108 'record_rules': {
109 'name': 'Record Rules',
110 'domain_type': 'non_functionnal',
111 'model': 'ir.rule'
112 },
113 'access_control_list': {
114 'name': 'Access Controls List',
115 'domain_type': 'non_functionnal',
116 'model': 'ir.model.access'
117 },
118 'field_access_rules': {
119 'name': 'Field Access Rules',
120 'domain_type': 'non_functionnal',
121 'model': 'msf_field_access_rights.field_access_rule'
122 },
123 'field_access_rule_lines': {
124 'name': 'Field Access Rule Lines',
125 'domain_type': 'non_functionnal',
126 'model': 'msf_field_access_rights.field_access_rule_line'
127 },
128 'button_access_rules': {
129 'name': 'Button Access Rules',
130 'domain_type': 'non_functionnal',
131 'model': 'msf_button_access_rights.button_access_rule'
132 },
133 'window_actions': {
134 'name': 'Window Actions',
135 'domain_type': 'non_functionnal',
136 'model': 'ir.actions.act_window'
137 },
138}
139
140MODEL_DATA_DICT = {
141 # SUPPLY
142 'products': {
143 'header_list': [
144 'default_code',
145 'name',
146 'xmlid_code',
147 'old_code',
148 'type',
149 'transport_ok',
150 'subtype',
151 'asset_type_id.name',
152 'procure_method',
153 'supply_method',
154 'standard_price',
155 'volume',
156 'weight',
157 'international_status.name',
158 'state.name',
159 'active',
160 'perishable',
161 'batch_management',
162 'uom_id.name',
163 'uom_po_id.name',
164 'nomen_manda_0.name',
165 'nomen_manda_1.name',
166 'nomen_manda_2.name',
167 'nomen_manda_3.name',
168 'life_time',
169 'use_time',
170 'short_shelf_life',
171 'alert_time',
172 'heat_sensitive_item.code',
173 'cold_chain',
174 'sterilized',
175 'single_use',
176 'narcotic',
177 'justification_code_id.code',
178 'controlled_substance',
179 'closed_article',
180 'restricted_country',
181 'country_restriction',
182 'dangerous_goods',
183 'un_code',
184 'criticism',
185 'abc_class',
186 'product_catalog_path',
187 'description',
188 'description2',
189 'description_sale',
190 'description_purchase',
191 'procure_delay',
192 'property_account_income.code',
193 'property_account_expense.code',
194 ],
195 'required_field_list': [
196 'name',
197 'international_status.name',
198 'nomen_manda_0.name',
199 'nomen_manda_1.name',
200 'nomen_manda_2.name',
201 'nomen_manda_3.name',
202 ],
203 'hide_download_all_entries': True,
204 },
205 'product_nomenclature': {
206 'header_list': [
207 'level',
208 'name',
209 'type',
210 'parent_id.msfid',
211 'msfid',
212 ],
213 'required_field_list': [
214 'level',
215 'name',
216 ],
217 'hide_download_3_entries': True,
218 'hide_download_all_entries': True,
219 },
220 'product_category': {
221 'header_list': [
222 'type',
223 'property_account_expense_categ',
224 'property_account_income_categ',
225 'name',
226 'property_stock_journal',
227 'donation_expense_account',
228 'family_id',
229 'msfid',
230 ],
231 'required_field_list': [
232 'name',
233 'family_id',
234 'msfid',
235 ],
236 },
237 'suppliers': {
238 'header_list': [
239 'address.type',
240 'address.city',
241 'address.name',
242 'address.street',
243 'address.zip',
244 'address.country_id.name',
245 'address.email',
246 'property_account_payable.code',
247 'property_account_receivable.code',
248 'name',
249 'lang',
250 'partner_type',
251 'customer',
252 'supplier',
253 'property_product_pricelist_purchase.currency_id',
254 'property_product_pricelist.currency_id',
255 ],
256 'required_field_list': [
257 'property_account_payable.code',
258 'property_account_receivable.code',
259 'name',
260 ],
261 },
262 'supplier_catalogues': {
263 'header_list': [
264 'name',
265 'period_from',
266 'period_to',
267 'currency_id.name',
268 'partner_id.name',
269 ],
270 'required_field_list': [
271 'name',
272 'currency_id.name',
273 'partner_id.name',
274 ],
275 },
276 'supplier_catalogues_lines': {
277 'header_list': [
278 'catalogue_id.name',
279 'product_id.code',
280 'product_id.name',
281 'line_uom_id.name',
282 'min_qty',
283 'unit_price',
284 'rounding',
285 'min_order_qty',
286 'comment',
287 ],
288 'required_field_list': [
289 'catalogue_id.name',
290 'product_id.code',
291 'line_uom_id.name',
292 'min_qty',
293 'unit_price',
294 ],
295 },
296
297
298 # FINANCE
299 'gl_accounts': {
300 'header_list': [
301 'user_type.code',
302 'accrual_account',
303 'activation_date',
304 'code',
305 'default_destination_id.code',
306 'inactivation_date',
307 'type',
308 'name',
309 'note',
310 'type_for_register',
311 'reconcile',
312 'parent_id.code',
313 'is_not_hq_correctible',
314 'shrink_entries_for_hq',
315 'currency_revaluation',
316 ],
317 'required_field_list': [
318 'user_type.code',
319 'activation_date',
320 'code',
321 'type',
322 'name',
323 'type_for_register',
324 ],
325 },
326 'gl_journals': {
327 'header_list': [
328 'code',
329 'currency.name',
330 'default_credit_account_id.code',
331 'default_debit_account_id.code',
332 'name',
333 'type',
334 'analytic_journal_id.code',
335 ],
336 'required_field_list': [
337 'code',
338 'name',
339 'type',
340 'analytic_journal_id.code',
341 ],
342 },
343 'analytic_accounts': {
344 'header_list': [
345 'name',
346 'code',
347 'category',
348 'parent_id.code',
349 'type',
350 'date_start',
351 ],
352 'required_field_list': [
353 'name',
354 'code',
355 'category',
356 'parent_id.code',
357 'date_start',
358 ],
359 },
360 'analytic_journals': {
361 'header_list': [
362 'active',
363 'code',
364 'name',
365 'type',
366 ],
367 'required_field_list': [
368 'code',
369 'name',
370 'type',
371 ],
372 },
373 'employees': {
374 'header_list': [
375 'name',
376 'identification_id',
377 'active',
378 ],
379 'required_field_list': [
380 'name',
381 'identification_id',
382 ],
383 },
384 'hq_entries': {
385 'header_list': [
386 'name',
387 'ref',
388 'document_date',
389 'date',
390 'account_id',
391 'partner_txt',
392 'amount',
393 'currency_id.name',
394 'destination_id',
395 'cost_center_id',
396 'analytic_id',
397 'free_1_id',
398 'free_2_id',
399 ],
400 'required_field_list': [
401 'name',
402 'account_id',
403 'currency_id.name',
404 'destination_id',
405 'analytic_id',
406 ],
407 },
408 'currency_rate': {
409 'header_list': [
410 'name',
411 'rate',
412 'currency_id.name',
413 ],
414 'required_field_list': [
415 'name',
416 'rate',
417 'currency_id.name',
418 ],
419 },
420
421
422 # NON FUNCTIONNAL
423 'user_groups': {
424 'header_list': [
425 'name',
426 ],
427 'required_field_list': [
428 'name',
429 ],
430 },
431 'user_access': {
432 'header_list': [
433 ],
434 'required_field_list': [
435 ],
436 'hide_export': True,
437 },
438 'record_rules': {
439 'header_list': [
440 'model_id.model',
441 'name',
442 'global',
443 'domain_force',
444 'perm_read',
445 'perm_write',
446 'perm_create',
447 'perm_unlink',
448 ],
449 'required_field_list': [
450 'model_id.model',
451 'name',
452 ],
453 },
454 'access_control_list': {
455 'header_list': [
456 'name',
457 'model_id.model',
458 'group_id.name',
459 'perm_read',
460 'perm_write',
461 'perm_create',
462 'perm_unlink',
463 ],
464 'required_field_list': [
465 'name',
466 'model_id.model',
467 ],
468 },
469 'field_access_rules': {
470 'header_list': [
471 'name',
472 'model_id.model',
473 'instance_level',
474 'domain_text',
475 'status',
476 ],
477 'required_field_list': [
478 'name',
479 'model_id.model',
480 'instance_level',
481 ],
482 },
483 'field_access_rule_lines': {
484 'header_list': [
485 'field_access_rule.name',
486 'field_access_rule_model_id',
487 'field.name',
488 'field_name',
489 'write_access',
490 'value_not_synchronized_on_create',
491 'value_not_synchronized_on_write',
492 ],
493 'required_field_list': [
494 'field_access_rule',
495 'field',
496 ],
497 },
498 'button_access_rules': {
499 'header_list': [
500 'model_id.model',
501 'view_id.name',
502 'label',
503 'name',
504 'group_names',
505 'type',
506 ],
507 'required_field_list': [
508 'model_id.model',
509 'view_id.name',
510 'name',
511 ],
512 },
513 'window_actions': {
514 'header_list': [
515 'name',
516 'res_model',
517 'view_type',
518 'view_id.name',
519 'domain',
520 'groups_id',
521 ],
522 'required_field_list': [
523 'name',
524 'res_model',
525 'view_type',
526 ],
527 },
528}
529
530# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0531
=== added file 'bin/addons/msf_doc_import/report/export_generic.mako'
--- bin/addons/msf_doc_import/report/export_generic.mako 1970-01-01 00:00:00 +0000
+++ bin/addons/msf_doc_import/report/export_generic.mako 2017-09-12 08:08:04 +0000
@@ -0,0 +1,137 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8
9 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
10 <Author>MSFUser</Author>
11 <LastAuthor>MSFUser</LastAuthor>
12 <Created>2012-06-18T15:46:09Z</Created>
13 <Company>Medecins Sans Frontieres</Company>
14 <Version>11.9999</Version>
15 </DocumentProperties>
16
17 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
18 <WindowHeight>13170</WindowHeight>
19 <WindowWidth>19020</WindowWidth>
20 <WindowTopX>120</WindowTopX>
21 <WindowTopY>60</WindowTopY>
22 <ProtectStructure>False</ProtectStructure>
23 <ProtectWindows>False</ProtectWindows>
24 </ExcelWorkbook>
25
26 <Styles>
27 <Style ss:ID="header">
28 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
29 <Interior ss:Color="#ffcc99" ss:Pattern="Solid"/>
30 <Font ss:Bold="1" ss:Color="#000000" />
31 <Borders>
32 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
33 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
34 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
35 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
36 </Borders>
37 <Protection />
38 </Style>
39 <Style ss:ID="String">
40 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
41 <Borders>
42 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
43 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
44 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
45 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
46 </Borders>
47 <Protection ss:Protected="0" />
48 </Style>
49 <Style ss:ID="Boolean">
50 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
51 <Borders>
52 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
53 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
54 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
55 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
56 </Borders>
57 <Protection ss:Protected="0" />
58 </Style>
59 <Style ss:ID="Float">
60 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
61 <Borders>
62 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
63 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
64 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
65 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
66 </Borders>
67 <NumberFormat ss:Format="Fixed" />
68 <Protection ss:Protected="0" />
69 </Style>
70 <Style ss:ID="Number">
71 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
72 <Borders>
73 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
74 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
75 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
76 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
77 </Borders>
78 <NumberFormat ss:Format="Fixed" />
79 <Protection ss:Protected="0" />
80 </Style>
81 <Style ss:ID="DateTime">
82 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
83 <Borders>
84 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
85 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
86 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
87 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
88 </Borders>
89 <NumberFormat ss:Format="Short Date" />
90 <Protection ss:Protected="0" />
91 </Style>
92 </Styles>
93
94 <ss:Worksheet ss:Name="${data.get('model_name', _('Sheet 1'))|x}" ss:Protected="0">
95
96 <Table x:FullColumns="1" x:FullRows="1">
97
98 <% rows = getRows(data['model'], data['fields'], data.get('nb_lines'), data.get('domain'), data.get('template_only', False), data['context']) %>
99 <% headers = getHeaders(data['model'], data['fields'], rows, data['context']) %>
100 % for col in headers:
101 <Column ss:AutoFitWidth="1" ss:Width="${col[2] or 70|x}" ss:StyleID="${col[1]|x}" />
102 % endfor
103
104 <Row>
105 % for col in headers:
106 <Cell ss:StyleID="header">
107 <Data ss:Type="String">${col[0]|x}</Data>
108 </Cell>
109 % endfor
110 </Row>
111
112 % if not data.get('template_only', False):
113 % for row in rows:
114 <Row>
115 % for index, cell in enumerate(row):
116 <Cell ss:StyleID="${headers[index][1]|x}">
117 % if headers[index][1] == 'String' and not cell:
118 <Data ss:Type="String"></Data>
119 % else:
120 <Data ss:Type="String">${cell|x}</Data>
121 % endif
122 </Cell>
123 % endfor
124 </Row>
125 % endfor
126 % endif
127 </Table>
128
129 <x:WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
130 <ProtectScenarios>False</ProtectScenarios>
131 <EnableSelection>UnlockedCells</EnableSelection>
132 <AllowInsertRows />
133 </x:WorksheetOptions>
134
135 </ss:Worksheet>
136
137</Workbook>
0138
=== modified file 'bin/addons/msf_doc_import/report/import_generic_template.mako'
--- bin/addons/msf_doc_import/report/import_generic_template.mako 2016-08-15 11:49:05 +0000
+++ bin/addons/msf_doc_import/report/import_generic_template.mako 2017-09-12 08:08:04 +0000
@@ -46,6 +46,27 @@
46 </Borders>46 </Borders>
47 <Protection ss:Protected="0" />47 <Protection ss:Protected="0" />
48 </Style>48 </Style>
49 <Style ss:ID="Boolean">
50 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
51 <Borders>
52 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
53 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
54 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
55 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
56 </Borders>
57 <Protection ss:Protected="0" />
58 </Style>
59 <Style ss:ID="Float">
60 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
61 <Borders>
62 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1" />
63 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1" />
64 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1" />
65 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1" />
66 </Borders>
67 <NumberFormat ss:Format="Fixed" />
68 <Protection ss:Protected="0" />
69 </Style>
49 <Style ss:ID="Number">70 <Style ss:ID="Number">
50 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>71 <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
51 <Borders>72 <Borders>
5273
=== modified file 'bin/addons/msf_doc_import/report/import_generic_template.py'
--- bin/addons/msf_doc_import/report/import_generic_template.py 2016-07-27 09:38:38 +0000
+++ bin/addons/msf_doc_import/report/import_generic_template.py 2017-09-12 08:08:04 +0000
@@ -19,12 +19,64 @@
19#19#
20##############################################################################20##############################################################################
2121
22from report import report_sxw
22from report_webkit.webkit_report import XlsWebKitParser23from report_webkit.webkit_report import XlsWebKitParser
2324
25
24XlsWebKitParser(26XlsWebKitParser(
25 'report.wizard.import.generic.template',27 'report.wizard.import.generic.template',
26 'abstract.wizard.import',28 'abstract.wizard.import',
27 'addons/msf_doc_import/report/import_generic_template.mako',29 'addons/msf_doc_import/report/import_generic_template.mako',
28)30)
2931
32
33class report_generic_export_parser(report_sxw.rml_parse):
34
35 def __init__(self, cr, uid, name, context=None):
36 super(report_generic_export_parser, self).__init__(cr, uid, name, context=context)
37 self.localcontext.update({
38 'getHeaders': self.getHeaders,
39 'getRows': self.getRows,
40 })
41 return
42
43 def getHeaders(self, model, field_list, rows, context=None):
44 '''
45 get the column names of the table. Set the type of the column and the
46 size of it.
47 '''
48 import_export_obj = self.pool.get('msf.import.export')
49 return import_export_obj._get_headers(self.cr, self.uid, model,
50 selection=None, field_list=field_list, rows=rows, context=context)
51
52 def getRows(self, model, fields, nb_lines=None, domain=None,
53 template_only=False, context=None):
54 """
55 Return list of lines from given generic export
56 """
57 if context is None:
58 context={}
59 if template_only:
60 return []
61 if not domain:
62 domain = []
63 rows = []
64 counter = 0
65 chunk_size = 100
66 model_obj = self.pool.get(model)
67 ids = model_obj.search(self.cr, self.uid, domain, limit=nb_lines)
68 fields = [x.replace('.', '/') for x in fields]
69 for i in range(0, len(ids), chunk_size):
70 ids_chunk = ids[i:i + chunk_size]
71 counter += len(ids_chunk)
72 context['translate_selection_field'] = True
73 rows.extend(model_obj.export_data(self.cr, self.uid, ids_chunk, fields, context=context)['datas'])
74 return rows
75
76XlsWebKitParser(
77 'report.wizard.export.generic',
78 'msf.import.export',
79 'addons/msf_doc_import/report/export_generic.mako',
80 parser=report_generic_export_parser,
81)
30# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:82# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
3183
=== added file 'bin/addons/msf_doc_import/view/msf_import_export_view.xml'
--- bin/addons/msf_doc_import/view/msf_import_export_view.xml 1970-01-01 00:00:00 +0000
+++ bin/addons/msf_doc_import/view/msf_import_export_view.xml 2017-09-12 08:08:04 +0000
@@ -0,0 +1,96 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<openerp>
3<data>
4
5 <record id="msf_import_export_view" model="ir.ui.view">
6 <field name="name">msf.import.export.view</field>
7 <field name="model">msf.import.export</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Import / Export">
11 <group>
12 <field name="display_file_import" invisible="1" />
13 <field name="display_file_export" invisible="1" />
14 <field name='model_list_selection' on_change="domain_type_change(model_list_selection)" />
15 </group>
16 <group col="4" colspan="4">
17 <field name="hide_download_3_entries" invisible="1" />
18 <field name="hide_download_all_entries" invisible="1" />
19 <group colspan="2" col="2" name="file_import" attrs="{'invisible':[('display_file_import', '=', False)]}">
20 <separator string="File Import" colspan="2"/>
21 <field name="display_test_import_button" invisible="1" />
22 <field name="import_file" colspan="4" on_change="file_change(import_file)"/>
23 <button name="test_import" string="Test file" type="object" icon="gtk-ok" colspan="4" attrs="{'invisible':[('display_test_import_button', '=', False)]}" />
24 <button name="import_xml" string="Run import" type="object" icon="gtk-execute" colspan="4" attrs="{'invisible': [('state', '!=', 'draft')]}" />
25 <separator colspan="4" string="Information" />
26 <field name="info_message" colspan="4" nolabel="1" />
27 </group>
28 <group colspan="2" col="2" name="file_export">
29 <separator string="File Export" colspan="2"/>
30 <group attrs="{'invisible':[('display_file_export', '=', False)]}">
31 <button name="download_template_file" string="Export empty template" icon="gtk-save" help="Download template file" type="object" />
32 <button name="download_3_entries_file" string="Export first 3 entries" type="object" icon="gtk-save" colspan="4" attrs="{'invisible':[('hide_download_3_entries', '=', True)]}"/>
33 <button name="download_all_entries_file" string="Export all data" type="object" icon="gtk-save" colspan="4" attrs="{'invisible':[('hide_download_all_entries', '=', True)]}"/>
34 </group>
35 </group>
36 <group colspan="4" attrs="{'invisible': [('show_warning', '=', False)]}">
37 <separator colspan="4" string="Warning messages" />
38 <field name="warning_message" nolabel="1" colspan="4" widget="full_text"/>
39 </group>
40
41 <group colspan="4" attrs="{'invisible': [('show_error', '=', False)]}">
42 <separator colspan="4" string="Error messages" />
43 <field name="error_message" nolabel="1" colspan="4" widget="full_text"/>
44 </group>
45 </group>
46 </form>
47 </field>
48 </record>
49
50
51 <record id="msf_import_export_supply_action" model="ir.actions.act_window">
52 <field name="name">Supply</field>
53 <field name="res_model">msf.import.export</field>
54 <field name="view_type">form</field>
55 <field name="view_mode">form</field>
56 <field name="target">current</field>
57 <field name="context">{'domain_type': 'supply'}</field>
58 </record>
59
60 <record id="msf_import_export_finance_action" model="ir.actions.act_window">
61 <field name="name">Finance</field>
62 <field name="res_model">msf.import.export</field>
63 <field name="view_type">form</field>
64 <field name="view_mode">form</field>
65 <field name="target">current</field>
66 <field name="context">{'domain_type': 'finance'}</field>
67 </record>
68
69 <record id="msf_import_export_non_functional_action" model="ir.actions.act_window">
70 <field name="name">Non Functional</field>
71 <field name="res_model">msf.import.export</field>
72 <field name="view_type">form</field>
73 <field name="view_mode">form</field>
74 <field name="target">current</field>
75 <field name="context">{'domain_type': 'non_functionnal'}</field>
76 </record>
77
78 <menuitem id="msf_import_export_menu"
79 name="Import / Export"
80 parent="object_query.menu_preferences" />
81
82 <menuitem id="msf_import_export_supply_menu"
83 parent="msf_import_export_menu"
84 action="msf_import_export_supply_action" />
85
86 <menuitem id="msf_import_export_finance_menu"
87 parent="msf_import_export_menu"
88 action="msf_import_export_finance_action" />
89
90 <menuitem id="msf_import_export_non_functional_menu"
91 parent="msf_import_export_menu"
92 action="msf_import_export_non_functional_action" />
93
94
95</data>
96</openerp>
097
=== modified file 'bin/addons/msf_doc_import/wizard/abstract_wizard_import.py'
--- bin/addons/msf_doc_import/wizard/abstract_wizard_import.py 2017-03-20 09:49:38 +0000
+++ bin/addons/msf_doc_import/wizard/abstract_wizard_import.py 2017-09-12 08:08:04 +0000
@@ -39,7 +39,7 @@
39 """39 """
40 Class used to export Header template.40 Class used to export Header template.
41 """41 """
42 type_ok = ['String', 'Number', 'DateTime']42 type_ok = ['String', 'Number', 'DateTime', 'Boolean', 'Float']
4343
44 def __new__(cls, name, ftype='String', size=70, tech_name=None, required=False):44 def __new__(cls, name, ftype='String', size=70, tech_name=None, required=False):
45 """45 """
@@ -71,12 +71,12 @@
71 :return: A datetime instance or False71 :return: A datetime instance or False
72 """72 """
73 # US:2527: accept only one format, reject other73 # US:2527: accept only one format, reject other
74 date_format = [74 accepted_date_format = [
75 '%d/%m/%Y',75 '%d/%m/%Y',
76 ]76 ]
7777
78 d = False78 d = False
79 for dformat in date_format:79 for dformat in accepted_date_format:
80 try:80 try:
81 d = DateTime.strptime(date_value, dformat)81 d = DateTime.strptime(date_value, dformat)
82 d = d.strftime('%Y-%m-%d %H:%M:%S')82 d = d.strftime('%Y-%m-%d %H:%M:%S')
@@ -130,9 +130,22 @@
130 return (0, value, None)130 return (0, value, None)
131 else:131 else:
132 try:132 try:
133 if isinstance(value, basestring):
134 value = value.rstrip().replace(',', '.')
133 return (0, float(value), None)135 return (0, float(value), None)
134 except Exception as e:136 except Exception as e:
135 return (-1, value, e)137 return (-1, value, e)
138 elif header[1] == 'Boolean':
139 if value.upper() in ('T', 'TRUE', '1'):
140 value = True
141 else:
142 value = False
143 elif header[1] == 'Number':
144 if vtype =='int':
145 try:
146 return (0, int(value), None)
147 except Exception as e:
148 return (-1, value, e)
136149
137 return (0, value, None)150 return (0, value, None)
138151
139152
=== modified file 'bin/addons/msf_profile/i18n/fr_MF.po'
--- bin/addons/msf_profile/i18n/fr_MF.po 2017-09-08 15:57:28 +0000
+++ bin/addons/msf_profile/i18n/fr_MF.po 2017-09-12 08:08:04 +0000
@@ -4544,13 +4544,14 @@
4544msgid "Contact Titles"4544msgid "Contact Titles"
4545msgstr "Titre/Position Contact"4545msgstr "Titre/Position Contact"
45464546
4547#. module: msf_button_access_rights4547#. modules: msf_button_access_rights, msf_doc_import
4548#: model:ir.actions.act_window,name:msf_button_access_rights.button_access_rule_list4548#: model:ir.actions.act_window,name:msf_button_access_rights.button_access_rule_list
4549#: model:ir.ui.menu,name:msf_button_access_rights.msf_button_access_rules4549#: model:ir.ui.menu,name:msf_button_access_rights.msf_button_access_rules
4550#: view:ir.ui.view:04550#: view:ir.ui.view:0
4551#: field:ir.ui.view,button_access_rules_ref:04551#: field:ir.ui.view,button_access_rules_ref:0
4552#: code:addons/msf_doc_import/msf_import_export_conf.py:124
4552msgid "Button Access Rules"4553msgid "Button Access Rules"
4553msgstr "Button Access Rules"4554msgstr "Règles d'Accès de bouton"
45544555
4555#. module: stock4556#. module: stock
4556#: code:addons/stock/stock.py:10914557#: code:addons/stock/stock.py:1091
@@ -7005,11 +7006,6 @@
7005msgid "MSF Codification"7006msgid "MSF Codification"
7006msgstr "Codification MSF"7007msgstr "Codification MSF"
70077008
7008#. module: product_list
7009#: view:product.list.line:0
7010msgid "Products"
7011msgstr "Products"
7012
7013#. module: base_setup7009#. module: base_setup
7014#: view:base.setup.company:07010#: view:base.setup.company:0
7015msgid "Your company information will be used to personalize documents issued with OpenERP such as invoices, sales orders and much more."7011msgid "Your company information will be used to personalize documents issued with OpenERP such as invoices, sales orders and much more."
@@ -13296,12 +13292,6 @@
13296msgid "Destinations"13292msgid "Destinations"
13297msgstr "Destinations"13293msgstr "Destinations"
1329813294
13299#. module: import_data
13300#: selection:import_category,object:0
13301#: selection:import_nomenclature,object:0
13302msgid "Product Nomenclature"
13303msgstr "Product Nomenclature"
13304
13305#. module: analytic_distribution13295#. module: analytic_distribution
13306#: code:addons/analytic_distribution/account_commitment.py:16613296#: code:addons/analytic_distribution/account_commitment.py:166
13307#, python-format13297#, python-format
@@ -15965,6 +15955,47 @@
15965msgid "New Zealand"15955msgid "New Zealand"
15966msgstr "Nouvelle-Zélande"15956msgstr "Nouvelle-Zélande"
1596715957
15958#. modules: msf_doc_import, msf_supply_doc_export
15959#: code:addons/msf_doc_import/wizard/__init__.py:68
15960#: code:addons/msf_doc_import/wizard/__init__.py:73
15961#: code:addons/msf_doc_import/wizard/__init__.py:78
15962#: code:addons/msf_doc_import/wizard/wizard_in_simulation_screen.py:65
15963#: report:addons/msf_supply_doc_export/report/report_real_composition_kit_xls.mako:71
15964#, python-format
15965msgid "Expiry Date"
15966msgstr "Date d'expiration"
15967
15968#. modules: account, msf_outgoing, register_accounting, account_override, purchase_compare_rfq, msf_doc_import, return_claim, analytic_distribution
15969#: code:addons/account/report/account_general_ledger.py:550
15970#: view:account.chart:0
15971#: field:account.chart,currency_id:0
15972#: view:account.analytic.chart:0
15973#: field:account.analytic.chart,currency_id:0
15974#: code:addons/msf_doc_import/wizard/wizard_in_simulation_screen.py:63
15975#: code:addons/msf_doc_import/wizard/wizard_po_simulation_screen.py:70
15976#: field:wizard.import.po.simulation.screen,in_currency:0
15977#: field:wizard.import.po.simulation.screen.line,imp_currency:0
15978#: field:wizard.import.po.simulation.screen.line,in_currency:0
15979#: field:wizard.simu.import.po.line,currency_id:0
15980#: field:wizard.simu.import.po.line,initial_currency:0
15981#: field:create.picking.move.processor,currency:0
15982#: field:internal.move.processor,currency:0
15983#: field:outgoing.delivery.move.processor,currency:0
15984#: field:ppl.move.processor,currency:0
15985#: field:return.ppl.move.processor,currency:0
15986#: field:stock.move.in.processor,currency:0
15987#: field:stock.move.processor,currency:0
15988#: field:validate.move.processor,currency:0
15989#: field:wizard.compare.rfq,currency_id:0
15990#: field:account.direct.invoice.wizard,currency_id:0
15991#: field:wizard.account.invoice,fake_currency_id:0
15992#: field:wizard.account.invoice,virtual_currency_id:0
15993#: field:claim.product.line,price_currency_claim_product_line:0
15994#: field:claim.product.line,price_unit_claim_product_line:0
15995#, python-format
15996msgid "Currency"
15997msgstr "Devise"
15998
15968#. module: sale15999#. module: sale
15969#: help:sale.order.line,delay:016000#: help:sale.order.line,delay:0
15970msgid "Number of days between the order confirmation the shipping of the products to the customer"16001msgid "Number of days between the order confirmation the shipping of the products to the customer"
@@ -17377,6 +17408,7 @@
1737717408
17378#. module: msf_doc_import17409#. module: msf_doc_import
17379#: view:wizard.import.batch:017410#: view:wizard.import.batch:0
17411#: view:msf.import.export:0
17380msgid "Warning messages"17412msgid "Warning messages"
17381msgstr "Messages d'avertissement"17413msgstr "Messages d'avertissement"
1738217414
@@ -20661,9 +20693,11 @@
20661msgid "IN update OUT"20693msgid "IN update OUT"
20662msgstr "IN update OUT"20694msgstr "IN update OUT"
2066320695
20664#. module: import_data20696#. modules: import_data, msf_doc_import
20665#: code:addons/import_data/import_data.py:31720697#: code:addons/import_data/import_data.py:317
20666#: code:addons/import_data/import_data.py:35620698#: code:addons/import_data/import_data.py:356
20699#: code:addons/msf_doc_import/msf_import_export.py:499
20700#: code:addons/msf_doc_import/msf_import_export.py:528
20667#, python-format20701#, python-format
20668msgid "%s does not exist"20702msgid "%s does not exist"
20669msgstr "%s n'existe pas"20703msgstr "%s n'existe pas"
@@ -24759,11 +24793,12 @@
24759msgid "This wizard will validate all journal entries of a particular journal and period. Once journal entries are validated, you can not update them anymore."24793msgid "This wizard will validate all journal entries of a particular journal and period. Once journal entries are validated, you can not update them anymore."
24760msgstr "Cet assistant validera toutes les écritures comptables pour un journal particulier et une période. Une fois validées, les écritures comptables ne peuvent plus être modifiées."24794msgstr "Cet assistant validera toutes les écritures comptables pour un journal particulier et une période. Une fois validées, les écritures comptables ne peuvent plus être modifiées."
2476124795
24762#. module: msf_field_access_rights24796#. modules: msf_field_access_rights, msf_doc_import
24763#: model:ir.actions.act_window,name:msf_field_access_rights.field_access_rules_list24797#: model:ir.actions.act_window,name:msf_field_access_rights.field_access_rules_list
24764#: model:ir.ui.menu,name:msf_field_access_rights.msf_field_access_rules24798#: model:ir.ui.menu,name:msf_field_access_rights.msf_field_access_rules
24799#: code:addons/msf_doc_import/msf_import_export_conf.py:114
24765msgid "Field Access Rules"24800msgid "Field Access Rules"
24766msgstr "Field Access Rules"24801msgstr "Règles d'Accès au Champs"
2476724802
24768#. modules: account, msf_outgoing, finance, sync_client, register_accounting, account_override, sourcing, sync_so, res_currency_functional, analytic_distribution24803#. modules: account, msf_outgoing, finance, sync_client, register_accounting, account_override, sourcing, sync_so, res_currency_functional, analytic_distribution
24769#: code:addons/account/report/account_general_ledger.py:25224804#: code:addons/account/report/account_general_ledger.py:252
@@ -25725,9 +25760,10 @@
25725msgid "No Period found on Invoice!"25760msgid "No Period found on Invoice!"
25726msgstr "Pas de Période indiquée sur la Facture!"25761msgstr "Pas de Période indiquée sur la Facture!"
2572725762
25728#. module: supplier_catalogue25763#. modules: supplier_catalogue, msf_doc_import
25729#: model:ir.actions.act_window,name:supplier_catalogue.action_supplier_catalogue_line_list25764#: model:ir.actions.act_window,name:supplier_catalogue.action_supplier_catalogue_line_list
25730#: view:supplier.catalogue.line:025765#: view:supplier.catalogue.line:0
25766#: code:addons/msf_doc_import/msf_import_export_conf.py:53
25731msgid "Supplier catalogue lines"25767msgid "Supplier catalogue lines"
25732msgstr "Lignes Catalogue Fournisseur"25768msgstr "Lignes Catalogue Fournisseur"
2573325769
@@ -25857,6 +25893,7 @@
2585725893
25858#. module: msf_doc_import25894#. module: msf_doc_import
25859#: view:wizard.import.batch:025895#: view:wizard.import.batch:0
25896#: view:msf.import.export:0
25860msgid "Run import"25897msgid "Run import"
25861msgstr "Démarrer l'import"25898msgstr "Démarrer l'import"
2586225899
@@ -29743,7 +29780,13 @@
29743msgid "Total amount this customer owes you."29780msgid "Total amount this customer owes you."
29744msgstr "Montant Total Dû par ce Client."29781msgstr "Montant Total Dû par ce Client."
2974529782
29746#. modules: tender_flow, msf_partner, account, product, base, useability_dashboard_and_menu29783#. modules: consumption_calculation, stock_override
29784#: report:addons/consumption_calculation/report/report_monthly_consumption_xls.mako:70
29785#: field:export.report.stock.move,name:0
29786msgid "Generated on"
29787msgstr "Generated on"
29788
29789#. modules: tender_flow, msf_partner, account, product, base, useability_dashboard_and_menu, msf_doc_import
29747#: model:ir.ui.menu,name:account.menu_account_supplier29790#: model:ir.ui.menu,name:account.menu_account_supplier
29748#: model:ir.ui.menu,name:account.menu_finance_payables29791#: model:ir.ui.menu,name:account.menu_finance_payables
29749#: model:ir.actions.act_window,name:base.action_partner_supplier_form29792#: model:ir.actions.act_window,name:base.action_partner_supplier_form
@@ -29755,6 +29798,7 @@
29755#: view:tender:029798#: view:tender:0
29756#: field:tender,supplier_ids:029799#: field:tender,supplier_ids:0
29757#: model:ir.ui.menu,name:useability_dashboard_and_menu.menu_supplier29800#: model:ir.ui.menu,name:useability_dashboard_and_menu.menu_supplier
29801#: code:addons/msf_doc_import/msf_import_export_conf.py:42
29758msgid "Suppliers"29802msgid "Suppliers"
29759msgstr "Fournisseurs"29803msgstr "Fournisseurs"
2976029804
@@ -30275,11 +30319,6 @@
30275msgid "Line %s. No info about given account: %s"30319msgid "Line %s. No info about given account: %s"
30276msgstr "Line %s. No info about given account: %s"30320msgstr "Line %s. No info about given account: %s"
3027730321
30278#. module: account_hq_entries
30279#: model:ir.module.module,shortdesc:account_hq_entries.module_meta_information
30280msgid "HQ Entries"
30281msgstr "HQ Entries"
30282
30283#. module: msf_budget30322#. module: msf_budget
30284#: view:wizard.budget.summary.export:030323#: view:wizard.budget.summary.export:0
30285msgid "Budget Summary PDF Export"30324msgid "Budget Summary PDF Export"
@@ -30894,6 +30933,7 @@
3089430933
30895#. module: msf_doc_import30934#. module: msf_doc_import
30896#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:30830935#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:308
30936#: code:addons/msf_doc_import/msf_import_export.py:688
30897#, python-format30937#, python-format
30898msgid "(%s line(s) with warning - see warning messages below)"30938msgid "(%s line(s) with warning - see warning messages below)"
30899msgstr "(%s ligne(s) avec des avertissements - voir les avertissements ci-dessous)"30939msgstr "(%s ligne(s) avec des avertissements - voir les avertissements ci-dessous)"
@@ -32587,6 +32627,7 @@
3258732627
32588#. module: msf_doc_import32628#. module: msf_doc_import
32589#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:31332629#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:313
32630#: code:addons/msf_doc_import/msf_import_export.py:693
32590#, python-format32631#, python-format
32591msgid "no data will be imported until all the error messages are corrected"32632msgid "no data will be imported until all the error messages are corrected"
32592msgstr "aucune donnée ne sera importée tant que toutes les erreurs ne seront pas corrigées"32633msgstr "aucune donnée ne sera importée tant que toutes les erreurs ne seront pas corrigées"
@@ -35506,6 +35547,7 @@
3550635547
35507#. module: msf_doc_import35548#. module: msf_doc_import
35508#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:29835549#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:298
35550#: code:addons/msf_doc_import/msf_import_export.py:678
35509#, python-format35551#, python-format
35510msgid "Processing of file completed in %s second(s)!\n"35552msgid "Processing of file completed in %s second(s)!\n"
35511"- Total lines to import: %s\n"35553"- Total lines to import: %s\n"
@@ -36767,8 +36809,11 @@
36767msgid "Move state"36809msgid "Move state"
36768msgstr "Statut de la transaction "36810msgstr "Statut de la transaction "
3676936811
36770#. module: procurement_auto36812#. modules: procurement_auto, procurement, msf_doc_import
36771#: field:stock.warehouse.automatic.supply.line,supply_id:036813#: field:stock.warehouse.automatic.supply.line,supply_id:0
36814#: field:stock.warehouse.orderpoint.line,supply_id:0
36815#: model:ir.actions.act_window,name:msf_doc_import.msf_import_export_supply_action
36816#: model:ir.ui.menu,name:msf_doc_import.msf_import_export_supply_menu
36772msgid "Supply"36817msgid "Supply"
36773msgstr "Approvisionnement"36818msgstr "Approvisionnement"
3677436819
@@ -40027,12 +40072,14 @@
40027msgid "DP execute"40072msgid "DP execute"
40028msgstr "DP execute"40073msgstr "DP execute"
4002940074
40030#. modules: msf_instance, sync_so, account_hq_entries40075#. modules: msf_instance, sync_so, account_hq_entries, account_hq_entries, msf_doc_import
40031#: model:ir.actions.act_window,name:account_hq_entries.action_hq_entries_tree40076#: model:ir.actions.act_window,name:account_hq_entries.action_hq_entries_tree
40032#: model:ir.model,name:account_hq_entries.model_hq_entries40077#: model:ir.model,name:account_hq_entries.model_hq_entries
40033#: model:ir.ui.menu,name:account_hq_entries.menu_hq_entries40078#: model:ir.ui.menu,name:account_hq_entries.menu_hq_entries
40034#: view:res.company:040079#: view:res.company:0
40035#: model:ir.model,name:sync_so.model_hq_entries40080#: model:ir.model,name:sync_so.model_hq_entries
40081#: model:ir.module.module,shortdesc:account_hq_entries.module_meta_information
40082#: code:addons/msf_doc_import/msf_import_export_conf.py:81
40036msgid "HQ Entries"40083msgid "HQ Entries"
40037msgstr "Ecritures HQ"40084msgstr "Ecritures HQ"
4003840085
@@ -42744,6 +42791,7 @@
4274442791
42745#. module: msf_doc_import42792#. module: msf_doc_import
42746#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:30642793#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:306
42794#: code:addons/msf_doc_import/msf_import_export.py:686
42747#, python-format42795#, python-format
42748msgid "imported"42796msgid "imported"
42749msgstr "importées"42797msgstr "importées"
@@ -42986,6 +43034,7 @@
4298643034
42987#. module: msf_doc_import43035#. module: msf_doc_import
42988#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:30643036#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:306
43037#: code:addons/msf_doc_import/msf_import_export.py:686
42989#, python-format43038#, python-format
42990msgid "without errors"43039msgid "without errors"
42991msgstr "sans erreurs"43040msgstr "sans erreurs"
@@ -48145,7 +48194,8 @@
48145msgid "Report can not be edited due to missing FX rates in specific currency table %s"48194msgid "Report can not be edited due to missing FX rates in specific currency table %s"
48146msgstr "Report can not be edited due to missing FX rates in specific currency table %s"48195msgstr "Report can not be edited due to missing FX rates in specific currency table %s"
4814748196
48148#. module: base48197#. modules: base, msf_doc_import
48198#: code:addons/msf_doc_import/msf_import_export_conf.py:86
48149#: model:ir.actions.act_window,name:base.ir_access_act48199#: model:ir.actions.act_window,name:base.ir_access_act
48150#: model:ir.ui.menu,name:base.menu_ir_access_act48200#: model:ir.ui.menu,name:base.menu_ir_access_act
48151msgid "Access Controls List"48201msgid "Access Controls List"
@@ -50484,7 +50534,7 @@
50484msgid "Followup lines"50534msgid "Followup lines"
50485msgstr "Suivi des Lignes"50535msgstr "Suivi des Lignes"
5048650536
50487#. modules: msf_budget, account, financing_contract, analytic_distribution50537#. modules: msf_budget, account, financing_contract, analytic_distribution, msf_doc_import
50488#: view:account.analytic.account:050538#: view:account.analytic.account:0
50489#: model:ir.ui.menu,name:account.account_analytic_def_account50539#: model:ir.ui.menu,name:account.account_analytic_def_account
50490#: view:account.analytic.account:050540#: view:account.analytic.account:0
@@ -50492,6 +50542,7 @@
50492#: model:ir.ui.menu,name:financing_contract.menu_action_account_analytic_account_form50542#: model:ir.ui.menu,name:financing_contract.menu_action_account_analytic_account_form
50493#: view:account.analytic.account:050543#: view:account.analytic.account:0
50494#: model:ir.ui.menu,name:msf_budget.menu_action_account_analytic_account_budget_form50544#: model:ir.ui.menu,name:msf_budget.menu_action_account_analytic_account_budget_form
50545#: code:addons/msf_doc_import/msf_import_export_conf.py:66
50495msgid "Analytic Accounts"50546msgid "Analytic Accounts"
50496msgstr "Comptes Analytiques"50547msgstr "Comptes Analytiques"
5049750548
@@ -50610,7 +50661,7 @@
50610msgid "Read Access"50661msgid "Read Access"
50611msgstr "Accès Lecture"50662msgstr "Accès Lecture"
5061250663
50613#. modules: product_nomenclature, import_data, product_asset, kit50664#. modules: product_nomenclature, import_data, product_asset, kit, msf_doc_import
50614#: selection:import_data,object:050665#: selection:import_data,object:0
50615#: selection:import_product,object:050666#: selection:import_product,object:0
50616#: selection:update_product,object:050667#: selection:update_product,object:0
@@ -50618,6 +50669,9 @@
50618#: field:product.asset,nomenclature_description:050669#: field:product.asset,nomenclature_description:0
50619#: model:ir.model,name:product_nomenclature.model_product_nomenclature50670#: model:ir.model,name:product_nomenclature.model_product_nomenclature
50620#: view:product.nomenclature:050671#: view:product.nomenclature:0
50672#: selection:import_category,object:0
50673#: selection:import_nomenclature,object:0
50674#: code:addons/msf_doc_import/msf_import_export_conf.py:32
50621msgid "Product Nomenclature"50675msgid "Product Nomenclature"
50622msgstr "Nomenclature du Produit"50676msgstr "Nomenclature du Produit"
5062350677
@@ -51151,7 +51205,7 @@
51151#: code:addons/msf_outgoing/wizard/validate_picking_processor.py:7551205#: code:addons/msf_outgoing/wizard/validate_picking_processor.py:75
51152#, python-format51206#, python-format
51153msgid "Line %s: %s"51207msgid "Line %s: %s"
51154msgstr "Ligne %s: %s"51208msgstr "Ligne %s : %s"
5115551209
51156#. module: account_override51210#. module: account_override
51157#: help:account.move.line,journal_type:051211#: help:account.move.line,journal_type:0
@@ -52986,11 +53040,6 @@
52986msgid "Included Fields"53040msgid "Included Fields"
52987msgstr "Champs Inclus"53041msgstr "Champs Inclus"
5298853042
52989#. module: kit
52990#: view:kit.mass.import:0
52991msgid "Error messages"
52992msgstr "Error messages"
52993
52994#. module: msf_partner53043#. module: msf_partner
52995#: view:res.partner:053044#: view:res.partner:0
52996msgid "Customer LT"53045msgid "Customer LT"
@@ -56414,13 +56463,14 @@
56414msgid "Choose Fiscal Year"56463msgid "Choose Fiscal Year"
56415msgstr "Choisir l'Exercice Comptable "56464msgstr "Choisir l'Exercice Comptable "
5641656465
56417#. module: msf_field_access_rights56466#. modules: msf_field_access_rights, msf_doc_import
56418#: model:ir.actions.act_window,name:msf_field_access_rights.field_access_rule_line_list56467#: model:ir.actions.act_window,name:msf_field_access_rights.field_access_rule_line_list
56419#: model:ir.ui.menu,name:msf_field_access_rights.field_access_rule_line_list_menu56468#: model:ir.ui.menu,name:msf_field_access_rights.field_access_rule_line_list_menu
56420#: view:msf_field_access_rights.field_access_rule:056469#: view:msf_field_access_rights.field_access_rule:0
56421#: field:msf_field_access_rights.field_access_rule,field_access_rule_line_ids:056470#: field:msf_field_access_rights.field_access_rule,field_access_rule_line_ids:0
56471#: code:addons/msf_doc_import/msf_import_export_conf.py:119
56422msgid "Field Access Rule Lines"56472msgid "Field Access Rule Lines"
56423msgstr "Field Access Rule Lines"56473msgstr "Lignes de Règle d'Accès au Champs"
5642456474
56425#. module: analytic_distribution56475#. module: analytic_distribution
56426#: field:analytic.distribution.wizard,fp_line_ids:056476#: field:analytic.distribution.wizard,fp_line_ids:0
@@ -56584,11 +56634,12 @@
56584msgid "Manually corrected"56634msgid "Manually corrected"
56585msgstr "Manually corrected"56635msgstr "Manually corrected"
5658656636
56587#. modules: account, account_mcdb56637#. modules: account, account_mcdb, msf_doc_import
56588#: view:account.analytic.journal:056638#: view:account.analytic.journal:0
56589#: model:ir.actions.act_window,name:account.action_account_analytic_journal_form56639#: model:ir.actions.act_window,name:account.action_account_analytic_journal_form
56590#: model:ir.ui.menu,name:account.account_def_analytic_journal56640#: model:ir.ui.menu,name:account.account_def_analytic_journal
56591#: view:account.mcdb:056641#: view:account.mcdb:0
56642#: code:addons/msf_doc_import/msf_import_export_conf.py:71
56592msgid "Analytic Journals"56643msgid "Analytic Journals"
56593msgstr "Journaux analytiques"56644msgstr "Journaux analytiques"
5659456645
@@ -56652,8 +56703,10 @@
56652msgid "In days"56703msgid "In days"
56653msgstr "En jours."56704msgstr "En jours."
5665456705
56655#. module: msf_doc_import56706#. modules: msf_doc_import, kit
56707#: view:kit.mass.import:0
56656#: view:wizard.import.batch:056708#: view:wizard.import.batch:0
56709#: view:msf.import.export:0
56657msgid "Error messages"56710msgid "Error messages"
56658msgstr "Messages d'erreur"56711msgstr "Messages d'erreur"
5665956712
@@ -57560,9 +57613,10 @@
57560msgid "Action to Trigger"57613msgid "Action to Trigger"
57561msgstr "Action à Déclencher"57614msgstr "Action à Déclencher"
5756257615
57563#. module: base57616#. modules: base, msf_doc_import
57564#: model:ir.actions.act_window,name:base.ir_action_window57617#: model:ir.actions.act_window,name:base.ir_action_window
57565#: model:ir.ui.menu,name:base.menu_ir_action_window57618#: model:ir.ui.menu,name:base.menu_ir_action_window
57619#: code:addons/msf_doc_import/msf_import_export_conf.py:129
57566msgid "Window Actions"57620msgid "Window Actions"
57567msgstr "Fenêtre Actions"57621msgstr "Fenêtre Actions"
5756857622
@@ -58838,11 +58892,6 @@
58838msgid "Specific partner"58892msgid "Specific partner"
58839msgstr "Partenaire spécifique"58893msgstr "Partenaire spécifique"
5884058894
58841#. module: procurement
58842#: field:stock.warehouse.orderpoint.line,supply_id:0
58843msgid "Supply"
58844msgstr "Supply"
58845
58846#. module: sale_override58895#. module: sale_override
58847#: view:sale.order.line:058896#: view:sale.order.line:0
58848msgid "This button shouldn't be use from form view. Please use the red cross on list view."58897msgid "This button shouldn't be use from form view. Please use the red cross on list view."
@@ -60862,6 +60911,7 @@
60862#: selection:wizard.import.batch,state:060911#: selection:wizard.import.batch,state:0
60863#: view:automated.import.job:060912#: view:automated.import.job:0
60864#: selection:automated.import.job,state:060913#: selection:automated.import.job,state:0
60914#: selection:msf.import.export,state:0
60865#, python-format60915#, python-format
60866msgid "In progress"60916msgid "In progress"
60867msgstr "En cours"60917msgstr "En cours"
@@ -61119,9 +61169,10 @@
61119msgid "%y - Year without century [00,99]."61169msgid "%y - Year without century [00,99]."
61120msgstr "%y - Année sans le siècle (00 à 99)."61170msgstr "%y - Année sans le siècle (00 à 99)."
6112161171
61122#. module: base61172#. modules: base, msf_doc_import
61123#: model:ir.actions.act_window,name:base.action_rule61173#: model:ir.actions.act_window,name:base.action_rule
61124#: model:ir.ui.menu,name:base.menu_action_rule61174#: model:ir.ui.menu,name:base.menu_action_rule
61175#: code:addons/msf_doc_import/msf_import_export_conf.py:104
61125msgid "Record Rules"61176msgid "Record Rules"
61126msgstr "Règles d´Enregistrement"61177msgstr "Règles d´Enregistrement"
6112761178
@@ -61450,6 +61501,7 @@
61450#: code:addons/sale_override/sale.py:36461501#: code:addons/sale_override/sale.py:364
61451#: code:addons/sale_override/sale.py:36561502#: code:addons/sale_override/sale.py:365
61452#: code:addons/sale_override/sale.py:36661503#: code:addons/sale_override/sale.py:366
61504#: selection:msf.import.export,state:0
61453#, python-format61505#, python-format
61454msgid "Not started"61506msgid "Not started"
61455msgstr "Non démarré"61507msgstr "Non démarré"
@@ -61984,6 +62036,32 @@
61984msgid "Nothing to import"62036msgid "Nothing to import"
61985msgstr "Rien à importer"62037msgstr "Rien à importer"
6198662038
62039#. modules: msf_budget, msf_homere_interface, supplier_catalogue, consumption_calculation, account_hq_entries, msf_doc_import, analytic_distribution, msf_doc_import, register_accounting
62040#: code:addons/account_hq_entries/wizard/hq_entries_import.py:319
62041#: code:addons/analytic_distribution/wizard/import_commitment_wizard.py:72
62042#: code:addons/consumption_calculation/wizard/wizard_import_fmc.py:87
62043#: code:addons/consumption_calculation/wizard/wizard_import_rac.py:85
62044#: code:addons/msf_budget/wizard/wizard_budget_import.py:240
62045#: code:addons/msf_doc_import/composition_kit.py:86
62046#: code:addons/msf_doc_import/composition_kit.py:181
62047#: code:addons/msf_doc_import/initial_stock_inventory.py:92
62048#: code:addons/msf_doc_import/initial_stock_inventory.py:600
62049#: code:addons/msf_doc_import/stock_cost_reevaluation.py:51
62050#: code:addons/msf_doc_import/tender.py:98
62051#: code:addons/msf_doc_import/wizard/wizard_import_product_list.py:88
62052#: code:addons/msf_doc_import/wizard/wizard_import_supplier_catalogue.py:164
62053#: code:addons/msf_homere_interface/wizard/hr_payroll_employee_import.py:584
62054#: code:addons/msf_homere_interface/wizard/hr_payroll_import.py:479
62055#: code:addons/supplier_catalogue/supplier_catalogue.py:590
62056#: code:addons/supplier_catalogue/wizard/catalogue_import_lines.py:45
62057#: code:addons/msf_doc_import/account.py:196
62058#: code:addons/msf_doc_import/wizard/stock_partial_picking.py:254
62059#: code:addons/msf_doc_import/wizard/stock_partial_picking.py:785
62060#: code:addons/register_accounting/wizard/wizard_register_import.py:255
62061#, python-format
62062msgid "Nothing to import."
62063msgstr "Rien à importer"
62064
61987#. module: account_mcdb62065#. module: account_mcdb
61988#: selection:account.mcdb,currency_choice:062066#: selection:account.mcdb,currency_choice:0
61989msgid "Booking"62067msgid "Booking"
@@ -62406,6 +62484,7 @@
6240662484
62407#. module: msf_doc_import62485#. module: msf_doc_import
62408#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:10662486#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:106
62487#: code:addons/msf_doc_import/msf_import_export.py:364
62409#, python-format62488#, python-format
62410msgid "Import in progress, please leave this window open and press the button 'Update' to show the progression of the import. Otherwise, you can continue to use Unifield"62489msgid "Import in progress, please leave this window open and press the button 'Update' to show the progression of the import. Otherwise, you can continue to use Unifield"
62411msgstr "Traitement en cours, veuillez laisser cette fenêtre ouverte et cliquez sur le bouton 'Mettre à jour' pour voir la progression de l'import. Sinon, vous pouvez continuer d'utiliser Unifield"62490msgstr "Traitement en cours, veuillez laisser cette fenêtre ouverte et cliquez sur le bouton 'Mettre à jour' pour voir la progression de l'import. Sinon, vous pouvez continuer d'utiliser Unifield"
@@ -67248,6 +67327,8 @@
67248#: field:threshold.value,line_ids:067327#: field:threshold.value,line_ids:0
67249#: field:threshold.value,product_ids:067328#: field:threshold.value,product_ids:0
67250#: view:restrictive.country.setup:067329#: view:restrictive.country.setup:0
67330#: view:product.list.line:0
67331#: code:addons/msf_doc_import/msf_import_export_conf.py:27
67251#, python-format67332#, python-format
67252msgid "Products"67333msgid "Products"
67253msgstr "Produits"67334msgstr "Produits"
@@ -68849,6 +68930,8 @@
68849#. module: msf_doc_import68930#. module: msf_doc_import
68850#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:28668931#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:286
68851#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:29268932#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:292
68933#: code:addons/msf_doc_import/msf_import_export.py:666
68934#: code:addons/msf_doc_import/msf_import_export.py:672
68852#, python-format68935#, python-format
68853msgid "Line %s: %s"68936msgid "Line %s: %s"
68854msgstr "Ligne %s : %s"68937msgstr "Ligne %s : %s"
@@ -79938,6 +80021,7 @@
79938#: field:automated.import.job,state:080021#: field:automated.import.job,state:0
79939#: field:export.report.inconsistencies,state:080022#: field:export.report.inconsistencies,state:0
79940#: field:export.report.stopped.products,state:080023#: field:export.report.stopped.products,state:0
80024#: field:msf.import.export,state:0
79941#: field:wizard.import.invoice.line,state:080025#: field:wizard.import.invoice.line,state:0
79942msgid "State"80026msgid "State"
79943msgstr "État"80027msgstr "État"
@@ -80596,6 +80680,7 @@
8059680680
80597#. module: msf_doc_import80681#. module: msf_doc_import
80598#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:17080682#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:170
80683#: code:addons/msf_doc_import/msf_import_export.py:549
80599#, python-format80684#, python-format
80600msgid "Line seemed empty, so this line was ignored"80685msgid "Line seemed empty, so this line was ignored"
80601msgstr "La ligne semblait vide, donc cette ligne a été ignorée"80686msgstr "La ligne semblait vide, donc cette ligne a été ignorée"
@@ -80655,7 +80740,7 @@
80655msgid "Send a test email"80740msgid "Send a test email"
80656msgstr "Send a test email"80741msgstr "Send a test email"
8065780742
80658#. modules: tender_flow, product_nomenclature, product_asset, account_override, purchase_allocation_report, register_accounting, product_expiry, procurement_cycle, return_claim, supplier_catalogue, import_data, stock_schedule, unifield_setup, stock_forecast, stock_batch_recall, order_types, msf_doc_import, purchase_followup, product, stock_override, service_purchasing, consumption_calculation, purchase_override, specific_rules, kit, sale_override, product_list, product_manufacturer, procurement_report, threshold_value, purchase, account, msf_outgoing, stock_move_tracking, product_attributes, procurement_auto, sale, transport_mgmt, procurement, sourcing, msf_audittrail, purchase_msf, stock, sync_so80743#. modules: tender_flow, product_nomenclature, product_asset, account_override, purchase_allocation_report, register_accounting, product_expiry, procurement_cycle, return_claim, supplier_catalogue, import_data, stock_schedule, unifield_setup, stock_forecast, stock_batch_recall, order_types, msf_doc_import, purchase_followup, product, stock_override, service_purchasing, consumption_calculation, purchase_override, specific_rules, kit, sale_override, product_list, product_manufacturer, procurement_report, threshold_value, purchase, account, msf_outgoing, stock_move_tracking, product_attributes, procurement_auto, sale, transport_mgmt, procurement, sourcing, msf_audittrail, purchase_msf, stock, sync_so, base
80659#: field:account.analytic.line,product_id:080744#: field:account.analytic.line,product_id:0
80660#: view:account.entries.report:080745#: view:account.entries.report:0
80661#: field:account.entries.report,product_id:080746#: field:account.entries.report,product_id:0
@@ -80809,6 +80894,47 @@
80809#: field:threshold.value.line,product_id:080894#: field:threshold.value.line,product_id:0
80810#: model:ir.model,name:transport_mgmt.model_product_product80895#: model:ir.model,name:transport_mgmt.model_product_product
80811#: model:ir.model,name:unifield_setup.model_product_product80896#: model:ir.model,name:unifield_setup.model_product_product
80897#: report:allocation.invoices.report:0
80898#: selection:res.request,ref_doc1:0
80899#: selection:res.request,ref_doc2:0
80900#: field:product.history.consumption.product,product_id:0
80901#: selection:import_category,object:0
80902#: selection:import_nomenclature,object:0
80903#: report:kit.report:0
80904#: report:addons/msf_doc_import/report/in_simulation_screen_xls_report.mako:149
80905#: report:addons/msf_doc_import/report/in_simulation_screen_xls_report.mako:158
80906#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:230
80907#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:241
80908#: report:po.simulation.screen:0
80909#: field:product.product.import.line.qty,product_id:0
80910#: field:wizard.import.in.line.simulation.screen,imp_product_id:0
80911#: field:wizard.import.in.line.simulation.screen,move_product_id:0
80912#: field:wizard.import.po.simulation.screen.line,imp_product_id:0
80913#: field:wizard.import.po.simulation.screen.line,in_product_id:0
80914#: view:create.picking.move.processor:0
80915#: field:create.picking.move.processor,product_id:0
80916#: view:internal.move.processor:0
80917#: field:internal.move.processor,product_id:0
80918#: view:outgoing.delivery.move.processor:0
80919#: field:outgoing.delivery.move.processor,product_id:0
80920#: view:ppl.move.processor:0
80921#: field:ppl.move.processor,product_id:0
80922#: view:return.ppl.move.processor:0
80923#: field:return.ppl.move.processor,product_id:0
80924#: view:stock.move.in.processor:0
80925#: field:stock.move.in.processor,product_id:0
80926#: view:stock.move.processor:0
80927#: field:stock.move.processor,product_id:0
80928#: view:validate.move.processor:0
80929#: field:validate.move.processor,product_id:0
80930#: field:stock.warehouse.orderpoint.line,product_id:0
80931#: view:product.where.used:0
80932#: field:product.where.used,product_id:0
80933#: field:standard.price.track.changes,product_id:0
80934#: field:account.direct.invoice.wizard.line,product_id:0
80935#: field:unconsistent.stock.report.line,product_id:0
80936#: view:stock.card.wizard:0
80937#: field:stock.card.wizard,product_id:0
80812msgid "Product"80938msgid "Product"
80813msgstr "Produit"80939msgstr "Produit"
8081480940
@@ -80902,7 +81028,7 @@
80902msgid "Select a supplier"81028msgid "Select a supplier"
80903msgstr "Sélectionner un fournisseur"81029msgstr "Sélectionner un fournisseur"
8090481030
80905#. modules: msf_budget, purchase, account, msf_outgoing, account_payment, purchase_override, specific_rules, sale, base, register_accounting, msf_doc_import, return_claim, stock, analytic_distribution, msf_homere_interface81031#. modules: msf_budget, purchase, account, msf_outgoing, account_payment, purchase_override, specific_rules, sale, base, register_accounting, msf_doc_import, return_claim, stock, analytic_distribution, delivery_mechanism, sales_followup, sync_client, tender_flow, sale_override, msf_tools, mission_stock, msf_homere_interface
80906#: selection:account.invoice.report,state:081032#: selection:account.invoice.report,state:0
80907#: selection:account.journal.period,state:081033#: selection:account.journal.period,state:0
80908#: selection:account.subscription,state:081034#: selection:account.subscription,state:0
@@ -80947,6 +81073,30 @@
80947#: selection:stock.inventory,state:081073#: selection:stock.inventory,state:0
80948#: view:stock.move:081074#: view:stock.move:0
80949#: view:stock.picking:081075#: view:stock.picking:0
81076#: code:addons/delivery_mechanism/delivery_mechanism.py:1295
81077#: code:addons/delivery_mechanism/delivery_mechanism.py:1315
81078#: code:addons/delivery_mechanism/delivery_mechanism.py:1343
81079#: code:addons/delivery_mechanism/delivery_mechanism.py:1388
81080#: code:addons/mission_stock/wizard/mission_stock_wizard.py:48
81081#: code:addons/mission_stock/wizard/mission_stock_wizard.py:56
81082#: code:addons/msf_outgoing/msf_outgoing.py:3197
81083#: view:automated.import.job:0
81084#: selection:automated.import.job,state:0
81085#: code:addons/sale_override/sale.py:176
81086#: code:addons/sale_override/sale.py:371
81087#: code:addons/sale_override/sale.py:372
81088#: code:addons/sale_override/sale.py:377
81089#: code:addons/sale_override/sale.py:378
81090#: code:addons/sale_override/sale.py:1483
81091#: code:addons/sale_override/sale.py:2035
81092#: code:addons/sale_override/sale.py:2244
81093#: code:addons/sale_override/sale.py:2506
81094#: code:addons/sale_override/sale.py:2578
81095#: view:sale.order.sourcing.progress:0
81096#: selection:sale.followup.multi.wizard,state:0
81097#: selection:sync.monitor,state:0
81098#: selection:tender.line,line_state:0
81099#: selection:msf.import.export,state:0
80950#: selection:wizard.import.invoice.line,state:081100#: selection:wizard.import.invoice.line,state:0
80951#: selection:hr.payroll.validation,state:081101#: selection:hr.payroll.validation,state:0
80952msgid "Done"81102msgid "Done"
@@ -83695,6 +83845,7 @@
8369583845
83696#. module: msf_doc_import83846#. module: msf_doc_import
83697#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:31283847#: code:addons/msf_doc_import/wizard/wizard_import_batch.py:312
83848#: code:addons/msf_doc_import/msf_import_export.py:692
83698#, python-format83849#, python-format
83699msgid "(see error messages below)"83850msgid "(see error messages below)"
83700msgstr "(voir les erreurs ci-dessous)"83851msgstr "(voir les erreurs ci-dessous)"
@@ -84421,7 +84572,7 @@
84421#: code:addons/msf_doc_import/wizard/abstract_wizard_import.py:35484572#: code:addons/msf_doc_import/wizard/abstract_wizard_import.py:354
84422#, python-format84573#, python-format
84423msgid "Import can be run only on draft wizard."84574msgid "Import can be run only on draft wizard."
84424msgstr "L'important ne peut être effectué que sur des assistants en état 'Non démarré'"84575msgstr "L'importation ne peut être effectuée que sur des assistants en état 'Non démarré'"
8442584576
84426#. module: account_payment84577#. module: account_payment
84427#: field:payment.line,currency:084578#: field:payment.line,currency:0
@@ -91108,6 +91259,7 @@
91108#: field:local.transport.cost.report,func_currency_id:091259#: field:local.transport.cost.report,func_currency_id:0
91109#: field:local.transport.cost.report,transport_currency_id:091260#: field:local.transport.cost.report,transport_currency_id:0
91110#: field:purchase.order,transport_currency_id:091261#: field:purchase.order,transport_currency_id:0
91262#: code:addons/msf_doc_import/msf_import_export_conf.py:86
91111#: report:allocation.invoices.report:091263#: report:allocation.invoices.report:0
91112#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:23891264#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:238
91113#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:24591265#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:245
@@ -92693,51 +92845,6 @@
92693msgid "Patches marked as 'not-installed' must have an emission date"92845msgid "Patches marked as 'not-installed' must have an emission date"
92694msgstr "Patches marked as 'not-installed' must have an emission date"92846msgstr "Patches marked as 'not-installed' must have an emission date"
9269592847
92696#. modules: register_accounting, msf_outgoing, product_attributes, import_data, stock_override, consumption_calculation, specific_rules, kit, account_override, procurement, base, msf_doc_import
92697#: report:allocation.invoices.report:0
92698#: selection:res.request,ref_doc1:0
92699#: selection:res.request,ref_doc2:0
92700#: field:product.history.consumption.product,product_id:0
92701#: selection:import_category,object:0
92702#: selection:import_nomenclature,object:0
92703#: report:kit.report:0
92704#: report:addons/msf_doc_import/report/in_simulation_screen_xls_report.mako:149
92705#: report:addons/msf_doc_import/report/in_simulation_screen_xls_report.mako:158
92706#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:230
92707#: report:addons/msf_doc_import/report/po_simulation_screen_xls_report.mako:241
92708#: report:po.simulation.screen:0
92709#: field:product.product.import.line.qty,product_id:0
92710#: field:wizard.import.in.line.simulation.screen,imp_product_id:0
92711#: field:wizard.import.in.line.simulation.screen,move_product_id:0
92712#: field:wizard.import.po.simulation.screen.line,imp_product_id:0
92713#: field:wizard.import.po.simulation.screen.line,in_product_id:0
92714#: view:create.picking.move.processor:0
92715#: field:create.picking.move.processor,product_id:0
92716#: view:internal.move.processor:0
92717#: field:internal.move.processor,product_id:0
92718#: view:outgoing.delivery.move.processor:0
92719#: field:outgoing.delivery.move.processor,product_id:0
92720#: view:ppl.move.processor:0
92721#: field:ppl.move.processor,product_id:0
92722#: view:return.ppl.move.processor:0
92723#: field:return.ppl.move.processor,product_id:0
92724#: view:stock.move.in.processor:0
92725#: field:stock.move.in.processor,product_id:0
92726#: view:stock.move.processor:0
92727#: field:stock.move.processor,product_id:0
92728#: view:validate.move.processor:0
92729#: field:validate.move.processor,product_id:0
92730#: field:stock.warehouse.orderpoint.line,product_id:0
92731#: view:product.where.used:0
92732#: field:product.where.used,product_id:0
92733#: field:standard.price.track.changes,product_id:0
92734#: field:account.direct.invoice.wizard.line,product_id:0
92735#: field:unconsistent.stock.report.line,product_id:0
92736#: view:stock.card.wizard:0
92737#: field:stock.card.wizard,product_id:0
92738msgid "Product"
92739msgstr "Product"
92740
92741#. module: report_webkit92848#. module: report_webkit
92742#: view:ir.header_webkit:092849#: view:ir.header_webkit:0
92743msgid "Content and styling"92850msgid "Content and styling"
@@ -92870,7 +92977,7 @@
92870msgid "SQL Constraint"92977msgid "SQL Constraint"
92871msgstr "Contrainte SQL"92978msgstr "Contrainte SQL"
9287292979
92873#. modules: hr, base, msf_homere_interface92980#. modules: hr, base, msf_homere_interface, msf_doc_import
92874#: model:ir.actions.act_window,name:base.action_partner_employee_form92981#: model:ir.actions.act_window,name:base.action_partner_employee_form
92875#: view:hr.employee:092982#: view:hr.employee:0
92876#: field:hr.job,employee_ids:092983#: field:hr.job,employee_ids:0
@@ -92880,6 +92987,7 @@
92880#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my92987#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my
92881#: model:ir.ui.menu,name:hr.menu_view_employee_category_configuration_form92988#: model:ir.ui.menu,name:hr.menu_view_employee_category_configuration_form
92882#: view:hr.employee:092989#: view:hr.employee:0
92990#: code:addons/msf_doc_import/msf_import_export_conf.py:76
92883msgid "Employees"92991msgid "Employees"
92884msgstr "Employé(e)s"92992msgstr "Employé(e)s"
9288592993
@@ -95260,11 +95368,11 @@
95260msgid "GRAND TOTAL"95368msgid "GRAND TOTAL"
95261msgstr "GRAND TOTAL"95369msgstr "GRAND TOTAL"
9526295370
95263#. module: msf_field_access_rights95371#. module: msf_field_access_right
95264#: model:ir.model,name:msf_field_access_rights.model_msf_field_access_rights_field_access_rule_line95372#: model:ir.model,name:msf_field_access_rights.model_msf_field_access_rights_field_access_rule_line
95265#: view:msf_field_access_rights.field_access_rule_line:095373#: view:msf_field_access_rights.field_access_rule_line:0
95266msgid "Field Access Rule Line"95374msgid "Field Access Rule Line"
95267msgstr "Field Access Rule Line"95375msgstr "Ligne de Règle d'Accès au Champs"
9526895376
95269#. module: account_mcdb95377#. module: account_mcdb
95270#: view:account.mcdb:095378#: view:account.mcdb:0
@@ -98029,6 +98137,166 @@
98029msgid "Article must be used only in a properly designed programme, need a more detailed description."98137msgid "Article must be used only in a properly designed programme, need a more detailed description."
98030msgstr "L'article doit être uniquement utilisé dans un programme correctement construit, à besoin d'une description plus détaillée."98138msgstr "L'article doit être uniquement utilisé dans un programme correctement construit, à besoin d'une description plus détaillée."
9803198139
98140#. module: msf_doc_import
98141#: model:ir.actions.report.xml,name:msf_doc_import.wizard_export_generic
98142msgid "Generic Export"
98143msgstr "Export Générique"
98144
98145#. module: msf_doc_import
98146#: field:msf.import.export,model_list_selection:0
98147msgid "Object to Import/Export"
98148msgstr "Objet à Importer/Exporter"
98149
98150#. module: msf_doc_import
98151#: field:msf.import.export,import_file:0
98152msgid "File to import .xml"
98153msgstr "Fichier à importer .xml"
98154
98155#. module: msf_doc_import
98156#: code:addons/msf_doc_import/msf_import_export.py:93
98157#, python-format
98158msgid "%s_Import_Template"
98159msgstr "%s_Modèle_d_import"
98160
98161#. module: msf_doc_import
98162#: code:addons/msf_doc_import/msf_import_export.py:198
98163#: code:addons/msf_doc_import/msf_import_export.py:322
98164#, python-format
98165msgid "field '%s' not found for model '%s'. Please contact the support team."
98166msgstr "champ '%s' non trouvé pour le modèle '%s'. Veuillez contacter l'équipe support."
98167
98168#. module: msf_doc_import
98169#: code:addons/msf_doc_import/msf_import_export.py:112
98170#, python-format
98171msgid "Selection '%s' not found. Please contact the support team."
98172msgstr "Sélection '%s' non trouvée. Veuillez contacter l'équipe support."
98173
98174#. module: msf_doc_import
98175#: code:addons/msf_doc_import/msf_import_export.py:117
98176#, python-format
98177msgid "The header_list for report '%s' is not defined. Please contact the support team."
98178msgstr "La liste des entêtes pour le rapport '%s' n'est pas définie. Veuillez contacter l'équipe support."
98179
98180#. module: msf_doc_import
98181#: code:addons/msf_doc_import/msf_import_export.py:264
98182#, python-format
98183msgid "File structure is incorrect, please correct. You may generate a template with the File export functionality."
98184msgstr "La structure du fichier est incorrecte, veuillez corriger. Vous pouvez générer un modèle avec la fonctionnalité d'exportation de modèle."
98185
98186#. module: msf_doc_import
98187#: code:addons/msf_doc_import/msf_import_export.py:272
98188#, python-format
98189msgid "File structure is correct."
98190msgstr "La structure du fichier est correcte."
98191
98192#. module: msf_doc_import
98193#: code:addons/msf_doc_import/msf_import_export.py:325
98194#, python-format
98195msgid "Column %s: get '%s' expected '%s'."
98196msgstr "Colonne %s: reçu '%s' attendu '%s'."
98197
98198#. module: msf_doc_import
98199#: code:addons/msf_doc_import/msf_import_export.py:328
98200#, python-format
98201msgid "The following columns are missing in the imported file:\n"
98202"%s"
98203msgstr "Les colonnes suivantes sont manquantes dans le fichier importé :\n"
98204"%s"
98205
98206#. module: msf_doc_import
98207#: code:addons/msf_doc_import/msf_import_export_conf.py:37
98208#, python-format
98209msgid "Product Categories"
98210msgstr "Catégories Produit"
98211
98212#. module: msf_doc_import
98213#: model:ir.actions.act_window,name:msf_doc_import.msf_import_export_non_functional_action
98214#: model:ir.ui.menu,name:msf_doc_import.msf_import_export_non_functional_menu
98215msgid "Non Functional"
98216msgstr "Non Functionnel"
98217
98218#. module: msf_doc_import
98219#: code:addons/msf_doc_import/msf_import_export_conf.py:48
98220#, python-format
98221msgid "Supplier Catalogues"
98222msgstr "Catalogues Fournisseur"
98223
98224#. module: msf_doc_import
98225#: view:msf.import.export:0
98226#: field:msf.import.export,display_file_import:0
98227msgid "File Import"
98228msgstr "Import Fichier"
98229
98230#. module: msf_doc_import
98231#: view:msf.import.export:0
98232#: field:msf.import.export,display_file_export:0
98233msgid "File Export"
98234msgstr "Export Fichier"
98235
98236#. module: msf_doc_import
98237#: view:msf.import.export:0
98238msgid "Export empty template"
98239msgstr "Exporter un modèle vide"
98240
98241#. module: msf_doc_import
98242#: view:msf.import.export:0
98243msgid "Export first 3 entries"
98244msgstr "Exporter les 3 premières entrées"
98245
98246#. module: msf_doc_import
98247#: view:msf.import.export:0
98248msgid "Export all data"
98249msgstr "Exporter toutes les données"
98250
98251#. module: msf_doc_import
98252#: code:addons/msf_doc_import/msf_import_export_conf.py:56
98253#, python-format
98254msgid "GL Accounts"
98255msgstr "Comptes"
98256
98257#. module: msf_doc_import
98258#: code:addons/msf_doc_import/msf_import_export_conf.py:61
98259#, python-format
98260msgid "GL Journals"
98261msgstr "Journaux"
98262
98263#. module: msf_doc_import
98264#: view:msf.import.export:0
98265msgid "Test file"
98266msgstr "Tester le fichier"
98267
98268#. module: msf_doc_import
98269#: view:msf.import.export:0
98270#: view:wizard.import.batch:0
98271msgid "Download template file"
98272msgstr "Télécharger un fichier modèle"
98273
98274#. module: msf_homere_interface
98275#: code:addons/msf_homere_interface/hr.py:137
98276#, python-format
98277msgid "Some employees have the same unique code: %s"
98278msgstr "Certains employés ont le même code unique : %s"
98279
98280#. modules: msf_doc_import
98281#: code:addons/msf_doc_import/msf_import_export_conf.py:86
98282msgid "Currency"
98283msgstr "Devise"
98284
98285#. modules: msf_doc_import
98286#: code:addons/msf_doc_import/msf_import_export_conf.py:99
98287msgid "User Access"
98288msgstr "Accès utilisateur"
98289
98290#. modules: msf_doc_import
98291#: code:addons/msf_doc_import/msf_import_export_conf.py:99
98292msgid "User Groups"
98293msgstr "Groupes utilisateur"
98294
98295#. modules: msf_doc_import
98296#: code:addons/msf_doc_import/msf_import_export_conf.py:99
98297msgid "Currencies Rates"
98298msgstr "Taux des Devises"
98299
98032#. module: account98300#. module: account
98033#: code:addons/account/report/common_report_header.py:13698301#: code:addons/account/report/common_report_header.py:136
98034#, python-format98302#, python-format
9803598303
=== modified file 'bin/addons/product_nomenclature/product_nomenclature.py'
--- bin/addons/product_nomenclature/product_nomenclature.py 2017-05-29 14:06:25 +0000
+++ bin/addons/product_nomenclature/product_nomenclature.py 2017-09-12 08:08:04 +0000
@@ -821,7 +821,7 @@
821 4. duplication from GUI: the default code XXX is saved, then modify in the write821 4. duplication from GUI: the default code XXX is saved, then modify in the write
822 '''822 '''
823 # The first 2 cases: dup of default_code/xmlid_code not allow823 # The first 2 cases: dup of default_code/xmlid_code not allow
824 if context.get('from_import_menu') or context.get('sync_update_execution', False):824 if context.get('sync_update_execution', False):
825 if not default_code or not vals.get('xmlid_code', False):825 if not default_code or not vals.get('xmlid_code', False):
826 raise Exception, "Problem creating product: Missing xmlid_code/default_code in the data"826 raise Exception, "Problem creating product: Missing xmlid_code/default_code in the data"
827 if not vals.get('xmlid_code'):827 if not vals.get('xmlid_code'):
828828
=== modified file 'bin/osv/orm.py'
--- bin/osv/orm.py 2017-08-18 14:26:52 +0000
+++ bin/osv/orm.py 2017-09-12 08:08:04 +0000
@@ -675,10 +675,18 @@
675 elif f[i] in self._inherit_fields.keys():675 elif f[i] in self._inherit_fields.keys():
676 cols = selection_field(self._inherits)676 cols = selection_field(self._inherits)
677 if cols and cols._type == 'selection' and not sync_context:677 if cols and cols._type == 'selection' and not sync_context:
678 sel_list = cols.selection678 # if requested, translate the fields.selection values
679 if r and type(sel_list) == type([]):679 translated_selection = False
680 r = [x[1] for x in sel_list if r==x[0]]680 if context.get('translate_selection_field', False) and r and f:
681 r = r and r[0] or False681 fields_get_res = self.fields_get(cr, uid, f, context=context)
682 if f[0] in fields_get_res and 'selection' in fields_get_res[f[0]]:
683 r = dict(fields_get_res[f[0]]['selection'])[r]
684 translated_selection = True
685 if not translated_selection:
686 sel_list = cols.selection
687 if r and type(sel_list) == type([]):
688 r = [x[1] for x in sel_list if r==x[0]]
689 r = r and r[0] or False
682 if not r:690 if not r:
683 if f[i] in self._columns:691 if f[i] in self._columns:
684 r = check_type(self._columns[f[i]]._type)692 r = check_type(self._columns[f[i]]._type)
@@ -935,7 +943,14 @@
935 if field_type not in ('one2many', 'many2one', 'many2many',943 if field_type not in ('one2many', 'many2one', 'many2many',
936 'integer', 'boolean', 'float', 'selection',944 'integer', 'boolean', 'float', 'selection',
937 'reference'):945 'reference'):
938 res = value946 if not context.get('sync_update_execution', False) and\
947 field_type == 'char' and isinstance(value, basestring) \
948 and len(value.splitlines()) > 1:
949 # US-2661 do not allowed newline character in char fields
950 res = False
951 warning += [_("New line characters in the field '%s' not allowed. Please fix entry :\n'%s'") % (field[len(prefix)], value)]
952 else:
953 res = value
939 elif field_type == 'one2many':954 elif field_type == 'one2many':
940 if field[len(prefix)] in done:955 if field[len(prefix)] in done:
941 continue956 continue
@@ -1033,27 +1048,40 @@
10331048
1034 from osv import except_osv1049 from osv import except_osv
1035 position = 01050 position = 0
1051 error_list = []
1036 while position<len(datas):1052 while position<len(datas):
1037 res = {}1053 res = {}
10381054
1039 (res, position, warning, res_id, xml_id) = \1055 (res, position, warning, res_id, xml_id) = \
1040 process_liness(self, datas, [], current_module, self._name, fields_def, position=position)1056 process_liness(self, datas, [], current_module, self._name, fields_def, position=position)
1041 if len(warning):1057 if len(warning):
1042 cr.rollback()1058 if not context.get('sync_update_execution', False):
1043 return (-1, res, 'Line ' + str(position) +' : ' + '!\n'.join(warning), '')1059 error_list.append(_('Line %s: %s') % (str(position), '\n'.join(warning)))
1060 continue
1061 else:
1062 cr.rollback()
1063 return (-1, res, 'Line ' + str(position) +' : ' + '!\n'.join(warning), '')
10441064
1045 try:1065 try:
1046 ir_model_data_obj._update(cr, uid, self._name,1066 ir_model_data_obj._update(cr, uid, self._name,
1047 current_module, res, mode=mode, xml_id=xml_id,1067 current_module, res, mode=mode, xml_id=xml_id,
1048 noupdate=noupdate, res_id=res_id, context=context)1068 noupdate=noupdate, res_id=res_id, context=context)
1049 except except_osv, e:1069 except except_osv, e:
1050 cr.rollback()1070 if not context.get('sync_update_execution', False):
1051 return (-1, res, 'Line ' + str(position) +' : ' + tools.ustr(e.value), '')1071 error_list.append(_('Line %s: %s') % (str(position), tools.ustr(e.value)))
1072 continue
1073 else:
1074 cr.rollback()
1075 return (-1, res, 'Line ' + str(position) +' : ' + tools.ustr(e.value), '')
1052 except Exception, e:1076 except Exception, e:
1053 #US-88: If this from an import account analytic, and there is sql error, AND not sync context, then just clear the cache1077 #US-88: If this from an import account analytic, and there is sql error, AND not sync context, then just clear the cache
1054 if 'account.analytic.account' in self._name and not context.get('sync_update_execution', False):1078 if 'account.analytic.account' in self._name and not context.get('sync_update_execution', False):
1055 cache.clean_caches_for_db(cr.dbname)1079 cache.clean_caches_for_db(cr.dbname)
1056 return (-1, res, 'Line ' + str(position) +' : ' + tools.ustr(e) + "\n" + tools.ustr(traceback.format_exc()), '')1080 if not context.get('sync_update_execution', False):
1081 error_list.append(_('Line %s: %s') % (str(position), tools.ustr(e) + "\n" + tools.ustr(traceback.format_exc())))
1082 continue
1083 else:
1084 return (-1, res, 'Line ' + str(position) +' : ' + tools.ustr(e) + "\n" + tools.ustr(traceback.format_exc()), '')
10571085
1058 if config.get('import_partial', False) and filename and (not (position%100)):1086 if config.get('import_partial', False) and filename and (not (position%100)):
1059 data = pickle.load(file(config.get('import_partial')))1087 data = pickle.load(file(config.get('import_partial')))
@@ -1062,6 +1090,9 @@
1062 if context.get('defer_parent_store_computation'):1090 if context.get('defer_parent_store_computation'):
1063 self._parent_store_compute(cr)1091 self._parent_store_compute(cr)
1064 cr.commit()1092 cr.commit()
1093 if not context.get('sync_update_execution', False) and error_list:
1094 cr.rollback()
1095 return (-1, {}, '\n'.join(error_list), '')
10651096
1066 if context.get('defer_parent_store_computation'):1097 if context.get('defer_parent_store_computation'):
1067 self._parent_store_compute(cr)1098 self._parent_store_compute(cr)

Subscribers

People subscribed via source and target branches