Added Add Player functionality to portal access for therapists and coaches.
This commit is contained in:
parent
c60ffd5bfa
commit
1f91c27a44
4 changed files with 134 additions and 16 deletions
|
|
@ -21,22 +21,50 @@
|
||||||
'version': '18.0.1.6.2',
|
'version': '18.0.1.6.2',
|
||||||
'summary': 'Manage the patients of a sports medicine clinic.',
|
'summary': 'Manage the patients of a sports medicine clinic.',
|
||||||
'description': """
|
'description': """
|
||||||
Adds the notion of sports teams, players (patients), coaches and treatment
|
Sports Clinic Management System
|
||||||
professionals. The core purpose of this module is to keep track of the treatment
|
=============================
|
||||||
history of players and to make it appropriately accessible to the various
|
|
||||||
involved parties (medical practitioners, clinic staff, team staff, and patients).
|
|
||||||
|
|
||||||
Internal users get access to patient data as appropriate, i.e.
|
A comprehensive solution for managing sports medicine clinics, focusing on player health,
|
||||||
treatment professionals get full access to their own patients' data, clinic
|
injury tracking, and team collaboration.
|
||||||
staff users get access to basic patient data needed for contacting patients, etc.
|
|
||||||
|
|
||||||
External users (portal users) can be added to give coaches and other team
|
Key Features:
|
||||||
personnel access to limited player data such as estimated return-to-play dates.
|
------------
|
||||||
Medical professionals (primarily field therapists) can also access the system
|
|
||||||
via the portal interface instead of requiring full internal user accounts, allowing
|
1. User Roles and Access:
|
||||||
for more flexible collaboration while maintaining appropriate access controls.
|
- Internal clinic staff with full patient record access
|
||||||
Coaches and treatment professionals can signal player injuries directly through the
|
- Treatment professionals with medical record access
|
||||||
portal interface, streamlining communication and injury tracking.
|
- Portal access for field therapists and team coaches
|
||||||
|
|
||||||
|
2. Player Management:
|
||||||
|
- Track player details and contact information
|
||||||
|
- Monitor team memberships and playing status
|
||||||
|
- Record and track injuries and treatment history
|
||||||
|
- Track match and practice availability
|
||||||
|
|
||||||
|
3. Injury Tracking:
|
||||||
|
- Comprehensive injury recording and documentation
|
||||||
|
- Treatment professional assignment
|
||||||
|
- Progress tracking and resolution monitoring
|
||||||
|
- Internal and external notes for different audiences
|
||||||
|
|
||||||
|
4. Team Management:
|
||||||
|
- Organize players into teams
|
||||||
|
- Assign coaching and medical staff
|
||||||
|
- Team-specific player status tracking
|
||||||
|
|
||||||
|
5. Portal Access:
|
||||||
|
- Coaches can view their teams and player status
|
||||||
|
- Field therapists can access and update medical records
|
||||||
|
- Injury reporting directly through the portal
|
||||||
|
|
||||||
|
6. Security and Privacy:
|
||||||
|
- Granular permission system
|
||||||
|
- Field-level security for sensitive information
|
||||||
|
- Audit trails for all changes
|
||||||
|
|
||||||
|
This module is designed to facilitate communication between medical professionals,
|
||||||
|
coaching staff, and administrative personnel while maintaining appropriate access
|
||||||
|
controls and data privacy.
|
||||||
""",
|
""",
|
||||||
"category": "Services/Medical",
|
"category": "Services/Medical",
|
||||||
"author": "Bemade Inc.",
|
"author": "Bemade Inc.",
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
from . import team_staff_portal
|
from . import team_staff_portal
|
||||||
from . import patient_injury_portal
|
from . import patient_injury_portal
|
||||||
|
from . import team_management_portal
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,11 @@ class Patient(models.Model):
|
||||||
_inherit = ["mail.thread", "mail.activity.mixin"]
|
_inherit = ["mail.thread", "mail.activity.mixin"]
|
||||||
_order = "last_name, first_name"
|
_order = "last_name, first_name"
|
||||||
|
|
||||||
|
active = fields.Boolean(
|
||||||
|
string='Active',
|
||||||
|
default=True,
|
||||||
|
help="If unchecked, it means this patient has been archived and won't appear in searches by default.")
|
||||||
|
|
||||||
# res.partner fields
|
# res.partner fields
|
||||||
partner_id = fields.Many2one(
|
partner_id = fields.Many2one(
|
||||||
comodel_name="res.partner",
|
comodel_name="res.partner",
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,12 @@
|
||||||
</template>
|
</template>
|
||||||
<template id="portal_my_team_players">
|
<template id="portal_my_team_players">
|
||||||
<t t-call="portal.portal_layout">
|
<t t-call="portal.portal_layout">
|
||||||
<h1><span t-field="team.name"/> Players</h1>
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||||
|
<h1 class="mb-0"><span t-field="team.name"/> Players</h1>
|
||||||
|
<a t-attf-href="/my/team/{{ team.id }}/add_player" class="btn btn-primary">
|
||||||
|
<i class="fa fa-plus me-1"/> Add Player
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
<t t-call="portal.portal_table">
|
<t t-call="portal.portal_table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
@ -58,6 +63,7 @@
|
||||||
<th>Practice Status</th>
|
<th>Practice Status</th>
|
||||||
<th>Estimated Return Date</th>
|
<th>Estimated Return Date</th>
|
||||||
<th>Last Consultation Date</th>
|
<th>Last Consultation Date</th>
|
||||||
|
<th>Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
@ -91,6 +97,12 @@
|
||||||
<span t-field="player.last_consultation_date"
|
<span t-field="player.last_consultation_date"
|
||||||
t-options="{'widget': 'date'}"/>
|
t-options="{'widget': 'date'}"/>
|
||||||
</td>
|
</td>
|
||||||
|
<td class="text-center">
|
||||||
|
<a t-attf-href="/my/patient/injury/new?patient_id={{ player.id }}&team_id={{ team.id }}"
|
||||||
|
class="btn btn-primary btn-sm">
|
||||||
|
<i class="fa fa-plus"/> Report Injury
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</t>
|
</t>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
@ -216,5 +228,77 @@
|
||||||
</t>
|
</t>
|
||||||
</xpath>
|
</xpath>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- Add Player Form -->
|
||||||
|
<template id="portal_add_player">
|
||||||
|
<t t-call="portal.portal_layout">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 offset-md-2">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Add New Player to <span t-field="team.name"/></h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<!-- Success/Error Messages -->
|
||||||
|
<t t-if="error" class="alert alert-danger" role="alert">
|
||||||
|
<i class="fa fa-exclamation-triangle me-2"/>
|
||||||
|
<span t-esc="error"/>
|
||||||
|
</t>
|
||||||
|
<t t-if="success" class="alert alert-success" role="alert">
|
||||||
|
<i class="fa fa-check-circle me-2"/>
|
||||||
|
<span t-esc="success"/>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<form t-attf-action="/my/team/{{ team.id }}/add_player/submit" method="post" class="mt-3">
|
||||||
|
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
|
||||||
|
<input type="hidden" name="team_id" t-att-value="team.id"/>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="first_name" class="form-label">First Name *</label>
|
||||||
|
<input type="text" class="form-control" id="first_name" name="first_name"
|
||||||
|
t-att-value="first_name or ''" required="required"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="last_name" class="form-label">Last Name *</label>
|
||||||
|
<input type="text" class="form-control" id="last_name" name="last_name"
|
||||||
|
t-att-value="last_name or ''" required="required"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="email" class="form-label">Email</label>
|
||||||
|
<input type="email" class="form-control" id="email" name="email"
|
||||||
|
t-att-value="email or ''"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="phone" class="form-label">Phone</label>
|
||||||
|
<input type="tel" class="form-control" id="phone" name="phone"
|
||||||
|
t-att-value="phone or ''"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="date_of_birth" class="form-label">Date of Birth</label>
|
||||||
|
<input type="date" class="form-control" id="date_of_birth" name="date_of_birth"
|
||||||
|
t-att-value="date_of_birth or ''"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<a t-attf-href="/my/team?team_id={{ team.id }}" class="btn btn-secondary">
|
||||||
|
<i class="fa fa-times me-1"/> Cancel
|
||||||
|
</a>
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fa fa-save me-1"/> Save Player
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
Loading…
Reference in a new issue