clinic/netforce_clinic/models/gen_visit.py

134 lines
5.0 KiB
Python
Raw Normal View History

2014-10-14 13:48:14 +00:00
from datetime import datetime, timedelta
from netforce.access import get_active_user
from netforce.model import Model, fields, get_model
FMT_DATE="%Y-%m-%d"
FMT_DATETIME="%Y-%m-%d %H:%M:%S"
class GenVisit(Model):
_name="clinic.gen.visit"
_transient=True
def _get_duration(self,ids,context={}):
res={}
for obj in self.browse(ids):
duration=datetime.strptime(obj.date_to,FMT_DATETIME)-datetime.strptime(obj.date_from,FMT_DATETIME)
res[obj.id]=duration.days
return res
_fields={
'date_from': fields.DateTime("From", required=True),
'date_to': fields.DateTime("To", required=True),
'cycle_id': fields.Many2One("clinic.cycle","Cycle", required=True),
'lines': fields.One2Many("clinic.gen.visit.line","gen_id","Lines"),
'monday': fields.Boolean("Monday"),
'tuesday': fields.Boolean("Tuesdays"),
'wednesday': fields.Boolean("Wednesdays"),
'thursday': fields.Boolean("Thursdays"),
'friday': fields.Boolean("Fridays"),
'doctor_id': fields.Many2One("clinic.doctor","Doctor"),
'nurse_id': fields.Many2One("clinic.nurse","Nurse"),
'duration': fields.Integer("Duration", function="_get_duration"),
}
def _get_lines(self,context={}):
ids=context.get("ids")
lines=[{'patient_id': id} for id in ids]
return lines
def _get_nurse(self,context={}):
user_id=get_active_user()
print("user_id ",user_id)
nurse_ids=get_model("clinic.nurse").search([['user_id','=',user_id]])
if nurse_ids:
return nurse_ids[0]
return None
_defaults={
'lines': _get_lines,
'date_from': lambda *a: datetime.now().strftime(FMT_DATETIME),
'date_to': lambda *a: datetime.now().strftime(FMT_DATETIME),
'nurse_id': _get_nurse,
'duration': 1,
}
def onchange_time(self,context={}):
data=context['data']
cycle_id=data['cycle_id']
duration=1
if cycle_id:
cycle=get_model('clinic.cycle').browse(cycle_id)
duration=cycle.duration or 0
seconds=duration*3600
date_from=data['date_from']
date_to=(datetime.strptime(date_from,FMT_DATETIME)+timedelta(seconds=seconds)).strftime(FMT_DATETIME)
data['date_to']='%s %s'%(data['date_to'][0:10],date_to[11:])
data['duration']=(datetime.strptime(data['date_to'],FMT_DATETIME)-datetime.strptime(data['date_from'],FMT_DATETIME)).days+1
return data
def onchange_dateto(self,context={}):
data=context['data']
data['duration']=(datetime.strptime(data['date_to'],FMT_DATETIME)-datetime.strptime(data['date_from'],FMT_DATETIME)).days+1
return data
def gen_visit(self,ids,context):
obj=self.browse(ids)[0]
time_stop=obj.date_to[11:]
days=[
obj.monday and 1 or 0,
obj.tuesday and 2 or 0,
obj.wednesday and 3 or 0,
obj.thursday and 4 or 0,
obj.friday and 5 or 0,
]
days=[day for day in days if day]
print("days ", days)
if not days:
raise Exception("Please select Day")
duration=datetime.strptime(obj.date_to,FMT_DATETIME)-datetime.strptime(obj.date_from,FMT_DATETIME)
for day in range(duration.days+1):
date_from=(datetime.strptime(obj.date_from,FMT_DATETIME)+timedelta(days=day)).strftime(FMT_DATETIME)
date_to="%s %s" % (obj.date_from[0:10],time_stop)
# loop patient
visit_vals=[]
for line in obj.lines:
# loop days in weekend
for day in days:
vals={
'patient_id': line.patient_id.id,
'doctor_id': obj.doctor_id.id,
'nurse_id': obj.nurse_id.id,
'cycle_id': obj.cycle_id.id,
'time_start': date_from,
'time_stop': date_to,
'state': 'draft',
}
visit_vals.append(vals)
if visit_vals:
dom=[]
dom.append(['time_start','>=','%s %s'%(obj.date_from[0:10],' 00:00:00')])
dom.append(['time_stop','<=','%s %s'%(obj.date_to[0:10],' 23:59:59')])
# search patient
dom.append(['state','=','draft'])
patient_ids=[visit['patient_id'] for visit in visit_vals]
dom.append(['patient_id', 'in', tuple(patient_ids)])
print("dom ", dom)
visit_obj=get_model('clinic.visit')
visit_ids=visit_obj.search(dom)
# delete old visit (same duration)
visit_obj.delete(visit_ids)
for vas in visit_vals:
visit_obj.create(vals)
return {
'next': {
'name': 'clinic_patient',
'mode': 'list',
},
'flash': 'Generate OK',
}
GenVisit.register()