Compare commits

...

138 Commits
master ... V4

Author SHA1 Message Date
michel d266986445 Merge branch 'V4' of fabien/michel_coworking into V4 2017-11-30 08:27:25 +00:00
Fabien BOURGEOIS a9d9429b04 [ADD]Coworker unit testing (beginning) 2017-11-29 21:06:00 +01:00
michel b00b0c96a4 Maj Cousin 2017-11-29 17:37:50 +01:00
michel c2e8df0081 relations OK 2017-11-29 17:36:20 +01:00
michel 7c17942736 Début de relation 2017-11-29 17:14:37 +01:00
michel 30bd4eb2d3 Ajout de plusieurs participants OK 2017-11-29 17:04:42 +01:00
michel 49526c558b Essai d'ajout de plusieur participants 2017-11-29 16:50:09 +01:00
michel 8287e674aa Ajout eval= et déplacement de la création de event en sous la création de coworkers 2017-11-29 14:53:50 +01:00
michel 48a5facf34 Changement du non coworking_app_demo.xml 2017-11-29 14:49:24 +01:00
michel 32f86786af Event ok mais pas les participants_ids 2017-11-29 14:37:31 +01:00
michel 498774c8a7 / 2017-11-29 14:29:03 +01:00
michel aaca3b3db1 création des coworkers OK mais probléme sur les events. 2017-11-29 14:28:37 +01:00
michel 1c46c0f04e Passage de data en demo 2017-11-29 12:13:36 +01:00
michel 3330976fdd Création OK d'un coworker avec un type staffer 2017-11-29 12:07:10 +01:00
michel 1c80800633 Passage des données de demo de coworking_coworker à coworking_app 2017-11-29 11:54:42 +01:00
michel 31306e5b57 Add demo xml file and manifest 2017-11-29 11:06:03 +01:00
michel 60d4824375 Test if coworker 1 or 2 is is_coworker for form and tree 2017-11-29 10:53:11 +01:00
michel 2a1e846304 / 2017-11-28 17:15:18 +01:00
michel 2411fdb93c Remove coworker_count 2017-11-28 15:02:39 +01:00
michel affa853857 [Contact-date for all] [Sup xpath to search view] [add search group by month and year for all] 2017-11-28 14:47:23 +01:00
michel 2ce2c58a82 Merge branch 'V4' of fabien/michel_coworking into V4 2017-11-28 11:29:52 +00:00
Fabien BOURGEOIS 6c8e3a9ccf [IMP]Partner coworker minor enhancements (model + views) 2017-11-28 12:29:13 +01:00
michel 7d52c03561 graph et pivot add view pivot 2017-11-28 11:20:06 +01:00
michel 83c684ff7d Graph et pivot 2017-11-28 11:01:28 +01:00
michel cb9bf0e328 / 2017-11-27 18:33:38 +01:00
michel 0ff1cc2066 Menu 2017-11-27 18:33:13 +01:00
michel a0d00c22e0 Add calendar menu 2017-11-27 18:27:31 +01:00
michel 7438312291 kanban ok 2017-11-27 17:53:39 +01:00
michel 0b6b5053c7 Kanban base 2017-11-27 17:06:40 +01:00
michel e306960bb0 Add search is_coworker filter 2017-11-27 16:53:42 +01:00
michel ce23b7e78e Tree view and full contact adress 2017-11-27 16:02:09 +01:00
michel 7111308501 / 2017-11-27 14:54:48 +01:00
michel 7e9a754b44 Radion is_coworker 2017-11-27 14:52:39 +01:00
michel 6a1e2cdd28 Radio is_coworker 2017-11-27 14:24:15 +01:00
michel 8c81f0eee6 / 2017-11-27 12:02:39 +01:00
michel 3f7865bba3 Position fields 2017-11-24 18:49:25 +01:00
michel 949ecb41ee / 2017-11-24 17:18:48 +01:00
michel 44042e87a8 whaouu 2017-11-24 17:16:20 +01:00
michel ebb8b20e14 fields 2017-11-24 16:56:52 +01:00
michel 824dbc7cda / 2017-11-24 16:26:24 +01:00
michel 61274df36d / 2017-11-24 16:25:14 +01:00
michel 2eea737322 / 2017-11-24 11:54:31 +01:00
michel c40deb8fe7 Probléme de ref = à la ligne 8 2017-11-24 11:32:59 +01:00
michel 3421890717 / 2017-11-24 11:32:03 +01:00
michel 96d3cb418e / 2017-11-24 10:17:51 +01:00
michel 3c68ea83d5 start v4 2017-11-24 10:05:18 +01:00
michel cad38216de Add contacts modul global depends 2017-11-23 14:33:55 +01:00
michel 83ad2867ee / 2017-11-21 17:02:04 +01:00
michel 00ecfada76 assistant 2017-11-21 16:40:06 +01:00
michel 5e0cd006d5 Merge branch 'V3' of fabien/michel_coworking into V3 2017-11-21 13:04:23 +00:00
Fabien BOURGEOIS 8a62f38159 [ADD][WIP]Coworking weekly creation wizard 2017-11-21 14:03:36 +01:00
michel 16758eec6d _compute_coworker_relation_ids 2017-11-21 12:47:42 +01:00
michel 78ff3e754f coworker default 2017-11-20 16:36:27 +01:00
michel 679fc4ce4f / 2017-11-20 16:27:04 +01:00
michel aa0d4d36d0 / 2017-11-20 16:26:21 +01:00
michel ccb82a0c72 / 2017-11-20 15:52:07 +01:00
michel a74caf97ca / 2017-11-20 15:24:48 +01:00
michel 0a67eabbd3 / 2017-11-20 15:24:30 +01:00
michel f3e9c630de relation_ids 2017-11-20 15:21:38 +01:00
michel c2f395a2e6 relation_ids 2017-11-20 15:07:59 +01:00
michel 34b0f1f385 relation ids 2017-11-20 14:48:26 +01:00
michel db6e19bba9 Merge branch 'V3' of fabien/michel_coworking into V3 2017-11-20 11:44:23 +00:00
Fabien BOURGEOIS 76be13ae5d [FIX]Menu for relations (and coworkers) 2017-11-20 12:32:11 +01:00
michel f7ef7f73cc menu 2017-11-20 12:11:42 +01:00
michel a679dcea4d Menu 2017-11-20 11:12:41 +01:00
michel 0aba5d585e Add tree view and editable on tree 2017-11-16 17:57:33 +01:00
michel 48255707e4 domaine xml coworker 1 2 2017-11-16 17:14:49 +01:00
michel 5c2b3b0b2c == 2017-11-16 16:59:02 +01:00
michel e37774fff6 Test coworker1 coworker2 is same 2017-11-16 16:48:32 +01:00
michel e048a9e9f0 / 2017-11-16 16:38:21 +01:00
michel 704ac03ca9 Add many2one fields coworker1 and 2. and relation 2017-11-16 16:37:46 +01:00
michel f0d5897b15 / 2017-11-16 16:06:46 +01:00
michel eeffe7b5ba 2017-11-16 16:02:30 +01:00
michel 912d4fdfc6 menu 2017-11-16 15:56:37 +01:00
michel 3ec1260069 / 2017-11-16 15:47:18 +01:00
michel 640ac54867 Base relation module 2017-11-16 14:53:35 +01:00
michel d652ceaccd / 2017-11-16 14:19:31 +01:00
michel 5b7ac167cb Add module coworker_relation 2017-11-16 13:41:03 +01:00
michel 20ade01c56 Merge branch 'V2' of fabien/michel_coworking into V2 2017-11-15 15:08:23 +00:00
Fabien BOURGEOIS e99374796b [REF]Global modularisation refactoring, end 2017-11-15 16:06:39 +01:00
Fabien BOURGEOIS 6601bed446 [REF][WIP]Modularisation basic structure 2017-11-15 15:42:41 +01:00
Fabien BOURGEOIS c8f398e913 [REF]Double _rec_name after merging 2017-11-15 15:38:15 +01:00
Fabien BOURGEOIS 288462c096 Merge branch 'V2' of ssh://git.yaltik.net:61722/michel/Coworking into V2 2017-11-15 15:34:17 +01:00
Fabien BOURGEOIS 7ac77e3762 [REF]Cleaning title / name tests 2017-11-15 15:32:42 +01:00
michel f3ddaaf2d8 / 2017-11-15 15:29:36 +01:00
michel e0ce682b3f Add field title to name field of model 2017-11-15 15:20:49 +01:00
michel 7cc3482546 Merge branch 'V2' of fabien/michel_coworking into V2 2017-11-15 14:07:04 +00:00
Fabien BOURGEOIS f0e9dbab4d [REF]Refactoring code for date_start and date_end validation 2017-11-15 15:03:12 +01:00
michel e26e6fd1c7 Check is date start 2017-11-15 14:57:27 +01:00
michel 0585672d52 Add widget float_time duration 2017-11-15 13:23:53 +01:00
michel ffd1399e67 Spécifications v2: Il nous manque le nombre d'événements auquel le coworker a participé 2017-11-15 12:31:47 +01:00
michel 545749ac50 sur l'ordre de tri c'est moins date de début ASC 2017-11-15 11:59:12 +01:00
michel 67c875e987 Spécifications v2:il faudrait remettre manager_id en required 2017-11-15 11:55:25 +01:00
michel 797bef0aee sur event : il faudrait que title soit reconnu comme le nom du modéle 2017-11-15 11:53:14 +01:00
michel 877632aab8 calendar ok 2017-11-15 10:53:34 +01:00
michel 6bb35e925d Security 2017-11-15 10:50:49 +01:00
michel f3ca56cf61 Add calendar date_start date_end 2017-11-15 10:39:42 +01:00
michel aeb16e6923 Serach Group 2017-11-15 10:25:41 +01:00
michel eaf4999a22 Merge branch 'V2' of fabien/michel_coworking into V2 2017-11-15 08:56:03 +00:00
Fabien BOURGEOIS 663219440c [IMP]Event model cleaning + search function handling of operator and value 2017-11-15 06:25:12 +01:00
michel 547221525b tree default_order 2017-11-14 18:13:24 +01:00
michel 8800cab3ab Add search group year, month 2017-11-14 18:12:07 +01:00
michel 168f28d0c9 / 2017-11-14 17:19:02 +01:00
michel c47575ce45 / 2017-11-14 13:43:06 +01:00
michel 1c81289236 / 2017-11-13 19:31:43 +01:00
michel e9d9c1bb9d / 2017-11-13 17:05:18 +01:00
michel 539cedf663 Many2many 2017-11-13 16:58:20 +01:00
michel d303d69b96 / 2017-11-13 16:45:45 +01:00
michel 39bb404f99 / 2017-11-13 16:30:08 +01:00
michel 0ae67777a6 / 2017-11-13 16:29:34 +01:00
michel 5d650a71cb Yesssss 2017-11-10 17:35:10 +01:00
michel 05f69c4aec / 2017-11-10 17:28:46 +01:00
michel d183b8b344 ./ 2017-11-10 17:09:59 +01:00
michel 4c687fb6a5 / 2017-11-10 17:08:56 +01:00
michel 8f80bfed16 Duration fail 2017-11-10 15:59:48 +01:00
michel 32687eafcd Add Event 2017-11-10 15:03:12 +01:00
michel 4a3d2da366 CSV ok 2017-11-09 15:41:13 +01:00
michel f286e714b9 / 2017-11-09 15:11:05 +01:00
michel 2abdd3584f / 2017-11-09 15:10:36 +01:00
michel a5ddde9994 Add security 2017-11-09 15:07:08 +01:00
michel 98ee48126d / 2017-11-09 11:00:59 +01:00
michel ebd17586e2 / 2017-11-09 10:56:40 +01:00
michel 3f595c957a [contact_date]:[name] 2017-11-09 10:54:44 +01:00
michel 831020620f / 2017-11-09 10:45:40 +01:00
michel 666274b883 add group for notebook 2017-11-09 10:43:41 +01:00
michel a78bec621f / 2017-11-09 10:20:10 +01:00
michel 650664245d Add calendar view 2017-11-09 10:19:08 +01:00
michel 7b33b11789 Kanban first version. 2017-11-09 10:02:21 +01:00
michel 25fadfdb56 / 2017-11-07 18:53:07 +01:00
michel f9b2d63d79 Add Kanban view 2017-11-07 18:52:29 +01:00
michel 9eddf23d7e Add notebook 2017-11-07 18:45:20 +01:00
michel 66809f1d25 Add full_name AND full_contact_adress on tree 2017-11-07 17:59:02 +01:00
michel 60530a4c3c Add field contact_image with widget image and class oe_avatar 2017-11-07 17:55:42 +01:00
michel 1c2175b51b compute_full_contact_adress clean version 2017-11-07 17:00:49 +01:00
michel 561aa7a49d computed adress if if if if :) 2017-11-07 15:27:21 +01:00
michel a197f65db5 Add concatain adress 2017-11-07 12:13:35 +01:00
michel eca14eb74d Full name 2017-11-06 22:48:27 +01:00
michel 80c7a95bc4 null 2017-11-06 16:31:18 +01:00
40 changed files with 1191 additions and 68 deletions

