Merge branch 'master' into golem_resource_account

This commit is contained in:
eloyoussef 2018-03-19 16:46:59 +01:00
commit aad88c2fed
26 changed files with 813 additions and 327 deletions

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2017 Fabien Bourgeois <fabien@yaltik.com> # Copyright 2017-2018 Fabien Bourgeois <fabien@yaltik.com>
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -18,7 +18,7 @@
{ {
'name': 'GOLEM Activity Member Registrations', 'name': 'GOLEM Activity Member Registrations',
'summary': 'GOLEM Activities Member Registrations management', 'summary': 'GOLEM Activities Member Registrations management',
'version': '10.0.1.1.0', 'version': '10.0.1.1.3',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Fabien Bourgeois, Michel Dessenne', 'author': 'Fabien Bourgeois, Michel Dessenne',
'license': 'AGPL-3', 'license': 'AGPL-3',
@ -26,6 +26,8 @@
'installable': True, 'installable': True,
'depends': ['golem_activity', 'golem_member'], 'depends': ['golem_activity', 'golem_member'],
'data': ['views/golem_activity_registration_views.xml', 'data': ['views/golem_activity_registration_views.xml',
'views/golem_member_views.xml', 'views/golem_activity_views.xml', 'views/golem_member_views.xml',
'views/golem_activity_views.xml',
'report/golem_member_card_templates.xml',
'security/ir.model.access.csv'] 'security/ir.model.access.csv']
} }

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 10.0\n" "Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-06-14 23:16+0000\n" "POT-Creation-Date: 2018-03-17 14:18+0000\n"
"PO-Revision-Date: 2017-06-28 17:30+0000\n" "PO-Revision-Date: 2018-03-17 14:18+0000\n"
"Last-Translator: <>\n" "Last-Translator: <>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -17,6 +17,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration #: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration
msgid "Activities" msgid "Activities"
msgstr "Activités" msgstr "Activités"
@ -36,6 +37,11 @@ msgstr "Inscriptions"
msgid "All activities" msgid "All activities"
msgstr "Toutes les activités" msgstr "Toutes les activités"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Animator"
msgstr "Intervenant"
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration #: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration
msgid "Base price" msgid "Base price"
@ -71,6 +77,21 @@ msgstr "Activités de la saison affichée par défaut"
msgid "Current season?" msgid "Current season?"
msgstr "Saison en cours?" msgstr "Saison en cours?"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Date start"
msgstr "Début"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Date stop"
msgstr "Fin"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Day"
msgstr "Jour"
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_activity_registration_search #: model:ir.ui.view,arch_db:golem_activity_registration.golem_activity_registration_search
msgid "Default season" msgid "Default season"
@ -106,6 +127,16 @@ msgstr "Liste des inscriptions aux activités"
msgid "GOLEM Member" msgid "GOLEM Member"
msgstr "Adhérent" msgstr "Adhérent"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Hour start"
msgstr "Début"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Hour stop"
msgstr "Fin"
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.model.fields,field_description:golem_activity_registration.field_golem_activity_registration_id #: model:ir.model.fields,field_description:golem_activity_registration.field_golem_activity_registration_id
msgid "ID" msgid "ID"
@ -137,6 +168,11 @@ msgstr "Adhérent"
msgid "Members" msgid "Members"
msgstr "Adhérents" msgstr "Adhérents"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Name"
msgstr "Nom"
#. module: golem_activity_registration #. module: golem_activity_registration
#: code:addons/golem_activity_registration/models/golem_activity_registration.py:38 #: code:addons/golem_activity_registration/models/golem_activity_registration.py:38
#: sql_constraint:golem.activity:0 #: sql_constraint:golem.activity:0
@ -186,13 +222,13 @@ msgid "Subscription"
msgstr "Inscription" msgstr "Inscription"
#. module: golem_activity_registration #. module: golem_activity_registration
#: code:addons/golem_activity_registration/models/golem_activity_registration.py:98 #: code:addons/golem_activity_registration/models/golem_activity_registration.py:99
#, python-format #, python-format
msgid "Subscription can not be executed : the targeted member is not on the same season as the activity." msgid "Subscription can not be executed : the targeted member is not on the same season as the activity."
msgstr "L'inscription n'a pas pu être enregistrée : l'usager visé n'est pas ahdérant pour la même saison que celle pendant laquelle se déroule l'activité." msgstr "L'inscription n'a pas pu être enregistrée : l'usager visé n'est pas ahdérant pour la même saison que celle pendant laquelle se déroule l'activité."
#. module: golem_activity_registration #. module: golem_activity_registration
#: code:addons/golem_activity_registration/models/golem_activity_registration.py:90 #: code:addons/golem_activity_registration/models/golem_activity_registration.py:91
#: sql_constraint:golem.activity.registration:0 #: sql_constraint:golem.activity.registration:0
#, python-format #, python-format
msgid "This member has already been registered for this activity." msgid "This member has already been registered for this activity."
@ -203,3 +239,7 @@ msgstr "L'usager a déjà été inscrit à cette activité."
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Type"
msgstr "Type"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 10.0\n" "Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-01-09 15:14+0000\n" "POT-Creation-Date: 2018-03-17 14:18+0000\n"
"PO-Revision-Date: 2018-01-09 15:14+0000\n" "PO-Revision-Date: 2018-03-17 14:18+0000\n"
"Last-Translator: <>\n" "Last-Translator: <>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -16,6 +16,7 @@ msgstr ""
"Plural-Forms: \n" "Plural-Forms: \n"
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration #: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration
msgid "Activities" msgid "Activities"
msgstr "" msgstr ""
@ -35,6 +36,11 @@ msgstr ""
msgid "All activities" msgid "All activities"
msgstr "" msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Animator"
msgstr ""
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration #: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_form_inherit_golem_activity_registration
msgid "Base price" msgid "Base price"
@ -70,6 +76,21 @@ msgstr ""
msgid "Current season?" msgid "Current season?"
msgstr "" msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Date start"
msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Date stop"
msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Day"
msgstr ""
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_activity_registration_search #: model:ir.ui.view,arch_db:golem_activity_registration.golem_activity_registration_search
msgid "Default season" msgid "Default season"
@ -105,6 +126,16 @@ msgstr ""
msgid "GOLEM Member" msgid "GOLEM Member"
msgstr "" msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Hour start"
msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Hour stop"
msgstr ""
#. module: golem_activity_registration #. module: golem_activity_registration
#: model:ir.model.fields,field_description:golem_activity_registration.field_golem_activity_registration_id #: model:ir.model.fields,field_description:golem_activity_registration.field_golem_activity_registration_id
msgid "ID" msgid "ID"
@ -136,6 +167,11 @@ msgstr ""
msgid "Members" msgid "Members"
msgstr "" msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Name"
msgstr ""
#. module: golem_activity_registration #. module: golem_activity_registration
#: code:addons/golem_activity_registration/models/golem_activity_registration.py:38 #: code:addons/golem_activity_registration/models/golem_activity_registration.py:38
#: sql_constraint:golem.activity:0 #: sql_constraint:golem.activity:0
@ -185,13 +221,13 @@ msgid "Subscription"
msgstr "" msgstr ""
#. module: golem_activity_registration #. module: golem_activity_registration
#: code:addons/golem_activity_registration/models/golem_activity_registration.py:98 #: code:addons/golem_activity_registration/models/golem_activity_registration.py:99
#, python-format #, python-format
msgid "Subscription can not be executed : the targeted member is not on the same season as the activity." msgid "Subscription can not be executed : the targeted member is not on the same season as the activity."
msgstr "" msgstr ""
#. module: golem_activity_registration #. module: golem_activity_registration
#: code:addons/golem_activity_registration/models/golem_activity_registration.py:90 #: code:addons/golem_activity_registration/models/golem_activity_registration.py:91
#: sql_constraint:golem.activity.registration:0 #: sql_constraint:golem.activity.registration:0
#, python-format #, python-format
msgid "This member has already been registered for this activity." msgid "This member has already been registered for this activity."
@ -202,3 +238,8 @@ msgstr ""
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#. module: golem_activity_registration
#: model:ir.ui.view,arch_db:golem_activity_registration.golem_member_card_template_inherit_golem_activity_resgitration
msgid "Type"
msgstr ""

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
Copyright 2018 Michel Dessenne <michel@yaltik.com>
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 <http://www.gnu.org/licenses/>.
-->
<odoo>
<template id="golem_member_card_template_inherit_golem_activity_resgitration"
inherit_id="golem_member.golem_member_card_template">
<xpath expr="//div[@id='page_report_member']/div[1]" postion="after">
<h3>Activities</h3>
<table id="table_activity_ref" class="table table-striped">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Animator</th>
<th>Day</th>
<th>Hour start</th>
<th>Hour stop</th>
<th>Date start</th>
<th id="activity_inherit_th">Date stop</th>
</tr>
</thead>
<tbody>
<tr id="activity_inherit_price_sum"
t-foreach="member.activity_registration_ids" t-as="reg">
<td class="col-xs-2">
<span t-esc="reg.activity_id.name" />
</td>
<td class="col-xs-2">
<span t-esc="reg.activity_id.type_id.name" />
</td>
<td class="col-xs-2">
<span t-field="reg.activity_id.animator_id" />
</td>
<td class="col-xs-2">
<span t-field="reg.activity_id.weekday" />
</td>
<td class="col-xs-1">
<t t-esc="'%02d:%02d' % (int(reg.activity_id.hour_start), round(reg.activity_id.hour_start % 1 * 60))" />
</td>
<td class="col-xs-1">
<t t-esc="'%02d:%02d' % (int(reg.activity_id.hour_stop), round(reg.activity_id.hour_stop % 1 * 60))" />
</td>
<td class="col-xs-2">
<span t-if="reg.activity_id.is_fullseason" t-field="season.date_start" />
<span t-else="" t-field="reg.activity_id.date_start" />
</td>
<td id="activity_inherit_td">
<span t-if="reg.activity_id.is_fullseason" t-field="season.date_end" />
<span t-else="" t-field="reg.activity_id.date_stop" />
</td>
</tr>
<tr id="activity_inherit_total" />
</tbody>
</table>
</xpath>
</template>
</odoo>

