| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | #!/usr/bin/env python3import datetime as dtimport osimport yamlscript_path = os.path.realpath(__file__)data_path = os.path.join(os.path.dirname(script_path), 'patients.yml')output_path = os.path.join(os.path.dirname(script_path), 'list.html')def random_date(start, end):    import random    return dt.date.fromordinal(random.randint(        start.toordinal(),        end.toordinal(),    ))class Patient:    def __init__(self, attr):        self.surname = attr.get('surname', None)        self.forename = attr.get('forename', None)        self.birth_date = attr.get('birth_date', None)        self.admission_date = attr.get('admission_date', None)        self.diagnosis = attr.get('diagnosis', None)        self.room = attr.get('room', None)        self.events = [Event(d) for d in attr.get('events', [])]    @property    def age_years(self):        if self.birth_date is None:            return None        else:            today = dt.date.today()            return today.year - self.birth_date.year \                - ((today.month, today.day) < (self.birth_date.month, self.birth_date.day))    @property    def admission_duration(self):        if self.admission_date is None:            return None        else:            return dt.date.today() - self.admission_dateclass Event:    def __init__(self, attr):        self.date = attr['date']        self.title = attr['title']    @property    def date_delta_str(self):        delta = dt.date.today() - self.date        if delta.days == 0:            return 'heute'        elif delta.days < 0:            return '{}d prae'.format(abs(delta.days))        else:            return '{}d post'.format(delta.days)    @property    def label(self):        return '{} {}'.format(self.date_delta_str, self.title)def main():    with open(data_path, 'r') as f:        patients = yaml.load(f.read())    patients.sort(key=lambda p: p.get('room', 0))    doc = '''    <!DOCTYPE html>    <html>    <head><link rel="stylesheet" href="list.css" /></head>    <body>        <table>    '''    for p in [Patient(d) for d in patients]:        doc += '<tr><td>{}</td></tr>'.format('</td><td>'.join([            '<b>{}</b>'.format(p.room) if p.room else '',            p.surname or '',            p.forename or '',            '{}a'.format(p.age_years) if p.birth_date else '',            '{}d'.format(p.admission_duration.days) if p.admission_date else '',            '; '.join(                ([p.diagnosis] if p.diagnosis else [])                    + [e.label for e in sorted(p.events, key=lambda e: e.date)]            )        ]))    doc += '</table></body></html>'    with open(output_path, 'w') as f:        f.write(doc)if __name__ == '__main__':    main()
 |