View File

@ -1,3 +1,4 @@
[MASTER]
load-plugins=pylint_odoo
disable=C8101

View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Firstname Lastname <firstname.lastname@company.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/>.
{
'name': 'Coworking whole Application',
'summary': 'yaltik coworking module simplify your coworking gerance',
'description': """ yaltik coworking module simplify your coworking gerance """,
'version': '10.0.0.0.1',
'category': 'Coworking',
'author': 'Yaltik',
'license': 'AGPL-3',
'application': True,
'installable': True,
'data': [],
'demo': ['data/coworking_app_demo.xml'],
'depends': ['coworking_coworker', 'coworking_event']
}

View File

@ -0,0 +1,146 @@
<?xml version="1.0"?>
<odoo>
<!-- Coworker -->
<record id="name_hs" model="res.partner">
<field name="name">Homer Simpson</field>
<field name="contact_date">2017-11-27</field>
<field name="is_coworker">True</field>
<field name="coworker_type">worker</field>
<field name="street">320 Rue de la pioche</field>
<field name="zip">88000</field>
<field name="city">Flousin</field>
<field name="country_id" ref="base.fr" />
</record>
<record id="name_jr" model="res.partner">
<field name="name">Joe Robert</field>
<field name="contact_date">2017-11-29</field>
<field name="is_coworker">True</field>
<field name="coworker_type">staffer</field>
<field name="street">26 Rue de la roche</field>
<field name="zip">38054</field>
<field name="city">Chambéry</field>
<field name="country_id" ref="base.fr" />
</record>
<record id="name_ra" model="res.partner">
<field name="name">Rob Altros</field>
<field name="contact_date">2017-11-29</field>
<field name="is_coworker">True</field>
<field name="coworker_type">member</field>
<field name="street">874 avenue de la source</field>
<field name="zip">38054</field>
<field name="city">Grosland</field>
<field name="country_id" ref="base.fr" />
</record>
<record id="name_so" model="res.partner">
<field name="name">Sophie Lira</field>
<field name="contact_date">2017-11-29</field>
<field name="is_coworker">True</field>
<field name="coworker_type">volunteer</field>
<field name="street">2 avenue chirolin</field>
<field name="zip">38054</field>
<field name="city">Grosland</field>
<field name="country_id" ref="base.fr" />
</record>
<record id="name_cb" model="res.partner">
<field name="name">Camille Bréa</field>
<field name="contact_date">2017-11-29</field>
<field name="is_coworker">True</field>
<field name="coworker_type">visitor</field>
<field name="street">6 Impase des monts</field>
<field name="zip">00254</field>
<field name="city">Grosland</field>
<field name="country_id" ref="base.fr" />
</record>
<!-- Events -->
<record id="event_1" model="coworking.event">
<field name="title">Evenement</field>
<field name="manager_id" ref="name_hs" />
<field name="date_start">2017-11-29</field>
<field name="date_end">2017-12-02</field>
<field name="description">Test de demo création d'event</field>
<field name="participants_ids" eval="[(4, ref('name_jr'), False)]"/>
<field name="statut">confirmed</field>
</record>
<record id="event_2" model="coworking.event">
<field name="title">Formation</field>
<field name="manager_id" ref="name_cb" />
<field name="date_start">2017-11-29</field>
<field name="date_end">2017-11-30</field>
<field name="description">Test de demo création d'event</field>
<field name="participants_ids" eval="[(4, ref('name_hs'), False)]"/>
<field name="statut">confirmed</field>
</record>
<record id="event_3" model="coworking.event">
<field name="title">Cuisine</field>
<field name="manager_id" ref="name_so" />
<field name="date_start">2017-11-29</field>
<field name="date_end">2017-11-30</field>
<field name="description">Test de demo création d'event</field>
<field name="participants_ids" eval="[(4, ref('name_ra'), False)]"/>
<field name="statut">confirmed</field>
</record>
<record id="event_4" model="coworking.event">
<field name="title">Méditation</field>
<field name="manager_id" ref="name_so" />
<field name="date_start">2017-12-05</field>
<field name="date_end">2017-12-10</field>
<field name="description">Test de demo création d'event</field>
<field name="participants_ids" eval="[(6, 0, [ref('name_hs'),
ref('name_ra'), ref('name_cb')])]" />
<field name="statut">confirmed</field>
</record>
<!-- relations -->
<record id="rela_1" model="coworking.relation">
<field name="coworker1" ref="name_so" />
<field name="coworker2" ref="name_hs" />
<field name="relation">Soeur</field>
</record>
<record id="rela_2" model="coworking.relation">
<field name="coworker1" ref="name_hs" />
<field name="coworker2" ref="name_so" />
<field name="relation">Frére</field>
</record>
<record id="rela_3" model="coworking.relation">
<field name="coworker1" ref="name_cb" />
<field name="coworker2" ref="name_ra" />
<field name="relation">Père</field>
</record>
<record id="rela_4" model="coworking.relation">
<field name="coworker1" ref="name_ra" />
<field name="coworker2" ref="name_cb" />
<field name="relation">Mère</field>
</record>
<record id="rela_5" model="coworking.relation">
<field name="coworker1" ref="name_hs" />
<field name="coworker2" ref="name_ra" />
<field name="relation">Donuts</field>
</record>
<record id="rela_6" model="coworking.relation">
<field name="coworker1" ref="name_ra" />
<field name="coworker2" ref="name_hs" />
<field name="relation">Psy</field>
</record>
<record id="rela_7" model="coworking.relation">
<field name="coworker1" ref="name_jr" />
<field name="coworker2" ref="name_hs" />
<field name="relation">Ami</field>
</record>
<record id="rela_8" model="coworking.relation">
<field name="coworker1" ref="name_so" />
<field name="coworker2" ref="name_jr" />
<field name="relation">Ami</field>
</record>
<record id="rela_9" model="coworking.relation">
<field name="coworker1" ref="name_jr" />
<field name="coworker2" ref="name_ra" />
<field name="relation">Cousin</field>
</record>
<record id="rela_10" model="coworking.relation">
<field name="coworker1" ref="name_ra" />
<field name="coworker2" ref="name_jr" />
<field name="relation">Cousine</field>
</record>
</odoo>

