This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
calebasse/scripts/import_horaires.py.bak

334 lines
13 KiB
Python

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os
import csv
from datetime import datetime, time, date
import calebasse.settings
import django.core.management
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
django.core.management.setup_environ(calebasse.settings)
from django.contrib.auth.models import User
from calebasse.actes.models import EventAct
from calebasse.agenda.models import Event, EventType
from calebasse.dossiers.models import PatientRecord, Status, FileState
from calebasse.ressources.models import Service
from calebasse.personnes.models import Worker, Holiday, TimeTable
from calebasse.personnes.forms import PERIOD_LIST_TO_FIELDS
from calebasse.ressources.models import WorkerType, HolidayType
# Configuration
db_path = "./scripts/20121221-192258"
dbs = ["F_ST_ETIENNE_SESSAD_TED", "F_ST_ETIENNE_CMPP", "F_ST_ETIENNE_CAMSP", "F_ST_ETIENNE_SESSAD"]
def _to_date(str_date):
if not str_date:
return None
return datetime.strptime(str_date[:-13], "%Y-%m-%d")
def _to_int(str_int):
if not str_int:
return None
return int(str_int)
def discipline_mapper(tables_data, service):
for line in tables_data['discipline']:
# Insert workertype
if not WorkerType.objects.filter(name=line['libelle']):
WorkerType.objects.create(name=line['libelle'])
def intervenants_mapper(tables_data, service):
for line in tables_data['intervenants']:
# Insert workers
for disp in tables_data['discipline']:
if disp['id'] == line['discipline']:
type = WorkerType.objects.get(name=disp['libelle'])
# TODO : import actif or not
worker, created = Worker.objects.get_or_create(
type=type,
last_name=line['nom'],
first_name=line['prenom'],
email=line['email'],
phone=line['tel'],
gender=int(line['titre']),
)
worker.services.add(service)
def dossiers_mapper(tables_data, service):
global dossiers
for line in tables_data['dossiers']:
status = Status.objects.filter(type="ACCUEIL").filter(services=service)
creator = User.objects.get(id=1)
gender = _to_int(line['nais_sexe'])
if gender == 0:
gender = None
# TODO: add more fields
patient, created = PatientRecord.objects.get_or_create(first_name=line['prenom'],
last_name=line['nom'], birthdate=_to_date(line['nais_date']),
twinning_rank=_to_int(line['nais_rang']),
gender=gender, service=service, creator=creator)
dossiers[line['id']] = patient
if not created:
if not line['ins_date']:
# Hack when there is no inscription date put 01/01/1970
line['ins_date'] = "1970-01-01 00:00:00.000"
fs = FileState.objects.create(status=status[0], author=creator,
date_selected=_to_date(line['ins_date']),
previous_state=None, patient=patient)
patient.last_state = fs
patient.save()
if line['sor_date']:
status = Status.objects.filter(type="CLOS").filter(services=service)
fs = FileState.objects.create(status=status[0], author=creator,
date_selected=_to_date(line['sor_date']),
previous_state=None, patient=patient)
patient.last_state = fs
patient.save()
def rs_mapper(tables_data, service):
global dossiers
event_type = EventType.objects.get(
label=u"Rendez-vous patient"
)
for line in tables_data['rs']:
if dossiers.has_key(line['enfant_id']):
patient = dossiers[line['enfant_id']]
strdate = line['date_rdv'][:-13] + ' ' + line['heure'][11:-4]
date = datetime.strptime(strdate, "%Y-%m-%d %H:%M:%S")
# TODO: add act_type
# act_event = EventAct.objects.get_or_create(
# title=line['libelle'],
# event_type=event_type,
# patient=patient,
# act_type=act_type,
# date=date
# )
else:
# TODO: if no patient add event
pass
def conge_mapper(tables_data, service):
""" """
for line in tables_data['conge']:
pass
def ev_mapper(tables_data, service):
""" """
pass
def notes_mapper(tables_data, service):
""" """
pass
def _get_dict(cols, line):
""""""
res = {}
for i, data in enumerate(line):
res[cols[i]] = data.decode('utf-8')
return res
tables_data = {}
PERIOD_FAURE_NOUS = {1 : 1,
2 : 2,
3 : 3,
4 : 4,
5: 6,
6: 7,
7: 8,
8: 9,
9: None,
10: 10,
12: 11,
13: 12,
}
def main():
""" """
thera_evt = {}
for db in dbs:
if "F_ST_ETIENNE_CMPP" == db:
service = Service.objects.get(name="CMPP")
elif "F_ST_ETIENNE_CAMSP" == db:
service = Service.objects.get(name="CAMSP")
elif "F_ST_ETIENNE_SESSAD_TED" == db:
service = Service.objects.get(name="SESSAD TED")
elif "F_ST_ETIENNE_SESSAD" == db:
service = Service.objects.get(name="SESSAD DYS")
tables_data[service.name] = []
csvfile = open(os.path.join(db_path, db, 'ev.csv'), 'rb')
csvlines = csv.reader(csvfile, delimiter=';', quotechar='|')
cols = csvlines.next()
i = 0
for line in csvlines:
# if _to_date(line[1]) > datetime(year=2012, month=1, day=1) and \
# (line[8] == 'ARRIVEE' or line[8] == 'DEPART'):
if line[8] == 'ARRIVEE' or line[8] == 'DEPART':
data = _get_dict(cols, line)
tables_data[service.name].append(data)
i += 1
csvfile.close()
print "%s - Nombre d'evt horaires : %d" % (service.name, i)
thera_evt[service.name] = {}
csvfile = open(os.path.join(db_path, db, 'details_ev.csv'), 'rb')
csvlines = csv.reader(csvfile, delimiter=';', quotechar='|')
cols = csvlines.next()
not_found = []
for line in csvlines:
worker = None
try:
if service.name == 'CMPP':
worker = Worker.objects.get(old_cmpp_id=line[2])
elif service.name == 'CAMSP':
worker = Worker.objects.get(old_camsp_id=line[2])
elif service.name == 'SESSAD DYS':
worker = Worker.objects.get(old_sessad_dys_id=line[2])
elif service.name == 'SESSAD TED':
worker = Worker.objects.get(old_sessad_ted_id=line[2])
else:
print "service inconnu!!!"
exit(0)
except Exception, e:
# print "error on id %s service %s with exception %s" % (line[2], service.name, str(e))
not_found.append(line[2])
if worker:
if line[1] in thera_evt.keys():
thera_evt[service.name][line[1]].append(worker)
else:
thera_evt[service.name][line[1]] = [worker]
csvfile.close()
print "%s - Liste des worker not found : %s" % (service.name, str(set(not_found)))
# 7 8 17 n'existe pas au SESSAD TED
# ['91', '89', '17', '77', '76', '75', '74', '73', '72', '82', '90', '85'] n'existe pas au CMPP
i = 0
j = 0
t_tmp = []
for horaire in tables_data[service.name]:
if not horaire['id'] in thera_evt[service.name]:
j += 1
# print "horaire sans detail: %s %s" % (horaire['id'], horaire['date_debut'])
elif not thera_evt[service.name][horaire['id']]:
i += 1
else:
if len(thera_evt[service.name][horaire['id']]) > 1:
print "%s - Horaire %s avec plus d'un worker %s!" % (service.name, horaire['id'], str(len(thera_evt[service.name][horaire['id']])))
exit(0)
horaire['worker'] = thera_evt[service.name][horaire['id']][0]
# if thera_evt[service.name][horaire['id']][0].last_name == "Borderon":
# print datetime.strptime(horaire['date_debut'][:-13], "%Y-%m-%d").date()
# print datetime.strptime(horaire['heure'][11:16], "%H:%M").time()
t_tmp.append(horaire)
tables_data[service.name] = t_tmp
print "%s - Nombre d'evt horaires sans details: %d" % (service.name, j)
print "%s - Nombre d'evt horaires sans worker: %d" % (service.name, i)
print "%s - Nombre d'evt horaires: %d" % (service.name, len(tables_data[service.name]))
i = 0
arrivee = None
t_tmp = []
tables_data[service.name]= sorted(tables_data[service.name], key=lambda tup: tup['date_debut'])
for horaire in tables_data[service.name]:
"""regrouper arrivé et départ sinon erreur:
même jour, même récurrence, mêmes intervenants, etc."""
t_tmp.append(horaire)
if horaire['libelle'] == 'ARRIVEE':
if arrivee:
# print "Deux arrivée de suite %s %s" % (str(arrivee), str(horaire))
pass
arrivee = horaire
if horaire['libelle'] == 'DEPART':
if arrivee:
if horaire['date_debut'] == arrivee['date_debut'] and \
horaire['rythme'] == arrivee['rythme'] and \
horaire['type_evenement'] == arrivee['type_evenement'] and \
horaire['worker'] == arrivee['worker']:
# horaire['date_fin'] == arrivee['date_fin'] and \
t_tmp.pop(len(t_tmp) - 1)
t_tmp.pop(len(t_tmp) - 1)
i += 1
# print "worker: %s" % arrivee['worker']
# print "date_debut: %s" % datetime.strptime(arrivee['date_debut'][:-13], "%Y-%m-%d").date()
# if arrivee['date_fin']:
# print "date_fin: %s" % datetime.strptime(arrivee['date_fin'][:-13], "%Y-%m-%d").date()
# print "heure arrivee: %s" % datetime.strptime(arrivee['heure'][11:16], "%H:%M").time()
# print "heure depart: %s" % datetime.strptime(horaire['heure'][11:16], "%H:%M").time()
# print "reccurrence: %s" % arrivee['rythme']
start_date = datetime.strptime(arrivee['date_debut'][:-13], "%Y-%m-%d").date()
weekday = int(start_date.strftime('%w')) + 1
periodicity = PERIOD_FAURE_NOUS[int(arrivee['rythme'])]
if not periodicity:
periodicity = 1
week_period, week_parity, week_rank = PERIOD_LIST_TO_FIELDS[periodicity - 1]
# print "week_period: %s" % week_period
# print "week_parity: %s" % week_parity
# print "week_rank: %s" % week_rank
end_date = None
skip = False
if arrivee['date_fin']:
end_date = datetime.strptime(arrivee['date_fin'][:-13], "%Y-%m-%d").date()
if arrivee['date_fin'] == arrivee['date_debut']:
skip = True
elif end_date < datetime(year=2013, month=1, day=2).date():
skip = True
if not skip:
pass
# tt = TimeTable(worker=arrivee['worker'],
# weekday=weekday,
# periodicity=periodicity,
# week_period=week_period, week_parity=week_parity, week_rank=week_rank,
# start_time = datetime.strptime(arrivee['heure'][11:16], "%H:%M").time(),
# end_time = datetime.strptime(horaire['heure'][11:16], "%H:%M").time(),
# start_date = start_date,
# end_date = end_date)
# tt.save()
# tt.services.add(service)
arrivee = None
else:
# print "Départ sans arrivee %s" % str(horaire)
pass
print "%s - Nombre d'horaires : %d" % (service.name, i)
print "%s - Nombre d'evt horaires restants: %d" % (service.name, len(t_tmp))
# csvfile = open('./scripts/horaires_manuel.csv', 'ab')
# writer = csv.writer(csvfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
# colonnes = list(t_tmp[0].keys())
# colonnes.append('service')
# writer.writerow(colonnes)
# for h in t_tmp:
# valeurs = list(h.values())
# valeurs.append(service.name)
# writer.writerow(valeurs)
# csvfile.close()
#Classer par worker, puis par jour: date de début => jour.
#Prendre l'vet arrivée et départ les plus récent pour chaque jour, pour chaque intervenant.
# Avec date de fin pas expriée ou pas de date de fin.
if __name__ == "__main__":
main()