Skip to content

Commit 954779b

Browse files
committed
Dynamically generate sample images
1 parent 295d56f commit 954779b

File tree

5 files changed

+89
-12
lines changed

5 files changed

+89
-12
lines changed

api/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ zip/
33
__pycache__/
44
build/
55
remote/
6+
preview/

api/example.json

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"id": "region",
3+
"name": "Hometown",
4+
"webname": "region",
5+
"abbr": "NIL",
6+
"location": {
7+
"lat": 0,
8+
"lng": 0
9+
},
10+
"timezone": "America/Los_Angeles",
11+
"timezone_group": "Pacific",
12+
"current_event": {
13+
"id": "example",
14+
"name": "CodeDay Hometown Winter 1970",
15+
"region_name": "Hometown",
16+
"region_id": "region",
17+
"webname": "region",
18+
"timezone": "America/Los_Angeles",
19+
"hashtag": "region",
20+
"urls": {
21+
"home": "https://codeday.org/region",
22+
"register": "https://codeday.org/region/register"
23+
},
24+
"starts_at": 1581796800,
25+
"ends_at": 1581883200,
26+
"venue": {
27+
"name": "VenueCorp",
28+
"address": {
29+
"line_1": "555 Post St",
30+
"line_2": null,
31+
"city": "SF",
32+
"state": "CA",
33+
"postal": "94102",
34+
"country": "US"
35+
},
36+
"full_address": "555 Post St, SF CA 94102, US"
37+
},
38+
"loaners": {
39+
"total": 0,
40+
"available": 0
41+
},
42+
"venue_agreement": null,
43+
"stripe_public_key": "pk_v0AIOIy377403GN0FKltGR9gOAAUe",
44+
"notice": null,
45+
"overflow_event": null,
46+
"has_related_events": false
47+
}
48+
}

api/generator.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime, pytz, os, subprocess
22
from jinja2 import Environment, FileSystemLoader, select_autoescape
3+
import hashlib
34

45
from starlette.responses import RedirectResponse, FileResponse
56

@@ -13,6 +14,7 @@ def __init__(self, data, promo=None, promoFor=None):
1314
self.supported_formats = ['svg', 'pdf', 'png']
1415
self.promo = promo
1516
self.promoFor = promoFor
17+
self.hash = hashlib.md5('{}_{}'.format(promo,promoFor).encode('utf8')).hexdigest()
1618

1719
self.data = data
1820
for key in data:
@@ -29,7 +31,9 @@ def __init__(self, data, promo=None, promoFor=None):
2931

3032
def get_cache(self, file_format, template_name='', full=True):
3133
basedir = os.path.dirname(os.path.realpath(__file__)) if full else ''
32-
return '{}/generated/{}/{}/{}_{}_{}'.format(basedir, self.current_event['id'], file_format, self.promo, self.promoFor, template_name.replace('svg', file_format))
34+
fname = '{}_{}'.format(self.hash, template_name.replace('svg', file_format)) if template_name else ''
35+
return '{}/generated/{}/{}/{}'.format(basedir, self.current_event['id'], file_format, fname)
36+
3337

3438
def make_poster(self, template_name, file_format):
3539
file_format = file_format.lower()

api/main.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import requests, json, shutil
22

3-
from fastapi import FastAPI
3+
from fastapi import FastAPI, BackgroundTasks
44
from jinja2 import Environment, FileSystemLoader, select_autoescape
55

66
from starlette.middleware.cors import CORSMiddleware
77
from starlette.responses import HTMLResponse, FileResponse, JSONResponse
88
from starlette.staticfiles import StaticFiles
99

1010
from generator import PosterGenerator
11-
from tasks import sync_templates, cleanup
11+
from tasks import run_tasks
1212

13-
sync_templates()
14-
cleanup()
13+
run_tasks()
1514

1615
env = Environment(
1716
loader= FileSystemLoader('./remote/templates/template'),
@@ -20,7 +19,7 @@
2019

2120
app = FastAPI()
2221

23-
app.mount("/preview", StaticFiles(directory="./remote/templates/preview"), name="preview")
22+
app.mount("/preview", StaticFiles(directory="./preview"), name="preview")
2423
app.mount("/static", StaticFiles(directory="./build/static"), name="static")
2524

2625
app.add_middleware(
@@ -40,9 +39,8 @@ def root():
4039
return HTMLResponse(file_get_contents("./build/index.html"))
4140

4241
@app.get('/sync')
43-
def sync():
44-
sync_templates()
45-
cleanup()
42+
def sync(background_tasks: BackgroundTasks):
43+
background_tasks.add_task(run_tasks)
4644
return HTMLResponse('ok')
4745

4846
@app.get("/render/{id}/{template}/{file_format}")
@@ -62,7 +60,7 @@ def generate_all(id, promo=None):
6260
eventJson = json.loads(eventRequest.text)
6361
except:
6462
return "No event found with id {}".format(id),404
65-
PosterGenerator(eventJson, promo).make_posters(env.list_templates())
63+
PosterGenerator(eventJson, promo, promoFor).make_posters(env.list_templates())
6664

6765
return FileResponse(shutil.make_archive('zip/{}'.format(id), 'zip', 'generated/{}'.format(eventJson.current_event['id'])), filename='{}.zip'.format(id))
6866

api/tasks.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import time, threading
22
import os, tempfile, zipfile, shutil
33
from urllib import request
4+
from generator import PosterGenerator
5+
from jinja2 import Environment, FileSystemLoader, select_autoescape
6+
import json
47

58
def sync_templates():
69
zip_path = os.path.join(tempfile.mkdtemp(), 'templates.zip')
@@ -20,6 +23,25 @@ def sync_templates():
2023
shutil.rmtree('remote/templates_old', ignore_errors=True)
2124
os.remove(zip_path)
2225

26+
27+
# Generate samples
28+
env = Environment(
29+
loader= FileSystemLoader('./remote/templates/template'),
30+
autoescape=select_autoescape(['svg'])
31+
)
32+
33+
with open('example.json', 'r') as exFile:
34+
data=json.loads(exFile.read())
35+
36+
shutil.rmtree('generated/example', ignore_errors=True)
37+
PosterGenerator(data, 'PROMO', '20% off').make_posters(env.list_templates())
38+
shutil.rmtree('preview', ignore_errors=True)
39+
os.rename('generated/example/png', 'preview')
40+
shutil.rmtree('generated/example', ignore_errors=True)
41+
for f in os.listdir('preview'):
42+
os.rename('preview/{}'.format(f), 'preview/{}'.format(f[str.index(f, '_')+1:]));
43+
44+
2345
def cleanup():
2446
for dir in ('generated', 'zip'):
2547
if (os.path.exists(dir)):
@@ -31,7 +53,11 @@ def cleanup():
3153
else:
3254
os.remove(path)
3355

34-
if __name__ == "__main__":
35-
print("Running tasks...")
56+
def run_tasks():
3657
sync_templates()
3758
cleanup()
59+
60+
61+
if __name__ == "__main__":
62+
print("Running tasks...")
63+
run_tasks()

0 commit comments

Comments
 (0)