View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@ -16,15 +16,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
{
'name': 'Coworking',
'name': 'Coworking base',
'summary': 'yaltik coworking module simplify your coworking gerance',
'description': """ yaltik coworking module simplify your coworking gerance """,
'version': '10.0.0.0.1',
'category': 'Useless',
'category': 'Coworking',
'author': 'Yaltik',
'license': 'AGPL-3',
'application': False,
'installable': True,
'data': ['views/coworking_menu.xml', 'views/coworker_views.xml'],
'depends': ['base']
'depends': ['contacts']
}

View File

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Firstname Lastname <firstname.lastname@company.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/>.
{
'name': 'Coworking coworker',
'summary': 'yaltik coworking module simplify your coworking gerance',
'description': """ yaltik coworking module simplify your coworking gerance """,
'version': '10.0.0.0.1',
'category': 'Coworking',
'author': 'Yaltik',
'license': 'AGPL-3',
'application': False,
'installable': True,
'data': ['views/res_partner_views.xml'],
'depends': ['coworking_base']
}

View File

@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import res_partner

View File

@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
""" Coworker module """
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class Coworker(models.Model):
""" Coworker model """
_name = 'coworking.coworker'
_description = 'Coworker model definition'
_order = 'id desc'
contact_date = fields.Date(default=fields.Date.context_today)
full_name = fields.Char(compute='_compute_full_name', store=True, index=True)
firstname = fields.Char('First name', required=True)
coworker_type = fields.Selection([('staffer', 'Staffer'),
('worker', 'Worker'), ('member', 'Member'),
('volunteer', 'Volunteer'),
('visitor', 'Visitor')])
company_name = fields.Char('Company')
job = fields.Char()
#Adress fields
street = fields.Char()
contact_zip = fields.Char()
city = fields.Char()
full_contact_adress = fields.Char(compute='_compute_full_contact_adress')
phone_number = fields.Char()
gsm = fields.Char('GSM')
email = fields.Char()
url = fields.Char('URL')
note = fields.Text()
#Images fields
contact_image = fields.Binary()
is_done = fields.Boolean('Done?')
is_active = fields.Boolean('Active?', default=True)
@api.depends('name', 'firstname')
def _compute_full_name(self):
"""Concaténation du nom et du prénom"""
for coworker in self:
coworker.full_name = u'{} {}'.format(coworker.name, coworker.firstname)
@api.constrains('contact_date')
def _check_contact_date(self):
"""Test si la modification de la date n'est pas superieur à la date du jour"""
if self.contact_date > fields.Date.context_today(self):
raise ValidationError(_('Date most be equal of inferior to to day'))
@api.constrains('company_name', 'job')
def _check_company_name(self):
for coworker in self:
"""Contrainte python sur company_name et job,
si il y a une raison sociale le champ job est à remplir
"""
if coworker.company_name and not coworker.job:
raise ValidationError(_('You must enter job and compagny both'))
@api.depends('street', 'contact_zip', 'city')
def _compute_full_contact_adress(self):
"""Concatènation de l'adresse si les chanps street, contact-zip et city sont renseignés"""
for coworker in self:
coworker.full_contact_adress = u'{} {} {}'.format \
(coworker.street or u'', coworker.contact_zip or u'', coworker.city or u'').strip()