View File

@ -18,7 +18,7 @@
{ {
'name': 'GOLEM Activity Session Member Registrations States', 'name': 'GOLEM Activity Session Member Registrations States',
'summary': 'GOLEM Activities Session Member Registration states', 'summary': 'GOLEM Activities Session Member Registration states',
'version': '10.0.1.0.0', 'version': '10.0.1.0.1',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Fabien Bourgeois', 'author': 'Fabien Bourgeois',
'license': 'AGPL-3', 'license': 'AGPL-3',
@ -27,6 +27,6 @@
'depends': ['golem_activity_registration', 'golem_payment'], 'depends': ['golem_activity_registration', 'golem_payment'],
'data': ['views/golem_activity_registration_views.xml', 'data': ['views/golem_activity_registration_views.xml',
'views/golem_member_views.xml', 'views/golem_activity_views.xml', 'views/golem_member_views.xml', 'views/golem_activity_views.xml',
'wizard/golem_activity_registration_invoicing.xml', 'wizard/golem_activity_registration_invoicing.xml']
'report/golem_member_report.xml'] # 'report/golem_member_report.xml']
} }

View File

@ -18,13 +18,13 @@
{ {
'name': 'GOLEM base module for global dependencies', 'name': 'GOLEM base module for global dependencies',
'summary': 'GOLEM base installs base and shared dependencies for GOLEM', 'summary': 'GOLEM base installs base and shared dependencies for GOLEM',
'version': '10.0.1.0.0', 'version': '10.0.1.0.1',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Fabien Bourgeois', 'author': 'Fabien Bourgeois',
'license': 'AGPL-3', 'license': 'AGPL-3',
'application': False, 'application': False,
'installable': True, 'installable': True,
'depends': ['membership', 'contacts', 'mail', 'account_voucher', 'depends': ['report', 'membership', 'contacts', 'mail', 'account_voucher',
'partner_firstname', 'partner_contact_birthdate', 'partner_firstname', 'partner_contact_birthdate',
'partner_contact_gender', 'partner_contact_gender',
'l10n_fr', 'l10n_fr_state', 'l10n_fr_department', 'l10n_fr', 'l10n_fr_state', 'l10n_fr_department',
@ -33,5 +33,7 @@
'web_widget_url_check', 'web_widget_url_check',
# 'web_one2many_kanban', # 'web_one2many_kanban',
'web_responsive'], 'web_responsive'],
'data': ['security/golem_security.xml', 'views/menus.xml'] 'data': ['security/golem_security.xml',
'views/menus.xml',
'views/yaltik_base_assets.xml']
} }

View File

