bemade_sports_clinic: add consent field, translations and general cleanup

This commit is contained in:
Marc Durepos 2024-02-20 20:06:35 -05:00
parent 12f19c5fbc
commit 0a2ec5fd8d
8 changed files with 401 additions and 258 deletions

View file

@ -18,7 +18,7 @@
#
{
'name': 'Sports Clinic Management',
'version': '16.0.1.5.5',
'version': '16.0.1.5.6',
'summary': 'Manage the patients of a sports medicine clinic.',
'description': """
Adds the notion of sports teams, players (patients), coaches and treatment
@ -45,6 +45,7 @@
'data/sports_clinic_data.xml',
'views/sports_team_views.xml',
'views/sports_clinic_menus.xml',
'views/sports_patient_injury_views.xml',
'views/sports_patient_views.xml',
'views/sports_clinic_portal_views.xml',
'views/res_partner_views.xml',

View file

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-07 20:03+0000\n"
"PO-Revision-Date: 2023-11-07 20:03+0000\n"
"POT-Creation-Date: 2024-02-21 00:52+0000\n"
"PO-Revision-Date: 2024-02-21 00:52+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -25,11 +25,6 @@ msgstr ""
msgid "/my/teams"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient_injury
msgid "A patient's injury."
msgstr "La blessure d'un patient."
#. module: bemade_sports_clinic
#. odoo-python
#: code:addons/bemade_sports_clinic/models/sports_team.py:0
@ -105,6 +100,11 @@ msgstr "Administrateur"
msgid "Age"
msgstr "Âge"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__allergies
msgid "Allergies"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_attachment_count
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__message_attachment_count
@ -112,14 +112,9 @@ msgid "Attachment Count"
msgstr "Nombre de pièces jointes"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__practice_ok
msgid "Cleared for Practice"
msgstr "Pratiques autorisées"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__healthy
msgid "Cleared to Play"
msgstr "Matchs autorisés"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__city
msgid "City"
msgstr "Ville"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__coach
@ -128,8 +123,9 @@ msgstr "Entraîneur"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_res_partner
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__partner_id
msgid "Contact"
msgstr "Contact"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__contact_type
@ -139,7 +135,12 @@ msgstr "Type de contact"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Contacts"
msgstr "Contacts"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__country_id
msgid "Country"
msgstr "Pays"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__create_uid
@ -159,15 +160,20 @@ msgstr "Créé par"
msgid "Created on"
msgstr "Créé le"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_kanban
msgid "DOB:"
msgstr "DDN :"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__date_of_birth
msgid "Date Of Birth"
msgstr "Date de naissance"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__injury_date_time
msgid "Date and Time of Injury"
msgstr "Date et heure de la blessure"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__injury_date
msgid "Date of Injury"
msgstr "Date de la blessure"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_injury_view_tree
@ -189,6 +195,11 @@ msgstr "Diagnostique"
msgid "Display Name"
msgstr "Nom pour affichage"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__doctor
msgid "Doctor"
msgstr "Docteur"
#. module: bemade_sports_clinic
#: model:ir.model.constraint,message:bemade_sports_clinic.constraint_sports_team_staff_team_staff_unique
msgid "Each partner can only be related to a given team once."
@ -301,7 +312,7 @@ msgstr "En santé :"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team__id
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__id
msgid "ID"
msgstr "ID"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__activity_exception_icon
@ -329,6 +340,13 @@ msgstr "Si coché, des nouveaux messages nécessitent votre attention."
msgid "If checked, some messages have a delivery error."
msgstr "Si coché, certains messages ont une erreur de livraison."
#. module: bemade_sports_clinic
#. odoo-python
#: code:addons/bemade_sports_clinic/models/patient_injury.py:0
#, python-format
msgid "If injury date is not set, the N/A box must be checked."
msgstr "Sa la date de la blessure n'est pas remplie, la case S/O doit être cochée."
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__no_play
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_teams
@ -463,7 +481,14 @@ msgstr "Erreur de livraison du message"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__message_ids
msgid "Messages"
msgstr "Messages"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__mobile
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__mobile
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__mobile
msgid "Mobile"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_contact__contact_type__mother
@ -476,6 +501,12 @@ msgstr "Mère"
msgid "My Activity Deadline"
msgstr "Date limite de mon activité"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__injury_date_na
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_injury__parental_consent__na
msgid "N/A"
msgstr "S/O"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__name
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__name
@ -508,13 +539,15 @@ msgstr "Type de la prochaine activité"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__match_status__no
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__practice_status__no
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_injury__parental_consent__no
msgid "No"
msgstr "Non"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__team_info_notes
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_player_injuries
msgid "Notes"
msgstr "Notes"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_needaction_counter
@ -557,6 +590,11 @@ msgstr "Organisation"
msgid "Other"
msgstr "Autre"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Other Contacts"
msgstr "Autres contacts"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_partner__owned_team_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_users__owned_team_ids
@ -571,55 +609,96 @@ msgid "Parent Organization"
msgstr "Organisation parente"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__parental_consent
msgid "Consent for Disclosure to Parent"
msgstr "Consentement pour divulgation au parent"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_partner__patient_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_users__patient_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__patient_id
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__patient_id
msgid "Patient"
msgstr "Patient(e)"
msgstr "Patient dans une clinique de médecine sportive."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Address"
msgstr "Adresse du patient"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__contact_ids
msgid "Patient Contacts"
msgstr "Contacts du patient"
#. module: bemade_sports_clinic
#: model:mail.message.subtype,name:bemade_sports_clinic.subtype_patient_update
msgid "Patient File Update"
msgstr "Mise à jour du dossier du patient"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Information"
msgstr "Information du patient"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient_injury
msgid "Patient Injury"
msgstr "La blessure d'un patient."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_injury_view_tree
msgid "Patient Injury History"
msgstr "Historique des blessures du patient"
#. module: bemade_sports_clinic
#: model:mail.message.subtype,name:bemade_sports_clinic.subtype_patient_injury_update
msgid "Patient Injury Status Update"
msgstr "Mise à jour du statut de la blessure d'un patient"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Phone & Email"
msgstr "Téléphone et courriel du patient"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Record"
msgstr "Dossier du patient"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient
msgid "Patient at a sports medicine clinic."
msgstr "Patient dans une clinique de médecine sportive."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient's Contacts"
msgstr "Contacts du patient"
#. module: bemade_sports_clinic
#: model:mail.message.subtype,description:bemade_sports_clinic.subtype_patient_update
msgid "Patient's file has been updated."
msgstr "Le dossier du patient a été mis à jour."
#. module: bemade_sports_clinic
#: model:mail.message.subtype,description:bemade_sports_clinic.subtype_patient_injury_update
msgid "Patient's injury was updated."
msgstr "Le dossier de la blessure du patient a été mis à jour."
#. module: bemade_sports_clinic
#: model:ir.actions.act_window,name:bemade_sports_clinic.action_view_patient
#: model:ir.ui.menu,name:bemade_sports_clinic.sports_clinic_patients
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_list
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_list_embedded
msgid "Patients"
msgstr "Patients"
msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__mobile
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__mobile
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__mobile
msgid "Mobile"
msgstr "Mobile"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__phone
msgid "Phone"
msgstr "Téléphone"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__healthy
msgid "Play OK"
msgstr "Matchs autorisés"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team__player_count
@ -635,6 +714,11 @@ msgstr "Nombre de joueurs"
msgid "Players"
msgstr "Joueurs"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__practice_ok
msgid "Practice OK"
msgstr "Pratiques autorisées"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__practice_status
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_players
@ -652,11 +736,6 @@ msgstr "Date prévue de résolution"
msgid "Predicted Return Date"
msgstr "Date prévue de retour"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_team_staff
msgid "Relationship between staff members and their teams."
msgstr "Relation entre les membres du personnel et leurs équipes."
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__resolution_date
msgid "Resolution Date"
@ -720,6 +799,11 @@ msgstr "Gestion de clinique de médecine sportive"
msgid "Sports Team"
msgstr "Équipe sportive"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_team_staff
msgid "Sports Team Staff"
msgstr "Relation entre les membres du personnel et leurs équipes."
#. module: bemade_sports_clinic
#: model:ir.actions.act_window,name:bemade_sports_clinic.action_view_team
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_team_view_list
@ -744,6 +828,11 @@ msgstr "Membre du personnel"
msgid "Stage"
msgstr "Étape"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__state_id
msgid "State"
msgstr "État"
#. module: bemade_sports_clinic
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient__activity_state
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient_injury__activity_state
@ -758,6 +847,21 @@ msgstr ""
"Aujourd'hui: La date d'échéance est aujourd'hui\n"
"Planifiées: Activités futures."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_kanban
msgid "Status:"
msgstr "Statut :"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__street
msgid "Street"
msgstr "Rue"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__street2
msgid "Street2"
msgstr "Rue2"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__team_id
msgid "Team"
@ -804,6 +908,11 @@ msgstr "La date quand la blessure a été résolue."
msgid "The teams this person works for."
msgstr "Les équipes pour lesquelles cette personne travaille."
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__therapist
msgid "Therapist"
msgstr "Thérapeute"
#. module: bemade_sports_clinic
#. odoo-python
#: code:addons/bemade_sports_clinic/controllers/team_staff_portal.py:0
@ -818,21 +927,18 @@ msgstr "Ce joueur n'a pu être trouvé."
msgid "This team could not be found."
msgstr "Cette équipe n'a pu être trouvée."
#. module: bemade_sports_clinic
#. odoo-python
#: code:addons/bemade_sports_clinic/models/res_partner.py:0
#, python-format
msgid "To change a patient's name, change it from the patient form."
msgstr "Pour changer le nom d'un patient, changez le à partir du formulaire patient."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_teams
msgid "Total Players"
msgstr "Total des joueurs"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__therapist
msgid "Therapist"
msgstr "Thérapeute"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__doctor
msgid "Doctor"
msgstr "Docteur"
#. module: bemade_sports_clinic
#: model:res.groups,name:bemade_sports_clinic.group_sports_clinic_treatment_professional
msgid "Treatment Professional"
@ -879,11 +985,22 @@ msgstr "Historique de communication du site web"
#. module: bemade_sports_clinic
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient__return_date
msgid "When the player was cleared by medical staff to return to match play."
msgstr "Quand le joueur a été autorisé par le personnel médical à retourner au jeu."
msgstr ""
"Quand le joueur a été autorisé par le personnel médical à retourner au jeu."
#. module: bemade_sports_clinic
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient_injury__parental_consent
msgid ""
"Whether the patient has given their consent to share injury details with "
"their parents."
msgstr ""
"Indique si le patient a donné son consentement pour que les détails de la blessure soient partagés avec "
"ses parents."
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__match_status__yes
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__practice_status__yes
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_injury__parental_consent__yes
msgid "Yes"
msgstr "Oui"
@ -903,11 +1020,6 @@ msgid "Your Teams"
msgstr "Vos équipes"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_home
msgid "players_count"
msgstr ""
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_home
msgid "teams_count"
msgstr ""
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__zip
msgid "Zip"
msgstr "Code postal"

View file

@ -1,4 +1,6 @@
from . import patient
from . import patient_injury
from . import patient_contact
from . import res_partner
from . import sports_team
from . import res_users

View file

@ -1,9 +1,8 @@
from odoo import models, fields, _, api, Command
from odoo.exceptions import ValidationError
from datetime import date, datetime
from datetime import date
from dateutil.relativedelta import relativedelta
from odoo.addons.phone_validation.tools import phone_validation
import pytz
class Patient(models.Model):
@ -205,135 +204,3 @@ class Patient(models.Model):
class PatientContact(models.Model):
_name = 'sports.patient.contact'
_description = "Emergency or other contacts for a patient."
sequence = fields.Integer(required=True, default=0)
name = fields.Char(unaccent=False)
contact_type = fields.Selection(selection=[
('mother', 'Mother'),
('father', 'Father'),
('other', 'Other'),
], required=True)
mobile = fields.Char(unaccent=False, required=True)
# TODO: add email here and on views
patient_id = fields.Many2one(comodel_name='sports.patient', string='Patient')
@api.onchange('mobile')
def _onchange_mobile_validation(self):
if self.mobile:
self.mobile = self._phone_format(self.mobile, force_format="INTERNATIONAL")
def _phone_format(self, number, force_format='E164'):
country = self.patient_id.country_id or self.env.company.country_id
if not country or not number:
return number
return phone_validation.phone_format(
number,
country.code if country else None,
country.phone_code if country else None,
force_format=force_format,
raise_exception=False
)
class PatientInjury(models.Model):
_name = 'sports.patient.injury'
_description = "Patient Injury"
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'diagnosis'
@api.model
def _today(self):
"""Get the current date in the user's time zone."""
return datetime.now(pytz.timezone(self.env.user.tz or 'GMT'))
# TODO: Find a way to improve notifications send about tracking injury details
# TODO: Add field consentement_parental = fields.Selection(oui, non, non-applicable)
patient_id = fields.Many2one(comodel_name='sports.patient',
string="Patient",
readonly=True,
required=True)
patient_name = fields.Char(related="patient_id.name")
diagnosis = fields.Char(tracking=True)
injury_date = fields.Date(
string='Date of Injury',
default=_today,
)
injury_date_na = fields.Boolean(string="N/A", default=False)
internal_notes = fields.Html(tracking=True)
external_notes = fields.Html(tracking=True)
treatment_professional_ids = fields.Many2many(comodel_name='res.users',
relation='patient_injury_treatment_pro_rel',
column1='patient_injury_id',
column2='treatment_pro_id', string='Treatment Professionals',
domain=[
('is_treatment_professional', '=',
True)], tracking=True)
predicted_resolution_date = fields.Date(tracking=True)
resolution_date = fields.Date(tracking=True,
help="The date when the injury was actually resolved.")
stage = fields.Selection(selection=[('active', 'Active'), ('resolved', 'Resolved')], compute='_compute_stage')
@api.constrains('injury_date_na', 'injury_date')
def constrain_date_blank_only_if_na(self):
for rec in self:
if not rec.injury_date_na and not rec.injury_date:
raise ValidationError(_("If injury date is not set, the N/A box must be checked."))
@api.onchange('injury_date_na')
def _onchange_injury_date_na(self):
for rec in self:
if rec.injury_date_na:
rec.injury_date = None
@api.onchange('injury_date')
def _onchange_injury_date(self):
for rec in self:
if rec.injury_date:
rec.injury_date_na = False
@api.depends('resolution_date')
def _compute_stage(self):
for rec in self:
if rec.resolution_date and rec.resolution_date <= date.today():
rec.stage = 'resolved'
else:
rec.stage = 'active'
def write(self, vals):
super().write(vals)
if 'treatment_professional_ids' in vals:
to_subscribe = (self.treatment_professional_ids.mapped('partner_id')
- self.message_follower_ids.mapped('partner_id'))
self.message_subscribe(to_subscribe.ids)
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
for rec in res:
to_subscribe = (rec.treatment_professional_ids.mapped('partner_id')
- rec.message_follower_ids.mapped('partner_id'))
rec.message_subscribe(to_subscribe.ids)
return res
def action_view_injury_form(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sports.patient.injury',
'res_id': self.id,
'context': self._context,
}
def _track_subtype(self, init_values):
if 'treatment_professional_ids' in init_values \
and len(init_values) == 1:
return self.env.ref('mail.mt_note')
else:
return self.env.ref('bemade_sports_clinic.subtype_patient_injury_update')

View file

@ -0,0 +1,35 @@
from odoo import models, fields, api
from odoo.addons.phone_validation.tools import phone_validation
class PatientContact(models.Model):
_name = 'sports.patient.contact'
_description = "Emergency or other contacts for a patient."
sequence = fields.Integer(required=True, default=0)
name = fields.Char(unaccent=False)
contact_type = fields.Selection(selection=[
('mother', 'Mother'),
('father', 'Father'),
('other', 'Other'),
], required=True)
mobile = fields.Char(unaccent=False, required=True)
# TODO: add email here and on views
patient_id = fields.Many2one(comodel_name='sports.patient', string='Patient')
@api.onchange('mobile')
def _onchange_mobile_validation(self):
if self.mobile:
self.mobile = self._phone_format(self.mobile, force_format="INTERNATIONAL")
def _phone_format(self, number, force_format='E164'):
country = self.patient_id.country_id or self.env.company.country_id
if not country or not number:
return number
return phone_validation.phone_format(
number,
country.code if country else None,
country.phone_code if country else None,
force_format=force_format,
raise_exception=False
)

View file

@ -0,0 +1,120 @@
from odoo import models, fields, api, _
from datetime import datetime, date
import pytz
from odoo.exceptions import ValidationError
class PatientInjury(models.Model):
_name = 'sports.patient.injury'
_description = "Patient Injury"
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'diagnosis'
@api.model
def _today(self):
"""Get the current date in the user's time zone."""
return datetime.now(pytz.timezone(self.env.user.tz or 'GMT'))
# TODO: Find a way to improve notifications send about tracking injury details
# TODO: Add field consentement_parental = fields.Selection(oui, non, non-applicable)
patient_id = fields.Many2one(
comodel_name='sports.patient',
string="Patient",
readonly=True,
required=True
)
patient_name = fields.Char(related="patient_id.name")
diagnosis = fields.Char(tracking=True)
injury_date = fields.Date(
string='Date of Injury',
default=_today,
)
injury_date_na = fields.Boolean(string="N/A", default=False)
internal_notes = fields.Html(tracking=True)
external_notes = fields.Html(tracking=True)
treatment_professional_ids = fields.Many2many(
comodel_name='res.users',
relation='patient_injury_treatment_pro_rel',
column1='patient_injury_id',
column2='treatment_pro_id', string='Treatment Professionals',
domain=[
('is_treatment_professional', '=',
True)], tracking=True
)
predicted_resolution_date = fields.Date(tracking=True)
resolution_date = fields.Date(
tracking=True,
help="The date when the injury was actually resolved."
)
stage = fields.Selection(selection=[('active', 'Active'), ('resolved', 'Resolved')], compute='_compute_stage')
parental_consent = fields.Selection(
string="Consent for Disclosure to Parent",
selection=[
('yes', 'Yes'),
('no', 'No'),
('na', 'N/A')
],
help="Whether the patient has given their consent to share injury details with their parents.",
tracking=True,
)
@api.constrains('injury_date_na', 'injury_date')
def constrain_date_blank_only_if_na(self):
for rec in self:
if not rec.injury_date_na and not rec.injury_date:
raise ValidationError(_("If injury date is not set, the N/A box must be checked."))
@api.onchange('injury_date_na')
def _onchange_injury_date_na(self):
for rec in self:
if rec.injury_date_na:
rec.injury_date = None
@api.onchange('injury_date')
def _onchange_injury_date(self):
for rec in self:
if rec.injury_date:
rec.injury_date_na = False
@api.depends('resolution_date')
def _compute_stage(self):
for rec in self:
if rec.resolution_date and rec.resolution_date <= date.today():
rec.stage = 'resolved'
else:
rec.stage = 'active'
def write(self, vals):
super().write(vals)
if 'treatment_professional_ids' in vals:
to_subscribe = (self.treatment_professional_ids.mapped('partner_id')
- self.message_follower_ids.mapped('partner_id'))
self.message_subscribe(to_subscribe.ids)
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
for rec in res:
to_subscribe = (rec.treatment_professional_ids.mapped('partner_id')
- rec.message_follower_ids.mapped('partner_id'))
rec.message_subscribe(to_subscribe.ids)
return res
def action_view_injury_form(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sports.patient.injury',
'res_id': self.id,
'context': self._context,
}
def _track_subtype(self, init_values):
if 'treatment_professional_ids' in init_values \
and len(init_values) == 1:
return self.env.ref('mail.mt_note')
else:
return self.env.ref('bemade_sports_clinic.subtype_patient_injury_update')

View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="sports_patient_injury_view_form" model="ir.ui.view">
<field name="name">sports.patient.injury.view.form</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<form>
<header>
<field name="stage" widget="statusbar"/>
</header>
<sheet>
<div class="oe_title">
<h1>
Injury Details for
<field name="patient_name" class="oe_inline"/>
</h1>
</div>
<group>
<group col="2">
<field name="patient_id" invisible="1"/>
<span colspan="2">
<label for="injury_date"/>
<field name="injury_date" widget="date" class="oe_inline"/>
<field name="injury_date_na" class="oe_inline"/>
<label for="injury_date_na"/>
</span>
<field name="diagnosis"/>
<field name="predicted_resolution_date"/>
<field name="resolution_date"/>
</group>
<group>
<field name="parental_consent"/>
<field name="internal_notes" widget="html"/>
<field name="external_notes" widget="html"/>
<field name="treatment_professional_ids"
widget="many2many_tags_avatar"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="sports_patient_injury_view_tree" model="ir.ui.view">
<field name="name">sports.patient.injury.view.tree</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<tree string="Patient Injury History" editable="bottom"
multi_edit="True">
<field name="patient_id" invisible="1"/>
<field name="injury_date" widget="date"/>
<field name="diagnosis"/>
<field name="predicted_resolution_date" widget="date"/>
<field name="resolution_date" widget="date"/>
<field name="treatment_professional_ids"
widget="many2many_avatar_user"/>
<field name="activity_ids" widget="list_activity"/>
<field name="parental_consent"/>
<button name="action_view_injury_form" type="object"
title="Details" string="Details"
context="{'default_patient_id': patient_id}"/>
</tree>
</field>
</record>
</odoo>

View file

@ -184,69 +184,6 @@
</form>
</field>
</record>
<record id="sports_patient_injury_view_form" model="ir.ui.view">
<field name="name">sports.patient.injury.view.form</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<form>
<header>
<field name="stage" widget="statusbar"/>
</header>
<sheet>
<div class="oe_title">
<h1>
Injury Details for
<field name="patient_name" class="oe_inline"/>
</h1>
</div>
<group>
<group col="2">
<field name="patient_id" invisible="1"/>
<span colspan="2">
<label for="injury_date"/>
<field name="injury_date" widget="date" class="oe_inline"/>
<field name="injury_date_na" class="oe_inline"/>
<label for="injury_date_na"/>
</span>
<field name="diagnosis"/>
<field name="predicted_resolution_date"/>
<field name="resolution_date"/>
</group>
<group>
<field name="internal_notes" widget="html"/>
<field name="external_notes" widget="html"/>
<field name="treatment_professional_ids"
widget="many2many_tags_avatar"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="sports_patient_injury_view_tree" model="ir.ui.view">
<field name="name">sports.patient.injury.view.tree</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<tree string="Patient Injury History" editable="bottom"
multi_edit="True">
<field name="patient_id" invisible="1"/>
<field name="injury_date" widget="date"/>
<field name="diagnosis"/>
<field name="predicted_resolution_date" widget="date"/>
<field name="resolution_date" widget="date"/>
<field name="treatment_professional_ids"
widget="many2many_avatar_user"/>
<field name="activity_ids" widget="list_activity"/>
<button name="action_view_injury_form" type="object"
title="Details" string="Details"
context="{'default_patient_id': patient_id}"/>
</tree>
</field>
</record>
>
</data>
</odoo>