View File

@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
""" Coworker module """
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class ResPartner(models.Model):
""" Coworker model """
_inherit = 'res.partner'
is_coworker = fields.Boolean('Coworker', default=False)
company_ids = fields.One2many(
string="Company",
comodel_name="res.partner",
inverse_name="parent_id",
)
url = fields.Char('URL')
contact_date = fields.Date(default=fields.Date.context_today)
coworker_type = fields.Selection([('staffer', 'Staffer'),
('worker', 'Worker'), ('member', 'Member'),
('volunteer', 'Volunteer'),
('visitor', 'Visitor')])
full_contact_adress = fields.Char(compute='_compute_full_contact_adress')
@api.depends('street', 'zip', 'city')
def _compute_full_contact_adress(self):
"""Concatènation de l'adresse si les chanps street, czip et city sont renseignés"""
for coworker in self:
coworker.full_contact_adress = u'{} {} {}'.format \
(coworker.street or u'', coworker.zip or u'', coworker.city or u'').strip()
@api.constrains('contact_date')
def _check_contact_date(self):
"""Test si la modification de la date n'est pas superieur à la date du jour"""
if self.contact_date > fields.Date.context_today(self):
raise ValidationError(_('Date most be equal of inferior to to day'))
@staticmethod
def _manage_coworker_type(vals):
""" Ensures that coworker_type is not defined when is_coworker is False """
if 'is_coworker' in vals:
if not vals['is_coworker']:
vals.update({'coworker_type': False})
return vals
@api.model
def create(self, vals):
""" Ensures that coworker_type is not defined when is_coworker is False """
vals = ResPartner._manage_coworker_type(vals)
return super(ResPartner, self).create(vals)
@api.multi
def write(self, vals):
""" Ensures that coworker_type is not defined when is_coworker is False """
vals = ResPartner._manage_coworker_type(vals)
super(ResPartner, self).write(vals)
return True

View File

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
acess_coworker_group_user,Access COWORKER Member User,model_coworking_coworker,base.group_user,1,1,1,0
acess_coworker_group_manager,Access COWORKER Member Manager,model_coworking_coworker,base.group_partner_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 acess_coworker_group_user Access COWORKER Member User model_coworking_coworker base.group_user 1 1 1 0
3 acess_coworker_group_manager Access COWORKER Member Manager model_coworking_coworker base.group_partner_manager 1 1 1 1

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import test_coworking_coworker

