From 030dff6f056b77738ea641912a54992c7c1f8fb0 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Fri, 10 Nov 2017 22:31:26 +0100 Subject: [PATCH 1/7] NOTE: Moved to https://github.com/cfra/eventmap From 400b65b1b04927cf841f021fd44ccc741e5c83dc Mon Sep 17 00:00:00 2001 From: olf Date: Tue, 25 Feb 2020 23:31:25 +0100 Subject: [PATCH 2/7] Make transition to Python3 Tested with Python3.8.1 --- Dockerfile | 2 +- run_server.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index ae94504..16be799 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:stretch +FROM python:3.8.1-buster MAINTAINER nobody@nowhere.ws RUN set -x \ diff --git a/run_server.py b/run_server.py index 6a62073..f1b4584 100755 --- a/run_server.py +++ b/run_server.py @@ -6,7 +6,7 @@ # import os -from cStringIO import StringIO +from io import StringIO import hashlib import threading import json @@ -25,13 +25,13 @@ def __init__(self, synchronized_json): super(SynchronizedJSONAutoLoader, self).__init__() def run(self): - print "Autoloader Starting up" + print("Autoloader Starting up") time.sleep(2) while cherrypy.engine.state == cherrypy.engine.states.STARTED: time.sleep(1) with self._synchronized_json.lock: self._synchronized_json.load() - print "Autoloader Exiting" + print("Autoloader Exiting") class SynchronizedJSON(object): def __init__(self, filename): @@ -73,7 +73,7 @@ def _update_sync_id(self): del doc['sync-id'] hashed_data = json.dumps(doc) h = hashlib.sha256() - h.update(hashed_data) + h.update(hashed_data.encode('utf-8')) doc['sync-id'] = h.hexdigest() self._new['data'] = json.dumps(doc, indent=4) self._new['sync-id'] = h.hexdigest() @@ -89,7 +89,7 @@ def set_data(self, data): self._update_sync_id() with open(self._filename + '.new', 'wb') as f: - f.write(self._new['data']) + f.write(self._new['data'].encode("utf-8")) f.flush() os.fsync(f.fileno()) os.rename(self._filename + '.new', self._filename) @@ -140,7 +140,7 @@ def __init__(self, path): self.markers = EventMapMarkerApi(path) def test_log(msg, level): - print "%s, %s" % (msg, level) + print("%s, %s" % (msg, level)) if __name__ == '__main__': publish = len(sys.argv) >= 2 and sys.argv[1] == '-P' @@ -151,7 +151,8 @@ def test_log(msg, level): 'server.socket_port': 8023, 'server.thread_pool_max': 500, 'server.thread_pool': 100, - 'log.screen': True + 'log.screen': True, + 'tools.encode.text_only': False }) cherrypy.tree.mount(None, '/', { From 8394dbcbb5dbdcc74fc7b769dc684596a195ca88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20R=C3=A4misch?= Date: Wed, 26 Feb 2020 17:19:25 +0100 Subject: [PATCH 3/7] Fixed broken read_layers.py for docker deployment --- Dockerfile | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 16be799..14c0c05 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,21 @@ -FROM python:3.8.1-buster +FROM debian:buster MAINTAINER nobody@nowhere.ws RUN set -x \ && apt-get update && apt-get install -y --no-install-recommends \ gir1.2-poppler-0.18 \ - python-cairo \ - python-gi \ - python-gi-cairo \ - python-gobject \ - python-pip \ - python-setuptools \ - python-wheel + python3-cairo \ + python3-gi \ + python3-gi-cairo \ + python3-pip \ + python3-setuptools \ + python3-wheel RUN mkdir /srv/eventmap WORKDIR /srv/eventmap COPY requirements.txt /srv/eventmap/requirements.txt -RUN pip install -r requirements.txt +RUN pip3 install -r requirements.txt COPY ./ /srv/eventmap From 3e41b2acbdd4e2d9da8734d2bab6780571532b11 Mon Sep 17 00:00:00 2001 From: olf Date: Thu, 27 Feb 2020 07:24:05 +0100 Subject: [PATCH 4/7] use python3 instead of python in Dockerfile CMD --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 14c0c05..6a8fe65 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,6 @@ COPY ./ /srv/eventmap VOLUME [ "/srv/eventmap/data" ] -CMD [ "python", "run_server.py", "-P" ] +CMD [ "python3", "run_server.py", "-P" ] EXPOSE 8023 From 899dfefb9c5bd984e45d1b8519a3d3525e619d5c Mon Sep 17 00:00:00 2001 From: olf Date: Thu, 27 Feb 2020 07:39:48 +0100 Subject: [PATCH 5/7] Fix unorderability of Layer __cmp__ is not respected in Python 3, therefore a TypeError is raised in L215 in read_layers.py when it is attempted to sort the layers. This was fixed by renaming the __cmp__ method to __lt__. --- read_layers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/read_layers.py b/read_layers.py index c28b3c9..957d820 100644 --- a/read_layers.py +++ b/read_layers.py @@ -59,8 +59,8 @@ def draw(self, context): def _load_file(self, path): raise NotImplementedError - def __cmp__(self, other): - return cmp(self.name, other.name) + def __lt__(self, other): + return self.name < other.name class PdfLayer(Layer): From a96c395fc3b810c7bff85fb0cf33716427c84559 Mon Sep 17 00:00:00 2001 From: olf Date: Thu, 27 Feb 2020 19:38:29 +0100 Subject: [PATCH 6/7] use pymupdf instead of Poppler --- read_layers.py | 40 +++++++++++++++------------------------- requirements.txt | 1 + 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/read_layers.py b/read_layers.py index 957d820..018ef10 100644 --- a/read_layers.py +++ b/read_layers.py @@ -8,8 +8,10 @@ # import cairo +import fitz import json import math +import io import os import shutil import stat @@ -62,44 +64,32 @@ def _load_file(self, path): def __lt__(self, other): return self.name < other.name - -class PdfLayer(Layer): - def _load_file(self, path): - import gi - gi.require_version('Poppler', '0.18') - from gi.repository import Poppler - document = Poppler.Document.new_from_file('file://{0}'.format(path), None) - self._page = document.get_page(0) +class ImageLayer(Layer): @property def _orig_width(self): - return self._page.get_size()[0] + return self._image.get_width() @property def _orig_height(self): - return self._page.get_size()[1] + return self._image.get_height() def draw(self, context): - super(PdfLayer, self).draw(context) - self._page.render(context) + super().draw(context) + context.set_source_surface(self._image) + context.paint() -class PngLayer(Layer): +class PdfLayer(ImageLayer): def _load_file(self, path): - self._image = cairo.ImageSurface.create_from_png(path) + document = fitz.open(path) + image = io.BytesIO(document.loadPage(0).getPixmap().getPNGData()) + self._image = cairo.ImageSurface.create_from_png(image) - @property - def _orig_width(self): - return self._image.get_width() - @property - def _orig_height(self): - return self._image.get_height() - - def draw(self, context): - super(PngLayer, self).draw(context) - context.set_source_surface(self._image) - context.paint() +class PngLayer(ImageLayer): + def _load_file(self, path): + self._image = cairo.ImageSurface.create_from_png(path) class LayerLoader(object): diff --git a/requirements.txt b/requirements.txt index 9a22a70..fb9aead 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,7 @@ jaraco.functools==1.20 more-itertools==4.3.0 portend==2.3 pytz==2018.7 +PyMuPDF==1.16.6 PyYAML==3.13 six==1.12.0 tempora==1.14 From 424bc0a6cc18d4bee900be0bf62f7ed2342ea482 Mon Sep 17 00:00:00 2001 From: olf Date: Thu, 27 Feb 2020 19:43:11 +0100 Subject: [PATCH 7/7] Update Dockerfile We now use python:3.8.1-buster as baseimage. Without the gobject dependency we can use the latest python version, without running into trouble to not find the gobject bindings for that version. This also allows us, to use the latest version of pymupdf, as the only available wheel for buster default python 3.7.3 was 1.16.6. Now: 1.16.11 --- Dockerfile | 14 ++------------ requirements.txt | 3 ++- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6a8fe65..b906d02 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,6 @@ -FROM debian:buster +FROM python:3.8.1-buster MAINTAINER nobody@nowhere.ws -RUN set -x \ - && apt-get update && apt-get install -y --no-install-recommends \ - gir1.2-poppler-0.18 \ - python3-cairo \ - python3-gi \ - python3-gi-cairo \ - python3-pip \ - python3-setuptools \ - python3-wheel - RUN mkdir /srv/eventmap WORKDIR /srv/eventmap COPY requirements.txt /srv/eventmap/requirements.txt @@ -21,6 +11,6 @@ COPY ./ /srv/eventmap VOLUME [ "/srv/eventmap/data" ] -CMD [ "python3", "run_server.py", "-P" ] +CMD [ "python", "run_server.py", "-P" ] EXPOSE 8023 diff --git a/requirements.txt b/requirements.txt index fb9aead..8fb2e99 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,8 @@ jaraco.functools==1.20 more-itertools==4.3.0 portend==2.3 pytz==2018.7 -PyMuPDF==1.16.6 +pycairo==1.19.1 +PyMuPDF==1.16.11 PyYAML==3.13 six==1.12.0 tempora==1.14