Package: nf-presentation
Создатель презентаций NanoFootball.comФормирует изdictобъекта упражнения, тренировки или события презентацию PowerPoint, которую получит пользователь. Требует около трех секунд на одно упражнение. Таким образом создание презентации из шести упражнений займет 10-20 секунд.УстановкаДля Линукс системpip install nf_presentationДля Виндоус системНа данный момент pipwin перестал работать, так что установка кринжеватая. Но быстрая:Сначала установим библиотекуcairocffi, которую нужно скачать вручную сhttp://www.lfd.uci.edu/~gohlke/pythonlibs/#cairocffiВыбрать под свою версию питона, напримерcairocffi‑1.3.0‑cp310‑cp310‑win_amd64.whl(для систем х64 и питона 3.10(это можно узнать по записиcp310))pip install cairocffi‑1.3.0‑cp310‑cp310‑win_amd64.whl //или другой ваш файл
pip install nf_presentationПроверить, что все установилось можно так:python 

>> import nf_presentationЕсли все прошло гладко, значит ты молодец, установка прошла успешно. В противном случае вылезет такая ошибкаOSError: no library called "cairo-2" was found
no library called "cairo" was found
no library called "libcairo-2" was found
cannot load library 'libcairo.so.2': error 0x7e
cannot load library 'libcairo.2.dylib': error 0x7e
cannot load library 'libcairo-2.dll': error 0x7eЗначитcairocffiвсе еще неправильно установлена, попробуй удалить ееpip uninstall cairocffiи попробуй еще раз. И да прибудет с тобой силаИспользованиеБазовый код выглядит так:import nf_presentation

# для тренировки
pptx_bytes= nf_presentation.from_training(input_data=training_data_dict)
# для события
pptx_bytes= nf_presentation.from_event(input_data=event_data_dict)
# или для одного упражнения
pptx_bytes= nf_presentation.from_single_exercise(
    input_data=exercise_data_dict,
    render_options={
        'scheme_1':True,
        'scheme_2':False,
        'video_1':True,
        'video_2':False,
        'animation_1':True
        })

response=HttpResponse(pptx_bytes, content-type='application/vnd.ms-powerpoint'
resonse['Content-Disposition']='attachement;filename="out.pptx"'
return responsepptx_bytesэто массив байтов, которые уже можно передать пользователям NanoFootballЗапись в файл или потокДля работы локально иногда может потребовать записать данные файл, для этого достаточно добавить аргументoutput_file.import nf_presentation

nf_presentation.from_training(input_data=training_data_dict, output_file='out.pptx')Теперьcreate_pptx()вернет NoneТестовые данныеВ пакет встроенны тестовые данные, и работоспособность пакета можно указавinput_data='test'import nf_presentation

pptx_bytes= nf_presentation.from_training(input_data='test')
# или для одного упражнения
pptx_bytes= nf_presentation.from_singe_exercise(input_data='test')Для вывода во временный файл достаточно назначить аргументoutput_fileвывода во временный файл можно использовать поток, как в примере вышеimport nf_presentation

nf_presentation.from_singe_exercise(output_file='from_test_data.pptx')ТестированиеВ корневой скачанной папке запуститьpython -m unittestПроблемыБольше всего времени уходит на создание схемы. А все потому что он выкачивает из интернета ссылки на файлы, если бы я знал, где локально хранятся файлы, это можно было бы в разы ускоритьОписание пока вообще не рендеритсяУпражнения которые приходят из событий по структуре отличаются от упражнений в списке упражненийTODOпочинил схему в упражненииhttp://nanofootball.com/exercises/exercise?id=9793&nfb=1&type=nfb_foldersотловил похожие ошибки с полигонами2675Побавить замены в схемах по regex,для ворот, а может быть для всех картинок вообще добавить preserverAspectRatioдля fillСкачивание должно стоять и внутри упражнения тожеИспользование анимаций в from_event()Можно ли получить исходный формат exercise_info как в nanofootball.com/exercisesЦели в левой таблице-> текст по центру колонкиСлайды создаются из двустороннего шаблонаЦветаCоздать презентацию для каждого упражнения, дабы отловить возможные ошибкиПоказывать ошибку, если файл не найдеy в assets, и картинка по умолчанию)Текущие проблемыНекоторые схемы получаются искаженными, даже в упражнении из тестовых данных. Там одни из ворот почему-то вытянуты по диагонали. Слава богу, в похожей схеме из другого упражнения все нормально. Так что сравнив схемы там и там, можно решить проблемуВ данный момент изображения создаются из других изображений(ворот, игроков и прочее). И эти ворота игроки скачиваются из интернета. Было бы неплохо, если бы можно было искать эти файлы локально, на сервере. Это помогло бы ускорить процесс.Битый SVGВ аттрибуте shchemeData упражения хранится svg фай схемы. Можно было бы легко пользоваться этими свг, и переделать их в пнг. Но есть проблема. Эти SVG битые.Аттрибуты записаны некорректно. То есть с точки зрения браузера они написаны верно, а с точки зрения форматирования svg - нет. Дело в том, что для браузера не существует различий между прописными с строчными буквами, например viewBox и viewbox для браузера выглядят одинаково, но для любой программы читающей изображения(в том числе cairoSVG) viewbox без большой буквы будет считаться ошибкой и пропущен обработчиком.Поэтому важно поправить данные полях схем, перед передачей в субпрограмму, которая из этой свг сделает PNGПри обработке SVG данных из schemeData упражнения будут сделаны такие заменыviewbox -> viewBoxmarkerwidth -> markerWidthrefx -> refXк некоторым внешним svg приписывается параметр preserveAspectRatio, чтобы они правильно отображалисьстроки типа style='...; fill="$0000000a1"' cairo не читает, цвет и прорачность выносится за тег style, можно использовать формат записи такой style="... fill: rgba(255, 255, 0, 0.1)", его каиро понимает...Все такие замены набиваются руками и лежат в nf_presentation.settings.svg_replacements
так же можно воспользоваться фукцией nf_presentation.settings.add_svg_replacement(old,fix), чтобы добавить новую подстановку. Потому что в дальнейшем список таких замен будет только расширяться, и если картинка на выходе не совсем походит на ту, что на сайте, скорее всего нужно поправить какой-то битый аттрибут.Зависимости SVGВ каждой картинке схемы из базы данных хранится ссылки на другие файлы, к счастью CairoSVG может использовать веб ссылки для картинок, чтобы создать потом png файлПри обрботке svg схемы все ссылки /static/schemeDrawer/img/... будут заменяться наhttp://nanofootball.com/static/schemeDrawer/img/...Подразумевается что все картинки доступны по адресуhttp://nanofootball.com/static/schemeDrawer/img/...Зависимости перекодировщика SVG -> PNGМодуль cairosvg, который собсно и перегружает картинки имеет в зависимостях cairocffi, которые на виндоус надо устанавливать отдельно, а в линуксе пока вообще хз что. Кажется это довольно грузная зависимость для сервера NFВ данный момент подразумевается, что при установке пакета nf-presentation устанавливается CairoSVG, которая в свою очередь автоматически установит cairocffi на линкус систему. Подразумевается, что наш НФ сервер работает на линуксе