diff --git a/passport/__init__.py b/passport/__init__.py new file mode 100644 index 000000000..1646d79a2 --- /dev/null +++ b/passport/__init__.py @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2013-2014 Savoir-faire Linux +# (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import res_passport +from . import res_partner diff --git a/passport/__openerp__.py b/passport/__openerp__.py new file mode 100644 index 000000000..1589c9cf0 --- /dev/null +++ b/passport/__openerp__.py @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2013-2014 Savoir-faire Linux +# (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Passport Management', + 'version': '0.1', + 'author': 'Savoir-faire Linux', + 'maintainer': 'Savoir-faire Linux', + 'website': 'http://www.savoirfairelinux.com', + 'license': 'AGPL-3', + 'category': 'Customer Relationship Management', + 'description': """ +Passport Management +=================== + +Contributors +------------ +* El Hadji Dem (elhadji.dem@savoirfairelinux.com) +* Sandy Carter (sandy.carter@savoirfairelinux.com) +""", + 'depends': [], + 'external_dependencies': {}, + 'data': [ + 'res_passport_view.xml', + "res_partner_view.xml", + 'security/ir.model.access.csv', + ], + 'demo': [], + 'test': [], + 'installable': True, +} diff --git a/passport/i18n/fr.po b/passport/i18n/fr.po new file mode 100644 index 000000000..8fb1fceb0 --- /dev/null +++ b/passport/i18n/fr.po @@ -0,0 +1,126 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * passport +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-24 23:40+0000\n" +"PO-Revision-Date: 2014-02-24 18:47-0500\n" +"Last-Translator: Sandy Carter \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 1.6.4\n" + +#. module: passport +#: help:res.passport,country_id:0 +msgid "Country of deliverance." +msgstr "Pays émetteur." + +#. module: passport +#: help:res.passport,birth_date:0 +msgid "Date of birth on passport." +msgstr "Date de naissance sur le passeport." + +#. module: passport +#: help:res.passport,gender:0 +msgid "Gender." +msgstr "Sexe." + +#. module: passport +#: model:ir.actions.act_window,name:passport.action_passport_tree_list +#: model:ir.model,name:passport.model_res_passport view:res.partner:0 +#: field:res.partner,passport_ids:0 +msgid "Passport" +msgstr "Passeport" + +#. module: passport +#: field:res.passport,country_id:0 +msgid "Delivery country" +msgstr "Pays de délivrance" + +#. module: passport +#: field:res.passport,name:0 +msgid "Owner name" +msgstr "Nom du propriétaire" + +#. module: passport +#: field:res.passport,gender:0 +msgid "Gender" +msgstr "Sexe" + +#. module: passport +#: field:res.passport,number:0 +msgid "Passport No" +msgstr "No du passeport" + +#. module: passport +#: help:res.passport,expiration_date:0 +msgid "Expiration date of passport." +msgstr "Date d'expiration sur le passeport." + +#. module: passport +#: view:res.passport:0 +msgid "PassportTree" +msgstr "PassportTree" + +#. module: passport +#: code:addons/passport/res_partner.py:39 +#, python-format +msgid "New Passport" +msgstr "Nouveau passeport" + +#. module: passport +#: view:res.passport:0 +msgid "PassportForm" +msgstr "PassportForm" + +#. module: passport +#: field:res.passport,partner_id:0 +msgid "Contact" +msgstr "Contact" + +#. module: passport +#: help:res.passport,number:0 +msgid "Passport number." +msgstr "Numéro du passeport." + +#. module: passport +#: selection:res.passport,gender:0 +msgid "Female" +msgstr "Femme" + +#. module: passport +#: help:res.passport,name:0 +msgid "Owner name (As printed into the passport)." +msgstr "Nom du propriétaire (Comme écrit sur le passeport)." + +#. module: passport +#: model:ir.model,name:passport.model_res_partner +msgid "Partner" +msgstr "Organisme" + +#. module: passport +#: selection:res.passport,gender:0 +msgid "Male" +msgstr "Homme" + +#. module: passport +#: view:res.passport:0 +msgid "Owner name (As printed into the passport)" +msgstr "Nom du propriétaire (Comme écrit sur le passeport)" + +#. module: passport +#: field:res.passport,expiration_date:0 +msgid "Expiration date" +msgstr "Date d'expiration" + +#. module: passport +#: field:res.passport,birth_date:0 +msgid "Birth Date" +msgstr "Date de naissance" diff --git a/passport/i18n/passport.pot b/passport/i18n/passport.pot new file mode 100644 index 000000000..62a361c40 --- /dev/null +++ b/passport/i18n/passport.pot @@ -0,0 +1,125 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * passport +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-24 23:40+0000\n" +"PO-Revision-Date: 2014-02-24 23:40+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: passport +#: help:res.passport,country_id:0 +msgid "Country of deliverance." +msgstr "" + +#. module: passport +#: help:res.passport,birth_date:0 +msgid "Date of birth on passport." +msgstr "" + +#. module: passport +#: help:res.passport,gender:0 +msgid "Gender." +msgstr "" + +#. module: passport +#: model:ir.actions.act_window,name:passport.action_passport_tree_list +#: model:ir.model,name:passport.model_res_passport +#: view:res.partner:0 +#: field:res.partner,passport_ids:0 +msgid "Passport" +msgstr "" + +#. module: passport +#: field:res.passport,country_id:0 +msgid "Delivery country" +msgstr "" + +#. module: passport +#: field:res.passport,name:0 +msgid "Owner name" +msgstr "" + +#. module: passport +#: field:res.passport,gender:0 +msgid "Gender" +msgstr "" + +#. module: passport +#: field:res.passport,number:0 +msgid "Passport No" +msgstr "" + +#. module: passport +#: help:res.passport,expiration_date:0 +msgid "Expiration date of passport." +msgstr "" + +#. module: passport +#: view:res.passport:0 +msgid "PassportTree" +msgstr "" + +#. module: passport +#: code:addons/passport/res_partner.py:39 +#, python-format +msgid "New Passport" +msgstr "" + +#. module: passport +#: view:res.passport:0 +msgid "PassportForm" +msgstr "" + +#. module: passport +#: field:res.passport,partner_id:0 +msgid "Contact" +msgstr "" + +#. module: passport +#: help:res.passport,number:0 +msgid "Passport number." +msgstr "" + +#. module: passport +#: selection:res.passport,gender:0 +msgid "Female" +msgstr "" + +#. module: passport +#: help:res.passport,name:0 +msgid "Owner name (As printed into the passport)." +msgstr "" + +#. module: passport +#: model:ir.model,name:passport.model_res_partner +msgid "Partner" +msgstr "" + +#. module: passport +#: selection:res.passport,gender:0 +msgid "Male" +msgstr "" + +#. module: passport +#: view:res.passport:0 +msgid "Owner name (As printed into the passport)" +msgstr "" + +#. module: passport +#: field:res.passport,expiration_date:0 +msgid "Expiration date" +msgstr "" + +#. module: passport +#: field:res.passport,birth_date:0 +msgid "Birth Date" +msgstr "" diff --git a/passport/res_partner.py b/passport/res_partner.py new file mode 100644 index 000000000..3ad15e2d3 --- /dev/null +++ b/passport/res_partner.py @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2013-2014 Savoir-faire Linux +# (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import orm, fields + + +class res_partner(orm.Model): + _inherit = 'res.partner' + _columns = { + 'passport_ids': fields.one2many( + 'res.passport', 'partner_id', 'Passport'), + } diff --git a/passport/res_partner_view.xml b/passport/res_partner_view.xml new file mode 100644 index 000000000..ce81a8f73 --- /dev/null +++ b/passport/res_partner_view.xml @@ -0,0 +1,17 @@ + + + + + res.partner + + + + + + + + + + + + diff --git a/passport/res_passport.py b/passport/res_passport.py new file mode 100644 index 000000000..3089e9597 --- /dev/null +++ b/passport/res_passport.py @@ -0,0 +1,58 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2013-2014 Savoir-faire Linux +# (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import fields, orm + + +class res_passport(orm.Model): + _description = 'Passport' + _name = 'res.passport' + _columns = { + 'name': fields.char( + 'Owner name', help='Owner name (As printed into the passport).'), + 'number': fields.char( + 'Passport No', size=50, help='Passport number.'), + 'country_id': fields.many2one( + 'res.country', 'Delivery country', help="Country of deliverance."), + 'expiration_date': fields.date( + 'Expiration date', help="Expiration date of passport."), + 'birth_date': fields.date('Birth Date', + help="Date of birth on passport."), + 'gender': fields.selection( + [('male', 'Male'), + ('female', 'Female')], + 'Gender', help="Gender."), + 'partner_id': fields.many2one('res.partner', 'Contact'), + } + + def name_get(self, cr, uid, ids, context=None): + if type(ids) in (int, long): + ids = [ids] + res = [] + for res_passport in self.browse(cr, uid, ids, context=context): + name_elements = [] + if res_passport.country_id and res_passport.country_id.name: + name_elements.append(res_passport.country_id.name) + if res_passport.name: + name_elements.append(res_passport.name) + res.append((res_passport.id, ' | '.join(name_elements))) + return res diff --git a/passport/res_passport_view.xml b/passport/res_passport_view.xml new file mode 100644 index 000000000..3bc4fac37 --- /dev/null +++ b/passport/res_passport_view.xml @@ -0,0 +1,46 @@ + + + + + + Passport Tree View + res.passport + tree + + + + + + + + + + + + + Passport Form View + res.passport + form + +
+ + + + + + + + +
+
+
+ + + + Passport + + res.passport + tree,form + +
+
diff --git a/passport/security/ir.model.access.csv b/passport/security/ir.model.access.csv new file mode 100644 index 000000000..728723cfe --- /dev/null +++ b/passport/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_res_passport","res_passport_user","model_res_passport","base.group_user",1,1,1,1 diff --git a/passport/tests/__init__.py b/passport/tests/__init__.py new file mode 100644 index 000000000..379245ef1 --- /dev/null +++ b/passport/tests/__init__.py @@ -0,0 +1,27 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2013 Savoir-faire Linux +# (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import test_passport + +checks = [ + test_passport, +] diff --git a/passport/tests/test_passport.py b/passport/tests/test_passport.py new file mode 100644 index 000000000..1f59eb9ad --- /dev/null +++ b/passport/tests/test_passport.py @@ -0,0 +1,164 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2013 Savoir-faire Linux +# (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.tests.common import TransactionCase +from openerp.osv.orm import browse_record +from datetime import date + + +class Base_Test_passport(TransactionCase): + """ + Simple test creating a passport + This is a base class for passport test cases. + Inherit from this and setup values. + """ + + def setUp(self, vals={}): + """ + Setting up passport. + """ + # Default test values + self.vals = {'name': 'This is a test passport name', + 'number': 'A200124789', + 'country_id': 1, + 'expiration_date': date(2013, 11, 14), + 'birth_date': date(1980, 11, 21), + 'gender': 'male', + } + super(Base_Test_passport, self).setUp() + # Overwrite vals if needed + self.vals = dict(self.vals.items() + vals.items()) + # Create the passport object; we will be testing this, so store in self + res_passport = self.registry('res.passport') + self.passport_id = res_passport.create(self.cr, self.uid, self.vals, context=None) + + def test_passport(self): + """ + Checking the passport creation. + """ + res_passport = self.registry('res.passport') + passport_obj = res_passport.browse(self.cr, self.uid, self.passport_id, context=None) + for field in self.vals: + val = passport_obj[field] + if type(val) == browse_record: + self.assertEquals(self.vals[field], val.id, + "IDs for %s don't match: (%i != %i)" % + (field, self.vals[field], val.id)) + else: + self.assertEquals(str(self.vals[field]), str(val), + "Values for %s don't match: (%s != %s)" % + (field, str(self.vals[field]), str(val))) + + +class Test_passport_bad(Base_Test_passport): + """ + Simple test creating a passport, test against bad values + """ + def setUp(self): + """ + Setting up passport, then changing the values to test against. + """ + super(Test_passport_bad, self).setUp() + # Change vals to something wrong + self.vals = { + 'name': 'This is the wrong passport name', + 'number': 'A111111111', + 'country_id': 0, + 'expiration_date': date(1999, 11, 14), + 'birth_date': date(1999, 11, 21), + 'gender': '', + } + + def test_passport(self): + """ + Checking the passport creation, assertions should all be false. + """ + res_passport = self.registry('res.passport') + passport_obj = res_passport.browse(self.cr, self.uid, self.passport_id, context=None) + for field in self.vals: + val = passport_obj[field] + if type(val) == browse_record: + self.assertNotEqual(self.vals[field], val.id, + "IDs for %s don't match: (%i != %i)" % + (field, self.vals[field], val.id)) + else: + self.assertNotEqual(str(self.vals[field]), str(val), + "Values for %s don't match: (%s != %s)" % + (field, str(self.vals[field]), str(val))) + + +class Test_passport_name_get(TransactionCase): + """ + Test name_get + """ + def setUp(self): + """ + Setting up passport with name, country, either and none. + """ + super(Test_passport_name_get, self).setUp() + res_passport = self.registry('res.passport') + res_country = self.registry('res.country') + country = res_country.browse(self.cr, self.uid, 1, context=None) + self.name_on_passport = 'test name' + self.country_name = country.name_get()[0][1] + self.both = res_passport.create( + self.cr, self.uid, {'name': self.name_on_passport, + 'country_id': country.id, }, + context=None) + self.name_only = res_passport.create( + self.cr, self.uid, {'name': self.name_on_passport, }, + context=None) + self.country_only = res_passport.create( + self.cr, self.uid, {'country_id': country.id, }, + context=None) + self.neither = res_passport.create( + self.cr, self.uid, {}, + context=None) + + def test_passport(self): + """ + Checking the passport creation, assertions should all be false. + """ + res_passport = self.registry('res.passport') + both_obj = res_passport.browse(self.cr, self.uid, self.both, context=None) + name_only = res_passport.browse(self.cr, self.uid, self.name_only, context=None) + country_only = res_passport.browse(self.cr, self.uid, self.country_only, context=None) + neither = res_passport.browse(self.cr, self.uid, self.neither, context=None) + self.assertEquals( + both_obj.name_get()[0][1], + ' | '.join((self.country_name, self.name_on_passport)), + 'Error in passport name_get() with both country name and name on ' + 'passport.' + ) + self.assertEquals( + name_only.name_get()[0][1], self.name_on_passport, + 'Error in passport name_get() with only name on passport.' + ) + self.assertEquals( + country_only.name_get()[0][1], self.country_name, + 'Error in passport name_get() with only name of country.' + ) + self.assertEquals( + neither.name_get()[0][1], '', + 'Error in passport name_get() with neither country name nor name ' + 'on passport.' + )