add gym module
166
gym/LICENSE/LICENSE
Normal 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
@@ -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
@@ -0,0 +1,3 @@
|
||||
# See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import models
|
||||
57
gym/__manifest__.py
Normal 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',
|
||||
}
|
||||
BIN
gym/__pycache__/__init__.cpython-36.pyc
Normal file
BIN
gym/__pycache__/__init__.cpython-37.pyc
Normal file
18
gym/data/email_template.xml
Normal 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>
|
||||
75
gym/data/equipment_demo.xml
Normal 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
@@ -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>
|
||||
75
gym/data/exercise_for_demo.xml
Normal 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>
|
||||
4
gym/data/inactive_rule_data.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<odoo noupdate="1">
|
||||
<function name="inactive_rule" model="calendar.event"/>
|
||||
<function name="inactive_rule" model="res.partner"/>
|
||||
</odoo>
|
||||
11
gym/data/mail_templates.xml
Normal 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>
|
||||
12
gym/data/member_sequence.xml
Normal 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>
|
||||
20
gym/data/membership_plan_sequence.xml
Normal 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>
|
||||
16
gym/data/membership_scheduler.xml
Normal 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
@@ -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>
|
||||
43
gym/demo/exercise_exercise_demo.xml
Normal 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
@@ -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>
|
||||
17
gym/demo/membership_demo.xml
Normal 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>
|
||||
73
gym/demo/pedo_meter_demo.xml
Normal 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
@@ -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
@@ -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
|
||||
BIN
gym/models/__pycache__/__init__.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/account_analytic_account.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/account_analytic_account.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/calendar_event.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/calendar_event.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/company.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/company.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/diet.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/diet.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/gym_skills.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/gym_skills.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/lead.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/lead.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/member.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/member.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/membership.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/membership.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/product_template.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/product_template.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_document.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_document.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_document_case.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_document_case.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_document_category.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_document_category.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_document_group.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_document_group.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_document_name.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_document_name.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_document_opposite.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_document_opposite.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_other.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_other.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/project_task.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/project_task.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/res_partner_credit_card.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/res_partner_credit_card.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/sale.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/sale.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/trainer.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/trainer.cpython-37.pyc
Normal file
BIN
gym/models/__pycache__/workout.cpython-36.pyc
Normal file
BIN
gym/models/__pycache__/workout.cpython-37.pyc
Normal file
23
gym/models/account_analytic_account.py
Normal 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
|
||||
15
gym/models/calendar_event.py
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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'
|
||||
147
gym/models/product_template.py
Normal 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'
|
||||
73
gym/models/project_document.py
Normal 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)
|
||||
72
gym/models/project_document_case.py
Normal 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)
|
||||
16
gym/models/project_document_category.py
Normal 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',
|
||||
)
|
||||
23
gym/models/project_document_group.py
Normal 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',
|
||||
)
|
||||
17
gym/models/project_document_name.py
Normal 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',
|
||||
)
|
||||
72
gym/models/project_document_opposite.py
Normal 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)
|
||||
73
gym/models/project_other.py
Normal 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)
|
||||
34
gym/models/project_task.py
Normal 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')
|
||||
40
gym/models/res_partner_credit_card.py
Normal 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',
|
||||
)
|
||||
18
gym/models/res_partner_credit_card_type.py
Normal 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
@@ -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
@@ -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
@@ -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')
|
||||
79
gym/security/ir.model.access.csv
Normal 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
|
||||
|
130
gym/security/security.xml
Normal 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>
|
||||
BIN
gym/static/description/fb.jpg
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
gym/static/description/gym.jpg
Normal file
|
After Width: | Height: | Size: 3.4 MiB |
BIN
gym/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
gym/static/description/icon2.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
gym/static/description/icon3.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
gym/static/description/img/emp-1.jpg
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
gym/static/description/img/emp-2.jpeg
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
gym/static/description/img/emp-3.jpeg
Normal file
|
After Width: | Height: | Size: 2.3 KiB |