57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
import asyncio
|
|
|
|
import django.core.management.commands.runserver as runserver
|
|
from asgiref.sync import sync_to_async
|
|
from pyppeteer import launch
|
|
|
|
from cookbook.integration.integration import Integration
|
|
|
|
|
|
class PDFexport(Integration):
|
|
|
|
def get_recipe_from_file(self, file):
|
|
raise NotImplementedError('Method not implemented in storage integration')
|
|
|
|
async def get_files_from_recipes_async(self, recipes, el, cookie):
|
|
cmd = runserver.Command()
|
|
|
|
browser = await launch(
|
|
handleSIGINT=False,
|
|
handleSIGTERM=False,
|
|
handleSIGHUP=False,
|
|
ignoreHTTPSErrors=True,
|
|
)
|
|
|
|
cookies = {'domain': cmd.default_addr, 'name': 'sessionid', 'value': cookie['sessionid'], }
|
|
options = {'format': 'letter',
|
|
'margin': {
|
|
'top': '0.75in',
|
|
'bottom': '0.75in',
|
|
'left': '0.75in',
|
|
'right': '0.75in',
|
|
}
|
|
}
|
|
|
|
files = []
|
|
for recipe in recipes:
|
|
|
|
page = await browser.newPage()
|
|
await page.emulateMedia('print')
|
|
await page.setCookie(cookies)
|
|
|
|
await page.goto('http://' + cmd.default_addr + ':' + cmd.default_port + '/view/recipe/' + str(recipe.id), {'waitUntil': 'domcontentloaded'})
|
|
await page.waitForSelector('#printReady')
|
|
|
|
files.append([recipe.name + '.pdf', await page.pdf(options)])
|
|
await page.close()
|
|
|
|
el.exported_recipes += 1
|
|
el.msg += self.get_recipe_processed_msg(recipe)
|
|
await sync_to_async(el.save, thread_sensitive=True)()
|
|
|
|
await browser.close()
|
|
return files
|
|
|
|
def get_files_from_recipes(self, recipes, el, cookie):
|
|
return asyncio.run(self.get_files_from_recipes_async(recipes, el, cookie))
|