View File

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
""" Coworking cowoker testing module """
from datetime import date
from odoo import fields
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
class TestCoworkingCoworker(TransactionCase):
""" Coworking cowoker testing """
def setUp(self, *args, **kwargs):
""" Bootstrap testing """
super(TestCoworkingCoworker, self).setUp(*args, **kwargs)
data = {'name': 'Homer Simpson', 'is_coworker': True}
self.homer = self.env['res.partner'].create(data)
def test_contact_date(self):
""" Test contact date : default to today and validity """
contact_date = fields.Date.from_string(self.homer.contact_date)
self.assertEqual(contact_date, date.today())
marge = self.env['res.partner'].create({'name': 'Marge Simpson',
'contact_date': '2017-01-01'})
self.assertEqual(marge.contact_date, '2017-01-01')
with self.assertRaises(ValidationError) as err:
data = {'name': 'Bart Simpson', 'contact_date': '2999-01-01'}
self.env['res.partner'].create(data)
self.assertIn('equal of inferior to', unicode(err.exception))
def test_full_address(self):
""" Test full address rendering """
pass
def test_manage_coworker_type(self):
""" Test that non-coworker have not coworker_type fixed """
pass

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_coworker" model="ir.ui.view">
<field name="name">Coworker Form</field>
<field name="model">coworking.coworker</field>
@ -10,62 +10,70 @@
<sheet>
<group name="group_top">
<group name="group_left">
<field name="contact_image" widget="image" class="oe_avatar"/>
<field name="contact_date" />
<field name="full_name" />
<field name="name" />
<field name="firstname" />
<field name="coworker_type" />
<field name="company_name" />
<field name="job"
attrs="{'invisible': [('company_name', '=', False)], 'required': [('company_name', '!=', False)]}" />
<field name="job" />
</group>
<group name="group_right">
<field name="street" />
<field name="contact_zip" />
<field name="city" />
<field name="full_contact_adress" />
<field name="gsm" />
<field name="phone_number" />
<field name="email" />
<field name="url" />
<field name="is_done" />
<field name="is_active" readonly="1" />
</group>
<field name="note" />
<field name="is_done" />
<field name="is_active" readonly="1" />
</group>
</group>
<groupe>
<notebook>
<page string="Note" name="note">
<field name="note" />
</page>
</notebook>
</groupe>
</sheet>
</form>
</field>
</record>
<!-- Tree -->
<record id="view_tree_coworker" model="ir.ui.view">
<field name="name">Coworker Tree</field>
<field name="model">coworking.coworker</field>
<field name="arch" type="xml">
<tree default_order="name asc, firstname asc">
<field name="name" />
<field name="firstname" />
<field name="full_name" />
<field name="company_name" />
<field name="full_contact_adress" />
<field name="gsm" />
<field name="email" />
</tree>
</field>
</record>
<!-- Search -->
<record id="view_search_coworker" model="ir.ui.view">
<field name="name">Coworker Search</field>
<field name="model">coworking.coworker</field>
<field name="arch" type="xml">
<search>
<field name="contact_date" />
<field name="name" />
<field name="firstname" />
<field name="full_name" />
<field name="company_name" />
<field name="gsm" />
<field name="email" />
<filter name="individual" string="Individual"
domain="[('company_name','=',False)]" />
<filter name="in_compagny" string="in_compagny"
domain="[('company_name','!=',False)]" />
@ -90,5 +98,45 @@
</field>
</record>
<!-- Kanban -->
<record id="view_kanban_coworker" model="ir.ui.view">
<field name="name">Coworker Kanban</field>
<field name="model">coworking.coworker</field>
<field name="arch" type="xml">
<kanban>
<field name="contact_image" />
<field name="full_name" />
<field name="full_contact_adress" />
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_vignette oe_semantic_html_override">
<div class="o_kanban_image">
<img t-if="record.contact_image.raw_value"
t-att-src="'data:image/png;base64,'+ record.contact_image.raw_value"/>
<t t-if="!record.contact_image.raw_value">
</t>
</div>
<div>
<field name="full_name" />
<field name="full_contact_adress" />
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Calendar -->
<record id="view_calendar_coworker" model="ir.ui.view">
<field name="name">Coworker Calendar</field>
<field name="model">coworking.coworker</field>
<field name="arch" type="xml">
<calendar date_start="contact_date"
display="First contact : [name]" >
<field name="name" />
</calendar>
</field>
</record>
</odoo>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action to open Coworkers list -->
<act_window id="coworker_action" name="Coworkers"
res_model="coworking.coworker" view_mode="tree,form,kanban,calendar" />
<!-- Menu item to open Coworkers list -->
<menuitem id="coworker_menu" name="Coworkers" />
<menuitem id="coworker_list" name="Coworkers" action="coworker_action"
parent="coworker_menu" sequence="1" />
</odoo>

