add gym module

This commit is contained in:
sonal
2020-08-04 16:50:06 +05:30
parent d32f648b75
commit 29f684db39
219 changed files with 5030 additions and 0 deletions

166
gym/LICENSE/LICENSE Normal file
View File

@@ -0,0 +1,166 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Copyright (C) 2019-TODAY Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

75
gym/README.rst Normal file
View File

@@ -0,0 +1,75 @@
==============
GYM Management
==============
This modules implements GYM management system with the following entities,
1) Member:-
--> Member can access his Membership details.
2) Operator:-
--> Operator can access all the membership information.
--> Manage Members
========
Features
========
* Manage Members
--> Efficiently manage all the members in your gym.
--> Directly create new member into the system when you convert a lead into opportunity.
* Memberships
--> Directly create a new membership for the member from Quotation upon sale confirmation.
--> Track the various stages of the Membership lifecycle.
* Measurement History with BMI and BMR calculation
--> Efficiently track the body measurement growth of the member.
--> BMI analyse it on graph and see how good they perform.
--> You can configure the default measurement units in your company profile.
* Manage Trainers
--> Easily manage your gym trainers. You can categories the trainers according to their skills.
* GYM Equipments
--> Manage your gym equipments. Set them as out of service or in maintenance.
* Exercises
--> Configure various exercises, add the steps to be followed and their benefits.
--> You can also add images and video links for better understanding.
* Pedometer
--> Track the steps of the member and analyse it on the graph view.
============
Similar Apps
============
GYM Management
GYM management software
GYM management system
GYM management project
GYM management odoo
Odoo GYM Management
GYM Management with odoo
GYM Management in odoo
GYM membership management software
GYM launch management
GYM management system website
GYM membership management
GYM management app
GYM management plan
GYM management project
GYM management tools
GYM facility management
GYM management roles

3
gym/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
# See LICENSE file for full copyright and licensing details.
from . import models

57
gym/__manifest__.py Normal file
View File