@ -0,0 +1,6 @@
.golem_report_title {
text-align: center;
padding: 0.4em 0 0.4em 0;
border: 1px solid grey;
background-color: #eeeeee;
}

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
Copyright 2018 Michel Dessenne <michel@yaltik.com>
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 <http://www.gnu.org/licenses/>.
-->
<odoo>
<template id="report_assets_common_inherit_golem_base"
inherit_id="report.assets_common">
<xpath expr="." position="inside">
<link rel="stylesheet" type="text/css"
href="/golem_base/static/src/css/yaltik.css" />
</xpath>
</template>
</odoo>

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2016 Fabien Bourgeois <fabien@yaltik.com> # Copyright 2016-2018 Fabien Bourgeois <fabien@yaltik.com>
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -18,13 +18,16 @@
{ {
'name': 'GOLEM families', 'name': 'GOLEM families',
'summary': 'GOLEM Members Families', 'summary': 'GOLEM Members Families',
'version': '10.0.2.1.1', 'version': '10.0.2.2.0',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Fabien Bourgeois', 'author': 'Fabien Bourgeois',
'license': 'AGPL-3', 'license': 'AGPL-3',
'application': False, 'application': False,
'installable': True, 'installable': True,
'depends': ['golem_member'], 'depends': ['golem_member'],
'data': ['security/ir.model.access.csv', 'views/golem_family_views.xml', 'data': ['security/ir.model.access.csv',
'views/golem_member_views.xml', 'views/res_partner_views.xml'] 'views/golem_family_views.xml',
'views/golem_member_views.xml',
'views/res_partner_views.xml',
'report/golem_member_card_templates.xml']
} }

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 10.0\n" "Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-01-29 14:59+0000\n" "POT-Creation-Date: 2018-03-18 09:24+0000\n"
"PO-Revision-Date: 2018-01-29 14:59+0000\n" "PO-Revision-Date: 2018-03-18 09:24+0000\n"
"Last-Translator: <>\n" "Last-Translator: <>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -26,6 +26,31 @@ msgstr "# de membres"
msgid "0000000000" msgid "0000000000"
msgstr "0000000000" msgstr "0000000000"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "<strong>Address</strong> :"
msgstr "<strong>Adresse</strong> :"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "<strong>Country</strong> :"
msgstr "<strong>Pays</strong> :"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_member_card_template_inherit_golem_family
msgid "<strong>Family :</strong>"
msgstr "<strong>Famille :</strong>"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_member_card_template_inherit_golem_family
msgid "<strong>Role :</strong>"
msgstr "<strong>Role :</strong>"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "<strong>State</strong> :"
msgstr "<strong>Région</strong> :"
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
@ -48,6 +73,7 @@ msgid "City"
msgstr "Ville" msgstr "Ville"
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Communication" msgid "Communication"
@ -71,6 +97,11 @@ msgstr "Nombre"
msgid "Country" msgid "Country"
msgstr "Pays" msgstr "Pays"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Country :"
msgstr "Pays :"
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_create_uid #: model:ir.model.fields,field_description:golem_family.field_golem_family_create_uid
#: model:ir.model.fields,field_description:golem_family.field_golem_family_role_create_uid #: model:ir.model.fields,field_description:golem_family.field_golem_family_role_create_uid
@ -83,6 +114,11 @@ msgstr "Créé par"
msgid "Created on" msgid "Created on"
msgstr "Créé le" msgstr "Créé le"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Details"
msgstr "Détails"
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_display_name #: model:ir.model.fields,field_description:golem_family.field_golem_family_display_name
#: model:ir.model.fields,field_description:golem_family.field_golem_family_role_display_name #: model:ir.model.fields,field_description:golem_family.field_golem_family_role_display_name
@ -107,6 +143,7 @@ msgstr "Familles"
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_id #: model:ir.model.fields,field_description:golem_family.field_golem_member_family_id
#: model:ir.model.fields,field_description:golem_family.field_res_partner_family_id #: model:ir.model.fields,field_description:golem_family.field_res_partner_family_id
#: model:ir.model.fields,field_description:golem_family.field_res_users_family_id #: model:ir.model.fields,field_description:golem_family.field_res_users_family_id
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Family" msgid "Family"
@ -159,6 +196,16 @@ msgstr "Liste des rôles familiaux"
msgid "GOLEM Member" msgid "GOLEM Member"
msgstr "Adhérent" msgstr "Adhérent"
#. module: golem_family
#: model:ir.actions.report.xml,name:golem_family.golem_family_report_html
msgid "Golem family report [HTML]"
msgstr "Cartes adhérents des membres [HTML]"
#. module: golem_family
#: model:ir.actions.report.xml,name:golem_family.golem_family_report_pdf
msgid "Golem family report [PDF]"
msgstr "Cartes adhérents des membres [PDF]"
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_search #: model:ir.ui.view,arch_db:golem_family.golem_family_search
msgid "Group By" msgid "Group By"
@ -188,6 +235,11 @@ msgstr "Dernière mise à jour par"
msgid "Last Updated on" msgid "Last Updated on"
msgstr "Dernière mise à jour le" msgstr "Dernière mise à jour le"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Mail :"
msgstr "Mail :"
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_member_ids #: model:ir.model.fields,field_description:golem_family.field_golem_family_member_ids
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_member_ids #: model:ir.model.fields,field_description:golem_family.field_golem_member_family_member_ids
@ -204,6 +256,11 @@ msgstr "Adhérents"
msgid "Mobile" msgid "Mobile"
msgstr "Mobile" msgstr "Mobile"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Mobile :"
msgstr "Portable :"
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_name #: model:ir.model.fields,field_description:golem_family.field_golem_family_name
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
@ -233,6 +290,11 @@ msgstr "Partenaire"
msgid "Phone" msgid "Phone"
msgstr "Téléphone" msgstr "Téléphone"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Phone :"
msgstr "Téléphone :"
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Please save new member before assigning a family." msgid "Please save new member before assigning a family."
@ -296,6 +358,11 @@ msgstr "Complément de rue"
msgid "Website" msgid "Website"
msgstr "Site Web" msgstr "Site Web"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Website :"
msgstr "Site Web :"
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 10.0\n" "Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-01-29 09:03+0000\n" "POT-Creation-Date: 2018-03-18 09:23+0000\n"
"PO-Revision-Date: 2018-01-29 09:03+0000\n" "PO-Revision-Date: 2018-03-18 09:23+0000\n"
"Last-Translator: <>\n" "Last-Translator: <>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -26,6 +26,31 @@ msgstr ""
msgid "0000000000" msgid "0000000000"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "<strong>Address</strong> :"
msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "<strong>Country</strong> :"
msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_member_card_template_inherit_golem_family
msgid "<strong>Family :</strong>"
msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_member_card_template_inherit_golem_family
msgid "<strong>Role :</strong>"
msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "<strong>State</strong> :"
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
@ -48,6 +73,7 @@ msgid "City"
msgstr "" msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Communication" msgid "Communication"
@ -55,6 +81,9 @@ msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_count #: model:ir.model.fields,field_description:golem_family.field_golem_family_count
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_count
#: model:ir.model.fields,field_description:golem_family.field_res_partner_family_count
#: model:ir.model.fields,field_description:golem_family.field_res_users_family_count
msgid "Count" msgid "Count"
msgstr "" msgstr ""
@ -80,6 +109,11 @@ msgstr ""
msgid "Created on" msgid "Created on"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Details"
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_display_name #: model:ir.model.fields,field_description:golem_family.field_golem_family_display_name
#: model:ir.model.fields,field_description:golem_family.field_golem_family_role_display_name #: model:ir.model.fields,field_description:golem_family.field_golem_family_role_display_name
@ -102,26 +136,17 @@ msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_id #: model:ir.model.fields,field_description:golem_family.field_golem_member_family_id
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_member
#: model:ir.model.fields,field_description:golem_family.field_res_partner_family_id #: model:ir.model.fields,field_description:golem_family.field_res_partner_family_id
#: model:ir.model.fields,field_description:golem_family.field_res_partner_family_member
#: model:ir.model.fields,field_description:golem_family.field_res_users_family_id #: model:ir.model.fields,field_description:golem_family.field_res_users_family_id
#: model:ir.model.fields,field_description:golem_family.field_res_users_family_member #: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_family_search_inherit_golem_membership #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Family" msgid "Family"
msgstr "" msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_count #: code:addons/golem_family/models/golem_family.py:48
#: model:ir.model.fields,field_description:golem_family.field_res_partner_family_count #: code:addons/golem_family/models/golem_family.py:82
#: model:ir.model.fields,field_description:golem_family.field_res_users_family_count
msgid "Family Count"
msgstr ""
#. module: golem_family
#: code:addons/golem_family/models/golem_family.py:49
#: code:addons/golem_family/models/golem_family.py:84
#, python-format #, python-format
msgid "Family Members" msgid "Family Members"
msgstr "" msgstr ""
@ -133,7 +158,6 @@ msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Family members" msgid "Family members"
msgstr "" msgstr ""
@ -167,6 +191,16 @@ msgstr ""
msgid "GOLEM Member" msgid "GOLEM Member"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.actions.report.xml,name:golem_family.golem_family_report_html
msgid "Golem family report [HTML]"
msgstr ""
#. module: golem_family
#: model:ir.actions.report.xml,name:golem_family.golem_family_report_pdf
msgid "Golem family report [PDF]"
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_search #: model:ir.ui.view,arch_db:golem_family.golem_family_search
msgid "Group By" msgid "Group By"
@ -196,8 +230,14 @@ msgstr ""
msgid "Last Updated on" msgid "Last Updated on"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Mail :"
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_member_ids #: model:ir.model.fields,field_description:golem_family.field_golem_family_member_ids
#: model:ir.model.fields,field_description:golem_family.field_golem_member_family_member_ids
#: model:ir.model.fields,field_description:golem_family.field_res_partner_family_member_ids #: model:ir.model.fields,field_description:golem_family.field_res_partner_family_member_ids
#: model:ir.model.fields,field_description:golem_family.field_res_users_family_member_ids #: model:ir.model.fields,field_description:golem_family.field_res_users_family_member_ids
msgid "Members" msgid "Members"
@ -211,6 +251,11 @@ msgstr ""
msgid "Mobile" msgid "Mobile"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Mobile :"
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.model.fields,field_description:golem_family.field_golem_family_name #: model:ir.model.fields,field_description:golem_family.field_golem_family_name
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
@ -240,6 +285,16 @@ msgstr ""
msgid "Phone" msgid "Phone"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Phone :"
msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family
msgid "Please save new member before assigning a family."
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
msgid "Put an internal note..." msgid "Put an internal note..."
@ -298,6 +353,11 @@ msgstr ""
msgid "Website" msgid "Website"
msgstr "" msgstr ""
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_card_template
msgid "Website :"
msgstr ""
#. module: golem_family #. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form #: model:ir.ui.view,arch_db:golem_family.golem_family_form
#: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
Copyright 2018 Michel Dessenne <michel@yaltik.com>
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 <http://www.gnu.org/licenses/>.
-->
<odoo>
<report id="golem_family_report_pdf" model="golem.family"
string="Golem family report [PDF]" report_type="qweb-pdf"
name="golem_family.golem_family_card_template"
file="golem_family.golem_family_card_template"
attachment="(object.name + '.pdf')" />
<report id="golem_family_report_html" model="golem.family"
string="Golem family report [HTML]" report_type="qweb-html"
name="golem_family.golem_family_card_template"
file="golem_family.golem_family_card_template"
attachment="(object.name + '.html')" />
<template id="golem_family_card_template">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<t t-foreach="docs" t-as="o">
<div class="oe_structure"/>
<div class="row">
<div class="col-xs-12">
<h2 class="golem_report_title">
Family <span t-field="o.name" />
</h2>
</div>
<div class="col-xs-6">
<h3>Details</h3>
<t if="o.city">
<address>
<strong>Address</strong> :
<span t-field="o.street" /><br />
<t t-if="o.street2">
<span t-field="o.street2" /><br />
</t>
<span t-field="o.zip" />
<span t-field="o.city" /><br />
</address>
</t>
<t t-if="o.state_id">
<strong>State</strong> :
<span t-field="o.state_id" /><br />
</t>
<t t-if="o.country_id">
<strong>Country</strong> :
<span t-field="o.country_id" />
</t>
</div>
<div class="col-xs-6">
<h3>Communication</h3>
<t t-if="o.phone">
Phone : <span t-field="o.phone" /><br />
</t>
<t t-if="o.mobile">
Mobile : <span t-field="o.mobile" /><br />
</t>
<t t-if="o.email">
Mail : <span t-field="o.email" /><br />
</t>
<t t-if="o.website">
Website : <span t-field="o.website" /><br />
</t>
</div>
</div>
</t>
</div>
<t t-foreach="docs" t-as="o">
<t t-foreach="o.member_ids" t-as="i" >
<t t-call="golem_member.golem_member_card_template" >
<t t-set="docs" t-value="i.member_id" />
</t>
</t>
</t>
</t>
</t>
</template>
<template id="golem_member_card_template_inherit_golem_family"
inherit_id="golem_member.golem_member_card_template">
<xpath expr="//div[@id='season_info']" position="before">
<div class="col-xs-12 text-right" id="family_info" t-if="member.family_id">
<strong>Family </strong> <span t-field="member.family_id.name" />
<t t-if="member.family_role">(<em t-field="member.family_role.name" />)</t>
</div>
</xpath>
</template>
</odoo>

