Skip to content

Commit 68af9e0

Browse files
committed
Fix PDF, add PNG, some code cleanup
1 parent e99c018 commit 68af9e0

File tree

3 files changed

+65
-46
lines changed

3 files changed

+65
-46
lines changed

api/generator.py

Lines changed: 62 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,84 @@
1-
import datetime, pytz, os
1+
import datetime, pytz, os, subprocess
22
from jinja2 import Environment, FileSystemLoader, select_autoescape
33

44
from starlette.responses import RedirectResponse
55

66
env = Environment(
7-
loader= FileSystemLoader('./posterTemplates'),
8-
autoescape=select_autoescape(['svg'])
7+
loader= FileSystemLoader('./posterTemplates'),
8+
autoescape=select_autoescape(['svg'])
99
)
1010

1111
class PosterGenerator:
1212
def __init__(self,data):
13+
self.supported_formats = ['svg', 'pdf', 'png']
14+
15+
self.data = data
1316
for key in data:
1417
setattr(self,key,data[key])
18+
1519
if self.current_event:
1620
self.start = datetime.datetime.fromtimestamp(data['current_event']['starts_at']).astimezone(pytz.timezone(self.timezone))
1721
self.month = self.start.strftime('%B')
1822
self.short_month = self.start.strftime('%b')
1923
self.day = self.start.day
2024
self.year = self.start.strftime('%Y')
21-
self.data = data
25+
self.url = self.webname
26+
27+
def get_cache(self, file_format, template_name='', full=True):
28+
basedir = os.path.dirname(os.path.realpath(__file__)) if full else ''
29+
return '{}/generated/{}/{}/{}'.format(basedir, self.id, file_format, template_name.replace('svg', file_format))
2230

23-
def make_poster(self, template, file_format):
24-
supported_files = ['svg','pdf']
31+
def make_poster(self, template_name, file_format):
2532
file_format = file_format.lower()
26-
if file_format not in supported_files:
27-
return('ERROR: File provided not supported format')
28-
if template not in env.list_templates():
29-
return({
30-
"requested_template": template,
31-
"template_list": env.list_templates(),
32-
"ERROR": 'Template provided not loaded in environment'
33-
})
33+
if file_format not in self.supported_formats:
34+
return('ERROR: File provided not supported format')
35+
36+
if template_name not in env.list_templates():
37+
return({
38+
"requested_template": template_name,
39+
"template_list": env.list_templates(),
40+
"ERROR": 'Template provided not loaded in environment'
41+
})
42+
43+
if not hasattr(self, 'make_poster_{}'.format(file_format)):
44+
return('ERROR: no make_poster method for format')
45+
3446
if not self.current_event:
35-
return('ERROR: Event not live in Clear')
36-
file = template
37-
template = env.get_template(file)
38-
id = self.id
39-
if not os.path.exists('generated/'):
40-
os.mkdir('generated/')
41-
if not os.path.exists('generated/{}/'.format(id)):
42-
os.mkdir('generated/{}/'.format(id))
43-
if not os.path.exists('generated/{}/svg/'.format(id)):
44-
os.mkdir('generated/{}/svg/'.format(id))
45-
if not os.path.exists('generated/{}/pdf/'.format(id)):
46-
os.mkdir('generated/{}/pdf/'.format(id))
47-
with open("generated/{}/svg/{}".format(id, file), "w+") as f:
48-
f.write(template.render(**vars(self)))
49-
# if file_format == 'pdf':
50-
# make_pdf('generated/{}/svg/{}'.format(id, file),
51-
# 'generated/{}/pdf/{}'.format(id, file.replace('.svg', '.pdf')))
52-
# return 'generated/{}/pdf/{}'.format(id, file.replace('.svg', '.pdf'))
53-
return RedirectResponse(url='/generated/{}/svg/{}'.format(id, file))
47+
return('ERROR: Event not live in Clear')
48+
49+
if not os.path.isfile(self.get_cache(file_format, template_name)):
50+
os.makedirs(self.get_cache(file_format), exist_ok=True)
51+
getattr(self, 'make_poster_{}'.format(file_format))(template_name)
52+
53+
return RedirectResponse(url=self.get_cache(file_format, template_name, full=False))
54+
55+
def require_format(self, template_name, file_format):
56+
if not os.path.isfile(self.get_cache(file_format, template_name)):
57+
self.make_poster(template_name, file_format)
58+
59+
def make_poster_svg(self, template_name):
60+
template = env.get_template(template_name)
61+
62+
with open(self.get_cache('svg', template_name), "w+") as f:
63+
f.write(template.render(**vars(self)))
64+
65+
def make_poster_pdf(self, template_name):
66+
self.require_format(template_name, 'svg')
67+
f_in = self.get_cache('svg', template_name)
68+
f_out = self.get_cache('pdf', template_name)
69+
70+
with open(os.devnull, 'wb') as devnull:
71+
subprocess.check_call(['inkscape', '-z', '-f', f_in, '-A', f_out], stdout=devnull, stderr=subprocess.STDOUT)
72+
73+
def make_poster_png(self, template_name):
74+
self.require_format(template_name, 'svg')
75+
f_in = self.get_cache('svg', template_name)
76+
f_out = self.get_cache('png', template_name)
77+
78+
with open(os.devnull, 'wb') as devnull:
79+
subprocess.check_call(['inkscape', '-z', '-w', '600', '-f', f_in, '-e', f_out], stdout=devnull, stderr=subprocess.STDOUT)
5480

5581
def make_posters(self,templates=env.list_templates()):
56-
for template in templates:
57-
self.make_poster(template, 'svg') # pdf so it makes them both
58-
59-
# def make_pdf(input,output):
60-
# if os.path.isfile(input):
61-
# with open(os.devnull, 'wb') as devnull:
62-
# subprocess.check_call(['inkscape {} --export-pdf={}'.format(input, output)], stdout=devnull, stderr=subprocess.STDOUT)
63-
# else:
64-
# print('Input file does not exist')
65-
# return
82+
for template_name in templates:
83+
for file_format in self.supported_formats:
84+
self.make_poster(template_name, file_format)

api/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ def generate_all(id):
5757

5858
@app.get('/api/listTemplates/', response_class=HTMLResponse)
5959
def listTemplates():
60-
return json.dumps([t.replace('.svg', '') for t in env.list_templates()])
60+
return json.dumps([t.replace('.svg', '') for t in env.list_templates()])

frontend/src/posters.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const Posters = () => {
99
const [loading, setLoading] = useState(false)
1010

1111
const [posterRegion, setPosterRegion] = useState('')
12-
const [posterFormat, setPosterFormat] = useState('svg')
12+
const [posterFormat, setPosterFormat] = useState('png')
1313

1414
useEffect(() => {
1515
if (regions.length == 0) {
@@ -40,7 +40,7 @@ const Posters = () => {
4040
return (
4141
<>
4242
<h1>CodeDay Poster Generator</h1>
43-
<EventDropdown
43+
City webname: <EventDropdown
4444
error={error}
4545
isLoading={loading}
4646
regions={regions}

0 commit comments

Comments
 (0)