-
Notifications
You must be signed in to change notification settings - Fork 2
/
booklet.py
118 lines (84 loc) · 2.97 KB
/
booklet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import yaml
import click
import pandas as pd
import jinja2
PARTICIPANT_HTML = './templates/participant.html'
BOOKLET_HTML = './templates/booklet.html'
CSS = './templates/styles.css'
def render_participant(participant):
"""
Parameters
----------
participant : pd.Series
A series with participant details.
"""
with open(PARTICIPANT_HTML, 'r') as f:
html_template = jinja2.Template(f.read())
# Link label for website: clean out some unneccesary bits
clean_website = participant['website'].replace('https://', '').replace('http://', '').strip('/')
# Truncate bio if too long
bio = participant['bio']
if len(bio) > 550:
bio = bio[:500].rsplit(' ', 1)[0]
bio += '... <a href="https://forum.openmod-initiative.org/u/{}">[read more on forum profile]</a>'.format(participant.name)
html = html_template.render(
username=participant.name,
name=participant['name'].title(),
bio=bio,
affiliation=participant['affiliation'],
website_url=participant['website'],
website_text=clean_website,
location=participant['location'],
portrait_url=participant['avatar_url']
)
return html
def render_booklet(participants, metadata):
participants_html = '\n'.join([render_participant(p) for i, p in participants.iterrows()])
with open(CSS, 'r') as f:
css = f.read()
with open(BOOKLET_HTML, 'r') as f:
html_template = jinja2.Template(f.read())
if 'html_header' in metadata:
with open(metadata['html_header'], 'r') as f:
html_header = f.read()
else:
html_header = ''
html = html_template.render(
css=css,
participants=participants_html,
title=metadata['title'],
subtitle=metadata['subtitle'],
html_header=html_header,
)
return html
@click.group()
def booklet():
"""Build an HTML conference participant booklet."""
pass
@booklet.command()
@click.argument("metadata_file", click.Path(exists=True, file_okay=True, dir_okay=False))
@click.option("--users", "-u", type=click.Path(exists=True, file_okay=True, dir_okay=False),
help="Path to user details CSV file.")
def build(metadata_file, users):
"""Build the booklet.
Reads user details as csv from stdin and writes the booklet to stdout.
\b
Parameters
----------
metadata_file : str
Path to metadata YAML file.
"""
if not users:
users = click.get_text_stream('stdin')
users = pd.read_csv(users, index_col=0)
with open(metadata_file, 'r') as f:
metadata = yaml.load(f)
# Order users by last name
users['lastname'] = users.name.str.split().str.get(-1)
users = users.sort_values(by='lastname')
# Replace NaN with empty string so can do {% if variable %} in jinja templates
users = users.replace(pd.np.nan, '')
html = render_booklet(users, metadata)
click.echo(html)
if __name__ == "__main__":
booklet()