View File

@ -19,7 +19,7 @@
{ {
'name': 'GOLEM non-profit members', 'name': 'GOLEM non-profit members',
'summary': 'Extends Odoo contacts for MJC', 'summary': 'Extends Odoo contacts for MJC',
'version': '10.0.1.1.2', 'version': '10.0.1.1.4',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Fabien Bourgeois, Michel Dessenne', 'author': 'Fabien Bourgeois, Michel Dessenne',
'license': 'AGPL-3', 'license': 'AGPL-3',
@ -30,7 +30,7 @@
'data': ['views/golem_member_views.xml', 'data': ['views/golem_member_views.xml',
'views/res_partner_views.xml', 'views/res_partner_views.xml',
'views/golem_member_numberconfig_views.xml', 'views/golem_member_numberconfig_views.xml',
'views/report_golem_member.xml', 'report/golem_member_card_templates.xml',
'data/golem_member_numberconfig_data.xml', 'data/golem_member_numberconfig_data.xml',
'security/ir.model.access.csv'] 'security/ir.model.access.csv']
} }

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
Copyright 2018 Michel Dessenne <michel@yaltik.com>
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 <http://www.gnu.org/licenses/>.
-->
<odoo>
<report id="golem_member_report_pdf" model="golem.member"
string="Golem member report [PDF]" report_type="qweb-pdf"
name="golem_member.golem_member_card_template"
file="golem_member.golem_member_card_template"
attachment="(object.name + '.pdf')" />
<report id="golem_member_report_html" model="golem.member"
string="Golem member report [HTML]" report_type="qweb-html"
name="golem_member.golem_member_card_template"
file="golem_member.golem_member_card_template"
attachment="(object.name + '.html')" />
<template id="golem_member_card_template">
<t t-call="report.html_container">
<t t-set="season" t-value="docs._default_season()" />
<t t-foreach="docs" t-as="member" id="foreach_member">
<t t-call="report.external_layout">
<div id='page_report_member' class="page">
<div class="row">
<div class="col-xs-12" id="member_title">
<h2 class="golem_report_title">
<span t-field="member.name" />
<small>(num. <span t-field="member.number" />)</small>
</h2>
</div>
<div class="col-xs-12" id="season_info">
<h3 class="text-right" style="margin-top: 0;">
Season :
<span t-field="season.name" />
<t t-if="season.date_start">
<small>Period :
<span t-field="season.date_start" /> -
<span t-field="season.date_end" />
</small>
</t>
</h3>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@ -1,114 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
Copyright 2018 Michel Dessenne <michel@yaltik.com>
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 <http://www.gnu.org/licenses/>.
-->
<odoo>
<report id="golem_member_report_pdf" model="golem.member"
string="Golem member report [PDF]" report_type="qweb-pdf"
name="golem_member.golem_member_card_template"
file="golem_member.golem_member_card_template"
attachment="(object.name + '.pdf')" />
<report id="golem_member_report_html" model="golem.member"
string="Golem member report [HTML]" report_type="qweb-html"
name="golem_member.golem_member_card_template"
file="golem_member.golem_member_card_template"
attachment="(object.name + '.html')" />
<template id="golem_member_card_template">
<t t-call="report.html_container">
<t t-set="season" t-value="docs._default_season()" />
<t t-foreach="docs" t-as="member" id="foreach_member">
<t t-call="report.external_layout">
<div id='page_report_member' class="page">
<div class="row">
<div class="col-xs-6">
<h2>
<span t-field="member.name" />
<small>(num. <span t-field="member.number" />)</small>
</h2>
</div>
<div class="col-xs-6">
<h3>
Season :
<span t-field="season.name" />
<t t-if="season.date_start">
<br />
<small>Period :
<span t-field="season.date_start" /> -
<span t-field="season.date_end" />
</small>
</t>
</h3>
</div>
</div>
<h3>Activities</h3>
<table id="table_activity_ref" class="table table-striped">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Animator</th>
<th>Day</th>
<th>Hour start</th>
<th>Hour stop</th>
<th>Date start</th>
<th id="activity_inherit_th">Date stop</th>
</tr>
</thead>
<tbody>
<tr id="activity_inherit_price_sum"
t-foreach="member.activity_registration_ids" t-as="reg">
<td class="col-xs-2">
<span t-esc="reg.activity_id.name" />
</td>
<td class="col-xs-2">
<span t-esc="reg.activity_id.type_id.name" />
</td>
<td class="col-xs-2">
<span t-field="reg.activity_id.animator_id" />
</td>
<td class="col-xs-2">
<span t-field="reg.activity_id.weekday" />
</td>
<td class="col-xs-1">
<t t-esc="'%02d:%02d' % (int(reg.activity_id.hour_start), round(reg.activity_id.hour_start % 1 * 60))" />
</td>
<td class="col-xs-1">
<t t-esc="'%02d:%02d' % (int(reg.activity_id.hour_stop), round(reg.activity_id.hour_stop % 1 * 60))" />
</td>
<td class="col-xs-2">
<span t-if="reg.activity_id.is_fullseason" t-field="season.date_start" />
<span t-else="" t-field="reg.activity_id.date_start" />
</td>
<td id="activity_inherit_td">
<span t-if="reg.activity_id.is_fullseason" t-field="season.date_end" />
<span t-else="" t-field="reg.activity_id.date_stop" />
</td>
</tr>
<tr id="activity_inherit_total"></tr>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@ -18,7 +18,7 @@
{ {
'name': 'GOLEM non-profit membership handling', 'name': 'GOLEM non-profit membership handling',
'summary': 'Extends Odoo membership', 'summary': 'Extends Odoo membership',
'version': '10.0.1.1.1', 'version': '10.0.1.1.2',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Fabien Bourgeois, Michel Dessenne', 'author': 'Fabien Bourgeois, Michel Dessenne',
'license': 'AGPL-3', 'license': 'AGPL-3',
@ -27,5 +27,5 @@
'depends': ['golem_member', 'account', 'decimal_precision'], 'depends': ['golem_member', 'account', 'decimal_precision'],
'data': ['views/golem_membership_invoice.xml', 'data': ['views/golem_membership_invoice.xml',
'views/golem_member_view.xml', 'views/golem_member_view.xml',
'views/report_golem_member.xml'] 'report/golem_member_card_template.xml']
} }

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright 2017 Fabien Bourgeois <fabien@yaltik.com> Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
Copyright 2018 Michel Dessenne <michel@yaltik.com> Copyright 2018 Michel Dessenne <michel@yaltik.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@ -20,13 +20,13 @@
'name': 'GOLEM non-profit resources', 'name': 'GOLEM non-profit resources',
'summary': 'GOLEM resources management', 'summary': 'GOLEM resources management',
'description': ''' GOLEM resources management ''', 'description': ''' GOLEM resources management ''',
'version': '10.0.1.9.1', 'version': '10.0.1.10.0',
'category': 'GOLEM', 'category': 'GOLEM',
'author': 'Youssef El Ouahby, Fabien Bourgeois', 'author': 'Youssef El Ouahby, Fabien Bourgeois',
'license': 'AGPL-3', 'license': 'AGPL-3',
'application': True, 'application': True,
'installable': True, 'installable': True,
'depends': ['product'], 'depends': ['golem_base', 'product'],
'data': ['views/golem_resource_views.xml', 'data': ['views/golem_resource_views.xml',
'views/golem_resource_type_views.xml', 'views/golem_resource_type_views.xml',
'views/golem_resource_reservation_views.xml', 'views/golem_resource_reservation_views.xml',

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 10.0\n" "Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-10 07:13+0000\n" "POT-Creation-Date: 2018-03-17 08:07+0000\n"
"PO-Revision-Date: 2018-03-10 07:13+0000\n" "PO-Revision-Date: 2018-03-17 08:07+0000\n"
"Last-Translator: <>\n" "Last-Translator: <>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -31,6 +31,11 @@ msgstr "Un article générique peut être lié, dans l'objectif de monétiser de
msgid "Active" msgid "Active"
msgstr "Actif" msgstr "Actif"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_timetable_availibility_24
msgid "All day"
msgstr "Toute la journée"
#. module: golem_resource #. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_view_search #: model:ir.ui.view,arch_db:golem_resource.golem_resource_view_search
msgid "Archived" msgid "Archived"
@ -108,26 +113,16 @@ msgstr "Créé par"
msgid "Created on" msgid "Created on"
msgstr "Créé le" msgstr "Créé le"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date
msgid "Date"
msgstr "Date"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_start
msgid "Date start"
msgstr "Date de début"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_stop
msgid "Date stop"
msgstr "Date de fin"
#. module: golem_resource #. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search #: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Day" msgid "Day"
msgstr "Jour" msgstr "Jour"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_day_start
msgid "Day start"
msgstr "Jour de début"
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_display_name #: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_display_name
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_display_name #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_display_name
@ -149,8 +144,7 @@ msgid "End availibility should be after than start availibility"
msgstr "La fin de disponibilité ne peut pas être après le début" msgstr "La fin de disponibilité ne peut pas être après le début"
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:110 #: code:addons/golem_resource/models/golem_resource_timetable.py:70
#: code:addons/golem_resource/models/golem_resource_timetable.py:55
#, python-format #, python-format
msgid "End time should be after than start time" msgid "End time should be after than start time"
msgstr "L'heure de fin ne peut pas être après l'heure de début" msgstr "L'heure de fin ne peut pas être après l'heure de début"
@ -182,6 +176,11 @@ msgstr "GOLEM Resource Type"
msgid "Golem Timetable" msgid "Golem Timetable"
msgstr "Golem Timetable" msgstr "Golem Timetable"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_hour_start
msgid "Hour start"
msgstr "Heure de début"
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_id #: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_id
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_id #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_id
@ -253,28 +252,28 @@ msgid "Name"
msgstr "Nom" msgstr "Nom"
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:200 #: code:addons/golem_resource/models/golem_resource_reservation.py:222
#, python-format #, python-format
msgid "Not allowed, the resource is already taken during this period : from {} to {} this day, please choose another périod before confirming." msgid "Not allowed, the resource is already taken during this period : from {} to {} this day, please choose another périod before confirming."
msgstr "Interdit : la ressource est déjà réservée durant cette période : de {} à {} ce jour, merci de choisir une autre période avant de confirmer." msgstr "Interdit : la ressource est déjà réservée durant cette période : de {} à {} ce jour, merci de choisir une autre période avant de confirmer."
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:182 #: code:addons/golem_resource/models/golem_resource_reservation.py:201
#, python-format #, python-format
msgid "Not allowed, the resource is not available during this period, please choose another time before confirming." msgid "Not allowed, the resource is not available during this period, please choose another time before confirming."
msgstr "Interdit : la ressource n'est pas disponible durant cette période, merci de choisir d'autres horaires avant de confirmer à nouveau." msgstr "Interdit : la ressource n'est pas disponible durant cette période, merci de choisir d'autres horaires avant de confirmer à nouveau."
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:167 #: code:addons/golem_resource/models/golem_resource_reservation.py:159
#, python-format #, python-format
msgid "Not allowed, the resource is not available in this period, please choose another périod before confirming" msgid "Not allowed, the resource is not available in this period, please choose another périod before confirming"
msgstr "Interdit : la ressource n'est pas disponible durant cette période, merci de choisir d'autres dates avant de confirmer à nouveau." msgstr "Interdit : la ressource n'est pas disponible durant cette période, merci de choisir d'autres dates avant de confirmer à nouveau."
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:187 #: code:addons/golem_resource/models/golem_resource_reservation.py:208
#, python-format #, python-format
msgid "Not allowed, the resource is not available this day. Please choose another date." msgid "Not allowed, the resource is not available this day : {}. Please choose another date."
msgstr "Interdit : la ressource n'est pas disponible ce jour de la semaine. Merci de choisir un autre jour." msgstr "Interdit : la ressource n'est pas disponible ce jour : {}. Merci de choisir un autre jour."
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_note #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_note
@ -298,7 +297,7 @@ msgid "Partner"
msgstr "Partenaire" msgstr "Partenaire"
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:142 #: code:addons/golem_resource/models/golem_resource_reservation.py:134
#, python-format #, python-format
msgid "Please enter the rejection reason" msgid "Please enter the rejection reason"
msgstr "Merci de saisir le motif du refus" msgstr "Merci de saisir le motif du refus"
@ -378,7 +377,7 @@ msgid "Resource Reservation list"
msgstr "Liste des réservations" msgstr "Liste des réservations"
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_id_4023 #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_id_4449
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_name #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_name
msgid "Resource Type" msgid "Resource Type"
msgstr "Type de ressource" msgstr "Type de ressource"
@ -419,7 +418,11 @@ msgid "Start"
msgstr "Début" msgstr "Début"
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_hour_start #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_start
msgid "Start date"
msgstr "Date de début"
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree #: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree
msgid "Start hour" msgid "Start hour"
msgstr "Heure de début" msgstr "Heure de début"
@ -436,7 +439,17 @@ msgid "Stop"
msgstr "Fin" msgstr "Fin"
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_hour_stop #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_stop
msgid "Stop date"
msgstr "Jour de fin"
#. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:102
#, python-format
msgid "Stop date should be after start date"
msgstr "Stop date should be after start date"
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree #: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree
msgid "Stop hour" msgid "Stop hour"
msgstr "Heure de fin" msgstr "Heure de fin"
@ -517,7 +530,7 @@ msgid "Without validation"
msgstr "Sans validation" msgstr "Sans validation"
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:156 #: code:addons/golem_resource/models/golem_resource_reservation.py:148
#, python-format #, python-format
msgid "You do not have permissions to validate or reject a reservation." msgid "You do not have permissions to validate or reject a reservation."
msgstr "Vous n'avez pas les autorisations nécessaires pour valider ou rejeter une réservation." msgstr "Vous n'avez pas les autorisations nécessaires pour valider ou rejeter une réservation."

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 10.0\n" "Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-10 07:12+0000\n" "POT-Creation-Date: 2018-03-17 08:07+0000\n"
"PO-Revision-Date: 2018-03-10 07:12+0000\n" "PO-Revision-Date: 2018-03-17 08:07+0000\n"
"Last-Translator: <>\n" "Last-Translator: <>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -31,6 +31,11 @@ msgstr ""
msgid "Active" msgid "Active"
msgstr "" msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_timetable_availibility_24
msgid "All day"
msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_view_search #: model:ir.ui.view,arch_db:golem_resource.golem_resource_view_search
msgid "Archived" msgid "Archived"
@ -108,26 +113,16 @@ msgstr ""
msgid "Created on" msgid "Created on"
msgstr "" msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date
msgid "Date"
msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_start
msgid "Date start"
msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_stop
msgid "Date stop"
msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search #: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Day" msgid "Day"
msgstr "" msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_day_start
msgid "Day start"
msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_display_name #: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_display_name
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_display_name #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_display_name
@ -149,8 +144,7 @@ msgid "End availibility should be after than start availibility"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:110 #: code:addons/golem_resource/models/golem_resource_timetable.py:70
#: code:addons/golem_resource/models/golem_resource_timetable.py:55
#, python-format #, python-format
msgid "End time should be after than start time" msgid "End time should be after than start time"
msgstr "" msgstr ""
@ -182,6 +176,11 @@ msgstr ""
msgid "Golem Timetable" msgid "Golem Timetable"
msgstr "" msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_hour_start
msgid "Hour start"
msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_id #: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_id
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_id #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_id
@ -253,27 +252,27 @@ msgid "Name"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:200 #: code:addons/golem_resource/models/golem_resource_reservation.py:222
#, python-format #, python-format
msgid "Not allowed, the resource is already taken during this period : from {} to {} this day, please choose another périod before confirming." msgid "Not allowed, the resource is already taken during this period : from {} to {} this day, please choose another périod before confirming."
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:182 #: code:addons/golem_resource/models/golem_resource_reservation.py:201
#, python-format #, python-format
msgid "Not allowed, the resource is not available during this period, please choose another time before confirming." msgid "Not allowed, the resource is not available during this period, please choose another time before confirming."
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:167 #: code:addons/golem_resource/models/golem_resource_reservation.py:159
#, python-format #, python-format
msgid "Not allowed, the resource is not available in this period, please choose another périod before confirming" msgid "Not allowed, the resource is not available in this period, please choose another périod before confirming"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:187 #: code:addons/golem_resource/models/golem_resource_reservation.py:208
#, python-format #, python-format
msgid "Not allowed, the resource is not available this day. Please choose another date." msgid "Not allowed, the resource is not available this day : {}. Please choose another date."
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
@ -298,7 +297,7 @@ msgid "Partner"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:142 #: code:addons/golem_resource/models/golem_resource_reservation.py:134
#, python-format #, python-format
msgid "Please enter the rejection reason" msgid "Please enter the rejection reason"
msgstr "" msgstr ""
@ -378,7 +377,7 @@ msgid "Resource Reservation list"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_id_4023 #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_id_4449
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_name #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_type_name
msgid "Resource Type" msgid "Resource Type"
msgstr "" msgstr ""
@ -419,7 +418,11 @@ msgid "Start"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_hour_start #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_start
msgid "Start date"
msgstr ""
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree #: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree
msgid "Start hour" msgid "Start hour"
msgstr "" msgstr ""
@ -436,7 +439,17 @@ msgid "Stop"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_hour_stop #: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_date_stop
msgid "Stop date"
msgstr ""
#. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:102
#, python-format
msgid "Stop date should be after start date"
msgstr ""
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree #: model:ir.ui.view,arch_db:golem_resource.golem_resource_timetable_view_tree
msgid "Stop hour" msgid "Stop hour"
msgstr "" msgstr ""
@ -517,7 +530,7 @@ msgid "Without validation"
msgstr "" msgstr ""
#. module: golem_resource #. module: golem_resource
#: code:addons/golem_resource/models/golem_resource_reservation.py:156 #: code:addons/golem_resource/models/golem_resource_reservation.py:148
#, python-format #, python-format
msgid "You do not have permissions to validate or reject a reservation." msgid "You do not have permissions to validate or reject a reservation."
msgstr "" msgstr ""

View File

@ -19,6 +19,7 @@
""" GOLEM Resource Reservation """ """ GOLEM Resource Reservation """
from math import modf from math import modf
from datetime import timedelta
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
@ -28,19 +29,18 @@ class GolemResourceReservation(models.Model):
_name = 'golem.resource.reservation' _name = 'golem.resource.reservation'
_description = 'GOLEM Reservation Model' _description = 'GOLEM Reservation Model'
_inherit = 'mail.thread' _inherit = 'mail.thread'
_order = 'date desc,hour_start asc' _order = 'day_start desc, hour_start asc'
name = fields.Char(compute='_compute_name', store=True) name = fields.Char(compute='_compute_name', store=True)
# TODO: handle multiple days reservation # TODO: handle multiple days reservation
date = fields.Date(required=True, index=True, readonly=True, date_start = fields.Datetime('Start date', required=True,
states={'draft': [('readonly', False)]}) index=True, readonly=True,
hour_start = fields.Float('Start hour', required=True, readonly=True, states={'draft': [('readonly', False)]})
states={'draft': [('readonly', False)]}) date_stop = fields.Datetime('Stop date', required=True,
hour_stop = fields.Float('Stop hour', required=True, readonly=True, index=True, readonly=True,
states={'draft': [('readonly', False)]}) states={'draft': [('readonly', False)]})
date_start = fields.Datetime(compute='_compute_date_start', store=True, index=True) day_start = fields.Date(compute='_compute_day_hour_start', store=True)
date_stop = fields.Datetime(compute='_compute_date_stop', store=True, index=True) hour_start = fields.Float(compute='_compute_day_hour_start', store=True)
resource_id = fields.Many2one('golem.resource', required=True, index=True, resource_id = fields.Many2one('golem.resource', required=True, index=True,
string='Resource', readonly=True, string='Resource', readonly=True,
track_visibility='onchange', track_visibility='onchange',
@ -68,46 +68,38 @@ class GolemResourceReservation(models.Model):
rejection_reason = fields.Text(readonly=True, track_visibility='onchange') rejection_reason = fields.Text(readonly=True, track_visibility='onchange')
@api.depends('resource_id', 'date') @api.depends('resource_id', 'date_start')
def _compute_name(self): def _compute_name(self):
""" Computes reservation name """ """ Computes reservation name """
for reservation in self: for reservation in self:
reservation.name = u'{}/{}'.format(reservation.resource_id.name, reservation.name = u'{}/{}'.format(reservation.resource_id.name,
reservation.date) reservation.date_start)
@api.depends('date', 'hour_start') @api.depends('date_start')
def _compute_date_start(self): def _compute_day_hour_start(self):
""" Computes Date start """ """ Computes Day and Hour Start : for better sorting """
for reservation in self: for reservation in self:
minute_start, hour_start = modf(reservation.hour_start) if reservation.date_start:
hour_start = int(hour_start) date_start = fields.Datetime.from_string(reservation.date_start)
minute_start = int(round(minute_start * 60)) reservation.day_start = date_start.date().isoformat()
reservation.date_start = u'{} {}:{}:00'.format(reservation.date, reservation.hour_start = date_start.hour + date_start.minute / 60.0
hour_start, minute_start)
@api.depends('date', 'hour_stop') @api.onchange('date_start')
def _compute_date_stop(self): def onchange_date_start(self):
""" Computes Date stop """
for reservation in self:
minute_stop, hour_stop = modf(reservation.hour_stop)
hour_stop = int(hour_stop)
minute_stop = int(round(minute_stop * 60))
reservation.date_stop = u'{} {}:{}:00'.format(reservation.date,
hour_stop, minute_stop)
@api.onchange('hour_start')
def onchange_hour_start(self):
""" Propose automatically stop hour after start hour had been filled """ """ Propose automatically stop hour after start hour had been filled """
for reservation in self: for reservation in self:
if reservation.hour_start and not reservation.hour_stop: if reservation.date_start:
reservation.hour_stop = reservation.hour_start + 1 start = fields.Datetime.from_string(reservation.date_start)
duration = timedelta(hours=1)
reservation.date_stop = start + duration
@api.constrains('hour_start', 'hour_stop')
def _check_hour_consistency(self): @api.constrains('date_start', 'date_stop')
""" Checks hour consistency """ def _check_date_consistency(self):
""" Checks date consistency """
for reservation in self: for reservation in self:
if reservation.hour_stop <= reservation.hour_start: if reservation.date_stop <= reservation.date_start:
raise ValidationError(_('End time should be after than start time')) raise ValidationError(_('Stop date should be after start date'))
@api.multi @api.multi
def state_draft(self): def state_draft(self):
@ -162,8 +154,8 @@ class GolemResourceReservation(models.Model):
for reservation in self: for reservation in self:
if reservation.state == 'confirmed': if reservation.state == 'confirmed':
# Check is reservation is not taking place out of the resource avaibility period # Check is reservation is not taking place out of the resource avaibility period
if reservation.date < reservation.resource_id.avaibility_start or \ if reservation.date_start < reservation.resource_id.avaibility_start or \
reservation.date > reservation.resource_id.avaibility_stop: reservation.date_stop > reservation.resource_id.avaibility_stop:
verr = _('Not allowed, the resource is not available in ' verr = _('Not allowed, the resource is not available in '
'this period, please choose another périod before ' 'this period, please choose another périod before '
'confirming') 'confirming')
@ -171,32 +163,62 @@ class GolemResourceReservation(models.Model):
#check if the resource hasn't a total availibility #check if the resource hasn't a total availibility
if not reservation.resource_id.availibility_24_7: if not reservation.resource_id.availibility_24_7:
# Check if reservation is not taking place out the avaibility timetables # Check if reservation is not taking place out the avaibility timetables
is_day_allowed = False date_start = fields.Datetime.from_string(reservation.date_start)
for timetable in reservation.resource_id.timetable_ids: date_stop = fields.Datetime.from_string(reservation.date_stop)
# Check for the time according to resource timetable avaibility reservation_period = [date_start + timedelta(days=x) for x in range(
date = fields.Datetime.from_string(reservation.date) (date_stop - date_start).days + 1)]
if int(timetable.weekday) == date.weekday(): for reservation_day in reservation_period:
is_day_allowed = True is_day_allowed = False
if reservation.hour_start < timetable.time_start or \ for timetable in reservation.resource_id.timetable_ids:
reservation.hour_stop > timetable.time_stop: # Check for the time according to resource timetable avaibility
verr = _('Not allowed, the resource is not available ' #date = fields.Datetime.from_string(reservation_day)
'during this period, please choose another ' if int(timetable.weekday) == reservation_day.weekday():
'time before confirming.') is_day_allowed = True
raise ValidationError(verr) #only check if the day hasn't a 24 availibility
if not is_day_allowed: if not timetable.availibility_24:
verr = _('Not allowed, the resource is not available ' reservation_day_date = reservation_day.date()
'this day. Please choose another date.') day_start = date_start.date()
raise ValidationError(verr) day_stop = date_stop.date()
if reservation_day_date == day_start and \
reservation_day_date == day_stop:
hour_start = date_start.hour + date_start.minute / 60.0
hour_stop = date_stop.hour + date_stop.minute / 60.0
elif reservation_day_date == day_start:
hour_start = date_start.hour + date_start.minute / 60.0
hour_stop = 23.98 # Just before 23:59
elif reservation_day_date == day_stop:
hour_start = 0.0
hour_stop = date_stop.hour + date_stop.minute / 60.0
else:
#if the day is not a start nor stop it
#should be covered on all day
#strange, as availibility_24 is not True
hour_start = 0.0
hour_stop = 23.98
if is_day_allowed and (hour_start < timetable.time_start or \
hour_stop > timetable.time_stop):
verr = _('Not allowed, the resource is not available '
'during this period, please choose another '
'time before confirming.')
raise ValidationError(verr)
if not is_day_allowed:
verr = _('Not allowed, the resource is not available '
'this day : {}. Please choose another '
'date.'.format(reservation_day.strftime('%A')))
raise ValidationError(verr)
# Check if the resource is already taken during this period # Check if the resource is already taken during this period
# PERF : check the date, not iterate over all reservations # PERF : check for res that can be in conflict,
# do not iterate over all reservations
domain = [('resource_id', '=', reservation.resource_id.id), domain = [('resource_id', '=', reservation.resource_id.id),
('date', '=', reservation.date), ('date_start', '<=', reservation.date_stop),
('date_stop', '>=', reservation.date_start),
('state', 'in', ('confirmed', 'validated')), ('state', 'in', ('confirmed', 'validated')),
('id', '!=', reservation.id)] ('id', '!=', reservation.id)]
reservations = self.env['golem.resource.reservation'].search(domain) reservations = self.env['golem.resource.reservation'].search(domain)
for other_res in reservations: for other_res in reservations:
if (other_res.hour_start < reservation.hour_start < other_res.hour_stop) or \ if (other_res.date_start < reservation.date_start < other_res.date_stop) or \
(other_res.hour_start < reservation.hour_stop < other_res.hour_stop): (other_res.date_start < reservation.date_stop < other_res.date_stop):
verr = _('Not allowed, the resource is already taken ' verr = _('Not allowed, the resource is already taken '
'during this period : from {} to {} this day, ' 'during this period : from {} to {} this day, '
'please choose another périod before confirming.') 'please choose another périod before confirming.')

View File

@ -37,8 +37,16 @@ class GolemTimetable(models.Model):
('4', _('Friday')), ('4', _('Friday')),
('5', _('Saturday')), ('5', _('Saturday')),
('6', _('Sunday'))], required=True) ('6', _('Sunday'))], required=True)
time_start = fields.Float(required=True, string='Start') time_start = fields.Float(string='Start')
time_stop = fields.Float(required=True, string='Stop') time_stop = fields.Float(string='Stop')
availibility_24 = fields.Boolean(string="All day")
@api.onchange('availibility_24')
def onchange_availibility_24(self):
""" fill time_start et time_stop if availibility_24 is True """
for line in self:
if line.availibility_24:
line.update({'time_start': 0.0, 'time_stop': 23.98})
@api.onchange('time_start') @api.onchange('time_start')
def onchange_time_start(self): def onchange_time_start(self):
@ -47,9 +55,23 @@ class GolemTimetable(models.Model):
if line.time_start and not line.time_stop: if line.time_start and not line.time_stop:
line.time_stop = line.time_start + 1 line.time_stop = line.time_start + 1
@api.constrains('availibility_24')
def check_avaibility24(self):
""" Checks hour consistency against avaibility 24 """
for line in self:
if line.availibility_24:
line.write({'time_start': 0.0, 'time_stop': 23.98})
@api.constrains('time_start', 'time_stop') @api.constrains('time_start', 'time_stop')
def _check_time_consistency(self): def _check_time_consistency(self):
""" Checks time consistency """ """ Checks time consistency """
for timetable in self: for line in self:
if timetable.time_stop <= timetable.time_start: if line.time_stop <= line.time_start:
raise ValidationError(_('End time should be after than start time')) raise ValidationError(_('End time should be after than start time'))
@api.constrains('time_start', 'time_stop')
def _check_time_all_day(self):
""" Checks time all day availibility """
for timetable in self:
if timetable.time_stop > 23.98 and timetable.time_start == 0:
timetable.write({'availibility_24': True})