@@ -0,0 +1,57 @@
# See LICENSE file for full copyright and licensing details.
{
'name': 'GYM Management',
'summary': 'This module is used for Gym Management with Membership,'
' Trainer, and Equipment.',
'version': '13.0.1.0.0',
'license': 'LGPL-3',
'author': 'Serpent Consulting Services Pvt. Ltd.',
'maintainer': 'Serpent Consulting Services Pvt. Ltd.',
'website': 'http://www.serpentcs.com',
'category': 'Gym Management',
'depends': [
'sale_management',
'hr',
'crm',
'project',
'membership',
],
'data': [
'data/inactive_rule_data.xml',
'security/security.xml',
'security/ir.model.access.csv',
'data/member_sequence.xml',
'data/membership_plan_sequence.xml',
'data/equipment_demo.xml',
'data/email_template.xml',
'data/membership_scheduler.xml',
'data/service_demo.xml',
'data/exercise_for_demo.xml',
'data/exercise_demo.xml',
'data/mail_templates.xml',
'views/menuitem_hide.xml',
'views/product_template.xml',
'views/membership_view.xml',
'views/project_task_view.xml',
'views/member_view.xml',
'views/trainer_view.xml',
'views/workout_view.xml',
'views/company_view.xml',
'views/gym_skills_view.xml',
],
'demo': [
'demo/exercise_exercise_demo.xml',
'demo/user_demo.xml',
'demo/pedo_meter_demo.xml',
'demo/food_demo.xml',
'demo/membership_demo.xml'
],
'images': ['static/description/gym.jpg'],
'application': True,
'installable': True,
'price': 199,
'currency': 'EUR',
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,18 @@
<odoo noupdate="1">
<!-- Email template for send notification on Membership expiration-->
<record id="membership_expiration" model="mail.template">
<field name="name">Membership Reminder</field>
<field name="email_from">${(user.partner_id.email or '')|safe}</field>
<field name="subject">Reminder for Membership Expiration</field>
<field name="email_to">${(object.email or '')|safe}</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="body_html"><![CDATA[
<p>Hello,</p>
<p>Your Membership will expire within 7 days.
Requesting you to do the needful actions.</p>
<p>Thank you,</p>]]>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,75 @@
<odoo noupdate="1">
<record id="equipment_rec_1" model="product.template">
<field name="name">Barbells</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/barbells.jpg"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_2" model="product.template">
<field name="name">CALF-MACHINE</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/CALF-MACHINE.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_3" model="product.template">
<field name="name">CABLES-AND-PULLEYS</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/CABLES-AND-PULLEYS.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_4" model="product.template">
<field name="name">BENCH-PRESS</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/BENCH-PRESS.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_5" model="product.template">
<field name="name">DUMBBELLS</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/DUMBBELLS.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_6" model="product.template">
<field name="name">LEG-EXTENSION-MACHINE</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/LEG-EXTENSION-MACHINE.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_7" model="product.template">
<field name="name">INCLINE-BENCH-PRESS</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/INCLINE-BENCH-PRESS.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_8" model="product.template">
<field name="name">HAMMER-STRENGTH-MACHINE</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/HAMMER-STRENGTH-MACHINE.png"/>
<field name="state">working</field>
</record>
<record id="equipment_rec_9" model="product.template">
<field name="name">KETTLEBELLS</field>
<field name="is_equipment">True</field>
<field name="image_1920" type="base64"
file="gym/static/src/img/KETTLEBELLS.png"/>
<field name="state">working</field>
</record>
</odoo>

119
gym/data/exercise_demo.xml Normal file
View File

@@ -0,0 +1,119 @@
<odoo noupdate="1">
<record id="equipment_pullups" model="product.template">
<field name="name">Pull Up Bar</field>
</record>
<record id="exercise_pullups" model="exercise.exercise">
<field name="name">Pull-ups</field>
<field name="equipment_id" ref="gym.equipment_pullups"/>
</record>
<record id="image_attachment_1" model="ir.attachment">
<field name="name">Pull-ups</field>
<field name="datas" type="base64" file="gym/static/image/pullup_2.jpeg"/>
</record>
<record id="image_attachment_2" model="ir.attachment">
<field name="name">Pull-ups</field>
<field name="datas" type="base64" file="gym/static/image/pullup.jpeg"/>
</record>
<record id="image_attachment_3" model="ir.attachment">
<field name="name">Pull-ups</field>
<field name="datas" type="base64" file="gym/static/image/pullup-4.jpeg"/>
</record>
<record id="exercise_Pulldown" model="exercise.exercise">
<field name="name">Pull down</field>
</record>
<record id="exercise_deadlift" model="exercise.exercise">
<field name="name">Deadlift</field>
</record>
<record id="exercise_dip" model="exercise.exercise">
<field name="name">Dip</field>
</record>
<record id="exercise_leg_curl" model="exercise.exercise">
<field name="name">Leg curl</field>
</record>
<record id="exercise_leg_press" model="exercise.exercise">
<field name="name">Leg press</field>
</record>
<record id="exercise_dumbbell_fly" model="exercise.exercise">
<field name="name">Dumbbell fly</field>
</record>
<record id="exercise_dumbbell_press" model="exercise.exercise">
<field name="name">Dumbbell press</field>
</record>
<record id="exercise_leg_extension" model="exercise.exercise">
<field name="name">Leg Extension</field>
</record>
<record id="exercise_snatch" model="exercise.exercise">
<field name="name">Snatch</field>
</record>
<record id="exercise_seated_calf_raise" model="exercise.exercise">
<field name="name">Seated Calf Raise</field>
</record>
<record id="equipment_Bench_press" model="product.template">
<field name="name">Bench Press Machine</field>
</record>
<record id="exercise_bench_press" model="exercise.exercise">
<field name="name">Bench Press</field>
<field name="equipment_id" ref="gym.equipment_Bench_press"/>
</record>
<record id="image_attachment_4" model="ir.attachment">
<field name="name">Bench Press</field>
<field name="datas" type="base64" file="gym/static/image/bench-1.jpeg"/>
</record>
<record id="image_attachment_5" model="ir.attachment">
<field name="name">Bench Press</field>
<field name="datas" type="base64" file="gym/static/image/bench-2.jpeg"/>
</record>
<record id="image_attachment_6" model="ir.attachment">
<field name="name">Bench Press</field>
<field name="datas" type="base64" file="gym/static/image/bench-3.jpeg"/>
</record>
<record id="exercise_Shoulder_press" model="exercise.exercise">
<field name="name">Shoulder Press</field>
</record>
<record id="exercise_crunch" model="exercise.exercise">
<field name="name">Crunch</field>
</record>
<record id="exercise_biceps_curl" model="exercise.exercise">
<field name="name">Biceps Curl</field>
</record>
<record id="exercise_wall_sit" model="exercise.exercise">
<field name="name">Wall sit</field>
</record>
<record id="exercise_standing_calf_raise" model="exercise.exercise">
<field name="name">Standing calf raise</field>
</record>
<record id="exercise_chest_fly" model="exercise.exercise">
<field name="name">Chest fly</field>
</record>
<record id="exercise_barbell_row" model="exercise.exercise">
<field name="name">Bent-over barbell rows</field>
</record>
</odoo>

View File

@@ -0,0 +1,75 @@
<odoo noupdate="1">
<record id="exercise_chest" model="exercise.type">
<field name="name">Chest</field>
</record>
<record id="exercise_shoulders" model="exercise.type">
<field name="name">Shoulders</field>
</record>
<record id="exercise_triceps" model="exercise.type">
<field name="name">Triceps</field>
</record>
<record id="exercise_biceps" model="exercise.type">
<field name="name">Biceps</field>
</record>
<record id="exercise_abdominals" model="exercise.type">
<field name="name">Abdominals</field>
</record>
<record id="exercise_glutes" model="exercise.type">
<field name="name">Glutes</field>
</record>
<record id="exercise_abs" model="exercise.type">
<field name="name">Abs</field>
</record>
<record id="exercise_lowerback" model="exercise.type">
<field name="name">Lowerback</field>
</record>
<record id="exercise_fullbody" model="exercise.type">
<field name="name">Full Body</field>
</record>
<record id="exercise_forarms" model="exercise.type">
<field name="name">Forearms</field>
</record>
<record id="exercise_traps" model="exercise.type">
<field name="name">Traps</field>
</record>
<record id="exercise_calves" model="exercise.type">
<field name="name">Calves</field>
</record>
<record id="exercise_quads" model="exercise.type">
<field name="name">Quads</field>
</record>
<record id="exercise_neck" model="exercise.type">
<field name="name">Neck</field>
</record>
<record id="exercise_middle_back" model="exercise.type">
<field name="name">Middle Back</field>
</record>
<record id="exercise_lats" model="exercise.type">
<field name="name">Lats</field>
</record>
<record id="exercise_legs" model="exercise.type">
<field name="name">Legs</field>
</record>
<record id="exercise_back" model="exercise.type">
<field name="name">Back</field>
</record>
</odoo>

View File

@@ -0,0 +1,4 @@
<odoo noupdate="1">
<function name="inactive_rule" model="calendar.event"/>
<function name="inactive_rule" model="res.partner"/>
</odoo>

View File

@@ -0,0 +1,11 @@
<odoo>
<record id="equipement_repair_template" model="mail.template">
<field name="name">Equipement</field>
<field name="email_from"></field>
<field name="subject"></field>
<field name="model_id" ref="product.model_product_template" />
<field name="auto_delete" eval="True" />
<field name="body_html">
</field>
</record>
</odoo>

View File

@@ -0,0 +1,12 @@
<odoo noupdate="1">
<!-- Sequence of Member ID -->
<record id="mem_seq" model="ir.sequence">
<field name="name">Member Sequence</field>
<field name="code">res.partner</field>
<field name="number_increment">1</field>
<field name="padding">5</field>
<field name="prefix">MEM/%(year)s/</field>
</record>
</odoo>

View File

@@ -0,0 +1,20 @@
<odoo noupdate="1">
<!-- Sequence of Membership plan ID -->
<record id="mem_seq" model="ir.sequence">
<field name="name">Membership PLan Sequence</field>
<field name="code">membership.membership_line</field>
<field name="number_increment">1</field>
<field name="padding">4</field>
<field name="prefix">MEPLAN/%(year)s/</field>
</record>
<record id="membership_number_seq" model="ir.sequence">
<field name="name">Membership Number Sequence</field>
<field name="code">membership.number</field>
<field name="number_increment">1</field>
<field name="padding">4</field>
<field name="prefix">M</field>
</record>
</odoo>

View File

@@ -0,0 +1,16 @@
<odoo noupdate="1">
<!--Membership Scheduler -->
<record id="update_membership_cron" model="ir.cron">
<field name="name">Update Membership</field>
<field name="model_id"
ref="membership.model_membership_membership_line"/>
<field name="state">code</field>
<field name="code">model.check_membership_validity()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False"/>
</record>
</odoo>

22
gym/data/service_demo.xml Normal file
View File

@@ -0,0 +1,22 @@
<odoo noupdate="1">
<record id="service_gym_1" model="product.template">
<field name="name">Gym</field>
</record>
<record id="service_Cardio_2" model="product.template">
<field name="name">Cardio</field>
</record>
<record id="service_yoga_3" model="product.template">
<field name="name">Yoga</field>
</record>
<record id="service_spa_4" model="product.template">
<field name="name">Spa</field>
</record>
<record id="service_personal_training_5" model="product.template">
<field name="name">Personal training</field>
</record>
<record id="service_nutrition_6" model="product.template">
<field name="name">Nutrition</field>
</record>
</odoo>

View File

@@ -0,0 +1,43 @@
<odoo noupdate="1">
<record id="gym.exercise_pullups" model="exercise.exercise">
<field name="benefits">Pull ups are very efficient because each and
every single pull up works out your biceps, triceps, forearms,
wrists, grip strength, lats, shoulders, and your core.
</field>
<field name="steps">1. Sit under the bar and grip it with your palms
facing out
2. Straighten up and lift about 50 percent of your body weight,
keeping your feet on the ground and your knees slightly bent. Keep
lifting until your chin is over the bar.
3. Slowly lower yourself back to starting position.
4. Repeat.
</field>
<field name="exercise_images_ids"
eval="[(6,0,[ref('image_attachment_1'),ref('image_attachment_2'),ref('image_attachment_3')])]"/>
<field name="exercise_type_ids"
eval="[(6,0,[ref('gym.exercise_shoulders')])]"/>
<field name="equipment_id" ref="gym.equipment_pullups"/>
</record>
<record id="gym.exercise_bench_press" model="exercise.exercise">
<field name="benefits">Maximum Overload the Chest Muscles. The bench
press is virtually unparalleled in its ability to target the chest
muscles with heavy loads..
</field>
<field name="steps">1. Setup. Lie on the flat bench with your eyes
under the bar.
2. Grab the bar. Put your pinky on the ring marks of your bar.
3. Unrack. Take a big breath and unrack the bar by straightening
your arms.
4. Lower the bar.
5. Press.
</field>
<field name="exercise_images_ids"
eval="[(6,0,[ref('image_attachment_4'),ref('image_attachment_5'),ref('image_attachment_6')])]"/>
<field name="exercise_type_ids"
eval="[(6,0,[ref('gym.exercise_chest')])]"/>
<field name="equipment_id" ref="gym.equipment_Bench_press"/>
</record>
</odoo>

206
gym/demo/food_demo.xml Normal file
View File

@@ -0,0 +1,206 @@
<odoo noupdate="1">
<record id="food_product_1" model="product.template">
<field name="name">Egg</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/egg.jpeg"/>
</record>
<record id="food_product_2" model="product.template">
<field name="name">Milk(Add 2 tsp skimmed milk powder )</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/milk.jpeg"/>
</record>
<record id="food_product_3" model="product.template">
<field name="name">Salad</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/salad.jpeg"/>
</record>
<record id="food_product_4" model="product.template">
<field name="name">Roti</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/roti.jpeg"/>
</record>
<record id="food_product_5" model="product.template">
<field name="name">Sabji</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/sabji.jpeg"/>
</record>
<record id="food_product_6" model="product.template">
<field name="name">Oats</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/oats.jpeg"/>
</record>
<record id="food_product_7" model="product.template">
<field name="name">Vegetable stuffed paratha</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/paratha.jpeg"/>
</record>
<record id="food_product_8" model="product.template">
<field name="name">Fruits</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/fruits.jpeg"/>
</record>
<record id="food_product_9" model="product.template">
<field name="name">Curd</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/curd.jpeg"/>
</record>
<record id="food_product_10" model="product.template">
<field name="name">Dal</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/dal.jpeg"/>
</record>
<record id="food_product_11" model="product.template">
<field name="name">Banana</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/banana.jpeg"/>
</record>
<record id="food_product_12" model="product.template">
<field name="name">Toasted bread</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/bread.jpeg"/>
</record>
<record id="food_product_13" model="product.template">
<field name="name">Dry Fruit chikki</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/chikki.jpeg"/>
</record>
<record id="food_product_14" model="product.template">
<field name="name">Roasted Soyabean</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/soya.jpeg"/>
</record>
<record id="food_product_15" model="product.template">
<field name="name">Lassi</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/lussi.jpeg"/>
</record>
<record id="food_product_16" model="product.template">
<field name="name">chicken soup</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/shup.jpeg"/>
</record>
<record id="food_product_17" model="product.template">
<field name="name">Tea / Coffee</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/tea.jpeg"/>
</record>
<record id="food_product_18" model="product.template">
<field name="name">Cookies</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/cookies.jpeg"/>
</record>
<record id="food_product_19" model="product.template">
<field name="name">Lukewarm Water</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/wotar.jpeg"/>
</record>
<record id="food_product_20" model="product.template">
<field name="name">Brown Rice</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/browen_rice.jpeg"/>
</record>
<record id="food_product_21" model="product.template">
<field name="name">Butter Milk</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/butter_milk.jpeg"/>
</record>
<record id="food_product_22" model="product.template">
<field name="name">Fish</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/fish.jpeg"/>
</record>
<record id="food_product_23" model="product.template">
<field name="name">Melon</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/melon.jpeg"/>
</record>
<record id="food_product_24" model="product.template">
<field name="name">lean roast beef</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/lean_roast_beef.jpeg"/>
</record>
<record id="food_product_25" model="product.template">
<field name="name">Swiss cheese</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/chese.jpeg"/>
</record>
<record id="food_product_26" model="product.template">
<field name="name">grain bread</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/grain_bread.jpeg"/>
</record>
<record id="food_product_27" model="product.template">
<field name="name">Broccoli</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/brocali.jpeg"/>
</record>
<record id="food_product_28" model="product.template">
<field name="name">Peanuts</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/penuats.jpeg"/>
</record>
<record id="food_product_29" model="product.template">
<field name="name">Poha</field>
<field name="is_food">True</field>
<field name="image_1920" type="base64"
file="gym/static/image/poha.jpeg"/>
</record>
</odoo>

View File

@@ -0,0 +1,17 @@
<odoo noupdate="1">
<!-- Demo Data for Memberships -->
<record id="product.product_product_1" model="product.product">
<field name="membership">False</field>
<field name="is_membership">True</field>
</record>
<record id="product.product_product_1" model="product.product">
<field name="membership">False</field>
<field name="is_membership">True</field>
</record>
<record id="product.product_product_1" model="product.product">
<field name="membership">False</field>
<field name="is_membership">True</field>
</record>
</odoo>

View File

@@ -0,0 +1,73 @@
<odoo noupdate="1">
<record id="pedo_rec_1" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo2"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=1)).strftime('%Y-%m-%d')"/>
<field name="steps">800</field>
</record>
<record id="pedo_rec_2" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo2"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=2)).strftime('%Y-%m-%d')"/>
<field name="steps">900</field>
</record>
<record id="pedo_rec_3" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo2"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=3)).strftime('%Y-%m-%d')"/>
<field name="steps">1000</field>
</record>
<record id="pedo_rec_4" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo2"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=4)).strftime('%Y-%m-%d')"/>
<field name="steps">1200</field>
</record>
<record id="pedo_rec_5" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo2"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=5)).strftime('%Y-%m-%d')"/>
<field name="steps">1500</field>
</record>
<record id="pedo_rec_6" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo3"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=1)).strftime('%Y-%m-%d')"/>
<field name="steps">200</field>
</record>
<record id="pedo_rec_7" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo3"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=2)).strftime('%Y-%m-%d')"/>
<field name="steps">400</field>
</record>
<record id="pedo_rec_8" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo3"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=3)).strftime('%Y-%m-%d')"/>
<field name="steps">900</field>
</record>
<record id="pedo_rec_9" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo3"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=4)).strftime('%Y-%m-%d')"/>
<field name="steps">1200</field>
</record>
<record id="pedo_rec_10" model="pedo.meter">
<field name="partner_id" ref="gym.member_demo3"/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1,day=5)).strftime('%Y-%m-%d')"/>
<field name="steps">1500</field>
</record>
</odoo>

110
gym/demo/user_demo.xml Normal file
View File

