Merge lp:~savoirfairelinux-openerp/partner-contact-management/partner-contact-management-base_contact_add_modules into lp:~partner-contact-core-editors/partner-contact-management/7.0

Status: Needs review
Proposed branch: lp:~savoirfairelinux-openerp/partner-contact-management/partner-contact-management-base_contact_add_modules
Merge into: lp:~partner-contact-core-editors/partner-contact-management/7.0
Diff against target: 2416 lines (+2295/-0)
23 files modified
base_contact_by_functions/__init__.py (+27/-0)
base_contact_by_functions/__openerp__.py (+56/-0)
base_contact_by_functions/functions.py (+41/-0)
base_contact_by_functions/functions_view.xml (+38/-0)
base_contact_by_functions/i18n/base_contact_by_functions.pot (+353/-0)
base_contact_by_functions/i18n/fr.po (+353/-0)
base_contact_by_functions/res_institutions.py (+49/-0)
base_contact_by_functions/res_institutions_view.xml (+55/-0)
base_contact_by_functions/res_partner.py (+102/-0)
base_contact_by_functions/res_partner_view.xml (+526/-0)
base_contact_by_functions/security/ir.model.access.csv (+5/-0)
base_contact_by_functions/tests/__init__.py (+31/-0)
base_contact_by_functions/tests/test_functions.py (+98/-0)
base_contact_by_functions/tests/test_institutions.py (+99/-0)
base_contact_by_functions/tests/test_partner_category.py (+105/-0)
base_contact_by_functions_partner_firstname/__init__.py (+25/-0)
base_contact_by_functions_partner_firstname/__openerp__.py (+53/-0)
base_contact_by_functions_partner_firstname/i18n/base_contact_by_functions_partner_firstname.pot (+27/-0)
base_contact_by_functions_partner_firstname/i18n/fr.po (+27/-0)
base_contact_by_functions_partner_firstname/res_partner.py (+76/-0)
base_contact_by_functions_partner_firstname/res_partner_view.xml (+71/-0)
base_contact_by_functions_partner_firstname/tests/__init__.py (+27/-0)
base_contact_by_functions_partner_firstname/tests/test_partner.py (+51/-0)
To merge this branch: bzr merge lp:~savoirfairelinux-openerp/partner-contact-management/partner-contact-management-base_contact_add_modules
Reviewer Review Type Date Requested Status
Lorenzo Battistini (community) Needs Resubmitting
Stefan Rijnhart (Opener) Needs Information
Sandy Carter (http://www.savoirfairelinux.com) Abstain
Review via email: mp+217775@code.launchpad.net

This proposal supersedes a proposal from 2014-01-30.

Description of the change

- [ADD] added base_contact_by_functions module: It allow to manage contacts by function"
- [ADD] Added base_contact_by_functions_partner_firstname module: It allows to add firstname before name.Name is considered like the lastname and we have firstname and lastname on partner view and contact view."
The base_contact_by_functions_partner_firstname module depends on partner_firstname and base_contact_by_functions module.

To post a comment you must log in.
Revision history for this message
Sandy Carter (http://www.savoirfairelinux.com) (sandy-carter) : Posted in a previous version of this proposal
review: Approve
Revision history for this message
Sandy Carter (http://www.savoirfairelinux.com) (sandy-carter) :
review: Abstain
Revision history for this message
Stefan Rijnhart (Opener) (stefan-opener) wrote :

I have a hard time trying to find out what this module actually does. The manifest description is very terse. The name of the module reminds me of base_contact, which allowed multiple connections between the same person and a company. Is this module similar? The description should at least explain what 'institutions' are (a concept that this module introduces).

Terminology is off at times, it seems. l.130: 'acronym': is this abbreviation, or maybe stick to the standard 'code' field name and label?

Organism: I'm guessing you mean organization. But in any case, changing the 'company' terminology should be split off as a separate module.

The translations seem to contain obsolete terms, e.g. l.241 and other occurrences of 'passport'.

review: Needs Information
Revision history for this message
Sandy Carter (http://www.savoirfairelinux.com) (sandy-carter) wrote :

This is for cases where one partner (Mike Fletcher President of Agrolait) can be part of another company (Mike Fletcher VP of AsusTEK) in a different function.

The module helps track these functions.

Revision history for this message
Lorenzo Battistini (elbati) wrote :

This project is now hosted on https://github.com/OCA/partner-contact. Please move your proposal there. This guide may help you https://github.com/OCA/maintainers-tools/wiki/How-to-move-a-Merge-Proposal-to-GitHub

review: Needs Resubmitting

Unmerged revisions

46. By Sandy Carter (http://www.savoirfairelinux.com)

Fix KeyError which sometimes arises when installing modules.

Assert that contact_id exists in vals

45. By Sandy Carter (http://www.savoirfairelinux.com)

Fix error when creating partner with contact info

44. By Sandy Carter (http://www.savoirfairelinux.com)

adapt module for community firstname module

43. By El Hadji Dem (http://www.savoirfairelinux.com)

[IMP] is_company field is True by default and replace Organism by Parent Organism in form view

42. By El Hadji Dem (http://www.savoirfairelinux.com)

[ADD] added base_contact_by_functions_partner_firstname module: It allows to add firstname before name.Name is considered like the lastname and we have firstname and lastname on partner view and contact view.

41. By El Hadji Dem (http://www.savoirfairelinux.com)

[ADD] added base_contact_by_functions module: It allow to manage contacts by function

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'base_contact_by_functions'
2=== added file 'base_contact_by_functions/__init__.py'
3--- base_contact_by_functions/__init__.py 1970-01-01 00:00:00 +0000
4+++ base_contact_by_functions/__init__.py 2014-04-30 15:00:54 +0000
5@@ -0,0 +1,27 @@
6+# -*- encoding: utf-8 -*-
7+##############################################################################
8+#
9+# OpenERP, Open Source Management Solution
10+# This module copyright (C) 2013 Savoir-faire Linux
11+# (<http://www.savoirfairelinux.com>).
12+#
13+# This program is free software: you can redistribute it and/or modify
14+# it under the terms of the GNU Affero General Public License as
15+# published by the Free Software Foundation, either version 3 of the
16+# License, or (at your option) any later version.
17+#
18+# This program is distributed in the hope that it will be useful,
19+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21+# GNU Affero General Public License for more details.
22+#
23+# You should have received a copy of the GNU Affero General Public License
24+# along with this program. If not, see <http://www.gnu.org/licenses/>.
25+#
26+##############################################################################
27+
28+from . import res_partner
29+from . import functions
30+from . import res_institutions
31+
32+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
33
34=== added file 'base_contact_by_functions/__openerp__.py'
35--- base_contact_by_functions/__openerp__.py 1970-01-01 00:00:00 +0000
36+++ base_contact_by_functions/__openerp__.py 2014-04-30 15:00:54 +0000
37@@ -0,0 +1,56 @@
38+# -*- encoding: utf-8 -*-
39+##############################################################################
40+#
41+# OpenERP, Open Source Management Solution
42+# This module copyright (C) 2013 Savoir-faire Linux
43+# (<http://www.savoirfairelinux.com>).
44+#
45+# This program is free software: you can redistribute it and/or modify
46+# it under the terms of the GNU Affero General Public License as
47+# published by the Free Software Foundation, either version 3 of the
48+# License, or (at your option) any later version.
49+#
50+# This program is distributed in the hope that it will be useful,
51+# but WITHOUT ANY WARRANTY; without even the implied warranty of
52+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53+# GNU Affero General Public License for more details.
54+#
55+# You should have received a copy of the GNU Affero General Public License
56+# along with this program. If not, see <http://www.gnu.org/licenses/>.
57+#
58+##############################################################################
59+
60+{
61+ 'name': 'Contacts by Functions',
62+ 'version': '0.1',
63+ 'author': 'Savoir-faire Linux',
64+ 'maintainer': 'Savoir-faire Linux',
65+ 'website': 'http://www.savoirfairelinux.com',
66+ 'category': 'Customer Relationship Management',
67+ 'description': """
68+Contacts by Functions
69+=====================
70+
71+This module allows you to manage contacts by functions
72+
73+Contributors
74+------------
75+* EL Hadji Dem (elhadji.dem@savoirfairelinux.com)
76+""",
77+ 'depends': [
78+ 'base_contact',
79+ ],
80+ 'external_dependencies': {},
81+ 'data': [
82+ 'functions_view.xml',
83+ 'res_institutions_view.xml',
84+ 'res_partner_view.xml',
85+ 'security/ir.model.access.csv',
86+ ],
87+ 'demo': [],
88+ 'test': [],
89+ 'installable': True,
90+ 'active': False,
91+}
92+
93+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
94
95=== added file 'base_contact_by_functions/functions.py'
96--- base_contact_by_functions/functions.py 1970-01-01 00:00:00 +0000
97+++ base_contact_by_functions/functions.py 2014-04-30 15:00:54 +0000
98@@ -0,0 +1,41 @@
99+# -*- encoding: utf-8 -*-
100+##############################################################################
101+#
102+# OpenERP, Open Source Management Solution
103+# This module copyright (C) 2013 Savoir-faire Linux
104+# (<http://www.savoirfairelinux.com>).
105+#
106+# This program is free software: you can redistribute it and/or modify
107+# it under the terms of the GNU Affero General Public License as
108+# published by the Free Software Foundation, either version 3 of the
109+# License, or (at your option) any later version.
110+#
111+# This program is distributed in the hope that it will be useful,
112+# but WITHOUT ANY WARRANTY; without even the implied warranty of
113+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
114+# GNU Affero General Public License for more details.
115+#
116+# You should have received a copy of the GNU Affero General Public License
117+# along with this program. If not, see <http://www.gnu.org/licenses/>.
118+#
119+##############################################################################
120+
121+from openerp.osv import fields, orm
122+
123+
124+class functions(orm.Model):
125+ _description = 'Functions'
126+ _name = 'functions'
127+ _columns = {
128+ 'name': fields.char('Name', size=256, required=True, select=True,
129+ help='Name of function.'),
130+ 'acronym': fields.char('Acronym', size=50, help='Acronym of function.'),
131+ 'partner_ids': fields.many2many('res.partner',
132+ 'function_partner_rel',
133+ 'function_id',
134+ 'partner_id',
135+ 'Functions'),
136+ 'institution_id': fields.many2one("res.institution", 'institution'),
137+ }
138+
139+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
140
141=== added file 'base_contact_by_functions/functions_view.xml'
142--- base_contact_by_functions/functions_view.xml 1970-01-01 00:00:00 +0000
143+++ base_contact_by_functions/functions_view.xml 2014-04-30 15:00:54 +0000
144@@ -0,0 +1,38 @@
145+<?xml version="1.0" ?>
146+<openerp>
147+ <data>
148+ <!-- Tree Views functions-->
149+ <record model="ir.ui.view" id="functions_tree_view">
150+ <field name="name">Functions Tree View</field>
151+ <field name="model">functions</field>
152+ <field name="type">tree</field>
153+ <field name="arch" type="xml">
154+ <tree string="FunctionsTree" version="7.0">
155+ <field name="name"/>
156+ <field name="acronym"/>
157+ </tree>
158+ </field>
159+ </record>
160+ <!-- Form Views functions-->
161+ <record model="ir.ui.view" id="functions_form_view">
162+ <field name="name">Functions Form View</field>
163+ <field name="model">functions</field>
164+ <field name="type">form</field>
165+ <field name="arch" type="xml">
166+ <form string="FunctionsForm" version="7.0" >
167+ <group col="4">
168+ <field name="name"/>
169+ <field name="acronym"/>
170+ </group>
171+ </form>
172+ </field>
173+ </record>
174+ <!-- Actions -->
175+ <record model="ir.actions.act_window" id="action_functions_tree_list">
176+ <field name="name">Functions</field>
177+ <field name="view_id" ref="functions_tree_view"/>
178+ <field name="res_model">functions</field>
179+ <field name="view_mode">tree,form</field>
180+ </record>
181+ </data>
182+</openerp>
183
184=== added directory 'base_contact_by_functions/i18n'
185=== added file 'base_contact_by_functions/i18n/base_contact_by_functions.pot'
186--- base_contact_by_functions/i18n/base_contact_by_functions.pot 1970-01-01 00:00:00 +0000
187+++ base_contact_by_functions/i18n/base_contact_by_functions.pot 2014-04-30 15:00:54 +0000
188@@ -0,0 +1,353 @@
189+# Translation of OpenERP Server.
190+# This file contains the translation of the following modules:
191+# * base_contact_by_functions
192+#
193+msgid ""
194+msgstr ""
195+"Project-Id-Version: OpenERP Server 7.0\n"
196+"Report-Msgid-Bugs-To: \n"
197+"POT-Creation-Date: 2014-01-28 22:15+0000\n"
198+"PO-Revision-Date: 2014-01-28 17:15-0500\n"
199+"Last-Translator: EL Hadji DEM <elhadji.dem@savoirfairelinux.com>\n"
200+"Language-Team: \n"
201+"MIME-Version: 1.0\n"
202+"Content-Type: text/plain; charset=UTF-8\n"
203+"Content-Transfer-Encoding: 8bit\n"
204+"Plural-Forms: \n"
205+"X-Generator: Poedit 1.5.4\n"
206+
207+#. module: base_contact_by_functions
208+#: field:res.category.functions,category_id:0
209+msgid "Category"
210+msgstr ""
211+
212+#. module: base_contact_by_functions
213+#: view:res.partner:0
214+msgid "City"
215+msgstr ""
216+
217+#. module: base_contact_by_functions
218+#: field:functions,partner_ids:0
219+#: model:ir.actions.act_window,name:base_contact_by_functions.action_functions_tree_list
220+#: model:ir.model,name:base_contact_by_functions.model_functions
221+#: field:res.category.functions,functions_id:0 view:res.institution:0
222+#: field:res.institution,institutionfunction_ids:0
223+#: field:res.institution.functions,functions_id:0 view:res.partner:0
224+#: field:res.partner,functions_ids:0 view:res.partner.category:0
225+#: field:res.partner.category,categoryfunction_ids:0
226+msgid "Functions"
227+msgstr ""
228+
229+#. module: base_contact_by_functions
230+#: view:res.partner:0
231+msgid "History (Functions)"
232+msgstr ""
233+
234+#. module: base_contact_by_functions
235+#: model:ir.model,name:base_contact_by_functions.model_res_institution_functions
236+msgid "Institutions functions"
237+msgstr ""
238+
239+#. module: base_contact_by_functions
240+#: help:res.partner,delivered_country:0
241+msgid "Country for which a passport is delivered"
242+msgstr ""
243+
244+#. module: base_contact_by_functions
245+#: model:ir.actions.act_window,name:base_contact_by_functions.action_partner_contact_form
246+msgid "Contacts"
247+msgstr ""
248+
249+#. module: base_contact_by_functions
250+#: view:res.partner:0
251+msgid "Street..."
252+msgstr ""
253+
254+#. module: base_contact_by_functions
255+#: view:res.institution:0
256+msgid "Add functions for this institution"
257+msgstr ""
258+
259+#. module: base_contact_by_functions
260+#: view:functions:0 view:res.institution:0 view:res.partner.category:0
261+msgid "FunctionsTree"
262+msgstr ""
263+
264+#. module: base_contact_by_functions
265+#: sql_constraint:res.institution:0
266+msgid "Name already exists"
267+msgstr ""
268+
269+#. module: base_contact_by_functions
270+#: view:res.partner:0
271+msgid "State"
272+msgstr ""
273+
274+#. module: base_contact_by_functions
275+#: help:res.category.functions,sequence:0
276+#: help:res.institution.functions,sequence:0
277+msgid "Used to order"
278+msgstr ""
279+
280+#. module: base_contact_by_functions
281+#: view:functions:0 view:res.institution:0 view:res.partner.category:0
282+msgid "FunctionsForm"
283+msgstr ""
284+
285+#. module: base_contact_by_functions
286+#: view:res.partner:0
287+msgid "e.g. Sales Director"
288+msgstr ""
289+
290+#. module: base_contact_by_functions
291+#: help:functions,acronym:0
292+msgid "Acronym of function."
293+msgstr ""
294+
295+#. module: base_contact_by_functions
296+#: view:res.partner:0
297+msgid "Tags..."
298+msgstr ""
299+
300+#. module: base_contact_by_functions
301+#: field:res.partner,start_date:0
302+msgid "Start date"
303+msgstr ""
304+
305+#. module: base_contact_by_functions
306+#: view:res.institution:0
307+msgid "InstitutionsForm"
308+msgstr ""
309+
310+#. module: base_contact_by_functions
311+#: view:res.partner:0
312+msgid "Fax:"
313+msgstr ""
314+
315+#. module: base_contact_by_functions
316+#: field:res.partner,expiration_date:0
317+msgid "Expiration date"
318+msgstr ""
319+
320+#. module: base_contact_by_functions
321+#: view:res.partner:0
322+msgid "Function"
323+msgstr ""
324+
325+#. module: base_contact_by_functions
326+#: view:res.partner:0
327+msgid "Parent Organism"
328+msgstr ""
329+
330+#. module: base_contact_by_functions
331+#: view:res.partner:0
332+msgid "Zip"
333+msgstr ""
334+
335+#. module: base_contact_by_functions
336+#: field:res.partner,delivered_country:0
337+msgid "Country Passport"
338+msgstr ""
339+
340+#. module: base_contact_by_functions
341+#: field:res.partner,other_contact_history_ids:0
342+msgid "unknown"
343+msgstr ""
344+
345+#. module: base_contact_by_functions
346+#: model:ir.actions.act_window,name:base_contact_by_functions.action_partner_customer_form
347+msgid "Company"
348+msgstr ""
349+
350+#. module: base_contact_by_functions
351+#: model:ir.model,name:base_contact_by_functions.model_res_category_functions
352+msgid "Categories functions"
353+msgstr ""
354+
355+#. module: base_contact_by_functions
356+#: help:res.institution,name:0
357+msgid "Name of institution."
358+msgstr ""
359+
360+#. module: base_contact_by_functions
361+#: help:res.partner,naming:0
362+msgid "Naming."
363+msgstr ""
364+
365+#. module: base_contact_by_functions
366+#: view:res.partner:0
367+msgid "Tag"
368+msgstr ""
369+
370+#. module: base_contact_by_functions
371+#: view:res.partner:0
372+msgid "Passport information"
373+msgstr ""
374+
375+#. module: base_contact_by_functions
376+#: view:res.partner:0
377+msgid "Address"
378+msgstr ""
379+
380+#. module: base_contact_by_functions
381+#: view:res.partner:0
382+msgid "Parent organism"
383+msgstr ""
384+
385+#. module: base_contact_by_functions
386+#: view:res.partner:0
387+msgid "have the same form for contact and other postions"
388+msgstr ""
389+
390+#. module: base_contact_by_functions
391+#: view:res.partner:0
392+msgid "Select functions for this organism"
393+msgstr ""
394+
395+#. module: base_contact_by_functions
396+#: view:res.partner:0
397+msgid "Phone:"
398+msgstr ""
399+
400+#. module: base_contact_by_functions
401+#: field:functions,name:0 field:res.institution,name:0
402+msgid "Name"
403+msgstr ""
404+
405+#. module: base_contact_by_functions
406+#: view:res.partner:0
407+msgid "ZIP"
408+msgstr ""
409+
410+#. module: base_contact_by_functions
411+#: view:res.partner:0
412+msgid "Use organism address"
413+msgstr ""
414+
415+#. module: base_contact_by_functions
416+#: view:res.partner:0
417+msgid "Country"
418+msgstr ""
419+
420+#. module: base_contact_by_functions
421+#: field:functions,institution_id:0
422+msgid "institution"
423+msgstr ""
424+
425+#. module: base_contact_by_functions
426+#: view:res.partner:0
427+msgid "Is an Organism"
428+msgstr ""
429+
430+#. module: base_contact_by_functions
431+#: field:res.partner,function_id:0
432+msgid "Position Occupied"
433+msgstr ""
434+
435+#. module: base_contact_by_functions
436+#: view:res.partner:0
437+msgid "Contact"
438+msgstr ""
439+
440+#. module: base_contact_by_functions
441+#: help:res.institution,sequence:0
442+msgid "Used to order the institutions"
443+msgstr ""
444+
445+#. module: base_contact_by_functions
446+#: view:res.partner:0
447+msgid "Mobile:"
448+msgstr ""
449+
450+#. module: base_contact_by_functions
451+#: model:ir.model,name:base_contact_by_functions.model_res_partner_category
452+msgid "Partner Categories"
453+msgstr ""
454+
455+#. module: base_contact_by_functions
456+#: view:res.partner:0
457+msgid "Organism"
458+msgstr ""
459+
460+#. module: base_contact_by_functions
461+#: model:ir.actions.act_window,name:base_contact_by_functions.action_institutions_tree_list
462+#: model:ir.model,name:base_contact_by_functions.model_res_institution
463+#: field:res.institution.functions,institution_id:0
464+msgid "Institutions"
465+msgstr ""
466+
467+#. module: base_contact_by_functions
468+#: view:res.partner:0
469+msgid "History"
470+msgstr ""
471+
472+#. module: base_contact_by_functions
473+#: field:res.partner,end_date:0
474+msgid "End date"
475+msgstr ""
476+
477+#. module: base_contact_by_functions
478+#: view:res.partner.category:0
479+msgid "Add function"
480+msgstr ""
481+
482+#. module: base_contact_by_functions
483+#: view:res.partner:0
484+msgid "Bank Details"
485+msgstr ""
486+
487+#. module: base_contact_by_functions
488+#: view:res.institution:0
489+msgid "InstitutionsTree"
490+msgstr ""
491+
492+#. module: base_contact_by_functions
493+#: field:res.category.functions,sequence:0 field:res.institution,sequence:0
494+#: field:res.institution.functions,sequence:0
495+msgid "Sequence"
496+msgstr ""
497+
498+#. module: base_contact_by_functions
499+#: view:res.partner:0
500+msgid "Bank Accounts"
501+msgstr ""
502+
503+#. module: base_contact_by_functions
504+#: view:res.partner:0
505+msgid "No, Street, Apartment/Office"
506+msgstr ""
507+
508+#. module: base_contact_by_functions
509+#: view:res.partner:0
510+msgid "Use address organism"
511+msgstr ""
512+
513+#. module: base_contact_by_functions
514+#: field:functions,acronym:0
515+msgid "Acronym"
516+msgstr ""
517+
518+#. module: base_contact_by_functions
519+#: help:functions,name:0
520+msgid "Name of function."
521+msgstr ""
522+
523+#. module: base_contact_by_functions
524+#: help:res.partner,passport_number:0
525+msgid "Passport number."
526+msgstr ""
527+
528+#. module: base_contact_by_functions
529+#: field:res.partner,passport_number:0
530+msgid "Passport Number"
531+msgstr ""
532+
533+#. module: base_contact_by_functions
534+#: model:ir.model,name:base_contact_by_functions.model_res_partner
535+msgid "Partner"
536+msgstr ""
537+
538+#. module: base_contact_by_functions
539+#: field:res.partner,naming:0
540+msgid "Naming"
541+msgstr ""
542
543=== added file 'base_contact_by_functions/i18n/fr.po'
544--- base_contact_by_functions/i18n/fr.po 1970-01-01 00:00:00 +0000
545+++ base_contact_by_functions/i18n/fr.po 2014-04-30 15:00:54 +0000
546@@ -0,0 +1,353 @@
547+# Translation of OpenERP Server.
548+# This file contains the translation of the following modules:
549+# * base_contact_by_functions
550+#
551+msgid ""
552+msgstr ""
553+"Project-Id-Version: OpenERP Server 7.0\n"
554+"Report-Msgid-Bugs-To: \n"
555+"POT-Creation-Date: 2014-01-29 15:16+0000\n"
556+"PO-Revision-Date: 2014-01-29 10:19-0500\n"
557+"Last-Translator: EL Hadji DEM <elhadji.dem@savoirfairelinux.com>\n"
558+"Language-Team: \n"
559+"MIME-Version: 1.0\n"
560+"Content-Type: text/plain; charset=UTF-8\n"
561+"Content-Transfer-Encoding: 8bit\n"
562+"Plural-Forms: \n"
563+"X-Generator: Poedit 1.5.4\n"
564+
565+#. module: base_contact_by_functions
566+#: field:res.category.functions,category_id:0
567+msgid "Category"
568+msgstr "Catégorie"
569+
570+#. module: base_contact_by_functions
571+#: view:res.partner:0
572+msgid "City"
573+msgstr "Ville"
574+
575+#. module: base_contact_by_functions
576+#: field:functions,partner_ids:0
577+#: model:ir.actions.act_window,name:base_contact_by_functions.action_functions_tree_list
578+#: model:ir.model,name:base_contact_by_functions.model_functions
579+#: field:res.category.functions,functions_id:0 view:res.institution:0
580+#: field:res.institution,institutionfunction_ids:0
581+#: field:res.institution.functions,functions_id:0 view:res.partner:0
582+#: field:res.partner,functions_ids:0 view:res.partner.category:0
583+#: field:res.partner.category,categoryfunction_ids:0
584+msgid "Functions"
585+msgstr "Fonctions"
586+
587+#. module: base_contact_by_functions
588+#: view:res.partner:0
589+msgid "History (Functions)"
590+msgstr "Historique (Fonctions)"
591+
592+#. module: base_contact_by_functions
593+#: model:ir.model,name:base_contact_by_functions.model_res_institution_functions
594+msgid "Institutions functions"
595+msgstr "Fonctions des institutions"
596+
597+#. module: base_contact_by_functions
598+#: help:res.partner,delivered_country:0
599+msgid "Country for which a passport is delivered"
600+msgstr "Pays pour lequel le passeport est délivré"
601+
602+#. module: base_contact_by_functions
603+#: model:ir.actions.act_window,name:base_contact_by_functions.action_partner_contact_form
604+msgid "Contacts"
605+msgstr "Contacts"
606+
607+#. module: base_contact_by_functions
608+#: view:res.partner:0
609+msgid "Street..."
610+msgstr "Rue..."
611+
612+#. module: base_contact_by_functions
613+#: view:res.institution:0
614+msgid "Add functions for this institution"
615+msgstr "Ajouter des fonctions de cette institution"
616+
617+#. module: base_contact_by_functions
618+#: view:functions:0 view:res.institution:0 view:res.partner.category:0
619+msgid "FunctionsTree"
620+msgstr "FonctionsTree"
621+
622+#. module: base_contact_by_functions
623+#: sql_constraint:res.institution:0
624+msgid "Name already exists"
625+msgstr "Le nom existe déjà"
626+
627+#. module: base_contact_by_functions
628+#: view:res.partner:0
629+msgid "State"
630+msgstr "Etat"
631+
632+#. module: base_contact_by_functions
633+#: help:res.category.functions,sequence:0
634+#: help:res.institution.functions,sequence:0
635+msgid "Used to order"
636+msgstr "Permet d'ordonner"
637+
638+#. module: base_contact_by_functions
639+#: view:functions:0 view:res.institution:0 view:res.partner.category:0
640+msgid "FunctionsForm"
641+msgstr "FonctionsForm"
642+
643+#. module: base_contact_by_functions
644+#: view:res.partner:0
645+msgid "e.g. Sales Director"
646+msgstr "ex: Directeur de vente"
647+
648+#. module: base_contact_by_functions
649+#: help:functions,acronym:0
650+msgid "Acronym of function."
651+msgstr "Acronyme de la fonction."
652+
653+#. module: base_contact_by_functions
654+#: view:res.partner:0
655+msgid "Tags..."
656+msgstr "Etiquettes..."
657+
658+#. module: base_contact_by_functions
659+#: field:res.partner,start_date:0
660+msgid "Start date"
661+msgstr "Date de début"
662+
663+#. module: base_contact_by_functions
664+#: view:res.institution:0
665+msgid "InstitutionsForm"
666+msgstr "InstitutionsForm"
667+
668+#. module: base_contact_by_functions
669+#: view:res.partner:0
670+msgid "Fax:"
671+msgstr "Télécopie :"
672+
673+#. module: base_contact_by_functions
674+#: field:res.partner,expiration_date:0
675+msgid "Expiration date"
676+msgstr "Date d'expiration"
677+
678+#. module: base_contact_by_functions
679+#: view:res.partner:0
680+msgid "Function"
681+msgstr "Fonction"
682+
683+#. module: base_contact_by_functions
684+#: view:res.partner:0
685+msgid "Fax"
686+msgstr "Télécopie"
687+
688+#. module: base_contact_by_functions
689+#: view:res.partner:0
690+msgid "Parent Organism"
691+msgstr "Organisme parent"
692+
693+#. module: base_contact_by_functions
694+#: field:res.partner,delivered_country:0
695+msgid "Country Passport"
696+msgstr "Pays de délivrance du passeport"
697+
698+#. module: base_contact_by_functions
699+#: field:res.partner,other_contact_history_ids:0
700+msgid "unknown"
701+msgstr "inconnu"
702+
703+#. module: base_contact_by_functions
704+#: model:ir.actions.act_window,name:base_contact_by_functions.action_partner_customer_form
705+msgid "Company"
706+msgstr "Organisme"
707+
708+#. module: base_contact_by_functions
709+#: model:ir.model,name:base_contact_by_functions.model_res_category_functions
710+msgid "Categories functions"
711+msgstr "Catégories functions"
712+
713+#. module: base_contact_by_functions
714+#: help:res.institution,name:0
715+msgid "Name of institution."
716+msgstr "Nom de l'institution."
717+
718+#. module: base_contact_by_functions
719+#: help:res.partner,naming:0
720+msgid "Naming."
721+msgstr "Appellation"
722+
723+#. module: base_contact_by_functions
724+#: view:res.partner:0
725+msgid "Tag"
726+msgstr "Etiquette"
727+
728+#. module: base_contact_by_functions
729+#: view:res.partner:0
730+msgid "Passport information"
731+msgstr "Informations du passeport"
732+
733+#. module: base_contact_by_functions
734+#: view:res.partner:0
735+msgid "Address"
736+msgstr "Adresse"
737+
738+#. module: base_contact_by_functions
739+#: view:res.partner:0
740+msgid "Parent organism"
741+msgstr "Organisme parent"
742+
743+#. module: base_contact_by_functions
744+#: view:res.partner:0
745+msgid "have the same form for contact and other postions"
746+msgstr "Avoir le même formulaire de contact et d'autres postions"
747+
748+#. module: base_contact_by_functions
749+#: view:res.partner:0
750+msgid "Select functions for this organism"
751+msgstr "Sélectionner les fonctions de cet organisme"
752+
753+#. module: base_contact_by_functions
754+#: view:res.partner:0
755+msgid "Phone:"
756+msgstr "Téléphone:"
757+
758+#. module: base_contact_by_functions
759+#: field:functions,name:0 field:res.institution,name:0
760+msgid "Name"
761+msgstr "Nom"
762+
763+#. module: base_contact_by_functions
764+#: view:res.partner:0
765+msgid "ZIP"
766+msgstr "Code postal"
767+
768+#. module: base_contact_by_functions
769+#: view:res.partner:0
770+msgid "Use organism address"
771+msgstr "Utilisez l'adresse de l'organisme"
772+
773+#. module: base_contact_by_functions
774+#: view:res.partner:0
775+msgid "Country"
776+msgstr "Pays"
777+
778+#. module: base_contact_by_functions
779+#: field:functions,institution_id:0
780+msgid "institution"
781+msgstr "institution"
782+
783+#. module: base_contact_by_functions
784+#: view:res.partner:0
785+msgid "Is an Organism"
786+msgstr "Est un Organisme"
787+
788+#. module: base_contact_by_functions
789+#: field:res.partner,function_id:0
790+msgid "Position Occupied"
791+msgstr "Fonction Occupée"
792+
793+#. module: base_contact_by_functions
794+#: view:res.partner:0
795+msgid "Contact"
796+msgstr "Contact"
797+
798+#. module: base_contact_by_functions
799+#: help:res.institution,sequence:0
800+msgid "Used to order the institutions"
801+msgstr "Permet d'ordonner les institutions"
802+
803+#. module: base_contact_by_functions
804+#: view:res.partner:0
805+msgid "Mobile:"
806+msgstr "Portable :"
807+
808+#. module: base_contact_by_functions
809+#: model:ir.model,name:base_contact_by_functions.model_res_partner_category
810+msgid "Partner Categories"
811+msgstr "Catégories de partenaires"
812+
813+#. module: base_contact_by_functions
814+#: view:res.partner:0
815+msgid "Organism"
816+msgstr "Organisme"
817+
818+#. module: base_contact_by_functions
819+#: model:ir.actions.act_window,name:base_contact_by_functions.action_institutions_tree_list
820+#: model:ir.model,name:base_contact_by_functions.model_res_institution
821+#: field:res.institution.functions,institution_id:0
822+msgid "Institutions"
823+msgstr "Institutions"
824+
825+#. module: base_contact_by_functions
826+#: view:res.partner:0
827+msgid "History"
828+msgstr "Historique"
829+
830+#. module: base_contact_by_functions
831+#: field:res.partner,end_date:0
832+msgid "End date"
833+msgstr "Date de fin"
834+
835+#. module: base_contact_by_functions
836+#: view:res.partner.category:0
837+msgid "Add function"
838+msgstr "Ajouter fonction"
839+
840+#. module: base_contact_by_functions
841+#: view:res.partner:0
842+msgid "Bank Details"
843+msgstr "Coordonnées bancaires"
844+
845+#. module: base_contact_by_functions
846+#: view:res.institution:0
847+msgid "InstitutionsTree"
848+msgstr "InstitutionsTree"
849+
850+#. module: base_contact_by_functions
851+#: field:res.category.functions,sequence:0 field:res.institution,sequence:0
852+#: field:res.institution.functions,sequence:0
853+msgid "Sequence"
854+msgstr "Séquence"
855+
856+#. module: base_contact_by_functions
857+#: view:res.partner:0
858+msgid "Bank Accounts"
859+msgstr "Comptes bancaires"
860+
861+#. module: base_contact_by_functions
862+#: view:res.partner:0
863+msgid "No, Street, Apartment/Office"
864+msgstr "No, Rue, Appartement/Bureau"
865+
866+#. module: base_contact_by_functions
867+#: view:res.partner:0
868+msgid "Use address organism"
869+msgstr "Utiliser l'adresse de l'organisme"
870+
871+#. module: base_contact_by_functions
872+#: field:functions,acronym:0
873+msgid "Acronym"
874+msgstr "Acronyme"
875+
876+#. module: base_contact_by_functions
877+#: help:functions,name:0
878+msgid "Name of function."
879+msgstr "Nom de la fonction."
880+
881+#. module: base_contact_by_functions
882+#: help:res.partner,passport_number:0
883+msgid "Passport number."
884+msgstr "Numéro de passeport."
885+
886+#. module: base_contact_by_functions
887+#: field:res.partner,passport_number:0
888+msgid "Passport Number"
889+msgstr "Numéro de passeport."
890+
891+#. module: base_contact_by_functions
892+#: model:ir.model,name:base_contact_by_functions.model_res_partner
893+msgid "Partner"
894+msgstr "Partenaire"
895+
896+#. module: base_contact_by_functions
897+#: field:res.partner,naming:0
898+msgid "Naming"
899+msgstr "Appellation"
900
901=== added file 'base_contact_by_functions/res_institutions.py'
902--- base_contact_by_functions/res_institutions.py 1970-01-01 00:00:00 +0000
903+++ base_contact_by_functions/res_institutions.py 2014-04-30 15:00:54 +0000
904@@ -0,0 +1,49 @@
905+# -*- encoding: utf-8 -*-
906+##############################################################################
907+#
908+# OpenERP, Open Source Management Solution
909+# This module copyright (C) 2013 Savoir-faire Linux
910+# (<http://www.savoirfairelinux.com>).
911+#
912+# This program is free software: you can redistribute it and/or modify
913+# it under the terms of the GNU Affero General Public License as
914+# published by the Free Software Foundation, either version 3 of the
915+# License, or (at your option) any later version.
916+#
917+# This program is distributed in the hope that it will be useful,
918+# but WITHOUT ANY WARRANTY; without even the implied warranty of
919+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
920+# GNU Affero General Public License for more details.
921+#
922+# You should have received a copy of the GNU Affero General Public License
923+# along with this program. If not, see <http://www.gnu.org/licenses/>.
924+#
925+##############################################################################
926+
927+from openerp.osv import fields, orm
928+
929+
930+class res_institutions(orm.Model):
931+ _description = 'Institutions'
932+ _name = 'res.institution'
933+ _order = 'sequence asc'
934+ _columns = {
935+ 'name': fields.char('Name', size=256, required=True, select=True,
936+ help='Name of institution.'),
937+ 'sequence': fields.integer('Sequence', help="Used to order the institutions"),
938+ 'institutionfunction_ids': fields.one2many('res.institution.functions', 'institution_id', 'Functions'),
939+ }
940+ _sql_constraints = [('institution_name_unique', 'unique(name)', 'Name already exists')]
941+
942+
943+class res_institutions_functions(orm.Model):
944+ _description = 'Institutions functions'
945+ _name = 'res.institution.functions'
946+ _order = 'sequence asc'
947+ _columns = {
948+ 'functions_id': fields.many2one('functions', 'Functions', required='True'),
949+ 'sequence': fields.integer('Sequence', help="Used to order"),
950+ 'institution_id': fields.many2one('res.institution', 'Institutions'),
951+ }
952+
953+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
954
955=== added file 'base_contact_by_functions/res_institutions_view.xml'
956--- base_contact_by_functions/res_institutions_view.xml 1970-01-01 00:00:00 +0000
957+++ base_contact_by_functions/res_institutions_view.xml 2014-04-30 15:00:54 +0000
958@@ -0,0 +1,55 @@
959+<?xml version="1.0" ?>
960+<openerp>
961+ <data>
962+ <!-- Tree Views Institutions-->
963+ <record model="ir.ui.view" id="institutions_tree_view">
964+ <field name="name">Institutions Tree View</field>
965+ <field name="model">res.institution</field>
966+ <field name="type">tree</field>
967+ <field name="arch" type="xml">
968+ <tree string="InstitutionsTree" version="7.0">
969+ <field name="name"/>
970+ <field name="sequence"/>
971+ </tree>
972+ </field>
973+ </record>
974+ <!-- Form Views Institutions-->
975+ <record model="ir.ui.view" id="institutions_form_view">
976+ <field name="name">Institutions Form View</field>
977+ <field name="model">res.institution</field>
978+ <field name="type">form</field>
979+ <field name="arch" type="xml">
980+ <form string="InstitutionsForm" version="7.0" >
981+ <group col="4">
982+ <field name="name"/>
983+ <field name="sequence"/>
984+ </group>
985+ <notebook position="inside">
986+ <page string="Functions">
987+ <separator string="Add functions for this institution"/>
988+ <group col="2" colspan="4">
989+ <field name="institutionfunction_ids" nolabel="1">
990+ <tree string="FunctionsTree">
991+ <field name="sequence"/>
992+ <field name="functions_id"/>
993+ </tree>
994+ <form string="FunctionsForm">
995+ <field name="functions_id"/>
996+ <field name="sequence"/>
997+ </form>
998+ </field>
999+ </group>
1000+ </page>
1001+ </notebook>
1002+ </form>
1003+ </field>
1004+ </record>
1005+ <!-- Actions -->
1006+ <record model="ir.actions.act_window" id="action_institutions_tree_list">
1007+ <field name="name">Institutions</field>
1008+ <field name="view_id" ref="institutions_tree_view"/>
1009+ <field name="res_model">res.institution</field>
1010+ <field name="view_mode">tree,form</field>
1011+ </record>
1012+ </data>
1013+</openerp>
1014
1015=== added file 'base_contact_by_functions/res_partner.py'
1016--- base_contact_by_functions/res_partner.py 1970-01-01 00:00:00 +0000
1017+++ base_contact_by_functions/res_partner.py 2014-04-30 15:00:54 +0000
1018@@ -0,0 +1,102 @@
1019+# -*- encoding: utf-8 -*-
1020+##############################################################################
1021+#
1022+# OpenERP, Open Source Management Solution
1023+# This module copyright (C) 2013 Savoir-faire Linux
1024+# (<http://www.savoirfairelinux.com>).
1025+#
1026+# This program is free software: you can redistribute it and/or modify
1027+# it under the terms of the GNU Affero General Public License as
1028+# published by the Free Software Foundation, either version 3 of the
1029+# License, or (at your option) any later version.
1030+#
1031+# This program is distributed in the hope that it will be useful,
1032+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1033+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1034+# GNU Affero General Public License for more details.
1035+#
1036+# You should have received a copy of the GNU Affero General Public License
1037+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1038+#
1039+##############################################################################
1040+
1041+import time
1042+from openerp.osv import orm, fields
1043+
1044+
1045+class res_partner_category(orm.Model):
1046+ """
1047+ Inherits partner_category
1048+ """
1049+ _inherit = 'res.partner.category'
1050+ _columns = {
1051+ 'categoryfunction_ids': fields.one2many('res.category.functions', 'category_id', 'Functions'),
1052+ }
1053+
1054+
1055+class res_category_functions(orm.Model):
1056+ """
1057+ Adds this class to link category and functions
1058+ """
1059+ _description = 'Categories functions'
1060+ _name = 'res.category.functions'
1061+ _order = 'sequence asc'
1062+ _columns = {
1063+ 'functions_id': fields.many2one('functions', 'Functions', required='True'),
1064+ 'sequence': fields.integer('Sequence', help="Used to order"),
1065+ 'category_id': fields.many2one('res.partner.category', 'Category'),
1066+ }
1067+
1068+
1069+class res_partner(orm.Model):
1070+ """
1071+ Inherits partner and adds functions_ids : List of functions
1072+ """
1073+ _inherit = 'res.partner'
1074+
1075+ def onchange_partner_function(self, cr, uid, ids, part, context=None):
1076+ if not part:
1077+ return {'value': None}
1078+ partner_ids = self.pool.get('res.partner').search(cr, uid, [('id', '=', part)])
1079+ functions_ids = self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context)[0].functions_ids
1080+ result = []
1081+ if functions_ids:
1082+ for line in functions_ids:
1083+ result.append(line.id)
1084+ dom = {'function_id': [('id', 'in', result)]}
1085+ return {'domain': dom}
1086+
1087+ def _get_history_lines(self, cr, uid, ids, name, arg, context=None):
1088+ res = {}
1089+ res_partner_pool = self.pool.get('res.partner')
1090+ for record in self.browse(cr, uid, ids, context=context):
1091+
1092+ if record.is_company:
1093+ return res
1094+ contact_ids = res_partner_pool.search(cr, uid,
1095+ [('contact_id', '=', record.id),
1096+ ('active', '=', False)],
1097+ context=context)
1098+ res[record.id] = [x.id for x in res_partner_pool.browse(cr, uid, contact_ids)
1099+ if x.end_date and x.end_date <= time.strftime('%Y-%m-%d')]
1100+ return res
1101+
1102+ _columns = {
1103+ 'functions_ids': fields.many2many('functions', 'function_partner_rel', 'partner_id',
1104+ 'function_id', 'Functions'),
1105+ 'start_date': fields.date('Start date'),
1106+ 'end_date': fields.date('End date'),
1107+ 'naming': fields.char('Naming', size=256, help="Naming."),
1108+ 'function_id': fields.many2one('functions', 'Position Occupied'),
1109+ 'other_contact_history_ids': fields.function(_get_history_lines,
1110+ relation="res.partner",
1111+ method=True,
1112+ type="one2many"),
1113+ # Replace company by Organism
1114+ 'use_parent_address': fields.boolean(
1115+ 'Use Organism Address',
1116+ help="Select this if you want to set organism's address information for this contact"),
1117+
1118+ }
1119+
1120+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1121
1122=== added file 'base_contact_by_functions/res_partner_view.xml'
1123--- base_contact_by_functions/res_partner_view.xml 1970-01-01 00:00:00 +0000
1124+++ base_contact_by_functions/res_partner_view.xml 2014-04-30 15:00:54 +0000
1125@@ -0,0 +1,526 @@
1126+<?xml version = "1.0" encoding="utf-8"?>
1127+<openerp>
1128+ <data>
1129+ <!--Add list of functions in partner view-->
1130+ <record id="view_contact_by_function_form" model="ir.ui.view">
1131+ <field name="name">contact.functions.form.inherit</field>
1132+ <field name="model">res.partner</field>
1133+ <field name="inherit_id" ref="base.view_partner_form"/>
1134+ <field name="arch" type="xml">
1135+ <field name="use_parent_address" position="replace">
1136+ <field name="use_parent_address"
1137+ class="oe_edit_only oe_inline"
1138+ on_change="onchange_address(use_parent_address, parent_id)"
1139+ attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"
1140+ string="Use organism address"/>
1141+ </field>
1142+ <label for="use_parent_address" position="replace">
1143+ <label for="use_parent_address"
1144+ class="oe_edit_only"
1145+ attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"
1146+ string="Use organism address"/>
1147+ </label>
1148+ <!--Add ')' at the end of 'Is an Organism?'-->
1149+ <label for="is_company" position="replace">
1150+ <label for="is_company" string="Is an Organism"/>)
1151+ </label>
1152+ <!--Replace Street placeholder by No, Street, Apartment/Office-->
1153+ <field name="street" position="attributes">
1154+ <attribute name="placeholder">No, Street, Apartment/Office</attribute>
1155+ </field>
1156+ <field name="fax" position="attributes">
1157+ <attribute name="string">Fax</attribute>
1158+ </field>
1159+
1160+ <notebook position="inside">
1161+ <page string="Functions"
1162+ attrs="{'invisible': [('is_company','=',False), ('child_ids', '=', [])]}"
1163+ autofocus="autofocus">
1164+ <separator string="Select functions for this organism"/>
1165+ <field name="functions_ids"/>
1166+ </page>
1167+ <page string="History (Functions)" attrs="{'invisible': ['|','|',('is_company','=',True),('contact_id','!=',False),('other_contact_history_ids','=',[])]}">
1168+ <separator string="History"/>
1169+ <field name="other_contact_history_ids" mode="kanban"
1170+ attrs="{'invisible': [('other_contact_history_ids','=',False)]}">
1171+ <kanban>
1172+ <field name="color"/>
1173+ <field name="name"/>
1174+ <field name="title"/>
1175+ <field name="email"/>
1176+ <field name="parent_id" string="Organism"/>
1177+ <field name="is_company"/>
1178+ <field name="function_id" string="Function"/>
1179+ <field name="phone"/>
1180+ <field name="street"/>
1181+ <field name="street2"/>
1182+ <field name="zip"/>
1183+ <field name="city"/>
1184+ <field name="country_id"/>
1185+ <field name="mobile"/>
1186+ <field name="fax"/>
1187+ <field name="state_id"/>
1188+ <field name="has_image"/>
1189+ <templates>
1190+ <t t-name="kanban-box">
1191+ <div class="oe_kanban_vignette oe_semantic_html_override">
1192+ <a type="open">
1193+ <t t-if="record.has_image.raw_value === true">
1194+ <img t-att-src="kanban_image('res.partner', 'image_small', record.id.value)"
1195+ class="oe_kanban_image"/>
1196+ </t>
1197+ <t t-if="record.has_image.raw_value === false">
1198+ <t t-if="record.is_company.raw_value === true">
1199+ <img t-att-src='_s + "/base/static/src/img/company_image.png"'
1200+ class="oe_kanban_image"/>
1201+ </t>
1202+ <t t-if="record.is_company.raw_value === false">
1203+ <img t-att-src='_s + "/base/static/src/img/avatar.png"'
1204+ class="oe_kanban_image"/>
1205+ </t>
1206+ </t>
1207+ </a>
1208+ <div class="oe_kanban_details">
1209+ <h4 class="oe_partner_heading">
1210+ <a type="open">
1211+ <field name="name"/>
1212+ </a>
1213+ </h4>
1214+ <div class="oe_kanban_partner_categories"/>
1215+ <div class="oe_kanban_partner_links"/>
1216+ <ul>
1217+ <li t-if="!record.parent_id.raw_value and record.function_id.raw_value">
1218+ <field name="function_id"/>
1219+ </li>
1220+ <li t-if="record.parent_id.raw_value and record.function_id.raw_value">
1221+ <field name="function_id"/>
1222+ ,
1223+ <field name="parent_id"/>
1224+ </li>
1225+ <li t-if="record.city.raw_value and !record.country.raw_value">
1226+ <field name="city"/>
1227+ </li>
1228+ <li t-if="!record.city.raw_value and record.country.raw_value">
1229+ <field name="country"/>
1230+ </li>
1231+ <li t-if="record.city.raw_value and record.country.raw_value">
1232+ <field name="city"/>
1233+ ,
1234+ <field name="country"/>
1235+ </li>
1236+ <li t-if="record.email.raw_value">
1237+ <a t-attf-href="mailto:#{record.email.raw_value}">
1238+ <field name="email"/>
1239+ </a>
1240+ </li>
1241+ </ul>
1242+ </div>
1243+ </div>
1244+ </t>
1245+ </templates>
1246+ </kanban>
1247+ <form string="Contact" version="7.0">
1248+ <sheet>
1249+ <field name="image" widget='image' class="oe_avatar oe_left"
1250+ options='{"preview_image": "image_medium"}'/>
1251+ <div class="oe_title">
1252+ <label for="name" class="oe_edit_only"/>
1253+ <h1>
1254+ <field name="name" style="width: 70%%"/>
1255+ </h1>
1256+ </div>
1257+ <group>
1258+ <!-- inherited part -->
1259+ <field name="category_id" widget="many2many_tags"
1260+ placeholder="Tags..." style="width: 70%%" string="Tag"/>
1261+ <field name="parent_id"
1262+ placeholder="Organism"
1263+ domain="[('is_company','=',True)]"
1264+ string="Parent Organism"/>
1265+ <!-- inherited part end -->
1266+ <field name="function_id" placeholder="e.g. Sales Director"/>
1267+ <group colspan="4">
1268+ <field name="start_date" />
1269+ <field name="end_date"/>
1270+ <field name="naming"/>
1271+ </group>
1272+ <field name="email"/>
1273+ <field name="phone"/>
1274+ <field name="mobile"/>
1275+ </group>
1276+ <div>
1277+ <field name="use_parent_address"/>
1278+ <label for="use_parent_address" string="Use organism address"/>
1279+ </div>
1280+ <group>
1281+ <label for="type"/>
1282+ <div name="div_type">
1283+ <field class="oe_inline" name="type"/>
1284+ </div>
1285+ <label for="street" string="Address"
1286+ attrs="{'invisible': [('use_parent_address','=', True)]}"/>
1287+ <div attrs="{'invisible': [('use_parent_address','=', True)]}"
1288+ name="div_address">
1289+ <field name="street" placeholder="Street..."/>
1290+ <field name="street2"/>
1291+ <div class="address_format">
1292+ <field name="city" placeholder="City" style="width: 40%%"/>
1293+ <field name="state_id" class="oe_no_button"
1294+ placeholder="State" style="width: 37%%"
1295+ options='{"no_open": True}' on_change="onchange_state(state_id)"/>
1296+ <field name="zip" placeholder="ZIP" style="width: 20%%"/>
1297+ </div>
1298+ <field name="country_id" placeholder="Country"
1299+ class="oe_no_button" options='{"no_open": True}'/>
1300+ </div>
1301+ </group>
1302+ <field name="supplier" invisible="True"/>
1303+ <group string="Bank Accounts">
1304+ <field name="bank_ids" nolabel="1">
1305+ <tree string="Bank Details">
1306+ <field name="state" invisible="1"/>
1307+ <field name="sequence" invisible="1"/>
1308+ <field name="acc_number"/>
1309+ <field name="bank_name"/>
1310+ <field name="owner_name"/>
1311+ </tree>
1312+ </field>
1313+ </group>
1314+ </sheet>
1315+ </form>
1316+ </field>
1317+ </page>
1318+ </notebook>
1319+ <!--Replace function by function_id defined by organism-->
1320+ <field name="function" position="replace"/>
1321+ </field>
1322+
1323+ </record>
1324+ <!--Add start_date, end_date, naming and account bank in partner view-->
1325+ <record id="view_position_info_form" model="ir.ui.view">
1326+ <field name="name">position.info.form.inherit</field>
1327+ <field name="model">res.partner</field>
1328+ <field name="inherit_id" ref="base_contact.view_partner_form_inherit"/>
1329+ <field name="arch" type="xml">
1330+ <xpath expr="//field[@name='other_contact_ids']/form//field[@name='category_id']"
1331+ position="attributes">
1332+ <attribute name="string">Tag</attribute>
1333+ </xpath>
1334+ <xpath expr="//field[@name='other_contact_ids']/form//field[@name='function']"
1335+ position="after">
1336+ <group colspan="4">
1337+ <field name="start_date" />
1338+ <field name="end_date"/>
1339+ <field name="naming"/>
1340+ </group>
1341+ </xpath>
1342+ <xpath expr="//field[@name='other_contact_ids']/form//field[@name='supplier']"
1343+ position="after">
1344+ <group string="Bank Accounts">
1345+ <field name="bank_ids" nolabel="1"/>
1346+ </group>
1347+ </xpath>
1348+ <xpath expr="//field[@name='other_contact_ids']/form//field[@name='parent_id']"
1349+ position="replace">
1350+ <group colspan="4">
1351+ <field name="parent_id" placeholder="Organism"
1352+ domain="[('is_company','=',True)]"
1353+ on_change="onchange_partner_function(parent_id)"
1354+ string="Parent Organism"/>
1355+ </group>
1356+ </xpath>
1357+ <xpath expr="//field[@name='other_contact_ids']/form//field[@name='function']"
1358+ position="replace">
1359+ <group colspan="4">
1360+ <field name="function_id" string="Function"/>
1361+ </group>
1362+ </xpath>
1363+ <xpath expr="//field[@name='other_contact_ids']/form//label[@for='use_parent_address']"
1364+ position="replace">
1365+ <label for="use_parent_address" string="Use address organism"/>
1366+ </xpath>
1367+ <xpath expr="//field[@name='other_contact_ids']/kanban//field[@name='function']"
1368+ position="replace">
1369+ <group colspan="4">
1370+ <field name="function_id" string="Function"/>
1371+ </group>
1372+ </xpath>
1373+ <xpath expr="//field[@name='other_contact_ids']/kanban//field[@name='has_image']"
1374+ position="after">
1375+ <templates>
1376+ <t t-name="kanban-box">
1377+ <t t-set="color" t-value="kanban_color(record.color.raw_value)"/>
1378+ <div t-att-class="color + (record.title.raw_value == 1 ? ' oe_kanban_color_alert' : '')"
1379+ style="position: relative">
1380+ <a t-if="! read_only_mode" type="delete"
1381+ style="position: absolute; right: 0; padding: 4px; diplay: inline-block">
1382+ X
1383+ </a>
1384+ <div class="oe_module_vignette">
1385+ <a type="open">
1386+ <t t-if="record.has_image.raw_value === true">
1387+ <img t-att-src="kanban_image('res.partner', 'image',
1388+ record.id.value, {'preview_image': 'image_small'})"
1389+ class="oe_avatar oe_kanban_avatar_smallbox"/>
1390+ </t>
1391+ <t t-if="record.image and record.image.raw_value !== false">
1392+ <img t-att-src="'data:image/png;base64,'+record.image.raw_value"
1393+ class="oe_avatar oe_kanban_avatar_smallbox"/>
1394+ </t>
1395+ <t t-if="record.has_image.raw_value === false
1396+ and (!record.image or record.image.raw_value === false)">
1397+ <t t-if="record.is_company.raw_value === true">
1398+ <img t-att-src='_s + "/base/static/src/img/company_image.png"'
1399+ class="oe_kanban_image oe_kanban_avatar_smallbox"/>
1400+ </t>
1401+ <t t-if="record.is_company.raw_value === false">
1402+ <img t-att-src='_s + "/base/static/src/img/avatar.png"'
1403+ class="oe_kanban_image oe_kanban_avatar_smallbox"/>
1404+ </t>
1405+ </t>
1406+ </a>
1407+ <div class="oe_module_desc">
1408+ <div class="oe_kanban_box_content oe_kanban_color_bglight oe_kanban_color_border">
1409+ <table class="oe_kanban_table">
1410+ <tr>
1411+ <td class="oe_kanban_title1" align="left" valign="middle">
1412+ <h4>
1413+ <a type="open">
1414+ <field name="name"/>
1415+ </a>
1416+ </h4>
1417+ <i>
1418+ <t t-if="record.parent_id.raw_value and !record.function_id.raw_value">
1419+ <field name="parent_id"/>
1420+ </t>
1421+ <t t-if="!record.parent_id.raw_value and record.function_id.raw_value">
1422+ <field name="function_id"/>
1423+ </t>
1424+ <t t-if="record.parent_id.raw_value and record.function_id.raw_value">
1425+ <field name="function_id"/>
1426+ ,
1427+ <field name="parent_id"/>
1428+ </t>
1429+ </i>
1430+ <div>
1431+ <a t-if="record.email.raw_value" title="Mail"
1432+ t-att-href="'mailto:'+record.email.value">
1433+ <field name="email"/>
1434+ </a>
1435+ </div>
1436+ <div t-if="record.phone.raw_value">
1437+ Phone: <field name="phone"/>
1438+ </div>
1439+ <div t-if="record.mobile.raw_value">
1440+ Mobile: <field name="mobile"/>
1441+ </div>
1442+ <div t-if="record.fax.raw_value">
1443+ Fax: <field name="fax"/>
1444+ </div>
1445+ </td>
1446+ </tr>
1447+ </table>
1448+ </div>
1449+ </div>
1450+ </div>
1451+ </div>
1452+ </t>
1453+ </templates>
1454+ </xpath>
1455+ have the same form for contact and other postions
1456+ <field name="parent_id" position="replace">
1457+ <field name="parent_id" placeholder="Parent organism"
1458+ domain="[('is_company','=',True)]"
1459+ attrs="{'invisible': [('is_company','=', False)]}"/>
1460+ </field>
1461+ <xpath expr="//field[@name='child_ids']/form//field[@name='supplier']"
1462+ position="after">
1463+ <group string="Bank Accounts">
1464+ <field name="bank_ids" nolabel="1"/>
1465+ </group>
1466+ </xpath>
1467+
1468+ <xpath expr="//field[@name='child_ids']/form//field[@name='function']"
1469+ position="after">
1470+ <group colspan="4">
1471+ <field name="start_date" />
1472+ <field name="end_date"/>
1473+ <field name="naming"/>
1474+ </group>
1475+ </xpath>
1476+ <xpath expr="//field[@name='child_ids']/form//field[@name='function']"
1477+ position="replace">
1478+ <group colspan="4">
1479+ <field name="parent_id"
1480+ placeholder="Organism"
1481+ domain="[('is_company','=',True)]"
1482+ string="Parent organism" />
1483+ <field name="function_id"
1484+ readonly="False"
1485+ domain="[('id', 'in', parent.functions_ids[0][2])]"
1486+ string="Function"/>
1487+ </group>
1488+ </xpath>
1489+
1490+ <xpath expr="//field[@name='child_ids']/form//label[@for='use_parent_address']"
1491+ position="replace">
1492+ <label for="use_parent_address" string="Use address organism"/>
1493+ </xpath>
1494+
1495+ <xpath expr="//field[@name='child_ids']/kanban//field[@name='function']"
1496+ position="replace">
1497+ <group colspan="4">
1498+ <field name="function_id" string="Function"/>
1499+ </group>
1500+ </xpath>
1501+ <xpath expr="//field[@name='other_contact_ids']/kanban//field[@name='has_image']"
1502+ position="after">
1503+ <templates>
1504+ <t t-name="kanban-box">
1505+ <div class="oe_kanban_vignette oe_semantic_html_override">
1506+ <a type="open">
1507+ <t t-if="record.has_image.raw_value === true">
1508+ <img t-att-src="kanban_image('res.partner', 'image_small', record.id.value)"
1509+ class="oe_kanban_image"/>
1510+ </t>
1511+ <t t-if="record.has_image.raw_value === false">
1512+ <t t-if="record.is_company.raw_value === true">
1513+ <img t-att-src='_s + "/base/static/src/img/company_image.png"'
1514+ class="oe_kanban_image"/>
1515+ </t>
1516+ <t t-if="record.is_company.raw_value === false">
1517+ <img t-att-src='_s + "/base/static/src/img/avatar.png"'
1518+ class="oe_kanban_image"/>
1519+ </t>
1520+ </t>
1521+ </a>
1522+ <div class="oe_kanban_details">
1523+ <h4 class="oe_partner_heading">
1524+ <a type="open">
1525+ <field name="name"/>
1526+ </a>
1527+ </h4>
1528+ <div class="oe_kanban_partner_categories"/>
1529+ <div class="oe_kanban_partner_links"/>
1530+ <ul>
1531+ <li t-if="record.parent_id.raw_value and !record.function_id.raw_value">
1532+ <field name="parent_id"/>
1533+ </li>
1534+ <li t-if="!record.parent_id.raw_value and record.function_id.raw_value">
1535+ <field name="function_id"/>
1536+ </li>
1537+ <li t-if="record.parent_id.raw_value and record.function_id.raw_value">
1538+ <field name="function_id"/>
1539+ ,
1540+ <field name="parent_id"/>
1541+ </li>
1542+ <li t-if="record.city.raw_value and !record.country.raw_value">
1543+ <field name="city"/>
1544+ </li>
1545+ <li t-if="!record.city.raw_value and record.country.raw_value">
1546+ <field name="country"/>
1547+ </li>
1548+ <li t-if="record.city.raw_value and record.country.raw_value">
1549+ <field name="city"/>
1550+ ,
1551+ <field name="country"/>
1552+ </li>
1553+ <li t-if="record.email.raw_value">
1554+ <a t-attf-href="mailto:#{record.email.raw_value}">
1555+ <field name="email"/>
1556+ </a>
1557+ </li>
1558+ </ul>
1559+ </div>
1560+ </div>
1561+ </t>
1562+ </templates>
1563+ </xpath>
1564+ </field>
1565+ </record>
1566+ <!-- Actions for organism -->
1567+ <record id="action_partner_customer_form" model="ir.actions.act_window">
1568+ <field name="name">Company</field>
1569+ <field name="type">ir.actions.act_window</field>
1570+ <field name="res_model">res.partner</field>
1571+ <field name="view_type">form</field>
1572+ <field name="view_mode">kanban,tree,form</field>
1573+ <field name="domain">[('is_company','=',1)]</field>
1574+ <field name="context" eval="{'default_is_company': True}"/>
1575+ <field name="filter" eval="True"/>
1576+ </record>
1577+ <!-- Actions for Contacts -->
1578+ <record id="action_partner_contact_form" model="ir.actions.act_window">
1579+ <field name="name">Contacts</field>
1580+ <field name="type">ir.actions.act_window</field>
1581+ <field name="res_model">res.partner</field>
1582+ <field name="view_type">form</field>
1583+ <field name="view_mode">kanban,tree,form</field>
1584+ <field name="domain">[('is_company','=',0)]</field>
1585+ <field name="filter" eval="True"/>
1586+ </record>
1587+
1588+ <!--Add country,street fields in tree partner view-->
1589+ <record model="ir.ui.view" id="view_partner_tree_country_address">
1590+ <field name="model">res.partner</field>
1591+ <field name="inherit_id" ref="base.view_partner_tree"/>
1592+ <field name="arch" type="xml">
1593+ <field name="country_id" position="replace"/>
1594+ <field name="name" position="after">
1595+ <field name="country_id"/>
1596+ </field>
1597+ <field name="email" position="after">
1598+ <field name="street" string="Address"/>
1599+ </field>
1600+ </field>
1601+ </record>
1602+
1603+ <!-- Inherit Categories adding functions -->
1604+ <record id="view_partner_category_functions_form" model="ir.ui.view">
1605+ <field name="name">Partner Categories Functions</field>
1606+ <field name="model">res.partner.category</field>
1607+ <field name="inherit_id" ref="base.view_partner_category_form"/>
1608+ <field name="arch" type="xml">
1609+ <xpath expr="//form[@string='Partner Category']/group[1]"
1610+ position="after">
1611+ <notebook position="inside">
1612+ <page string="Functions">
1613+ <separator string="Add function"/>
1614+ <group col="2" colspan="4">
1615+ <field name="categoryfunction_ids" nolabel="1">
1616+ <tree string="FunctionsTree">
1617+ <field name="sequence"/>
1618+ <field name="functions_id"/>
1619+ </tree>
1620+ <form string="FunctionsForm">
1621+ <field name="functions_id"/>
1622+ <field name="sequence"/>
1623+ </form>
1624+ </field>
1625+ </group>
1626+ </page>
1627+ </notebook>
1628+ </xpath>
1629+ </field>
1630+ </record>
1631+
1632+ <!--Replace company by organism-->
1633+ <record id="view_partner_simple_form" model="ir.ui.view">
1634+ <field name="name">res.partner.simplified.form</field>
1635+ <field name="model">res.partner</field>
1636+ <field name="arch" type="xml">
1637+ <label for="is_company" position="replace">
1638+ <label for="is_company" string="Is an Organism"/>
1639+ </label>
1640+ <field name="parent_id" position="replace">
1641+ <field name="parent_id"
1642+ placeholder="Organism"
1643+ domain="[('is_company', '=', True)]"
1644+ context="{'default_is_company': True, 'default_supplier': supplier}"
1645+ attrs="{'invisible': [('is_company','=', True),('parent_id', '=', False)]}"
1646+ on_change="onchange_address(use_parent_address, parent_id)"/>
1647+ </field>
1648+ </field>
1649+ </record>
1650+ </data>
1651+</openerp>
1652
1653=== added directory 'base_contact_by_functions/security'
1654=== added file 'base_contact_by_functions/security/ir.model.access.csv'
1655--- base_contact_by_functions/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
1656+++ base_contact_by_functions/security/ir.model.access.csv 2014-04-30 15:00:54 +0000
1657@@ -0,0 +1,5 @@
1658+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
1659+"access_functions","functions_user","model_functions","base.group_user",1,1,1,1
1660+"access_res_category_functions","access_res_category_functions_user","model_res_category_functions","base.group_user",1,1,1,1
1661+"access_res_institution","access_res_institution_user","model_res_institution","base.group_user",1,1,1,1
1662+"access_res_institution_functions","access_res_institution_functions_user","model_res_institution_functions","base.group_user",1,1,1,1
1663
1664=== added directory 'base_contact_by_functions/tests'
1665=== added file 'base_contact_by_functions/tests/__init__.py'
1666--- base_contact_by_functions/tests/__init__.py 1970-01-01 00:00:00 +0000
1667+++ base_contact_by_functions/tests/__init__.py 2014-04-30 15:00:54 +0000
1668@@ -0,0 +1,31 @@
1669+# -*- encoding: utf-8 -*-
1670+##############################################################################
1671+#
1672+# OpenERP, Open Source Management Solution
1673+# This module copyright (C) 2013 Savoir-faire Linux
1674+# (<http://www.savoirfairelinux.com>).
1675+#
1676+# This program is free software: you can redistribute it and/or modify
1677+# it under the terms of the GNU Affero General Public License as
1678+# published by the Free Software Foundation, either version 3 of the
1679+# License, or (at your option) any later version.
1680+#
1681+# This program is distributed in the hope that it will be useful,
1682+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1683+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1684+# GNU Affero General Public License for more details.
1685+#
1686+# You should have received a copy of the GNU Affero General Public License
1687+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1688+#
1689+##############################################################################
1690+
1691+from . import test_functions
1692+from . import test_institutions
1693+from . import test_partner_category
1694+
1695+checks = [
1696+ test_functions,
1697+ test_institutions,
1698+ test_partner_category
1699+]
1700
1701=== added file 'base_contact_by_functions/tests/test_functions.py'
1702--- base_contact_by_functions/tests/test_functions.py 1970-01-01 00:00:00 +0000
1703+++ base_contact_by_functions/tests/test_functions.py 2014-04-30 15:00:54 +0000
1704@@ -0,0 +1,98 @@
1705+# -*- encoding: utf-8 -*-
1706+##############################################################################
1707+#
1708+# OpenERP, Open Source Management Solution
1709+# This module copyright (C) 2013 Savoir-faire Linux
1710+# (<http://www.savoirfairelinux.com>).
1711+#
1712+# This program is free software: you can redistribute it and/or modify
1713+# it under the terms of the GNU Affero General Public License as
1714+# published by the Free Software Foundation, either version 3 of the
1715+# License, or (at your option) any later version.
1716+#
1717+# This program is distributed in the hope that it will be useful,
1718+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1719+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1720+# GNU Affero General Public License for more details.
1721+#
1722+# You should have received a copy of the GNU Affero General Public License
1723+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1724+#
1725+##############################################################################
1726+
1727+from openerp.tests.common import TransactionCase
1728+from openerp.osv.orm import browse_record
1729+
1730+
1731+class Base_Test_function(TransactionCase):
1732+ """
1733+ Simple test creating a function
1734+ This is a base class for function test cases.
1735+ Inherit from this and setup values.
1736+ """
1737+
1738+ def setUp(self, vals={}):
1739+ """
1740+ Setting up function.
1741+ """
1742+ # Default test values
1743+ self.vals = {'name': 'This is a test function name',
1744+ 'acronym': 'This is a test function acronym',
1745+ }
1746+ super(Base_Test_function, self).setUp()
1747+ self.vals = dict(self.vals.items() + vals.items())
1748+ # Create the function object; we will be testing this, so store in self
1749+ function_function = self.registry('functions')
1750+ self.function_id = function_function.create(self.cr, self.uid, self.vals, context=None)
1751+
1752+ def test_function(self):
1753+ """
1754+ Checking the function creation.
1755+ """
1756+ function_function = self.registry('functions')
1757+ function_obj = function_function.browse(self.cr, self.uid, self.function_id, context=None)
1758+ for field in self.vals:
1759+ val = function_obj[field]
1760+ if type(val) == browse_record:
1761+ self.assertEquals(self.vals[field], val.id,
1762+ "IDs for %s don't match: (%i != %i)" %
1763+ (field, self.vals[field], val.id))
1764+ else:
1765+ self.assertEquals(str(self.vals[field]), str(val),
1766+ "Values for %s don't match: (%s != %s)" %
1767+ (field, str(self.vals[field]), str(val)))
1768+
1769+
1770+class Test_function_bad(Base_Test_function):
1771+ """
1772+ Simple test creating a function, test against bad values
1773+ """
1774+ def setUp(self):
1775+ """
1776+ Setting up function, then changing the values to test against.
1777+ """
1778+ super(Test_function_bad, self).setUp()
1779+ # Change vals to something wrong
1780+ self.vals = {'name': 'This is the wrong function name',
1781+ 'acronym': 'This is the wrong function acronym',
1782+ }
1783+
1784+ def test_function(self):
1785+ """
1786+ Checking the function creation, assertions should all be false.
1787+ """
1788+ function_function = self.registry('functions')
1789+ function_obj = function_function.browse(self.cr, self.uid, self.function_id, context=None)
1790+ for field in self.vals:
1791+ val = function_obj[field]
1792+ if type(val) == browse_record:
1793+ self.assertNotEqual(self.vals[field], val.id,
1794+ "IDs for %s don't match: (%i != %i)" %
1795+ (field, self.vals[field], val.id))
1796+ else:
1797+ self.assertNotEqual(str(self.vals[field]), str(val),
1798+ "Values for %s don't match: (%s != %s)" %
1799+ (field, str(self.vals[field]), str(val)))
1800+
1801+
1802+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1803
1804=== added file 'base_contact_by_functions/tests/test_institutions.py'
1805--- base_contact_by_functions/tests/test_institutions.py 1970-01-01 00:00:00 +0000
1806+++ base_contact_by_functions/tests/test_institutions.py 2014-04-30 15:00:54 +0000
1807@@ -0,0 +1,99 @@
1808+# -*- encoding: utf-8 -*-
1809+##############################################################################
1810+#
1811+# OpenERP, Open Source Management Solution
1812+# This module copyright (C) 2013 Savoir-faire Linux
1813+# (<http://www.savoirfairelinux.com>).
1814+#
1815+# This program is free software: you can redistribute it and/or modify
1816+# it under the terms of the GNU Affero General Public License as
1817+# published by the Free Software Foundation, either version 3 of the
1818+# License, or (at your option) any later version.
1819+#
1820+# This program is distributed in the hope that it will be useful,
1821+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1822+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1823+# GNU Affero General Public License for more details.
1824+#
1825+# You should have received a copy of the GNU Affero General Public License
1826+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1827+#
1828+##############################################################################
1829+
1830+from openerp.tests.common import TransactionCase
1831+from openerp.osv.orm import browse_record
1832+
1833+
1834+class Base_Test_institution(TransactionCase):
1835+ """
1836+ Simple test creating a institution
1837+ This is a base class for institution test cases.
1838+ Inherit from this and setup values.
1839+ """
1840+
1841+ def setUp(self, vals={}):
1842+ """
1843+ Setting up institution.
1844+ """
1845+ # Default test values
1846+ self.vals = {'name': 'This is a test institution name',
1847+ 'sequence': '1',
1848+ 'institutionfunction_ids': '[]',
1849+ }
1850+ super(Base_Test_institution, self).setUp()
1851+ self.vals = dict(self.vals.items() + vals.items())
1852+ # Create the institution object; we will be testing this, so store in self
1853+ institution_institution = self.registry('res.institution')
1854+ self.institution_id = institution_institution.create(self.cr, self.uid, self.vals, context=None)
1855+
1856+ def test_institution(self):
1857+ """
1858+ Checking the institution creation.
1859+ """
1860+ institution_institution = self.registry('res.institution')
1861+ institution_obj = institution_institution.browse(self.cr, self.uid, self.institution_id, context=None)
1862+ for field in self.vals:
1863+ val = institution_obj[field]
1864+ if type(val) == browse_record:
1865+ self.assertEquals(self.vals[field], val.id,
1866+ "IDs for %s don't match: (%i != %i)" %
1867+ (field, self.vals[field], val.id))
1868+ else:
1869+ self.assertEquals(str(self.vals[field]), str(val),
1870+ "Values for %s don't match: (%s != %s)" %
1871+ (field, str(self.vals[field]), str(val)))
1872+
1873+
1874+class Test_institution_bad(Base_Test_institution):
1875+ """
1876+ Simple test creating a institution, test against bad values
1877+ """
1878+ def setUp(self):
1879+ """
1880+ Setting up institution, then changing the values to test against.
1881+ """
1882+ super(Test_institution_bad, self).setUp()
1883+ # Change vals to something wrong
1884+ self.vals = {'name': 'This is the wrong institution name',
1885+ 'sequence': '0',
1886+ }
1887+
1888+ def test_institution(self):
1889+ """
1890+ Checking the institution creation, assertions should all be false.
1891+ """
1892+ institution_institution = self.registry('res.institution')
1893+ institution_obj = institution_institution.browse(self.cr, self.uid, self.institution_id, context=None)
1894+ for field in self.vals:
1895+ val = institution_obj[field]
1896+ if type(val) == browse_record:
1897+ self.assertNotEqual(self.vals[field], val.id,
1898+ "IDs for %s don't match: (%i != %i)" %
1899+ (field, self.vals[field], val.id))
1900+ else:
1901+ self.assertNotEqual(str(self.vals[field]), str(val),
1902+ "Values for %s don't match: (%s != %s)" %
1903+ (field, str(self.vals[field]), str(val)))
1904+
1905+
1906+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1907
1908=== added file 'base_contact_by_functions/tests/test_partner_category.py'
1909--- base_contact_by_functions/tests/test_partner_category.py 1970-01-01 00:00:00 +0000
1910+++ base_contact_by_functions/tests/test_partner_category.py 2014-04-30 15:00:54 +0000
1911@@ -0,0 +1,105 @@
1912+# -*- encoding: utf-8 -*-
1913+##############################################################################
1914+#
1915+# OpenERP, Open Source Management Solution
1916+# This module copyright (C) 2013 Savoir-faire Linux
1917+# (<http://www.savoirfairelinux.com>).
1918+#
1919+# This program is free software: you can redistribute it and/or modify
1920+# it under the terms of the GNU Affero General Public License as
1921+# published by the Free Software Foundation, either version 3 of the
1922+# License, or (at your option) any later version.
1923+#
1924+# This program is distributed in the hope that it will be useful,
1925+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1926+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1927+# GNU Affero General Public License for more details.
1928+#
1929+# You should have received a copy of the GNU Affero General Public License
1930+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1931+#
1932+##############################################################################
1933+
1934+from openerp.tests.common import TransactionCase
1935+from openerp.osv.orm import browse_record
1936+
1937+
1938+class Base_Test_partner_category(TransactionCase):
1939+ """
1940+ Simple test creating a partner_category
1941+ This is a base class for partner_category test cases.
1942+ Inherit from this and setup values.
1943+ """
1944+
1945+ def setUp(self, vals={}):
1946+ """
1947+ Setting up partner_category.
1948+ """
1949+ # Default test values
1950+ self.vals = {'name': 'This is a test partner_category name',
1951+ 'active': True,
1952+ }
1953+ super(Base_Test_partner_category, self).setUp()
1954+ # Create the parent
1955+ partner_category_partner = self.registry('res.partner.category')
1956+ self.vals['parent_id'] = partner_category_partner.create(self.cr, self.uid, {
1957+ 'name': 'Test parent',
1958+ 'active': True, }, context=None)
1959+
1960+ self.vals = dict(self.vals.items() + vals.items())
1961+ # Create the partner_category object; we will be testing this, so store in self
1962+ self.partner_category_id = partner_category_partner.create(self.cr, self.uid, self.vals, context=None)
1963+
1964+ def test_partner_category(self):
1965+ """
1966+ Checking the partner_category creation.
1967+ """
1968+ partner_category = self.registry('res.partner.category')
1969+ partner_category_obj = partner_category.browse(self.cr, self.uid, self.partner_category_id, context=None)
1970+ for field in self.vals:
1971+ val = partner_category_obj[field]
1972+ if type(val) == browse_record:
1973+ self.assertEquals(self.vals[field], val.id,
1974+ "IDs for %s don't match: (%i != %i)" %
1975+ (field, self.vals[field], val.id))
1976+ else:
1977+ self.assertEquals(str(self.vals[field]), str(val),
1978+ "Values for %s don't match: (%s != %s)" %
1979+ (field, str(self.vals[field]), str(val)))
1980+
1981+
1982+class Test_partner_category_bad(Base_Test_partner_category):
1983+ """
1984+ Simple test creating a partner_category, test against bad values
1985+ """
1986+ def setUp(self):
1987+ """
1988+ Setting up partner_category, then changing the values to test against.
1989+ """
1990+ super(Test_partner_category_bad, self).setUp()
1991+ # Change vals to something wrong
1992+ self.vals = {'name': 'This is the wrong partner_category name',
1993+ 'active': False,
1994+ }
1995+
1996+ def test_partner_category(self):
1997+ """
1998+ Checking the partner_category creation, assertions should all be false.
1999+ """
2000+ partner_category_partner_category = self.registry('res.partner.category')
2001+ partner_category_obj = partner_category_partner_category.browse(self.cr, self.uid,
2002+ self.partner_category_id,
2003+ context=None)
2004+ for field in self.vals:
2005+ val = partner_category_obj[field]
2006+ if type(val) == browse_record:
2007+ self.assertNotEqual(self.vals[field], val.id,
2008+ "IDs for %s don't match: (%i != %i)" %
2009+ (field, self.vals[field], val.id))
2010+ else:
2011+ self.assertNotEqual(str(self.vals[field]), str(val),
2012+ "Values for %s don't match: (%s != %s)" %
2013+ (field, str(self.vals[field]), str(val)))
2014+
2015+
2016+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2017
2018=== added directory 'base_contact_by_functions_partner_firstname'
2019=== added file 'base_contact_by_functions_partner_firstname/__init__.py'
2020--- base_contact_by_functions_partner_firstname/__init__.py 1970-01-01 00:00:00 +0000
2021+++ base_contact_by_functions_partner_firstname/__init__.py 2014-04-30 15:00:54 +0000
2022@@ -0,0 +1,25 @@
2023+# -*- encoding: utf-8 -*-
2024+##############################################################################
2025+#
2026+# OpenERP, Open Source Management Solution
2027+# This module copyright (C) 2013 Savoir-faire Linux
2028+# (<http://www.savoirfairelinux.com>).
2029+#
2030+# This program is free software: you can redistribute it and/or modify
2031+# it under the terms of the GNU Affero General Public License as
2032+# published by the Free Software Foundation, either version 3 of the
2033+# License, or (at your option) any later version.
2034+#
2035+# This program is distributed in the hope that it will be useful,
2036+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2037+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2038+# GNU Affero General Public License for more details.
2039+#
2040+# You should have received a copy of the GNU Affero General Public License
2041+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2042+#
2043+##############################################################################
2044+
2045+import res_partner
2046+
2047+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2048
2049=== added file 'base_contact_by_functions_partner_firstname/__openerp__.py'
2050--- base_contact_by_functions_partner_firstname/__openerp__.py 1970-01-01 00:00:00 +0000
2051+++ base_contact_by_functions_partner_firstname/__openerp__.py 2014-04-30 15:00:54 +0000
2052@@ -0,0 +1,53 @@
2053+# -*- encoding: utf-8 -*-
2054+##############################################################################
2055+#
2056+# OpenERP, Open Source Management Solution
2057+# This module copyright (C) 2013 Savoir-faire Linux
2058+# (<http://www.savoirfairelinux.com>).
2059+#
2060+# This program is free software: you can redistribute it and/or modify
2061+# it under the terms of the GNU Affero General Public License as
2062+# published by the Free Software Foundation, either version 3 of the
2063+# License, or (at your option) any later version.
2064+#
2065+# This program is distributed in the hope that it will be useful,
2066+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2067+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2068+# GNU Affero General Public License for more details.
2069+#
2070+# You should have received a copy of the GNU Affero General Public License
2071+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2072+#
2073+##############################################################################
2074+
2075+{
2076+ 'name': 'Contacts by Functions - Partner Firstname Bindings',
2077+ 'version': '0.1',
2078+ 'category': 'Customer Relationship Management',
2079+ 'summary': 'Contacts by Functions - Partner Firstname Bindings',
2080+ 'description': """
2081+Contacts by Functions - Partner Firstname Bindings
2082+==================================================
2083+
2084+Contributors
2085+------------
2086+* El Hadji Dem (elhadji.dem@savoirfairelinux.com)
2087+""",
2088+ 'author': 'Savoir-faire Linux',
2089+ 'website': 'www.savoirfairelinux.com',
2090+ 'license': 'AGPL-3',
2091+ 'depends': [
2092+ 'base_contact_by_functions',
2093+ 'partner_firstname',
2094+ ],
2095+ 'data': [
2096+ 'res_partner_view.xml',
2097+ ],
2098+ 'test': [],
2099+ 'demo': [
2100+ ],
2101+ 'installable': True,
2102+ 'auto_install': True,
2103+}
2104+
2105+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2106
2107=== added directory 'base_contact_by_functions_partner_firstname/i18n'
2108=== added file 'base_contact_by_functions_partner_firstname/i18n/base_contact_by_functions_partner_firstname.pot'
2109--- base_contact_by_functions_partner_firstname/i18n/base_contact_by_functions_partner_firstname.pot 1970-01-01 00:00:00 +0000
2110+++ base_contact_by_functions_partner_firstname/i18n/base_contact_by_functions_partner_firstname.pot 2014-04-30 15:00:54 +0000
2111@@ -0,0 +1,27 @@
2112+# Translation of OpenERP Server.
2113+# This file contains the translation of the following modules:
2114+# * base_contact_by_functions_partner_firstname
2115+#
2116+msgid ""
2117+msgstr ""
2118+"Project-Id-Version: OpenERP Server 7.0\n"
2119+"Report-Msgid-Bugs-To: \n"
2120+"POT-Creation-Date: 2014-01-03 07:16+0000\n"
2121+"PO-Revision-Date: 2014-01-03 02:17-0500\n"
2122+"Last-Translator: EL Hadji DEM <elhadji.dem@savoirfairelinux.com>\n"
2123+"Language-Team: \n"
2124+"MIME-Version: 1.0\n"
2125+"Content-Type: text/plain; charset=UTF-8\n"
2126+"Content-Transfer-Encoding: 8bit\n"
2127+"Plural-Forms: \n"
2128+"X-Generator: Poedit 1.5.4\n"
2129+
2130+#. module: base_contact_by_functions_partner_firstname
2131+#: view:res.partner:0
2132+msgid "lastname"
2133+msgstr ""
2134+
2135+#. module: base_contact_by_functions_partner_firstname
2136+#: view:res.partner:0
2137+msgid "Firstname"
2138+msgstr ""
2139
2140=== added file 'base_contact_by_functions_partner_firstname/i18n/fr.po'
2141--- base_contact_by_functions_partner_firstname/i18n/fr.po 1970-01-01 00:00:00 +0000
2142+++ base_contact_by_functions_partner_firstname/i18n/fr.po 2014-04-30 15:00:54 +0000
2143@@ -0,0 +1,27 @@
2144+# Translation of OpenERP Server.
2145+# This file contains the translation of the following modules:
2146+# * base_contact_by_functions_partner_firstname
2147+#
2148+msgid ""
2149+msgstr ""
2150+"Project-Id-Version: OpenERP Server 7.0\n"
2151+"Report-Msgid-Bugs-To: \n"
2152+"POT-Creation-Date: 2014-01-03 07:17+0000\n"
2153+"PO-Revision-Date: 2014-01-03 02:18-0500\n"
2154+"Last-Translator: EL Hadji DEM <elhadji.dem@savoirfairelinux.com>\n"
2155+"Language-Team: \n"
2156+"MIME-Version: 1.0\n"
2157+"Content-Type: text/plain; charset=UTF-8\n"
2158+"Content-Transfer-Encoding: 8bit\n"
2159+"Plural-Forms: \n"
2160+"X-Generator: Poedit 1.5.4\n"
2161+
2162+#. module: base_contact_by_functions_partner_firstname
2163+#: view:res.partner:0
2164+msgid "lastname"
2165+msgstr "Nom"
2166+
2167+#. module: base_contact_by_functions_partner_firstname
2168+#: view:res.partner:0
2169+msgid "Firstname"
2170+msgstr "Prénom"
2171
2172=== added file 'base_contact_by_functions_partner_firstname/res_partner.py'
2173--- base_contact_by_functions_partner_firstname/res_partner.py 1970-01-01 00:00:00 +0000
2174+++ base_contact_by_functions_partner_firstname/res_partner.py 2014-04-30 15:00:54 +0000
2175@@ -0,0 +1,76 @@
2176+# -*- encoding: utf-8 -*-
2177+##############################################################################
2178+#
2179+# OpenERP, Open Source Management Solution
2180+# This module copyright (C) 2013 Savoir-faire Linux
2181+# (<http://www.savoirfairelinux.com>).
2182+#
2183+# This program is free software: you can redistribute it and/or modify
2184+# it under the terms of the GNU Affero General Public License as
2185+# published by the Free Software Foundation, either version 3 of the
2186+# License, or (at your option) any later version.
2187+#
2188+# This program is distributed in the hope that it will be useful,
2189+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2190+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2191+# GNU Affero General Public License for more details.
2192+#
2193+# You should have received a copy of the GNU Affero General Public License
2194+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2195+#
2196+##############################################################################
2197+
2198+import time
2199+from openerp.osv import orm, fields
2200+
2201+
2202+class res_partner(orm.Model):
2203+ """
2204+ Inherits partner and adds functions_ids : List of functions
2205+ """
2206+ _inherit = 'res.partner'
2207+
2208+ def create(self, cr, user, vals, context=None):
2209+ context = self._basecontact_check_context(cr, user, 'create', context)
2210+ if not vals.get('name') and vals.get('contact_id'):
2211+ vals['name'] = self.browse(cr, user, vals['contact_id'], context=context).name
2212+ if vals.get('end_date'):
2213+ if vals['end_date'] and vals['end_date'] <= time.strftime('%Y-%m-%d'):
2214+ vals['active'] = False
2215+ if vals.get('contact_type') and vals.get('contact_type') == 'standalone':
2216+ contact_vals = {key: vals[key] for key in vals.keys() if key != 'parent_id'}
2217+ contact_vals['active'] = True
2218+ contact_vals['function_id'] = None
2219+ vals['contact_id'] = super(res_partner, self).create(cr, user, contact_vals,
2220+ context=context)
2221+ self.write(cr, user, vals['contact_id'], {
2222+ 'firstname': vals.get('firstname', ''),
2223+ 'lastname': vals.get('lastname', ''),
2224+ }, context=context)
2225+ # Check if we create existing contact from company(ie: company is true)
2226+ # Check if we create another function from contact view
2227+ if vals.get('contact_type') == 'attached' or (not vals.get('contact_type') and vals.get('contact_id')):
2228+ contact_info = self.browse(cr, user, vals.get('contact_id'), context=context)
2229+ vals['firstname'] = contact_info.firstname
2230+ vals['title'] = contact_info.title.id or ''
2231+
2232+ if ('contact_id'in vals and ('reset_password' in context or
2233+ 'install_mode' in context)):
2234+ return vals['contact_id']
2235+ res = super(res_partner, self).create(cr, user, vals, context=context)
2236+ return res
2237+
2238+ def write(self, cr, user, ids, vals, context=None):
2239+ context = self._basecontact_check_context(cr, user, 'write', context)
2240+ if vals.get('end_date'):
2241+ if vals['end_date'] and vals['end_date'] <= time.strftime('%Y-%m-%d'):
2242+ vals['active'] = False
2243+ if vals.get('contact_type') and vals.get('contact_type') == 'standalone':
2244+ contact_vals = {key: vals[key] for key in vals.keys() if key != 'parent_id'}
2245+ contact_vals['active'] = True
2246+ contact_vals['function_id'] = None
2247+ vals['contact_id'] = super(res_partner, self).write(cr, user, contact_vals,
2248+ context=context)
2249+ return super(res_partner, self).write(cr, user, ids, vals, context=context)
2250+
2251+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2252
2253=== added file 'base_contact_by_functions_partner_firstname/res_partner_view.xml'
2254--- base_contact_by_functions_partner_firstname/res_partner_view.xml 1970-01-01 00:00:00 +0000
2255+++ base_contact_by_functions_partner_firstname/res_partner_view.xml 2014-04-30 15:00:54 +0000
2256@@ -0,0 +1,71 @@
2257+<?xml version = "1.0" encoding="utf-8"?>
2258+<openerp>
2259+ <data>
2260+
2261+ <!--Redefine this part of view from firstname_partner module -->
2262+ <record id="view_partner_form_firstname_inherit11" model="ir.ui.view">
2263+ <field name="name">res.partner.form.firstname.inherit11</field>
2264+ <field name="model">res.partner</field>
2265+ <field name="inherit_id" ref="partner_firstname.view_partner_form_firstname"/>
2266+ <field name="arch" type="xml">
2267+ <!--Redefine firstname field in view partner-->
2268+ <field name="firstname" position="replace">
2269+ <group attrs="{'invisible': [('is_company', '=', True)]}">
2270+ <field name="firstname"/>
2271+ </group>
2272+ </field>
2273+ <!--Redefine firstname field in contact view-->
2274+ <xpath expr="//form[@string='Contact']/sheet/div//field[@name='firstname']" position="replace">
2275+ <field name="firstname" attrs="{'invisible': [('contact_type', '=', 'attached')]}"/>
2276+ </xpath>
2277+ </field>
2278+ </record>
2279+
2280+ <!--Replace name by full name in kanban view-->
2281+ <record id="view_partner_form_firstname_inherit11" model="ir.ui.view">
2282+ <field name="model">res.partner</field>
2283+ <field name="inherit_id" ref="base_contact_by_functions.view_contact_by_function_form"/>
2284+ <field name="arch" type="xml">
2285+ <xpath expr="//field[@name='other_contact_history_ids']/kanban//field[@name='name']" position="replace">
2286+ <field name="lastname"/>
2287+ </xpath>
2288+ <xpath expr="//field[@name='other_contact_history_ids']/kanban/templates//t[@t-name='kanban-box']//div[@class='oe_kanban_details']//field[@name='name']"
2289+ position="before">
2290+ <field name="firstname"/>
2291+ </xpath>
2292+ <!--Display firstname and name after Image-->
2293+ <xpath expr="//field[@name='other_contact_history_ids']/form[@string='Contact']/sheet//field[@name='image']"
2294+ position="after">
2295+ <h1>
2296+ <field name="contact_id" style="width: 70%%" readonly="1"/>
2297+ </h1>
2298+ </xpath>
2299+ </field>
2300+ </record>
2301+
2302+ <!--Display firstname and name in kanban view for other position -->
2303+ <record id="view_partner_form_firstname_name" model="ir.ui.view">
2304+ <field name="name">res.partner.form.firstname.name</field>
2305+ <field name="model">res.partner</field>
2306+ <field name="inherit_id" ref="base_contact_by_functions.view_position_info_form"/>
2307+ <field name="arch" type="xml">
2308+ <xpath expr="//field[@name='other_contact_ids']/form[@string='Contact']/sheet/div//field[@name='name']"
2309+ position="replace"/>
2310+ <xpath expr="//field[@name='other_contact_ids']/form[@string='Contact']/sheet//field[@name='image']"
2311+ position="after">
2312+ <h1>
2313+ <field name="contact_id" style="width: 70%%" readonly="1"/>
2314+ </h1>
2315+ </xpath>
2316+ <!--I don't want to display the label field, so I hide it-->
2317+ <xpath expr="//field[@name='other_contact_ids']/form[@string='Contact']/sheet/div//label[@for='name']"
2318+ position="replace"/>
2319+ <!--Add firstname before name in templates view-->
2320+ <xpath expr="//t[@t-name='kanban-box']//div[@class='oe_kanban_details']/h4[@class='oe_partner_heading']//field[@name='name']"
2321+ position="before">
2322+ <field name="firstname"/>
2323+ </xpath>
2324+ </field>
2325+ </record>
2326+ </data>
2327+</openerp>
2328
2329=== added directory 'base_contact_by_functions_partner_firstname/tests'
2330=== added file 'base_contact_by_functions_partner_firstname/tests/__init__.py'
2331--- base_contact_by_functions_partner_firstname/tests/__init__.py 1970-01-01 00:00:00 +0000
2332+++ base_contact_by_functions_partner_firstname/tests/__init__.py 2014-04-30 15:00:54 +0000
2333@@ -0,0 +1,27 @@
2334+# -*- encoding: utf-8 -*-
2335+##############################################################################
2336+#
2337+# OpenERP, Open Source Management Solution
2338+# This module copyright (C) 2010 - 2014 Savoir-faire Linux
2339+# (<http://www.savoirfairelinux.com>).
2340+#
2341+# This program is free software: you can redistribute it and/or modify
2342+# it under the terms of the GNU Affero General Public License as
2343+# published by the Free Software Foundation, either version 3 of the
2344+# License, or (at your option) any later version.
2345+#
2346+# This program is distributed in the hope that it will be useful,
2347+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2348+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2349+# GNU Affero General Public License for more details.
2350+#
2351+# You should have received a copy of the GNU Affero General Public License
2352+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2353+#
2354+##############################################################################
2355+
2356+from . import test_partner
2357+
2358+checks = [
2359+ test_partner,
2360+]
2361
2362=== added file 'base_contact_by_functions_partner_firstname/tests/test_partner.py'
2363--- base_contact_by_functions_partner_firstname/tests/test_partner.py 1970-01-01 00:00:00 +0000
2364+++ base_contact_by_functions_partner_firstname/tests/test_partner.py 2014-04-30 15:00:54 +0000
2365@@ -0,0 +1,51 @@
2366+# -*- encoding: utf-8 -*-
2367+##############################################################################
2368+#
2369+# OpenERP, Open Source Management Solution
2370+# This module copyright (C) 2010 - 2014 Savoir-faire Linux
2371+# (<http://www.savoirfairelinux.com>).
2372+#
2373+# This program is free software: you can redistribute it and/or modify
2374+# it under the terms of the GNU Affero General Public License as
2375+# published by the Free Software Foundation, either version 3 of the
2376+# License, or (at your option) any later version.
2377+#
2378+# This program is distributed in the hope that it will be useful,
2379+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2380+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2381+# GNU Affero General Public License for more details.
2382+#
2383+# You should have received a copy of the GNU Affero General Public License
2384+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2385+#
2386+##############################################################################
2387+
2388+from openerp.tests.common import TransactionCase
2389+
2390+
2391+class test_partner_contact_id(TransactionCase):
2392+
2393+ def setUp(self):
2394+ super(test_partner_contact_id, self).setUp()
2395+ # Clean up registries
2396+ self.registry('ir.model').clear_caches()
2397+ self.registry('ir.model.data').clear_caches()
2398+ # Get registries
2399+ self.user_model = self.registry("res.users")
2400+ self.partner_model = self.registry("res.partner")
2401+ # Get context
2402+ self.context = self.user_model.context_get(self.cr, self.uid)
2403+ # Create values for test, contact also created
2404+ contact_id = self.partner_model.create(self.cr, self.uid, {
2405+ 'name': 'test_contact',
2406+ 'title': 1,
2407+ }, context=self.context)
2408+ self.vals = {
2409+ 'name': 'test_partner',
2410+ 'type': 'contact',
2411+ 'contact_id': contact_id,
2412+ }
2413+
2414+ def test_create_partner(self):
2415+ cr, uid, vals, context = self.cr, self.uid, self.vals, self.context
2416+ self.partner_model.create(cr, uid, vals, context=context)