diff --git a/djaif/book/book_map.py b/djaif/book/book_map.py index 681a134..8b09b3f 100644 --- a/djaif/book/book_map.py +++ b/djaif/book/book_map.py @@ -1,46 +1,57 @@ -from graphviz import Digraph - from djaif.book import models def book_map(book): - dig = Digraph('Map') + dig = ['digraph {', + ' node [style="filled"]' + ] for page in book.bookpage_set.all(): - dig.node( - _pid(page), - label='{page.id}:"{page.title}"\n{items}'.format( - page=page, - items='\n'.join( - '+ {id}:"{name}"'.format( - id=i.id, name=i.name[:10], - ) for i in page.items.all() + dig.append('{pid} [ \ + label="{label}" \ + tooltip="{tooltip}" \ + href="{href}" \ + ]'.format( + pid = _pid(page), + label='{page.title} ({page.id})\\n{items}'.format( + page=page, + items='\\n'.join( + '+ {id}: {name}'.format( + id=i.id, name=i.name[:10], + ) for i in page.items.all() + ), ), - ), - tooltip=page.body, - href='/admin/book/bookpage/{0.id}/change'.format(page), + tooltip=page.body.replace("\r\n", " "), + href='/admin/book/bookpage/{0.id}/change'.format(page), + ) ) links = models.PageLink.objects.filter(from_page__book_id=book.id) for link in links.all(): - dig.edge( - _pid(link.from_page), - _pid(link.to_page), - label='{link.id}:"{shortname}"\n{items}'.format( - link=link, - shortname=link.name[:10], - items='\n'.join( - '? {id}:"{name}"'.format( - id=i.id, name=i.name[:10], - ) for i in link.items.all() + dig.append('{from_page} -> {to_page} [ \ + shape="circle" \ + label="{label}" \ + labeltooltip="{labeltooltip}" \ + labelhref="{labelhref}" \ + ]'.format( + from_page = _pid(link.from_page), + to_page = _pid(link.to_page), + label='{link.id}: {shortname}\\n{items}'.format( + link=link, + shortname=link.name[:10], + items='\\n'.join( + '? {id}: {name}'.format( + id=i.id, name=i.name[:10], + ) for i in link.items.all() + ), ), - ), - labeltooltip=link.name, - labelhref='/admin/book/pagelink/{0.id}/change'.format(link), + labeltooltip=link.name, + labelhref='/admin/book/pagelink/{0.id}/change'.format(link), + ) ) - dig.format = 'svg' # noqa: WPS125 - return dig.pipe().decode('utf-8') + dig.append('}') + return ' '.join(dig) def _pid(page): diff --git a/djaif/book/templates/map.html b/djaif/book/templates/map.html new file mode 100644 index 0000000..74b7f85 --- /dev/null +++ b/djaif/book/templates/map.html @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + diff --git a/djaif/book/views.py b/djaif/book/views.py index 595faef..926fe75 100644 --- a/djaif/book/views.py +++ b/djaif/book/views.py @@ -189,7 +189,11 @@ def delete_save(request, book_id, save_id): def view_book_map(request, book_id): book = get_object_or_404(models.Book, id=book_id) - return FileResponse(book_map.book_map(book), filename='map.svg') + return render( + request, + 'map.html', + context={'book': book_map.book_map(book)}, + ) @on_progress diff --git a/poetry.lock b/poetry.lock index 483ea34..afc0ba9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -27,17 +27,17 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "backports.zoneinfo" @@ -118,21 +118,21 @@ python-versions = ">=3.6,<4.0" [[package]] name = "django" -version = "4.0.6" +version = "4.1" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." category = "main" optional = false python-versions = ">=3.8" [package.dependencies] -asgiref = ">=3.4.1,<4" +asgiref = ">=3.5.2,<4" "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} sqlparse = ">=0.2.2" tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] +argon2 = ["argon2-cffi (>=19.1.0)"] [[package]] name = "django-extensions" @@ -353,19 +353,6 @@ python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -[[package]] -name = "graphviz" -version = "0.20" -description = "Simple Python interface for Graphviz" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -dev = ["tox (>=3)", "flake8", "pep8-naming", "wheel", "twine"] -docs = ["sphinx (>=4)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] -test = ["pytest (>=7)", "pytest-mock (>=3)", "mock (>=4)", "pytest-cov", "coverage"] - [[package]] name = "isort" version = "4.3.21" @@ -427,7 +414,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pbr" -version = "5.9.0" +version = "5.10.0" description = "Python Build Reasonableness" category = "dev" optional = false @@ -488,12 +475,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.12.0" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "python-dotenv" version = "0.20.0" @@ -515,7 +505,7 @@ python-versions = ">=3.6" [[package]] name = "regex" -version = "2022.7.9" +version = "2022.8.17" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -606,7 +596,7 @@ python-versions = "*" [[package]] name = "tzdata" -version = "2022.1" +version = "2022.2" description = "Provider of IANA time zone data" category = "main" optional = false @@ -644,7 +634,7 @@ typing_extensions = ">=3.6,<4.0" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "e95d05acd7bbe1135e0940f75a2d2c0b493c3f78b71ce02256705b9b7a8a5b37" +content-hash = "587fbd35665bf382e52fc849fc2ac2a85068f5958f0fa125d538c662bdde740d" [metadata.files] appdirs = [] @@ -656,10 +646,7 @@ astor = [ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, ] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] +attrs = [] "backports.zoneinfo" = [ {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, @@ -758,7 +745,6 @@ gitpython = [ {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, ] -graphviz = [] isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, @@ -770,10 +756,7 @@ mccabe = [ ] parso = [] pathspec = [] -pbr = [ - {file = "pbr-5.9.0-py2.py3-none-any.whl", hash = "sha256:e547125940bcc052856ded43be8e101f63828c2d94239ffbe2b327ba3d5ccf0a"}, - {file = "pbr-5.9.0.tar.gz", hash = "sha256:e8dca2f4b43560edef58813969f52a56cef023146cbb8931626db80e6c1c4308"}, -] +pbr = [] pep8-naming = [ {file = "pep8-naming-0.9.1.tar.gz", hash = "sha256:a33d38177056321a167decd6ba70b890856ba5025f0a8eca6a3eda607da93caf"}, {file = "pep8_naming-0.9.1-py2.py3-none-any.whl", hash = "sha256:45f330db8fcfb0fba57458c77385e288e7a3be1d01e8ea4268263ef677ceea5f"}, @@ -791,10 +774,7 @@ pyflakes = [ {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] +pygments = [] python-dotenv = [] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, @@ -862,10 +842,7 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] -tzdata = [ - {file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"}, - {file = "tzdata-2022.1.tar.gz", hash = "sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3"}, -] +tzdata = [] wemake-python-styleguide = [ {file = "wemake-python-styleguide-0.14.1.tar.gz", hash = "sha256:e13dc580fa56b7b548de8da170bccb8ddff2d4ab026ca987db8a9893bf8a7b5b"}, {file = "wemake_python_styleguide-0.14.1-py3-none-any.whl", hash = "sha256:73a501e0547275287a2b926515c000cc25026a8bceb9dcc1bf73ef85a223a3c6"}, diff --git a/pyproject.toml b/pyproject.toml index a3a0ff0..0179d60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,6 @@ authors = ["Your Name