@@ -0,0 +1,110 @@
<odoo noupdate="1">
<!-- Member -->
<record id="member_demo" model="res.partner">
<field name="name">Member</field>
<field name="company_id" ref="base.main_company"/>
<field name="email">member@gym.example.com</field>
<field name="company_name">YourCompany</field>
</record>
<record id="member_user_demo" model="res.users">
<field name="partner_id" ref="gym.member_demo"/>
<field name="login">member44@gym.example.com</field>
<field name="password">a</field>
<field name="is_member" eval="1"/>
<field name="company_id" ref="base.main_company"/>
<field name="groups_id" eval="[(6,0,[ref('gym.group_gym_member')])]"/>
<field name="image_1920" type="base64" file="gym/static/image/member.jpeg"/>
</record>
<record id="member_demo2" model="res.partner">
<field name="name">Troy</field>
<field name="company_id" ref="base.main_company"/>
<field name="is_member" eval="1"/>
<field name="mobile">54685154854</field>
<field name="email">member12@gym.example.com</field>
<field name="image_1920" type="base64" file="gym/static/image/mem-1.jpeg"/>
</record>
<record id="member_demo4" model="res.partner">
<field name="name">Lucy</field>
<field name="company_id" ref="base.main_company"/>
<field name="is_member" eval="1"/>
<field name="mobile">578656882132</field>
<field name="email">member132@gym.example.com</field>
<field name="image_1920" type="base64" file="gym/static/image/mem-2.jpeg"/>
</record>
<record id="member_demo3" model="res.partner">
<field name="name">Steven</field>
<field name="company_id" ref="base.main_company"/>
<field name="is_member" eval="1"/>
<field name="mobile">2312365135</field>
<field name="email">member133@gym.example.com</field>
<field name="image_1920" type="base64" file="gym/static/image/mem-3.jpeg"/>
</record>
<!--Measurement history -->
<record id="measure_11" model="body.measurement">
<field name="partner_id" ref='gym.member_demo2'/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=2)).strftime('%Y-%m-%d')"/>
<field name="neck">7.05</field>
<field name="chest">36.00</field>
<field name="biceps">12.00</field>
<field name="waist">34.00</field>
<field name="hips">38.00</field>
<field name="thigh">16.00</field>
<field name="calf">8.00</field>
<field name="weight">60.00</field>
<field name="height">5.03</field>
</record>
<record id="measure_12" model="body.measurement">
<field name="partner_id" ref='gym.member_demo2'/>
<field name="date"
eval="(DateTime.now() - relativedelta(months=1)).strftime('%Y-%m-%d')"/>
<field name="neck">6.05</field>
<field name="chest">35.00</field>
<field name="biceps">10.00</field>
<field name="waist">32.00</field>
<field name="hips">36.00</field>
<field name="thigh">13.00</field>
<field name="calf">6.00</field>
<field name="weight">55.00</field>
<field name="height">5.03</field>
</record>
<record id="trainer_employee_demo1" model="hr.employee">
<field name="name">John</field>
<field name="work_email">membernn@gym.example.com</field>
<field name="is_trainer" eval="1"/>
<field name="image_1920" type="base64" file="gym/static/image/emp-1.jpeg"/>
</record>
<record id="trainer_employee_demo2" model="hr.employee">
<field name="name">Ron</field>
<field name="work_email">member23132679@gym.example.com</field>
<field name="is_trainer" eval="1"/>
<field name="image_1920" type="base64"
file="gym/static/image/trainer.jpeg"/>
</record>
<!-- Operator -->
<record id="operator_employee_demo1" model="hr.employee">
<field name="name">Victoria</field>
<field name="work_email">member12167@gym.example.com</field>
<field name="image_1920" type="base64" file="gym/static/image/ope-1.jpeg"/>
</record>
<!-- Manager -->
<record id="manager_employee_demo1" model="hr.employee">
<field name="name">Victoria</field>
<field name="work_email">member1211@gym.example.com</field>
<field name="image_1920" type="base64" file="gym/static/image/man.jpeg"/>
</record>
</odoo>

24
gym/models/__init__.py Normal file
View File

@@ -0,0 +1,24 @@
# See LICENSE file for full copyright and licensing details.
from . import member
from . import trainer
from . import product_template
from . import membership
from . import diet
from . import workout
from . import lead
from . import company
from . import gym_skills
from . import project_task
from . import sale
from . import calendar_event
from . import project_document
from . import project_document_case
from . import project_document_category
from . import project_document_group
from . import project_document_name
from . import project_document_opposite
from . import project_other
from . import account_analytic_account
from . import res_partner_credit_card
from . import res_partner_credit_card_type

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from odoo import fields, models,api
class AccountAnalyticAccount(models.Model):
_inherit = 'account.analytic.account'
is_location = fields.Boolean(
string='Is Location',
compute='compute_is_location',
store=True
)
@api.depends('group_id')
def compute_is_location(self):
for record in self:
if record.group_id.name=='Location':
record.is_location=True
else:
record.is_location=False

View File

@@ -0,0 +1,15 @@
# See LICENSE file for full copyright and licensing details.
from odoo import api, models
class CalendarEvent(models.Model):
_inherit = 'calendar.event'
@api.model
def inactive_rule(self):
rule_rec = self.env.ref('calendar.calendar_event_rule_employee',
raise_if_not_found=False)
if rule_rec and rule_rec.active:
rule_rec.active = False

20
gym/models/company.py Normal file
View File

@@ -0,0 +1,20 @@
# See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ResCompany(models.Model):
_inherit = 'res.company'
default_password = fields.Char('Password', default='gym',
help="""This will be used as a
default password when a
user gets automatically created
when an employee is created!""")
default_umo_of_height_id = fields.Many2one('uom.uom',
string='Unit of Height')
default_umo_of_weight_id = fields.Many2one('uom.uom',
string='Unit of Weight')
default_umo_of_measure_id = fields.Many2one('uom.uom',
string='Unit of Body Part '
'Measurement')

46
gym/models/diet.py Normal file
View File

@@ -0,0 +1,46 @@
# See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class DietPlan(models.Model):
"""Model for creating diet plan."""
_name = 'diet.plan'
_description = "Model for creating diet plan"
name = fields.Char('Name')
diet_plans_ids = fields.One2many('diet.plan.lines', 'plan_id', 'Plans')
class DietPlanLines(models.Model):
"""Model for add interval and food item in diet plan."""
_name = 'diet.plan.lines'
_description = "Diet Plan Lines"
interval = fields.Selection([('early_morning', 'Early Morning'),
('breakfast', 'Breakfast'),
('pre_lunch', 'Pre Lunch'),
('lunch', 'Lunch'),
('snack', 'Snack'),
('dinner', 'Dinner')],
'Interval',
help='Interval for Eating the food')
plan_id = fields.Many2one('diet.plan', 'Plans')
food_item_ids = fields.One2many('food.item', 'food_id', 'Food Items',
help='Foods and interval')
class FoodItem(models.Model):
"""Model for adding food item in diet plan."""
_name = 'food.item'
_description = "Food Item"
food_name_id = fields.Many2one('product.template', 'Food Item')
quantity = fields.Integer(string='Qty', help='Quantity of Food Items')
food_id = fields.Many2one('diet.plan.lines', 'Food Items',
help='Select Food Items')
measure_unit_id = fields.Many2one('uom.uom', string='Measurement Unit',
help='Measurement Unit for Food item')

11
gym/models/gym_skills.py Normal file
View File

@@ -0,0 +1,11 @@
# See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class GymSkills(models.Model):
_name = 'gym.skills'
_description = "Gym Skills"
name = fields.Char('Skill', required=True)
code = fields.Char('Code')

15
gym/models/lead.py Normal file
View File

@@ -0,0 +1,15 @@
# See LICENSE file for full copyright and licensing details.
from odoo import models
class CrmLead(models.Model):
_inherit = 'crm.lead'
def _lead_create_contact(self, name, is_company, parent_id=False):
res = super(CrmLead, self)._lead_create_contact(name, is_company,
parent_id=parent_id)
for lead in res:
lead.customer = True
lead.is_member = True
return res

325
gym/models/member.py Normal file
View File