View File

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_res_partner" model="ir.ui.view">
<field name="name">>res.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref ="base.view_partner_form" />
<field name="arch" type="xml">
<field name="type" position="after">
<field name="is_coworker" />
<field name="coworker_type"
attrs="{'invisible': [('is_coworker','=', False)]}" />
<field name="contact_date" />
</field>
<field name="email" position="after">
<field name="url" />
</field>
</field>
</record>
<!-- Tree -->
<record id="view_tree_res_partner" model="ir.ui.view">
<field name="name">res.partner.tree.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref ="base.view_partner_tree" />
<field name="arch" type="xml">
<field name="phone" position="before">
<field name="company_name" />
<field name="full_contact_adress" />
</field>
<field name="phone" position="replace">
<field name="mobile" />
</field>
</field>
</record>
<!-- Search -->
<record id="view_search_res_partner" model="ir.ui.view">
<field name="name">res.partner.search.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref ="base.view_res_partner_filter" />
<field name="arch" type="xml">
<search position="inside">
<filter name="group_coworker_type" string="Group coworker type"
context="{'group_by': 'coworker_type'}" />
<filter name="group_title" string="by title"
context="{'group_by': 'title'}" />
<filter name="group_city" string="City"
context="{'group_by': 'city'}" />
<filter name="is_coworker" string="Coworker"
domain="[('is_coworker','=',True)]" />
<filter name="group_month" string="Month"
context="{'group_by': 'contact_date:month'}" />
<filter name="group_year" string="Year"
context="{'group_by': 'contact_date:year'}" />
</search>
</field>
</record>
<!-- Kanban -->
<record id="view_kanban_res_partner" model="ir.ui.view">
<field name="name">res.partner.kanban.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref ="base.res_partner_kanban_view" />
<field name="arch" type="xml">
<field name="city" position="after">
<field name="full_contact_adress" />
</field>
<xpath expr="//div[@class='oe_kanban_details']/ul/li[4]" position="replace">
<li><field name="full_contact_adress" /></li>
</xpath>
<xpath expr="//div[@class='oe_kanban_details']/ul/li[5]" position="attributes">
<attribute name="style">display: none;</attribute>
</xpath>
<xpath expr="//div[@class='oe_kanban_details']/ul/li[6]" position="attributes">
<attribute name="style">display: none;</attribute>
</xpath>
</field>
</record>
<!-- Calendar -->
<act_window id="contacts.action_contacts" name="Contacts"
res_model="res.partner" view_mode="kanban,form,calendar,graph,pivot" />
<record id="view_calendar_res_partner" model="ir.ui.view">
<field name="name">res.partner.calendar</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<calendar date_start="contact_date" mode="month"
display="First contact : [name]" >
<field name="name" />
</calendar>
</field>
</record>
<!-- Graph -->
<record id="view_graph_res_partner" model="ir.ui.view">
<field name="name">res.partner.graph</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<graph type="bar">
<field name="is_coworker" />
</graph>
</field>
</record>
<record id="view_pivot_res_partner" model="ir.ui.view">
<field name="name">pivot</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<pivot string="titre pivot">
<field name="title" type="col" />
<field name="contact_date" interval="week" />
</pivot>
</field>
</record>
</odoo>

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models, wizard

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Firstname Lastname <firstname.lastname@company.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/>.
{
'name': 'Coworking event',
'summary': 'yaltik coworking module simplify your coworking gerance',
'description': """ yaltik coworking module simplify your coworking gerance """,
'version': '10.0.0.0.1',
'category': 'Coworking',
'author': 'Yaltik',
'license': 'AGPL-3',
'application': False,
'installable': True,
'data': ['security/ir.model.access.csv',
'views/event_menu.xml',
'views/event_views.xml',
'views/res_partner_views.xml',
'wizard/coworking_event_weekly_views.xml'],
'depends': ['coworking_coworker']
}

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
"""dd"""
from . import event, res_partner

View File

@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
""" Event module """
from datetime import datetime
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class Event(models.Model):
""" Event model """
_name = 'coworking.event'
_description = 'Event model definition'
_rec_name = 'title'
_order = 'id asc'
title = fields.Char(required=True)
manager_id = fields.Many2one('res.partner', 'Manager', index=True, required=True,
domain="[('coworker_type', 'in', ['staffer', 'member'])]")
date_start = fields.Datetime(default=fields.Date.context_today, required=True)
starts_this_week = fields.Integer(compute='_compute_starts_this_week',
search='_search_starts_this_week')
date_end = fields.Datetime(required=True)
duration = fields.Float(compute='_compute_duration')
description = fields.Text()
statut = fields.Selection([('draft', 'Draft'),
('confirmed', 'Confirmed'),
('canceled', 'Canceled')], default='draft')
participants_ids = fields.Many2many('res.partner', string='Subscribers')
participants_count = fields.Integer('Number of participants',
compute='_compute_participants_count')
@api.depends('date_start')
def _compute_starts_this_week(self):
""" Computes is event starts this week """
for event in self:
date_start = fields.Datetime.from_string(event.date_start)
week_start = date_start.isocalendar()[1]
event.starts_this_week = (datetime.now().isocalendar()[1] == week_start)
def _search_starts_this_week(self, operator, value):
""" Searches function for starts_this_week """
res_ids = []
for event in self.search([]):
date_start = fields.Datetime.from_string(event.date_start)
week_start = date_start.isocalendar()[1]
if datetime.now().isocalendar()[1] == week_start:
res_ids.append(event.id)
if operator == '=':
operator = 'in'if value else 'not in'
else:
operator = 'not in'if value else 'in'
return [('id', operator, res_ids)]
@api.depends('participants_ids')
def _compute_participants_count(self):
""" Computes number of participants """
for event in self:
event.participants_count = len(event.participants_ids)
@api.constrains('statut', 'participants_ids')
def _check_if_confirmed(self):
"""Test si participants_ids est confirmed"""
for event in self:
if event.participants_ids and event.statut == 'draft':
raise models.ValidationError(_('You can have subscribed people '
'if event is not confirmed yet'))
@api.constrains('date_start', 'date_end')
def _check_dates(self):
"""Test si la modification de la date de début est infnérieure à la date de fin"""
for event in self:
if event.date_start > event.date_end:
raise ValidationError(_('End date most be supperior to to start date'))
@api.depends('date_start', 'date_end')
def _compute_duration(self):
for event in self:
if event.date_start and event.date_end:
date_end_py = fields.Datetime.from_string(event.date_end)
date_start_py = fields.Datetime.from_string(event.date_start)
delta = date_end_py - date_start_py
event.duration = delta.days * 24.0 + round(float(delta.seconds) / 3600.0)
else:
event.duration = 0.0

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
""" Coworker adaptations """
from odoo import models, fields, api
class ResPartner(models.Model):
""" Coworker adaptations """
_inherit = 'res.partner'
manager_event_ids = fields.One2many('coworking.event', 'manager_id',
string='Events managed')
event_ids = fields.Many2many('coworking.event', string='Events visited')
events_coworker_count = fields.Integer('Number of event have participe',
compute='_compute_events_coworker_count')
@api.depends('event_ids')
def _compute_events_coworker_count(self):
""" Computes number of event coworker """
for event in self:
event.events_coworker_count = len(event.event_ids)

View File

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
acess_coworker_group_user,Access COWORKER Member User,model_coworking_event,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 acess_coworker_group_user Access COWORKER Member User model_coworking_event base.group_user 1 1 1 1

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action to open Coworkers list -->
<act_window id="event_action" name="Event"
res_model="coworking.event" view_mode="tree,form,calendar"
context="{'search_default_status_confirmed': True, 'search_default_status_draft': True}" />
<!-- Menu item to open Event list -->
<menuitem id="event_topmenu" name="Event" />
<menuitem id="event_menu" name="Events" action="event_action"
parent="event_topmenu" sequence="1" />
</odoo>