View File

@ -43,9 +43,21 @@ class TestGolemResourceReservation(TransactionCase):
}) })
self.timetable_obj = self.env['golem.resource.timetable'] self.timetable_obj = self.env['golem.resource.timetable']
timetable_data = {'resource_id': self.resource.id, 'weekday': '0', timetable_data = {'resource_id': self.resource.id, 'weekday': '0',
'time_start': 8.0, 'time_stop': 12.0} 'time_start': 8.0, 'time_stop': 12.0}
timetable_data2 = {'resource_id': self.resource.id, 'weekday': '1',
'availibility_24': True}
timetable_data3 = {'resource_id': self.resource.id, 'weekday': '2',
'time_start': 7.0, 'time_stop': 23.98}
timetable_data4 = {'resource_id': self.resource.id, 'weekday': '3',
'availibility_24': True}
self.timetable_obj.create(timetable_data) self.timetable_obj.create(timetable_data)
self.timetable_obj.create(timetable_data2)
self.timetable_obj.create(timetable_data3)
self.timetable_obj.create(timetable_data4)
timetable_data['resource_id'] = self.resource_val.id timetable_data['resource_id'] = self.resource_val.id
self.timetable_obj.create(timetable_data) self.timetable_obj.create(timetable_data)
@ -55,9 +67,8 @@ class TestGolemResourceReservation(TransactionCase):
self.data = { self.data = {
'resource_id': self.resource.id, 'resource_id': self.resource.id,
'date': '2018-02-05', # is monday 'date_start': '2018-02-05 11:00:00', # is monday
'hour_start': 11.0, 'date_stop': '2018-02-05 12:00:00',
'hour_stop': 12.0,
'partner_id': self.partner.id 'partner_id': self.partner.id
} }
self.res_obj = self.env['golem.resource.reservation'] self.res_obj = self.env['golem.resource.reservation']
@ -67,28 +78,26 @@ class TestGolemResourceReservation(TransactionCase):
reservation = self.res_obj.create(self.data) reservation = self.res_obj.create(self.data)
self.assertEqual(reservation.partner_id, self.partner) self.assertEqual(reservation.partner_id, self.partner)
self.assertEqual(reservation.user_id, self.env.user) self.assertEqual(reservation.user_id, self.env.user)
self.assertEqual(reservation.hour_start, 11.0)
self.assertEqual(reservation.hour_stop, 12.0)
self.assertEqual(reservation.state, 'draft')
self.assertFalse(reservation.rejection_reason)
self.assertEqual(reservation.name, 'Resource/2018-02-05')
self.assertEqual(reservation.date_start, '2018-02-05 11:00:00') self.assertEqual(reservation.date_start, '2018-02-05 11:00:00')
self.assertEqual(reservation.date_stop, '2018-02-05 12:00:00') self.assertEqual(reservation.date_stop, '2018-02-05 12:00:00')
self.assertEqual(reservation.state, 'draft')
self.assertFalse(reservation.rejection_reason)
self.assertEqual(reservation.name, 'Resource/2018-02-05 11:00:00')
self.assertEqual(reservation.resource_id, self.resource) self.assertEqual(reservation.resource_id, self.resource)
self.assertEqual(len(reservation.resource_timetable_ids), 1) self.assertEqual(len(reservation.resource_timetable_ids), 4)
self.assertEqual(reservation.resource_id.reservation_ids[0], reservation) self.assertEqual(reservation.resource_id.reservation_ids[0], reservation)
def test_reservation_hours(self): def test_reservation_hours(self):
""" Test thats stop hour can not be after or equal start hour """ """ Test thats stop date can not be after or equal start date """
self.data['hour_stop'] = 7.0 self.data['date_stop'] = '2018-02-05 10:00:00'
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
self.res_obj.create(self.data) self.res_obj.create(self.data)
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
self.res_obj.create({ self.res_obj.create({
'resource_id': self.resource.id, 'date': '2018-02-05', 'resource_id': self.resource.id,
'hour_start': 12.0, 'hour_stop': 12.0, 'date_start': '2018-02-05 11:00:00',
'partner_id': self.partner.id 'date_stop': '2018-02-05 11:00:00',
}) 'partner_id': self.partner.id})
def test_state_basic(self): def test_state_basic(self):
""" Tests basic state methods """ """ Tests basic state methods """
@ -114,6 +123,7 @@ class TestGolemResourceReservation(TransactionCase):
reservation.state_confirm() reservation.state_confirm()
self.assertEqual(reservation.state, 'validated') self.assertEqual(reservation.state, 'validated')
def test_state_rejected(self): def test_state_rejected(self):
""" Tests state rejected """ """ Tests state rejected """
self.data['resource_id'] = self.resource_val.id self.data['resource_id'] = self.resource_val.id
@ -141,55 +151,73 @@ class TestGolemResourceReservation(TransactionCase):
self.env.user.groups_id = [(2, group_manager.id, False)] self.env.user.groups_id = [(2, group_manager.id, False)]
with self.assertRaises(ValidationError) as err: with self.assertRaises(ValidationError) as err:
reservation.state_validated() reservation.state_validated()
self.assertIn(u'autorisations nécessaires pour valider', err.exception.args[0]) self.assertIn(u'do not have permissions to validate', err.exception.args[0])
def test_confirmed_period(self): def test_confirmed_period(self):
""" Test allowed period """ """ Test allowed period """
self.data['date'] = '2012-01-01' # Out of period self.data['date_start'] = '2012-02-05 11:00:00' # Out of period
reservation = self.res_obj.create(self.data) reservation = self.res_obj.create(self.data)
with self.assertRaises(ValidationError) as err: with self.assertRaises(ValidationError) as err:
reservation.state_confirm() reservation.state_confirm()
self.assertIn(u'pas disponible durant cette période', err.exception.args[0]) self.assertIn(u'pas disponible durant cette période', err.exception.args[0])
def test_confirmed_allowed_day(self): def test_confirmed_allowed_day(self):
""" Test allowed day """ """ Test allowed day """
self.data['date'] = '2018-02-06' # Bad day self.data['date_start'] = '2018-02-04 11:00:00' # Bad day
reservation = self.res_obj.create(self.data) reservation = self.res_obj.create(self.data)
with self.assertRaises(ValidationError) as err: with self.assertRaises(ValidationError) as err:
reservation.state_confirm() reservation.state_confirm()
self.assertIn('pas disponible ce jour', err.exception.args[0]) self.assertIn('not available this day', err.exception.args[0])
def test_multidays_reservation(self):
""" Test multidays reservation """
#two days allowed reservation
self.data['date_start'] = '2018-02-07 14:00:00' # Wednesday : allowed FROM 7
self.data['date_stop'] = '2018-02-08 11:00:00' # Thursday : allowed
reservation = self.res_obj.create(self.data)
reservation.state_confirm()
self.assertEqual(reservation.state, 'validated')
reservation.state_draft()
#Two days allowed but one not allowed in the middle
reservation.write({'date_start': '2018-02-06 14:00:00',
'date_stop': '2018-02-08 11:00:00'})
with self.assertRaises(ValidationError) as err:
reservation.state_confirm()
self.assertIn('not available during this period', err.exception.args[0])
def test_confirmed_allowed_hours(self): def test_confirmed_allowed_hours(self):
""" Test allowed hours """ """ Test allowed hours """
self.data['hour_stop'] = 14.0 # Out of range stop hour self.data['date_stop'] = '2018-02-05 14:00:00' # Out of range stop hour
reservation = self.res_obj.create(self.data) reservation = self.res_obj.create(self.data)
with self.assertRaises(ValidationError) as err: with self.assertRaises(ValidationError) as err:
reservation.state_confirm() reservation.state_confirm()
self.assertIn(u'merci de choisir d\'autres horaires', err.exception.args[0]) self.assertIn(u'merci de choisir d\'autres horaires', err.exception.args[0])
# Out of range start hour
reservation = self.res_obj.create({'resource_id': self.resource.id, reservation = self.res_obj.create({'resource_id': self.resource.id,
'date': '2018-02-05', 'date_start': '2018-02-05 05:00:00',
'hour_start': 5.0, # Out of range start hour 'date_stop': '2018-02-05 12:00:00',
'hour_stop': 12.0,
'partner_id': self.partner.id}) 'partner_id': self.partner.id})
with self.assertRaises(ValidationError) as err: with self.assertRaises(ValidationError) as err:
reservation.state_confirm() reservation.state_confirm()
self.assertIn(u'merci de choisir d\'autres horaires', err.exception.args[0]) self.assertIn(u'the resource is not available during this period', err.exception.args[0])
def test_confirmed_other_res(self): def test_confirmed_other_res(self):
""" Test if there are other reservations in conflict """ """ Test if there are other reservations in conflict """
reservation = self.res_obj.create(self.data) reservation = self.res_obj.create(self.data)
reservation.state_confirm() reservation.state_confirm()
reservation2 = self.res_obj.create({ reservation2 = self.res_obj.create({
'resource_id': self.resource.id, 'date': '2018-02-05', 'resource_id': self.resource.id,
'hour_start': 10.0, 'hour_stop': 11.0, # OK, no conflict 'date_start': '2018-02-05 10:00:00',
'date_stop': '2018-02-05 11:00:00',
'partner_id': self.partner.id 'partner_id': self.partner.id
}) })
reservation2.state_confirm() reservation2.state_confirm()
reservation3 = self.res_obj.create({ reservation3 = self.res_obj.create({
'resource_id': self.resource.id, 'date': '2018-02-05', 'resource_id': self.resource.id,
'hour_start': 10.0, 'hour_stop': 10.5, # Conflict with 2nd res 'date_start': '2018-02-05 11:20:00',
'date_stop': '2018-02-05 11:40:00',# Conflict with 2nd res
'partner_id': self.partner.id 'partner_id': self.partner.id
}) })
with self.assertRaises(ValidationError) as err: with self.assertRaises(ValidationError) as err:
reservation3.state_confirm() reservation3.state_confirm()
self.assertIn(u'déjà réservée durant cette période', err.exception.args[0]) self.assertIn(u'the resource is already taken', err.exception.args[0])