@@ -0,0 +1,325 @@
# See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from datetime import date
from odoo.exceptions import ValidationError
class ResUsers(models.Model):
"""Users's detail."""
_inherit = 'res.users'
@api.model
def create(self, vals):
return super(ResUsers,
self.with_context(is_create_user=True)).create(vals)
class MemberDetail(models.Model):
"""Member's detail."""
_inherit = 'res.partner'
is_member = fields.Boolean(string='Is member ?',
default=lambda self: self.env.context.
get('member_default', False))
is_operator = fields.Boolean(string='Operator')
gender = fields.Selection([('male', 'Male'), ('female', 'Female')],
string='Gender', default='male')
occupation = fields.Char('Occupation')
reg_no = fields.Char('Member ID', copy=False,
help='Registration Number of Member')
member_measurement_ids = fields.One2many('body.measurement', 'partner_id',
'Measurement History',
help='Body Measurement History '
'of the Member')
birthdate = fields.Date('Date of Birth')
age = fields.Float(compute='_compute_calculate_age', string='Age',store=True)
measurements = fields.Integer(compute="_compute_cal_total_measurement",
string="Total measurement")
membership = fields.Integer(compute="_compute_cal_total_membership",
string="Total membership")
user_id = fields.Many2one('res.users', copy=False, string='User',
ondelete="cascade")
email = fields.Char(copy=False)
document_ids = fields.One2many(
comodel_name='project.document',
inverse_name="partner_id",
string='Documents',
)
document_opposite_ids = fields.One2many(
comodel_name='project.document.opposite',
inverse_name='partner_id',
string='Opposite Party Documents',
)
document_case_ids = fields.One2many(
comodel_name='project.document.case',
inverse_name='partner_id',
string='Case Related Documents',
)
docuemnt_other_ids = fields.One2many(
comodel_name='project.document.other',
inverse_name='partner_id',
string='Other Documents',
)
membership_number = fields.Char(
string='Membership No',
default='New'
)
account_manager_id = fields.Many2one(
comodel_name='res.users',
string='Account Manager',
)
analytic_id = fields.Many2one(
comodel_name='account.analytic.account',
string="Home Club"
)
home_club = fields.Char(
string='Home Clubs',
)
nationality_id = fields.Many2one(
comodel_name='res.country',
string='Nationality',
)
marketing_source = fields.Char(
string='Marketing Source',
)
referred_by_id = fields.Many2one(
comodel_name='res.users',
string='Referred By',
)
emirate_number = fields.Char(
string='Emirates ID',
)
passport_number = fields.Char(
string='Passport Number',
)
credit_card_ids = fields.One2many(
comodel_name='res.partner.credit.card',
inverse_name='partner_id',
string='Credit Cards',
)
def unlink(self):
for rec in self:
user_id = rec.user_id
rec.user_id = False
user_id.unlink()
return super(MemberDetail, self).unlink()
@api.model
def inactive_rule(self):
rule_rec = self.env.ref('base.res_partner_rule_private_employee',
raise_if_not_found=False)
if rule_rec and rule_rec.active:
rule_rec.active = False
@api.constrains('birthdate')
def _check_birthdate(self):
"""Check birth date of Member."""
if self.birthdate and self.birthdate >= date.today():
raise ValidationError(_("Birth date must be less than today's"
" date."))
def _compute_cal_total_measurement(self):
"""Measurement history count."""
for partner_rec in self:
partner_rec.measurements = \
partner_rec.member_measurement_ids and len(
partner_rec.member_measurement_ids.ids)
def _compute_cal_total_membership(self):
"""Count no of membership of the member."""
for partner_rec in self:
partner_rec.membership = \
partner_rec.member_lines and len(
partner_rec.member_lines.ids)
@api.depends('birthdate')
def _compute_calculate_age(self):
"""Age calculation of member."""
for partner_rec in self:
partner_rec.age = \
partner_rec.birthdate and \
date.today().year - partner_rec.birthdate.year
@api.model
def create(self, vals):
"""Create sequence of member."""
rec = super(MemberDetail, self).create(vals)
if vals.get('name'):
vals['reg_no'] = self.env[
'ir.sequence'].next_by_code('res.partner')
if vals.get('is_member'):
if rec.membership_number=='New':
rec.membership_number= self.env[
'ir.sequence'].next_by_code('membership.number')
if not self.env['res.users']._context.get('is_create_user'):
rec.user_id = self.env['res.users'].sudo().create({
'name': rec.name,
'login': rec.email,
'partner_id': rec.id,
'password': rec.company_id.default_password or '',
'groups_id': [(6, 0, [self.env.ref(
'gym.group_gym_member').id])]
}).id
return rec
def open_user(self):
"""
This Method is used to Open User from member record.
@param self: The object pointer
"""
# Created res users in open
return {
'view_type': 'form',
'view_id': self.env.ref('base.view_users_form').id,
'view_mode': 'form',
'res_model': 'res.users',
'res_id': self.user_id.id,
'type': 'ir.actions.act_window'
}
class BodyMeasurement(models.Model):
"""Body Measurement of the Member."""
_name = 'body.measurement'
_description = "Body Measurement"
_rec_name = 'partner_id'
partner_id = fields.Many2one('res.partner', 'Member')
date = fields.Date('Date', required=True)
neck = fields.Float('Neck')
umo_neck_id = fields.Many2one(
'uom.uom', string='Measurement Unit',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
chest = fields.Float('Chest')
umo_chest_id = fields.Many2one(
'uom.uom', string='Measurement Unit for Chest',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
biceps = fields.Float('Biceps')
umo_biceps_id = fields.Many2one(
'uom.uom', string='Measurement Unit Biceps',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
waist = fields.Float('Waist')
umo_waist_id = fields.Many2one(
'uom.uom', string='Measurement Unit Waist',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
hips = fields.Float('Hips')
umo_hips_id = fields.Many2one(
'uom.uom', string='Measurement Unit Hips',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
thigh = fields.Float('Thighs')
umo_thigh_id = fields.Many2one(
'uom.uom', string='Measurement Unit Thigh',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
calf = fields.Float('Calf')
umo_calf_id = fields.Many2one(
'uom.uom', string='Measurement Unit Calf',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
weight = fields.Float('Weight')
umo_weight_id = fields.Many2one(
'uom.uom', string='Measurement Unit Weight',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.product_uom_categ_kgm').id)])
height = fields.Float('Height')
umo_height_id = fields.Many2one(
'uom.uom', string='Measurement Unit Height',
domain=lambda self: [('category_id', '=',
self.env.ref('uom.uom_categ_length').id)])
bmi = fields.Float(
compute='_compute_bmi',
string='BMI',
default=0.0,
help='Used for Body mass index Calculation')
bmr = fields.Float(string='BMR', compute='_compute_bmr',
help='Used for Body Metabolic rate Calculation')
image_128 = fields.Binary(
related='partner_id.image_128',
)
@api.model
def default_get(self, fields):
res = super(BodyMeasurement, self).default_get(fields)
height_uom = self.env.user.company_id and\
self.env.user.company_id.default_umo_of_height_id
weight_uom = self.env.user.company_id and\
self.env.user.company_id.default_umo_of_weight_id
body_pary_uom = self.env.user.company_id and\
self.env.user.company_id.default_umo_of_measure_id
res.update({
'umo_weight_id': weight_uom.id,
'umo_height_id': height_uom.id,
'umo_calf_id': body_pary_uom.id,
'umo_thigh_id': body_pary_uom.id,
'umo_hips_id': body_pary_uom.id,
'umo_waist_id': body_pary_uom.id,
'umo_biceps_id': body_pary_uom.id,
'umo_chest_id': body_pary_uom.id,
'umo_neck_id': body_pary_uom.id,
})
return res
@api.depends('height', 'weight')
def _compute_bmi(self):
"""Calculation of the Body mass index."""
bmi = 0
for rec in self.filtered(
lambda rec: rec.height and rec.weight):
bmi = rec.weight / (rec.height * rec.height)
self.bmi = bmi
@api.depends('height', 'weight', 'partner_id.age')
def _compute_bmr(self):
"""Calculation of the Basal metabolic rate."""
bmr = 0
for measurement_rec in self.filtered(
lambda measurement_rec: measurement_rec.height and
measurement_rec.weight):
bmr = 66.47 + (13.75 * measurement_rec.weight) \
+ (5.0 * measurement_rec.height) \
- (6.75 * measurement_rec.partner_id.age)
self.bmr = bmr
class BodyPart(models.Model):
_name = 'body.part'
_description = "Body Part"
name = fields.Char('Body part')
class PedoMeter(models.Model):
"""Model for pedo meter."""
_name = 'pedo.meter'
_description = "Pedo Meter"
partner_id = fields.Many2one('res.partner', 'Pedometer')
date = fields.Date('Date', required=True)
steps = fields.Integer('Steps', required=True)

207
gym/models/membership.py Normal file
View File

@@ -0,0 +1,207 @@
# See LICENSE file for full copyright and licensing details.
from datetime import date
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class MembershipInvoice(models.TransientModel):
"""Membership Invoice Wizard."""
_inherit = 'membership.invoice'
product_id = fields.Many2one('product.product',
string='Membership', help='Membership plan')
membership_plan_id = fields.Many2one('product.template', 'Membership Plan',
help='Selection of membership plan '
'in membership invoice')
class MembershipPlanMain(models.Model):
"""Inherited Membership line object for membership records."""
_inherit = 'membership.membership_line'
membership_id = fields.Many2one('product.product',
string="Membership Scheme",
required=True)
end_date = fields.Date('End Date', help='End date of the Membership')
states = fields.Selection([('draft', 'Draft'),
('confirm', 'Confirmed'),
('expire', 'Expired'),
('cancel', 'Cancelled')],
string='Status',
default='draft')
plan_sequence = fields.Char('Plan ID',
help='Sequence of the Membership Plan')
sale_order_id = fields.Many2one('sale.order', 'Order',
readonly=True, copy=False,
help='Store the Reference of the sale'
' order')
paid_amount = fields.Float('Paid Amount', store=True,
compute='_compute_get_paid_amount')
@api.depends('sale_order_id.invoice_ids.amount_residual')
def _compute_get_paid_amount(self):
for rec in self:
amount_total = 0
for inv in rec.sale_order_id.invoice_ids.filtered(
lambda inv: inv.state != 'draft'):
amount_total += (inv.amount_total - inv.amount_residual)
rec.paid_amount = amount_total
@api.onchange('membership_id')
def _onchange_membership_id(self):
self.member_price = self.membership_id.list_price
@api.constrains('date', 'end_date', 'partner', 'membership_id')
def _check_time(self):
"""Start and End date validation."""
if self.date and self.end_date and self.date >= self.end_date:
raise ValidationError(_("End date must be greater "
"than the start date."))
membership_ids = self.search([
('partner', '=', self.partner.id),
('membership_id', '=', self.membership_id.id),
'|', '&',
('date', '<=', self.date),
'&', ('end_date', '>=', self.date),
('date', '<', self.end_date),
'&', ('date', '<', self.end_date),
('end_date', '>', self.date),
('id', '!=', self.id)])
if membership_ids:
raise ValidationError(_("You can not create membership, This "
"membership is already created."))
@api.model
def create(self, vals):
"""Sequence of Membership record."""
if vals.get('partner'):
vals['plan_sequence'] = self.env[
'ir.sequence'].next_by_code('membership.membership_line')
return super(MembershipPlanMain, self).create(vals)
def unlink(self):
for mem_rec in self:
if mem_rec.states == 'confirm':
raise ValidationError(
_("Sorry, you can't delete a confirmed membership."))
return super(MembershipPlanMain, self).unlink()
def copy(self, default=None):
for mem_rec in self:
if mem_rec.states == 'confirm':
raise ValidationError(
_("Sorry, you can't duplicate a confirmed membership."))
return super(MembershipPlanMain, self).copy(default)
def action_draft(self):
"""Set the Membership to draft."""
for mem_rec in self:
mem_rec.states = "draft"
def action_cancel(self):
"""Set the Membership to cancelled."""
for mem_rec in self:
mem_rec.states = "cancel"
def action_confirm(self):
"""Set the Membership to confirmed."""
for mem_rec in self:
sale_order_id = self.env['sale.order'].with_context(
is_membership_created=True).create(
{'partner_id': mem_rec.partner.id,
'membership': True,
'start_date': mem_rec.date,
'end_date': mem_rec.end_date,
'order_line': [(0, 0,
{'product_id': mem_rec.membership_id.id,
'price_unit': mem_rec.member_price})]})
sale_order_id.action_confirm()
mem_rec.write({'states': 'confirm',
'sale_order_id': sale_order_id.id})
def action_expire(self):
"""Set the Membership to expired."""
for mem_rec in self:
mem_rec.states = "expire"
@api.model
def check_membership_validity(self):
"""Method for calculating the remaining days of Membership and gives
notification of membership Expiration.
"""
user_rec = self.env.user
curr_day = date.today()
# searching on membership.membership_line
membership_line = self.search(
['|', ('end_date', '<', curr_day), '&',
('end_date', '>=', curr_day),
'&',
('end_date', '<=', curr_day + relativedelta(days=7)),
('states', 'in', ['confirm'])])
# loop on membership.membership_line
for membership_rec in membership_line:
# fetching email of member.
if membership_rec.partner.email:
# template for email
template = self.env.ref('gym.membership_expiration')
end_dt = membership_rec.end_date
remain_days = end_dt - curr_day
due_days = str(max(0, remain_days.days))
# Setting the membership state to expire if days are 0
if remain_days.days <= 0:
membership_rec.action_expire()
# Email content
if template:
body = ''
body += "<p>Hello <b>" + membership_rec.partner.name + \
"</b>,</p></br>"
body += "<p>This email is to inform you that your " \
"membership will be expiring in " \
+ due_days + " days." "</p></br>"
body += "<p>For renewal, please contact the " \
"manager." "</p></br>"
body += "<p>Thank You." "</p></br>"
body += "<p>" + user_rec.company_id.name + "," " </p></br>"
body += "<p>" + user_rec.name + "." " </p></br>"
template.write({'body_html': body})
template.send_mail(membership_rec.partner.id,
force_send=True)
@api.depends('account_invoice_id.state',
'account_invoice_id.amount_residual',
'account_invoice_id.invoice_payment_state')
def _compute_state(self):
"""Compute the state lines """
if not self:
return
if self.account_invoice_id:
self._cr.execute('''
SELECT reversed_entry_id, COUNT(id)
FROM account_move
WHERE reversed_entry_id IN %s
GROUP BY reversed_entry_id
''', [tuple(self.mapped('account_invoice_id.id'))])
reverse_map = dict(self._cr.fetchall())
for line in self:
move_state = line.account_invoice_id.state
payment_state = line.account_invoice_id.invoice_payment_state
line.state = 'none'
if move_state == 'draft':
line.state = 'waiting'
elif move_state == 'posted':
if payment_state == 'paid':
if reverse_map.get(line.account_invoice_id.id):
line.state = 'canceled'
else:
line.state = 'paid'
elif payment_state == 'in_payment':
line.state = 'paid'
elif payment_state == 'not_paid':
line.state = 'invoiced'
elif move_state == 'cancel':
line.state = 'canceled'

View File

@@ -0,0 +1,147 @@
# See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class GymEquipments(models.Model):
"""Inherited product model for creating Equipment."""
_inherit = 'product.template'
is_equipment = fields.Boolean(string='Is Equipment',
default=lambda self: self.env.context.
get('equipments_default', False))
exercise_ids = fields.Many2many('exercise.type',
string='Exercise Type',
help='This Equipment is For which '
'Type of Exercise')
state = fields.Selection([('working', 'Working'),
('maintenance', 'Maintenance'),
('repair', 'Repair'),
('out_of_service', 'Out Of Service')], 'State',
help='States of the Equipment', default='working')
note = fields.Text('Note')
company = fields.Char('Company Name')
purchase_date = fields.Date('Purchase Date')
is_service = fields.Boolean(string='Is Service',
default=lambda self: self.env.context.
get('service_default', False))
is_food = fields.Boolean(string='Is Food?')
unit_id = fields.Many2one('uom.uom', string="Unit of Measure",
help='Measurement Unit for Food item')
quantity = fields.Char('Quantity')
calorie = fields.Float('Calories')
protein = fields.Float('Protein')
carbohydrates = fields.Float('Carbohydrates')
fat = fields.Float(string='Fat')
fibres = fields.Float('Fibres')
sodium = fields.Float('Sodium')
is_membership = fields.Boolean(string='Is Membership ?',
help='Check if the product is eligible '
'for membership.')
def sts_work(self):
for equipment_rec in self:
equipment_rec.state = 'working'
cr, uid, context, su = self.env.args
context = dict(context)
template_id = self.env.ref('gym.equipement_repair_template')
to_mail_id = []
employee_ids = self.env['hr.employee'].search(
[('active', '=', True)])
for employee_id in employee_ids:
if employee_id.user_id and \
employee_id.user_id.partner_id.email:
to_mail_id.append(
employee_id.user_id.email)
to_mail_ids = ','.join(to_mail_id)
body_html = """<![CDATA[<div style="font-family: 'Lucica Grande',
Ubuntu, Arial, Verdana, sans-serif; font-size: 14px;
color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello <b>Trainer</b>,</p>
<p>It is to be informed that <b>${object.name}</b>
is working.<p/>
"""
user_id = self.env['res.users'].browse(uid)
if to_mail_ids:
template_id.write(
{'body_html': body_html,
'subject': 'Equipment is Working.',
'email_from': str(user_id.email),
'email_to': to_mail_ids,
'lang': 'lang' in context and
context.get('lang', 'en_US')})
template_id.send_mail(self.id, force_send=True)
def sts_maintan(self):
for equipment_rec in self:
equipment_rec.state = 'maintenance'
cr, uid, context, su = self.env.args
context = dict(context)
template_id = self.env.ref('gym.equipement_repair_template')
to_mail_id = []
employee_ids = self.env['hr.employee'].search(
[('active', '=', True)])
for employee_id in employee_ids:
if employee_id.user_id and \
employee_id.user_id.partner_id.email:
to_mail_id.append(
employee_id.user_id.email)
to_mail_ids = ','.join(to_mail_id)
body_html = """<![CDATA[<div style="font-family: 'Lucica Grande',
Ubuntu, Arial, Verdana, sans-serif; font-size: 14px;
color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello <b>Trainer</b>,</p>
<p>It is to be informed that <b>${object.name}</b>
is under maintenance.<p/>
"""
user_id = self.env['res.users'].browse(uid)
if to_mail_ids:
template_id.write(
{'body_html': body_html,
'subject': 'Equipment is under maintenance.',
'email_from': str(user_id.email),
'email_to': to_mail_ids,
'lang': 'lang' in context and
context.get('lang', 'en_US')})
template_id.send_mail(self.id, force_send=True)
def sts_rpr(self):
for equipment_rec in self:
equipment_rec.state = 'repair'
cr, uid, context, su = self.env.args
context = dict(context)
template_id = self.env.ref('gym.equipement_repair_template')
to_mail_id = []
employee_ids = self.env['hr.employee'].search(
[('active', '=', True)])
for employee_id in employee_ids:
if employee_id.user_id and \
employee_id.user_id.partner_id.email:
to_mail_id.append(
employee_id.user_id.email)
to_mail_ids = ','.join(to_mail_id)
body_html = """<![CDATA[<div style="font-family: 'Lucica Grande',
Ubuntu, Arial, Verdana, sans-serif; font-size: 14px;
color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello <b>Trainer</b>,</p>
<p>It is to be informed that<b>${object.name}</b>
is under repair.<p/>
"""
user_id = self.env['res.users'].browse(uid)
if to_mail_ids:
template_id.write(
{'body_html': body_html,
'subject': 'Equipment is under repairing.',
'email_from': str(user_id.email),
'email_to': to_mail_ids,
'lang': 'lang' in context and
context.get('lang', 'en_US')})
template_id.send_mail(self.id, force_send=True)
def sts_out(self):
for equipment_rec in self:
equipment_rec.state = 'out_of_service'

View File

@@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import date,datetime
class ProjectDocument(models.Model):
_name = 'project.document'
_description = "Documents"
_rec_name = "document_name_id"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
document_name_id = fields.Many2one(
comodel_name="project.document.name",
string='Document Name',
)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Partner',
)
datas = fields.Binary(
string='Document',
)
datas_fname = fields.Char('Filename')
is_document_set = fields.Boolean(
string='Is Document Set',
compute='_compute_document_set',
store=True,
)
user_id = fields.Many2one(
comodel_name='res.users',
string='Uploaded By',
readonly=True,
)
date = fields.Datetime(
string='Date',
readonly=True,
)
# --------------------------------------------------------------------
# METHODS
# --------------------------------------------------------------------
@api.depends('datas')
def _compute_document_set(self):
for doc in self:
if doc.datas:
doc.is_document_set = True
else:
doc.is_document_set = False
@api.model
def create(self,vals):
if vals.get('datas'):
vals['user_id'] = self.env.user.id
vals['date'] = datetime.now()
res = super(ProjectDocument,self).create(vals)
return res
def write(self, values):
if values.get('datas'):
values['user_id'] = self.env.user.id
values['date'] = datetime.now()
return super(ProjectDocument,self).write(values)

View File

@@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import date,datetime
class ProjectDocumentCase(models.Model):
_name = 'project.document.case'
_description = "Case Related Documents"
_rec_name = "document_name_id"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
document_name_id = fields.Many2one(
comodel_name="project.document.name",
string='Document Name',
)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Partner',
)
datas = fields.Binary(
string='Document',
)
datas_fname = fields.Char('Filename')
is_document_set = fields.Boolean(
string='Is Document Set',
compute='_compute_document_set',
store=True,
)
user_id = fields.Many2one(
comodel_name='res.users',
string='Uploaded By',
readonly=True,
)
date = fields.Datetime(
string='Date',
readonly=True,
)
# --------------------------------------------------------------------
# METHODS
# --------------------------------------------------------------------
@api.depends('datas')
def _compute_document_set(self):
for doc in self:
if doc.datas:
doc.is_document_set = True
else:
doc.is_document_set = False
@api.model
def create(self,vals):
if vals.get('datas'):
vals['user_id'] = self.env.user.id
vals['date'] = datetime.now()
res = super(ProjectDocumentCase,self).create(vals)
return res
def write(self, values):
if values.get('datas'):
values['user_id'] = self.env.user.id
values['date'] = datetime.now()
return super(ProjectDocumentCase,self).write(values)

View File

@@ -0,0 +1,16 @@
from odoo import api, fields, models, _
class ProjectDocumentCategory(models.Model):
_name = 'project.document.category'
_description = "Documents Categories"
_rec_name = "name"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
name = fields.Char(
string='Name',
)

View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
class ProjectDocumentGroup(models.Model):
_name = 'project.document.group'
_description = "Documents Group"
_rec_name = "category_id"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
category_id = fields.Many2one(
comodel_name="project.document.category",
string='Category',
)
document_name_ids = fields.Many2many(
comodel_name="project.document.name",
string='Documents',
)

View File

@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
class ProjectDocumentName(models.Model):
_name = 'project.document.name'
_description = "Documents Name"
_rec_name = "name"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
name = fields.Char(
string='Name',
)

View File

@@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import date,datetime
class ProjectDocumentOpposite(models.Model):
_name = 'project.document.opposite'
_description = "Opposite Party Documents"
_rec_name = "document_name_id"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
document_name_id = fields.Many2one(
comodel_name="project.document.name",
string='Document Name',
)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Partner',
)
datas = fields.Binary(
string='Document',
)
datas_fname = fields.Char('Filename')
is_document_set = fields.Boolean(
string='Is Document Set',
compute='_compute_document_set',
store=True,
)
user_id = fields.Many2one(
comodel_name='res.users',
string='Uploaded By',
readonly=True,
)
date = fields.Datetime(
string='Date',
readonly=True,
)
# --------------------------------------------------------------------
# METHODS
# --------------------------------------------------------------------
@api.depends('datas')
def _compute_document_set(self):
for doc in self:
if doc.datas:
doc.is_document_set = True
else:
doc.is_document_set = False
@api.model
def create(self,vals):
if vals.get('datas'):
vals['user_id'] = self.env.user.id
vals['date'] = datetime.now()
res = super(ProjectDocumentOpposite,self).create(vals)
return res
def write(self, values):
if values.get('datas'):
values['user_id'] = self.env.user.id
values['date'] = datetime.now()
return super(ProjectDocumentOpposite,self).write(values)

View File

@@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import date,datetime
class ProjectDocumentOther(models.Model):
_name = 'project.document.other'
_description = "Other Documents"
_rec_name = "document_name_id"
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
document_name_id = fields.Many2one(
comodel_name="project.document.name",
string='Document Name',
)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Partner',
)
datas = fields.Binary(
string='Document',
)
datas_fname = fields.Char('Filename')
is_document_set = fields.Boolean(
string='Is Document Set',
compute='_compute_document_set',
store=True,
)
user_id = fields.Many2one(
comodel_name='res.users',
string='Uploaded By',
readonly=True,
)
date = fields.Datetime(
string='Date',
readonly=True,
)
# --------------------------------------------------------------------
# METHODS
# --------------------------------------------------------------------
@api.depends('datas')
def _compute_document_set(self):
for doc in self:
if doc.datas:
doc.is_document_set = True
else:
doc.is_document_set = False
@api.model
def create(self,vals):
if vals.get('datas'):
vals['user_id'] = self.env.user.id
vals['date'] = datetime.now()
res = super(ProjectDocumentOther,self).create(vals)
return res
def write(self, values):
if values.get('datas'):
values['user_id'] = self.env.user.id
values['date'] = datetime.now()
return super(ProjectDocumentOther,self).write(values)

View File

@@ -0,0 +1,34 @@
# See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ProjectTask(models.Model):
"""Inherited project task model for giving the task type whether the task
is of workout or Diet."""
_inherit = "project.task"
_order = 'schedule_date asc'
schedule_date = fields.Date('Schedule Date',
help='Start date and Stop date of the Task')
reviewer_id = fields.Many2one('res.users', 'Specialist',
help='Reviewer of the Task')
task_type = fields.Selection([('workout', 'Workout'), ('diet', 'Diet')],
string='Type',
help='Type of the Task [workout]-If task is '
'of Workout Plan [diet]-If task is of '
'Diet Plan')
class ProjectProject(models.Model):
"""Inherited project model for giving the project type whether the task
is of workout or Diet."""
_inherit = 'project.project'
type = fields.Selection([('workout', 'Workout'), ('diet', 'Diet')], 'Type',
default=lambda self: self.env.context.
get('workout_default', False) or False,
help='Type of the Project [workout] '
'-If project is of Workout Plan [diet]-If '
'project is of Diet Plan')

View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import date
from odoo.exceptions import ValidationError
class ResPartnerCreditCard(models.Model):
_name = 'res.partner.credit.card'
_rec_name = 'name'
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
name = fields.Char(
string='Name',
)
type_id = fields.Many2one(
comodel_name='res.partner.credit.card.type',
string='Type',
)
number = fields.Integer(
string='Number',
)
expiry_date = fields.Date(
string='Expiry Date'
)
ccb_number = fields.Char(
string='CCB Number',
)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Partner',
)

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from datetime import date
from odoo.exceptions import ValidationError
class ResPartnerCreditCardType(models.Model):
_name = 'res.partner.credit.card.type'
_rec_name = 'name'
# --------------------------------------------------------------------
# FIELDS
# --------------------------------------------------------------------
name = fields.Char(
string='Name',
)

73
gym/models/sale.py Normal file
View File

@@ -0,0 +1,73 @@
# See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class SaleOrder(models.Model):
"""Imported sale order model."""
_inherit = 'sale.order'
start_date = fields.Date('Start Date')
end_date = fields.Date('End Date')
membership = fields.Boolean(string='Membership',
help='Check if the Customer Wants to Buy '
'membership.')
@api.model
def create(self, values):
rec = super(SaleOrder, self).create(values)
if rec.membership and not rec.partner_id.is_member:
rec.partner_id.is_member = True
rec.partner_id.membership_number = self.env[
'ir.sequence'].next_by_code('membership.number')
return rec
def write(self, values):
for rec in self:
if values.get('partner_id'):
partner_id =\
self.env['res.partner'].browse(values.get('partner_id'))
else:
partner_id = rec.partner_id
if values.get('membership', rec.membership) and not \
partner_id.is_member:
partner_id.is_member = True
return super(SaleOrder, self).write(values)
@api.constrains('order_line', 'membership')
def _check_order_line_membership(self):
"""Membership product constraint."""
if self.membership and len([rec for rec in self.order_line.filtered(
lambda rec:
rec.product_id.product_tmpl_id.is_membership)]) > 1:
raise ValidationError(
_("You can\'t select more than one membership product."))
@api.constrains('start_date', 'end_date')
def _check_date(self):
"""Membership date constraint."""
if self.membership and self.start_date > self.end_date:
raise ValidationError(
_("End date must be greater than start date"))
def action_confirm(self):
"""Create membership line when confirm sale order."""
res = super(SaleOrder, self).action_confirm()
for order in self:
if order.membership and order.state == 'sale' and not \
order._context.get('is_membership_created'):
for line_rec in order.order_line:
if line_rec.product_id.product_tmpl_id.is_membership:
membership_rec = \
self.env['membership.membership_line'].create({
'partner': order.partner_id.id,
'date': order.start_date,
'end_date': order.end_date,
'member_price': line_rec.price_subtotal,
'membership_id': line_rec.product_id.id,
'sale_order_id': order.id,
})
membership_rec.action_confirm()
return res

66
gym/models/trainer.py Normal file
View File

@@ -0,0 +1,66 @@
# See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class HrEmployee(models.Model):
"""Inherited this model for trainer's information."""
_inherit = 'hr.employee'
is_trainer = fields.Boolean(string='Is Trainer ?')
specialist_ids = fields.Many2many('gym.skills', 'trainer_skill_rel',
'trainer_id', 'skill_id',
string='Specialization')
total_session = fields.Integer(
compute='_compute_calculation_trainer_session',
string='Total Session')
user_id = fields.Many2one('res.users', 'User',
related='resource_id.user_id', store=True,
readonly=False, ondelete="cascade")
def unlink(self):
for rec in self:
user_id = rec.user_id
rec.user_id = False
user_id.unlink()
return super(HrEmployee, self).unlink()
def _compute_calculation_trainer_session(self):
"""Trainer session count for session smart
button in trainer form(hr.employee)."""
for trainer_rec in self:
trainer_rec.total_session = \
self.env['calendar.event'].search_count([
('trainer_id', '=', trainer_rec.id)])
@api.constrains('work_email')
def _check_work_email(self):
rec = self.search([('work_email', '=', self.work_email),
('id', '!=', self.id)])
if rec:
raise ValidationError(_("You can not have two users with the "
"same login !"))
@api.model
def create(self, vals):
"""Method for creating User at trainer creation."""
res = super(HrEmployee, self).create(vals)
if not vals.get('user_id'):
user = self.env['res.users'].create({
'name': vals.get('name'),
'login': vals.get('work_email', False),
'password': self.env.user.company_id.default_password or '',
'groups_id': [(6, 0, [self.env.ref(
'gym.group_gym_trainer').id])],
})
if user and user.partner_id:
user.partner_id.write({'email': vals.get('work_email', False)})
res.write({'user_id': user and user.id or False})
return res
def copy(self, default=None):
if self.is_trainer:
raise ValidationError(_("Sorry, you can't duplicate a trainer. "))
return super(HrEmployee, self).copy(default)

78
gym/models/workout.py Normal file
View File

@@ -0,0 +1,78 @@
# See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ExerciseLines(models.Model):
"""Information about body parts and exercise."""
_name = 'exercise.lines'
_description = "Exercise Lines"
exercise_name_id = fields.Many2one('exercise.exercise', 'Exercise name')
sets = fields.Integer('Sets')
reps_ids = fields.Many2many('repeat.repeat', 'exercise_repeat_rel',
string="Repetition")
sequence = fields.Integer('Sequence')
class RepeatRepeat(models.Model):
_name = 'repeat.repeat'
_description = "Repeated"
name = fields.Integer('Reps', required=1)
class ExerciseExercise(models.Model):
"""Information about Exercise and Equipment."""
_name = 'exercise.exercise'
_description = "Exercise Exercise"
name = fields.Char('Name')
exercise_type_ids = fields.Many2many(
'exercise.type', string='Exercise For')
equipment_id = fields.Many2one('product.template', 'Equipment')
exercise_images_ids = fields.Many2many('ir.attachment', string='Images')
exercise_images_ids = fields.One2many(
'ir.attachment',
'exercise_id',
string='Attachment',
)
benefits = fields.Text('Benefits of Exercise')
steps = fields.Text('Steps To Follow')
exercise_video_ids = fields.One2many(
'exercise.videos', 'exercise_id', 'Videos')
class Attachment(models.Model):
_inherit = 'ir.attachment'
_description = 'Ir Attachment'
exercise_id = fields.Many2one(
'exercise.exercise',
string='Exercise',
)
# @api.onchange('datas')
# def _onchange_datas(self):
# self.name = self.datas
class ExerciseType(models.Model):
_name = 'exercise.type'
_description = "Exercise Type"
name = fields.Char('Name', required=1)
class ExerciseVideos(models.Model):
"""Model for Exercise Videos."""
_name = 'exercise.videos'
_description = "Exercise Videos"
name = fields.Char('Name', required=True)
link = fields.Char('Link', required=True)
exercise_id = fields.Many2one('exercise.exercise', 'Exercises')

View File

@@ -0,0 +1,79 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_body_measurement,access.body.measurement,model_body_measurement,base.group_user,1,0,0,0
access_exercise_type,access.exercise.type,model_exercise_type,base.group_user,1,1,1,1
access_exercise_exercise,access.exercise.exercise,model_exercise_exercise,base.group_user,1,1,1,1
access_exercise_lines,access.exercise.lines,model_exercise_lines,base.group_user,1,1,1,1
access_gym_skills,access.gym.skills,model_gym_skills,base.group_user,1,1,1,1
access_food_item,access.food.item,model_food_item,base.group_user,1,1,1,1
access_exercise_videos,access.exercise.videos,model_exercise_videos,base.group_user,1,1,1,1
access_body_part,access.body.part,model_body_part,base.group_user,1,1,1,1
access_diet_plan,access.diet.plan,model_diet_plan,base.group_user,1,1,1,1
access_diet_plan_lines,access.diet.plan.lines,model_diet_plan_lines,base.group_user,1,1,1,1
access_pedo_meter,access.pedo.meter,model_pedo_meter,base.group_user,1,1,1,1
access_body_measurement_trainer,access.body.measurement.trainer,model_body_measurement,gym.group_gym_trainer,1,0,0,0
access_exercise_type_trainer,access.exercise.type.trainer,model_exercise_type,gym.group_gym_trainer,1,1,1,1
access_exercise_exercise_trainer,access.exercise.exercise.trainer,model_exercise_exercise,gym.group_gym_trainer,1,1,1,1
access_exercise_lines_trainer,access.exercise.lines.trainer,model_exercise_lines,gym.group_gym_trainer,1,1,1,1
access_gym_skills_trainer,access.gym.skills.trainer,model_gym_skills,gym.group_gym_trainer,1,1,1,1
access_food_item_trainer,access.food.item.trainer,model_food_item,gym.group_gym_trainer,1,1,1,1
access_exercise_videos_trainer,access.exercise.videos.trainer,model_exercise_videos,gym.group_gym_trainer,1,1,1,1
access_body_part_trainer,access.body.part.trainer,model_body_part,gym.group_gym_trainer,1,1,1,1
access_diet_plan_trainer,access.diet.plan.trainer,model_diet_plan,gym.group_gym_trainer,1,1,1,1
access_diet_plan_lines_trainer,access.diet.plan.lines.trainer,model_diet_plan_lines,gym.group_gym_trainer,1,1,1,1
access_pedo_meter_trainer,access.pedo.meter.trainer,model_pedo_meter,gym.group_gym_trainer,1,0,0,0
access_body_measurement_member,access.body.measurement.member,model_body_measurement,gym.group_gym_member,1,0,0,0
access_exercise_type_member,access.exercise.type.member,model_exercise_type,gym.group_gym_member,1,0,0,0
access_exercise_exercise_member,access.exercise.exercise.member,model_exercise_exercise,gym.group_gym_member,1,0,0,0
access_exercise_lines_member,access.exercise.lines.member,model_exercise_lines,gym.group_gym_member,1,0,0,0
access_gym_skills_member,access.gym.skills.member,model_gym_skills,gym.group_gym_member,1,0,0,0
access_food_item_member,access.food.item.member,model_food_item,gym.group_gym_member,1,0,0,0
access_body_part_member,access.body.part.member,model_body_part,gym.group_gym_member,1,0,0,0
access_diet_plan_member,access.diet.plan.member,model_diet_plan,gym.group_gym_member,1,0,0,0
access_diet_plan_lines_member,access.diet.plan.lines.member,model_diet_plan_lines,gym.group_gym_member,1,0,0,0
access_membership_member_member,access.membership.member.member,model_membership_membership_line,gym.group_gym_member,1,0,0,0
access_exercise_videos_member,access.exercise.videos.member,model_exercise_videos,gym.group_gym_member,1,0,0,0
access_pedo_meter_member,access.pedo.meter.member,model_pedo_meter,gym.group_gym_member,1,1,1,0
access_calendar_event_member,access.calendar.event.member,calendar.model_calendar_event,gym.group_gym_member,1,0,1,0
access_body_measurement_operator,Access.body.measurement.operator,model_body_measurement,gym.group_gym_operator,1,1,1,1
access_exercise_type_operator,access.exercise.type.operator,model_exercise_type,gym.group_gym_operator,1,1,1,1
access_exercise_exercise_operator,access.exercise.exercise.operator,model_exercise_exercise,gym.group_gym_operator,1,1,1,1
access_exercise_lines_operator,access.exercise.lines.operator,model_exercise_lines,gym.group_gym_operator,1,1,1,1
access_gym_skills_operator,access.gym.skills.operator,model_gym_skills,gym.group_gym_operator,1,1,1,1
access_food_item_operator,access.food.item.operator,model_food_item,gym.group_gym_operator,1,1,1,1
access_body_part_operator,access.body.part.operator,model_body_part,gym.group_gym_operator,1,1,1,1
access_diet_plan_operator,access.diet.plan.operator,model_diet_plan,gym.group_gym_operator,1,1,1,1
access_diet_plan_lines_operator,access.diet.plan.lines.operator,model_diet_plan_lines,gym.group_gym_operator,1,1,1,1
access_membership_member_operator,access.membership.member.operator,model_membership_membership_line,gym.group_gym_operator,1,1,1,1
access_exercise_videos_operator,access.exercise.videos.operator,model_exercise_videos,gym.group_gym_operator,1,1,1,1
access_pedo_meter_operator,access.pedo.meter.operator,model_pedo_meter,gym.group_gym_operator,1,1,1,1
access_body_measurement_manager,Access.body.measurement.manager,model_body_measurement,gym.group_gym_manager,1,1,1,1
access_exercise_type_manager,access.exercise.type.manager,model_exercise_type,gym.group_gym_manager,1,1,1,1
access_exercise_exercise_manager,access.exercise.exercise.manager,model_exercise_exercise,gym.group_gym_manager,1,1,1,1
access_exercise_lines_manager,access.exercise.lines.manager,model_exercise_lines,gym.group_gym_manager,1,1,1,1
access_gym_skills_manager,access.gym.skills.manager,model_gym_skills,gym.group_gym_manager,1,1,1,1
access_food_item_manager,access.food.item.manager,model_food_item,gym.group_gym_manager,1,1,1,1
access_body_part_manager,access.body.part.manager,model_body_part,gym.group_gym_manager,1,1,1,1
access_diet_plan_manager,access.diet.planmanager,model_diet_plan,gym.group_gym_manager,1,1,1,1
access_diet_plan_lines_manager,access.diet.plan.lines.manager,model_diet_plan_lines,gym.group_gym_manager,1,1,1,1
access_membership_member_manager,access.membership.member.manager,model_membership_membership_line,gym.group_gym_manager,1,1,1,1
access_exercise_videos_manager,access.exercise.videos.manager,model_exercise_videos,gym.group_gym_manager,1,1,1,1
access_pedo_meter_manager,access.pedo.meter.manager,model_pedo_meter,gym.group_gym_manager,1,1,1,1
access_resource_calendar_operator,access.resource.calendar.operator,resource.model_resource_calendar,gym.group_gym_operator,1,1,1,1
access_resource_calendar_attendance_operator,access.resource.calendar.attendance.operator,resource.model_resource_calendar_attendance,gym.group_gym_operator,1,1,1,1
access_res_users_operator,access.res.users.operator,base.model_res_users,gym.group_gym_operator,1,1,1,1
calendar.access_calendar_event_all_employee,calendar.event_all_employee,calendar.model_calendar_event,base.group_user,1,0,1,0
membership.access_membership_membership_line_partner_manager,membership.membership.line.partner.manager,membership.model_membership_membership_line,base.group_partner_manager,1,0,0,0
project.access_project_task,project.task,project.model_project_task,project.group_project_user,1,1,1,0
access_product_template_operator,access.product.template operator,product.model_product_template,gym.group_gym_operator,1,1,1,0
access_product_product_operator,access.product.product.operator,product.model_product_product,gym.group_gym_operator,1,1,1,0
access_repeat_repeat,access.repeat.repeat,model_repeat_repeat,base.group_user,1,1,1,1
access_hr_emp_group_gym_trainer,access.group_gym_trainer,model_hr_employee,gym.group_gym_trainer,1,1,0,0
access_project_document,access_project_document,model_project_document,base.group_user,1,1,1,1
access_project_document_case,access_project_document_case,model_project_document_case,base.group_user,1,1,1,1
access_project_document_category,access_project_document_category,model_project_document_category,base.group_user,1,1,1,1
access_project_document_group,access_project_document_group,model_project_document_group,base.group_user,1,1,1,1
access_project_document_name,access_project_document_name,model_project_document_name,base.group_user,1,1,1,1
access_project_document_opposite,access_project_document_opposite,model_project_document_opposite,base.group_user,1,1,1,1
access_project_document_other,access_project_document_other,model_project_document_other,base.group_user,1,1,1,1
access_res_partner_credit_card,access_res_partner_credit_card,model_res_partner_credit_card,base.group_user,1,1,1,1
access_res_partner_credit_card_type,access_res_partner_credit_card_type,model_res_partner_credit_card_type,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 access_body_measurement access.body.measurement model_body_measurement base.group_user 1 0 0 0
3 access_exercise_type access.exercise.type model_exercise_type base.group_user 1 1 1 1
4 access_exercise_exercise access.exercise.exercise model_exercise_exercise base.group_user 1 1 1 1
5 access_exercise_lines access.exercise.lines model_exercise_lines base.group_user 1 1 1 1
6 access_gym_skills access.gym.skills model_gym_skills base.group_user 1 1 1 1
7 access_food_item access.food.item model_food_item base.group_user 1 1 1 1
8 access_exercise_videos access.exercise.videos model_exercise_videos base.group_user 1 1 1 1
9 access_body_part access.body.part model_body_part base.group_user 1 1 1 1
10 access_diet_plan access.diet.plan model_diet_plan base.group_user 1 1 1 1
11 access_diet_plan_lines access.diet.plan.lines model_diet_plan_lines base.group_user 1 1 1 1
12 access_pedo_meter access.pedo.meter model_pedo_meter base.group_user 1 1 1 1
13 access_body_measurement_trainer access.body.measurement.trainer model_body_measurement gym.group_gym_trainer 1 0 0 0
14 access_exercise_type_trainer access.exercise.type.trainer model_exercise_type gym.group_gym_trainer 1 1 1 1
15 access_exercise_exercise_trainer access.exercise.exercise.trainer model_exercise_exercise gym.group_gym_trainer 1 1 1 1
16 access_exercise_lines_trainer access.exercise.lines.trainer model_exercise_lines gym.group_gym_trainer 1 1 1 1
17 access_gym_skills_trainer access.gym.skills.trainer model_gym_skills gym.group_gym_trainer 1 1 1 1
18 access_food_item_trainer access.food.item.trainer model_food_item gym.group_gym_trainer 1 1 1 1
19 access_exercise_videos_trainer access.exercise.videos.trainer model_exercise_videos gym.group_gym_trainer 1 1 1 1
20 access_body_part_trainer access.body.part.trainer model_body_part gym.group_gym_trainer 1 1 1 1
21 access_diet_plan_trainer access.diet.plan.trainer model_diet_plan gym.group_gym_trainer 1 1 1 1
22 access_diet_plan_lines_trainer access.diet.plan.lines.trainer model_diet_plan_lines gym.group_gym_trainer 1 1 1 1
23 access_pedo_meter_trainer access.pedo.meter.trainer model_pedo_meter gym.group_gym_trainer 1 0 0 0
24 access_body_measurement_member access.body.measurement.member model_body_measurement gym.group_gym_member 1 0 0 0
25 access_exercise_type_member access.exercise.type.member model_exercise_type gym.group_gym_member 1 0 0 0
26 access_exercise_exercise_member access.exercise.exercise.member model_exercise_exercise gym.group_gym_member 1 0 0 0
27 access_exercise_lines_member access.exercise.lines.member model_exercise_lines gym.group_gym_member 1 0 0 0
28 access_gym_skills_member access.gym.skills.member model_gym_skills gym.group_gym_member 1 0 0 0
29 access_food_item_member access.food.item.member model_food_item gym.group_gym_member 1 0 0 0
30 access_body_part_member access.body.part.member model_body_part gym.group_gym_member 1 0 0 0
31 access_diet_plan_member access.diet.plan.member model_diet_plan gym.group_gym_member 1 0 0 0
32 access_diet_plan_lines_member access.diet.plan.lines.member model_diet_plan_lines gym.group_gym_member 1 0 0 0
33 access_membership_member_member access.membership.member.member model_membership_membership_line gym.group_gym_member 1 0 0 0
34 access_exercise_videos_member access.exercise.videos.member model_exercise_videos gym.group_gym_member 1 0 0 0
35 access_pedo_meter_member access.pedo.meter.member model_pedo_meter gym.group_gym_member 1 1 1 0
36 access_calendar_event_member access.calendar.event.member calendar.model_calendar_event gym.group_gym_member 1 0 1 0
37 access_body_measurement_operator Access.body.measurement.operator model_body_measurement gym.group_gym_operator 1 1 1 1
38 access_exercise_type_operator access.exercise.type.operator model_exercise_type gym.group_gym_operator 1 1 1 1
39 access_exercise_exercise_operator access.exercise.exercise.operator model_exercise_exercise gym.group_gym_operator 1 1 1 1
40 access_exercise_lines_operator access.exercise.lines.operator model_exercise_lines gym.group_gym_operator 1 1 1 1
41 access_gym_skills_operator access.gym.skills.operator model_gym_skills gym.group_gym_operator 1 1 1 1
42 access_food_item_operator access.food.item.operator model_food_item gym.group_gym_operator 1 1 1 1
43 access_body_part_operator access.body.part.operator model_body_part gym.group_gym_operator 1 1 1 1
44 access_diet_plan_operator access.diet.plan.operator model_diet_plan gym.group_gym_operator 1 1 1 1
45 access_diet_plan_lines_operator access.diet.plan.lines.operator model_diet_plan_lines gym.group_gym_operator 1 1 1 1
46 access_membership_member_operator access.membership.member.operator model_membership_membership_line gym.group_gym_operator 1 1 1 1
47 access_exercise_videos_operator access.exercise.videos.operator model_exercise_videos gym.group_gym_operator 1 1 1 1
48 access_pedo_meter_operator access.pedo.meter.operator model_pedo_meter gym.group_gym_operator 1 1 1 1
49 access_body_measurement_manager Access.body.measurement.manager model_body_measurement gym.group_gym_manager 1 1 1 1
50 access_exercise_type_manager access.exercise.type.manager model_exercise_type gym.group_gym_manager 1 1 1 1
51 access_exercise_exercise_manager access.exercise.exercise.manager model_exercise_exercise gym.group_gym_manager 1 1 1 1
52 access_exercise_lines_manager access.exercise.lines.manager model_exercise_lines gym.group_gym_manager 1 1 1 1
53 access_gym_skills_manager access.gym.skills.manager model_gym_skills gym.group_gym_manager 1 1 1 1
54 access_food_item_manager access.food.item.manager model_food_item gym.group_gym_manager 1 1 1 1
55 access_body_part_manager access.body.part.manager model_body_part gym.group_gym_manager 1 1 1 1
56 access_diet_plan_manager access.diet.planmanager model_diet_plan gym.group_gym_manager 1 1 1 1
57 access_diet_plan_lines_manager access.diet.plan.lines.manager model_diet_plan_lines gym.group_gym_manager 1 1 1 1
58 access_membership_member_manager access.membership.member.manager model_membership_membership_line gym.group_gym_manager 1 1 1 1
59 access_exercise_videos_manager access.exercise.videos.manager model_exercise_videos gym.group_gym_manager 1 1 1 1
60 access_pedo_meter_manager access.pedo.meter.manager model_pedo_meter gym.group_gym_manager 1 1 1 1
61 access_resource_calendar_operator access.resource.calendar.operator resource.model_resource_calendar gym.group_gym_operator 1 1 1 1
62 access_resource_calendar_attendance_operator access.resource.calendar.attendance.operator resource.model_resource_calendar_attendance gym.group_gym_operator 1 1 1 1
63 access_res_users_operator access.res.users.operator base.model_res_users gym.group_gym_operator 1 1 1 1
64 calendar.access_calendar_event_all_employee calendar.event_all_employee calendar.model_calendar_event base.group_user 1 0 1 0
65 membership.access_membership_membership_line_partner_manager membership.membership.line.partner.manager membership.model_membership_membership_line base.group_partner_manager 1 0 0 0
66 project.access_project_task project.task project.model_project_task project.group_project_user 1 1 1 0
67 access_product_template_operator access.product.template operator product.model_product_template gym.group_gym_operator 1 1 1 0
68 access_product_product_operator access.product.product.operator product.model_product_product gym.group_gym_operator 1 1 1 0
69 access_repeat_repeat access.repeat.repeat model_repeat_repeat base.group_user 1 1 1 1
70 access_hr_emp_group_gym_trainer access.group_gym_trainer model_hr_employee gym.group_gym_trainer 1 1 0 0
71 access_project_document access_project_document model_project_document base.group_user 1 1 1 1
72 access_project_document_case access_project_document_case model_project_document_case base.group_user 1 1 1 1
73 access_project_document_category access_project_document_category model_project_document_category base.group_user 1 1 1 1
74 access_project_document_group access_project_document_group model_project_document_group base.group_user 1 1 1 1
75 access_project_document_name access_project_document_name model_project_document_name base.group_user 1 1 1 1
76 access_project_document_opposite access_project_document_opposite model_project_document_opposite base.group_user 1 1 1 1
77 access_project_document_other access_project_document_other model_project_document_other base.group_user 1 1 1 1
78 access_res_partner_credit_card access_res_partner_credit_card model_res_partner_credit_card base.group_user 1 1 1 1
79 access_res_partner_credit_card_type access_res_partner_credit_card_type model_res_partner_credit_card_type base.group_user 1 1 1 1

130
gym/security/security.xml Normal file
View File

@@ -0,0 +1,130 @@
<odoo>
<!-- Menu Visible Group-->
<record id="group_menu_visible" model="res.groups">
<field name="name">Menu Visible</field>
</record>
<!-- Member Group-->
<record id="group_gym_member" model="res.groups">
<field name="name">Member</field>
</record>
<!-- Trainer Group-->
<record id="group_gym_trainer" model="res.groups">
<field name="name">Trainer</field>
<field name="implied_ids" eval="[
(4, ref('project.group_project_user')),
(4, ref('base.group_user'))]"/>
</record>
<!-- Operator Group-->
<record id="group_gym_operator" model="res.groups">
<field name="name">Operator</field>
<field name="implied_ids" eval="[
(4, ref('hr.group_hr_user')),
(4, ref('account.group_account_user')),
(4, ref('sales_team.group_sale_salesman_all_leads')),
(4, ref('project.group_project_manager'))]"/>
</record>
<!-- Manager Group-->
<record id="group_gym_manager" model="res.groups">
<field name="name">Gym Manager</field>
<field name="implied_ids" eval="[
(4, ref('hr.group_hr_manager')),
(4, ref('sales_team.group_sale_manager')),
(4, ref('account.group_account_manager')),
(4, ref('base.group_system')),
(4, ref('group_gym_operator')),
(4, ref('project.group_project_manager'))]"/>
<field name="users" eval="[(4, ref('base.user_admin'))]"/>
</record>
<!-- Rule for Member viewing his Tasks-->
<record id="rule_project_task_member" model="ir.rule">
<field name="name">Rule for Member viewing his Tasks</field>
<field name="model_id" ref="project.model_project_task"/>
<field name="groups" eval="[(4, ref('gym.group_gym_member')),(4, ref('project.group_project_user'))]"/>
<field name="domain_force">[('user_id','=',user.id)]</field>
</record>
<!-- Rule for Member viewing his Projects-->
<record id="rule_project_project_member" model="ir.rule">
<field name="name">Rule for Member viewing his Projects</field>
<field name="model_id" ref="project.model_project_project"/>
<field name="groups" eval="[(4, ref('gym.group_gym_member'))]"/>
<field name="domain_force">[('partner_id','=',user.partner_id.id)]</field>
</record>
<!--Disable the rule for Visible by all employees and set to Visible by following customers
-->
<record id="project.project_public_members_rule" model="ir.rule">
<field name='active' eval='False'/>
</record>
<!-- Rule for Member viewing his Partner Record-->
<record id="rule_res_partner_member" model="ir.rule">
<field name="name">Rule for Member viewing his Record</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="groups" eval="[(4, ref('gym.group_gym_member'))]"/>
<field name="domain_force">[('id','=',user.partner_id.id)]</field>
</record>
<!-- Rule for Manager viewing all Partner Record-->
<record id="rule_res_partner_manager" model="ir.rule">
<field name="name">Rule for Manager viewing all Record</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="groups" eval="[(4, ref('gym.group_gym_operator')),(4, ref('gym.group_gym_manager'))]"/>
<field name="domain_force">[(1,'=',1)]</field>
</record>
<!-- Rule for Member viewing his User Record-->
<record id="rule_res_users_member" model="ir.rule">
<field name="name">Rule for Member viewing his User Record</field>
<field name="model_id" ref="base.model_res_users"/>
<field name="groups" eval="[(4, ref('gym.group_gym_member'))]"/>
<field name="domain_force">[('id','=',user.id)]</field>
</record>
<!-- Rule for Member viewing his Membership-->
<record id="rule_membership_member" model="ir.rule">
<field name="name">Rule for Member viewing his Membership</field>
<field name="model_id" ref="membership.model_membership_membership_line"/>
<field name="groups" eval="[(4, ref('gym.group_gym_member'))]"/>
<field name="domain_force">[('partner','=',user.partner_id.id)]</field>
</record>
<!-- Rule for Trainer viewing his record only-->
<record id="rule_hr_employee_trainer" model="ir.rule">
<field name="name">Rule for Trainer viewing his Record</field>
<field name="model_id" ref="hr.model_hr_employee"/>
<field name="groups" eval="[(4, ref('gym.group_gym_trainer'))]"/>
<field name="domain_force">[('user_id','=',user.id)]</field>
</record>
<!-- Rule for Trainer viewing his Bookings only-->
<record id="rule_trainer_booking" model="ir.rule">
<field name="name">Rule for Trainer viewing his Bookings</field>
<field name="model_id" ref="calendar.model_calendar_event"/>
<field name="groups" eval="[(4, ref('gym.group_gym_trainer'))]"/>
<field name="domain_force">[('trainer_id.user_id','=',user.id)]</field>
</record>
<record id="calendar.calendar_event_rule_employee" model="ir.rule">
<field ref="calendar.model_calendar_event" name="model_id"/>
<field name="name">All Calendar Event for employees</field>
<field name="domain_force">[(1,'=',1)]</field>
<field eval="[(4,ref('base.group_user'))]" name="groups"/>
<field name='active' eval='False'/>
</record>
<!-- Rule for Member viewing his Measurement history-->
<record id="rule_measurement_history" model="ir.rule">
<field name="name">Rule for viewing his Measurement history</field>
<field name="model_id" ref="gym.model_body_measurement"/>
<field name="groups" eval="[(4, ref('gym.group_gym_member'))]"/>
<field name="domain_force">[('partner_id','=',user.partner_id.id)]</field>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Some files were not shown because too many files have changed in this diff Show More