View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_event" model="ir.ui.view">
<field name="name">Event Form</field>
<field name="model">coworking.event</field>
<field name="arch" type="xml">
<form string="event">
<header>
<field name="statut" widget="statusbar" clickable="1" />
</header>
<sheet>
<group name="group_top">
<group name="group_left">
<field name="title" />
<field name="manager_id" />
<field name="date_start" />
<field name="starts_this_week" attrs="{'invisible': [('date_start', '=', True)]}" />
<field name="date_end" />
<field name="duration" widget="float_time" />
<field name="description" />
<field name="participants_ids" widget="many2many_tags"
options="{'no_create': true}" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- Tree -->
<record id="view_tree_coworker" model="ir.ui.view">
<field name="name">event Tree</field>
<field name="model">coworking.event</field>
<field name="arch" type="xml">
<tree default_order="date_start asc">
<field name="title" />
<field name="manager_id" />
<field name="date_start" />
<field name="participants_count" />
<field name="statut" />
</tree>
</field>
</record>
<!-- Search -->
<record id="view_search_event" model="ir.ui.view">
<field name="name">Event Search</field>
<field name="model">coworking.event</field>
<field name="arch" type="xml">
<search>
<field name="title" />
<field name="manager_id" />
<filter name="status_confirmed" string="Confirmed"
domain="[('statut','=','confirmed')]" />
<filter name="status_draft" string="Draft"
domain="[('statut','=','draft')]" />
<filter name="canceled" string="Canceled"
domain="[('statut','=','canceled')]" />
<separator />
<filter name="this_week" string="Starts this week"
domain="[('starts_this_week','=', True)]" />
<filter name="this_30_month" string="Starts 30 month"
domain="[('date_start','&lt;=', datetime.datetime.combine(context_today() + datetime.timedelta(days=30), datetime.time(23,59,59))),
('date_start','&gt;=', datetime.datetime.combine(context_today(), datetime.time(0,0,0)))]" />
<filter name="group_status" string="Group status"
context="{'group_by': 'statut'}" />
<filter name="group_manager_id" string="Group manager"
context="{'group_by': 'manager_id'}" />
<filter name="group_years_start" string="Group years start"
context="{'group_by': 'date_start:year'}" />
<filter name="group_month" string="Group month"
context="{'group_by': 'date_start:month'}" />
</search>
</field>
</record>
<!-- Calendar -->
<record id="view_calendar_event" model="ir.ui.view">
<field name="name">Event Calendar</field>
<field name="model">coworking.event</field>
<field name="arch" type="xml">
<calendar date_start="date_start" date_stop="date_end"
display="[title]" >
<field name="title" />
</calendar>
</field>
</record>
</odoo>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_res_partner" model="ir.ui.view">
<field name="name">Res_partner Form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref ="base.view_partner_form" />
<field name="arch" type="xml">
<notebook position="inside">
<page string="Events" name="Events">
<group name="events">
<field name="manager_event_ids"
context="{'default_manager_id': active_id}" />
<field name="event_ids" />
<field name="events_coworker_count" />
</group>
</page>
</notebook>
</field>
</record>
</odoo>

View File

@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import coworking_event_weekly

View File

@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
""" Weekly massive event creation module """
import logging
from datetime import timedelta
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
_LOGGER = logging.getLogger(__name__)
class CoworkingEventWeekly(models.TransientModel):
""" Weekly massive event creation """
_name = 'coworking.event.weekly'
_description = 'Weekly massive event creation'
title = fields.Char(required=True)
manager_id = fields.Many2one('res.partner', string='Manager',
required=True)
date_start_recurence = fields.Datetime('Date start', required=True)
date_stop_recurence = fields.Datetime('Date stop', required=True)
duration = fields.Float(required=True)
@api.constrains('date_start_recurence', 'date_stop_recurence')
def _check_dates(self):
""" Check date coherence """
for weekly in self:
if weekly.date_start_recurence > weekly.date_stop_recurence:
raise ValidationError(_('Please check you dates.'))
@api.multi
def weekly_create(self):
""" Create multiple events repeated weekly, according to dates """
self.ensure_one()
# 5 - Rediriger vers la liste des événements (en automatique)
# _LOGGER.warning()
date_start_py = fields.Datetime.from_string(self.date_start_recurence)
duration_delta = timedelta(hours=self.duration)
date_stop_py = fields.Datetime.from_string(self.date_stop_recurence)
delta = date_stop_py - date_start_py
wdelta = timedelta(days=7)
for week_number in xrange(delta.days / 7 + 1):
if week_number == 0:
date_start = self.date_start_recurence
date_stop = fields.Datetime.to_string(date_start_py + duration_delta)
else:
date_start = fields.Datetime.from_string(self.date_start_recurence) +\
wdelta * week_number
date_stop = fields.Datetime.to_string(date_start + duration_delta)
date_start = fields.Datetime.to_string(date_start)
self.env['coworking.event'].create({
'title': self.title,
'date_start': date_start,
'date_end': date_stop,
'manager_id': self.manager_id.id
})
event_action = self.env.ref('coworking_event.event_action')
return {
'type': event_action.type,
'name': event_action.name,
'res_model': event_action.res_model,
'target': 'main',
'view_mode': event_action.view_mode
}

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_weekly_event" model="ir.ui.view">
<field name="name">Event Weekly Form</field>
<field name="model">coworking.event.weekly</field>
<field name="arch" type="xml">
<form string="event">
<sheet>
<group>
<field name="title" />
<field name="manager_id" />
<field name="date_start_recurence" />
<field name="date_stop_recurence" />
<field name="duration" widget="float_time" />
</group>
</sheet>
<footer>
<button type="object" name="weekly_create" string="Create"
class="oe_highlight" />
<button string="Close" special="cancel" />
</footer>
</form>
</field>
</record>
<!-- Action -->
<!-- <record id="weekly_event_action" model="ir.actions.act_window">
<field name="name">Weekly event</field>
<field name="res_model">coworking.event.weekly</field>
<field name="view_mode">form</field>
<field name="view_id" ref="coworking_event.view_form_weekly_event" />
<field name="target">new</field>
</record> -->
<act_window id="weekly_event_action" name="Weekly event"
res_model="coworking.event.weekly" view_mode="form"
target="new" />
<!-- Menu -->
<menuitem id="weekly_event_menu" name="Weekly events" action="weekly_event_action"
parent="event_topmenu" sequence="5" />
</odoo>

View File

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
from . import coworker
from . import models