View File

@ -46,6 +46,7 @@ class TestGolemResourceTimetable(TransactionCase):
self.assertEqual(timetable.resource_id, self.resource) self.assertEqual(timetable.resource_id, self.resource)
self.assertEqual(timetable.time_start, 8.0) self.assertEqual(timetable.time_start, 8.0)
self.assertEqual(timetable.time_stop, 10.0) self.assertEqual(timetable.time_stop, 10.0)
self.assertFalse(timetable.availibility_24)
self.assertEqual(timetable, self.resource.timetable_ids[0]) self.assertEqual(timetable, self.resource.timetable_ids[0])
def test_timetable_times(self): def test_timetable_times(self):

View File

@ -39,9 +39,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree> <tree>
<field name="resource_id" /> <field name="resource_id" />
<field name="date" /> <field name="date_start" />
<field name="hour_start" widget="float_time" /> <field name="date_stop" />
<field name="hour_stop" widget="float_time" />
<field name="partner_id" /> <field name="partner_id" />
<field name="state" /> <field name="state" />
</tree> </tree>
@ -82,9 +81,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</group> </group>
<group string="Reservation"> <group string="Reservation">
<group> <group>
<field name="date" /> <field name="date_start" />
<field name="hour_start" widget="float_time" /> <field name="date_stop" />
<field name="hour_stop" widget="float_time" />
<field name="user_id" options="{'no_create': True}" /> <field name="user_id" options="{'no_create': True}" />
<field name="partner_id" /> <field name="partner_id" />
<field name="note" <field name="note"

View File

@ -18,7 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<odoo> <odoo>
<data> <data>
<!-- Trees --> <!-- Trees -->
<record model="ir.ui.view" id="golem_resource_timetable_view_tree"> <record model="ir.ui.view" id="golem_resource_timetable_view_tree">
<field name="name">GOLEM Resource Timetable Tree</field> <field name="name">GOLEM Resource Timetable Tree</field>
@ -27,11 +26,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<tree editable="bottom"> <tree editable="bottom">
<field name="resource_id" invisible="1" /> <field name="resource_id" invisible="1" />
<field name="weekday" /> <field name="weekday" />
<field name="time_start" string="Start hour" widget="float_time" /> <field name="availibility_24"/>
<field name="time_stop" string="Stop hour" widget="float_time" /> <field name="time_start" string="Start hour" widget="float_time"
required="1" />
<field name="time_stop" string="Stop hour" widget="float_time"
required="1" />
</tree> </tree>
</field> </field>
</record> </record>
</data> </data>
</odoo> </odoo>