View File

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Firstname Lastname <firstname.lastname@company.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/>.
{
'name': 'Coworking relation',
'summary': 'yaltik coworking module simplify your coworking gerance',
'description': """ yaltik coworking module simplify your coworking gerance """,
'version': '10.0.0.0.1',
'category': 'Coworking',
'author': 'Yaltik',
'license': 'AGPL-3',
'application': False,
'installable': True,
'data': ['security/ir.model.access.csv',
'views/relation_menu.xml',
'views/relation_views.xml',
'views/res_partner_views.xml'],
'depends': ['coworking_coworker']
}

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
"""dd"""
from . import relation, res_partner

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
""" Coworker relation """
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class CoworkerRelation(models.Model):
"""Coworker relation model """
_name = 'coworking.relation'
_description = 'relation model definition'
_order = 'id asc'
name = fields.Char()
coworker1 = fields.Many2one(
'res.partner', 'Coworker 1', index=True, required=True,
domain="[('is_coworker', '=', True)]"
)
coworker2 = fields.Many2one(
'res.partner', 'Coworker 2', index=True, required=True,
domain="[('is_coworker', '=', True)]"
)
relation = fields.Char(index=True, required=True)
@api.constrains('coworker1', 'coworker2')
def _check_if_coworker_is_same(self):
"""Test si coworker1 est identique à coworker2"""
if self.coworker1 == self.coworker2:
raise ValidationError(_('Coworker1 is same coworker2'))

View File

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
""" Coworker adaptations """
import logging
from odoo import models, fields, api
_LOGGER = logging.getLogger(__name__)
class ResPartner(models.Model):
""" Coworker adaptations """
_inherit = 'res.partner'
manager_event_ids = fields.One2many('coworking.event', 'manager_id',
string='Events managed')
event_ids = fields.Many2many('coworking.event', string='Events visited')
events_coworker_count = fields.Integer('Number of event have participe',
compute='_compute_events_coworker_count')
#Relation fields
coworker_relation_ids = fields.One2many(
string="Relations",
comodel_name="coworking.relation",
inverse_name="coworker2",
compute="_compute_coworker_relation_ids")
@api.depends('event_ids')
def _compute_events_coworker_count(self):
""" Computes number of event coworker """
for event in self:
event.events_coworker_count = len(event.event_ids)
def _compute_coworker_relation_ids(self):
""" Computes coworker1_relation_ids and coworker2_relation_ids """
for coworker in self:
relation_model = self.env['coworking.relation']
domain = ('|', ['coworker1', '=', coworker.id],
['coworker2', '=', coworker.id])
coworker.coworker_relation_ids = relation_model.search(domain)

View File

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
acess_coworker_group_user,Access COWORKER Member User,model_coworking_relation,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 acess_coworker_group_user Access COWORKER Member User model_coworking_relation base.group_user 1 1 1 1

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action to open Coworkers list -->
<act_window id="relation_action" name="Relation"
res_model="coworking.relation" view_mode="tree" />
<!-- Menu item to open Event list -->
<menuitem id="coworker_relation_menu" name="Relations" action="relation_action"
parent="contacts.menu_contacts" sequence="2" />
</odoo>

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_relation" model="ir.ui.view">
<field name="name">Relation Form</field>
<field name="model">coworking.relation</field>
<field name="arch" type="xml">
<form string="event">
<sheet>
<group name="group_top">
<group name="group_left">
<field name="coworker1" domain="[('id', '!=', coworker2), ('is_coworker', '=', True)]" />
<field name="coworker2" domain="[('id', '!=', coworker1), ('is_coworker', '=', True)]" />
<field name="relation" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- Tree -->
<record id="view_tree_relation" model="ir.ui.view">
<field name="name">relation Tree</field>
<field name="model">coworking.relation</field>
<field name="arch" type="xml">
<tree editable="True">
<field name="coworker1" domain="[('id', '!=', coworker2), ('is_coworker', '=', True)]" />
<field name="coworker2" domain="[('id', '!=', coworker1), ('is_coworker', '=', True)]" />
<field name="relation" />
</tree>
</field>
</record>
<!-- Search -->
<record id="view_search_relation" model="ir.ui.view">
<field name="name">relation Search</field>
<field name="model">coworking.relation</field>
<field name="arch" type="xml">
<search>
<field name="coworker1" />
<field name="coworker2" />
<field name="relation" />
<separator />
<filter name="group_relation" string="Group relation"
context="{'group_by': 'relation'}" />
<filter name="group_coworker1" string="Group coworker1"
context="{'group_by': 'coworker1'}" />
</search>
</field>
</record>
</odoo>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form -->
<record id="view_form_res_partner" model="ir.ui.view">
<field name="name">Res_partner Form adaptations</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref ="base.view_partner_form" />
<field name="arch" type="xml">
<notebook position="inside">
<page string="Relation" name="Relation">
<group name="relation">
<field name="coworker_relation_ids" />
</group>
</page>
</notebook>
</field>
</record>
</odoo>

View File

@ -1,39 +0,0 @@
# -*- coding: utf-8 -*-
""" Coworker module """
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class Coworker(models.Model):
""" Coworker model """
_name = 'coworking.coworker'
_description = 'Coworker model definition'
_order = 'id desc'
name = fields.Char(required=True)
firstname = fields.Char('First name', required=True)
coworker_type = fields.Selection([('staffer', 'Staffer'),
('worker', 'Worker'), ('member', 'Member'),
('volunteer', 'Volunteer'),
('visitor', 'Visitor')])
company_name = fields.Char('Company')
job = fields.Char()
contact_date = fields.Date(default=fields.Date.context_today)
street = fields.Char()
contact_zip = fields.Char()
city = fields.Char()
phone_number = fields.Char()
gsm = fields.Char('GSM')
email = fields.Char()
url = fields.Char('URL')
note = fields.Text()
is_done = fields.Boolean('Done?')
is_active = fields.Boolean('Active?', default=True)
@api.constrains('contact_date')
def _check_contact_date(self):
if self.contact_date > fields.Date.context_today(self):
raise ValidationError(_('Date most be egual of inferior to to day'))

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action to open Coworkers list -->
<act_window id="coworker_action" name="Coworkers"
res_model="coworking.coworker" view_mode="tree,form" />
<!-- Menu item to open Coworkers list -->
<menuitem id="coworker_menu" name="Coworkers" action="coworker_action" />
</odoo>