{ "info": { "author": "Federico Capoano", "author_email": "nemesis@ninux.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Topic :: Internet :: WWW/HTTP", "Topic :: System :: Networking" ], "description": "django-netjsongraph\n===================\n\n.. image:: https://travis-ci.org/netjson/django-netjsongraph.svg\n :target: https://travis-ci.org/netjson/django-netjsongraph\n\n.. image:: https://coveralls.io/repos/netjson/django-netjsongraph/badge.svg\n :target: https://coveralls.io/r/netjson/django-netjsongraph\n\n.. image:: https://requires.io/github/netjson/django-netjsongraph/requirements.svg?branch=master\n :target: https://requires.io/github/netjson/django-netjsongraph/requirements/?branch=master\n :alt: Requirements Status\n\n.. image:: https://badge.fury.io/py/django-netjsongraph.svg\n :target: http://badge.fury.io/py/django-netjsongraph\n\n.. image:: https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square\n :target: https://gitter.im/openwisp/general\n\n------------\n\nReusable django app for collecting and visualizing network topology.\n\n.. image:: https://raw.githubusercontent.com/netjson/django-netjsongraph/master/docs/images/visualizer.png\n\n.. image:: https://raw.githubusercontent.com/netjson/django-netjsongraph/master/docs/images/admin.png\n\n.. contents:: **Table of Contents**:\n :backlinks: none\n :depth: 3\n\n------------\n\nCurrent features\n----------------\n\n* **network topology collector** supporting different formats:\n - NetJSON NetworkGraph\n - OLSR (jsoninfo/txtinfo)\n - batman-adv (jsondoc/txtinfo)\n - BMX6 (q6m)\n - CNML 1.0\n - OpenVPN\n - additional formats can be added by `specifying custom parsers <#netjsongraph-parsers>`_\n* **network topology visualizer** based on `netjsongraph.js `_\n* **simple HTTP API** that exposes data in `NetJSON `__ *NetworkGraph* format\n* **admin interface** that allows to easily manage, audit, visualize and debug topologies and their relative data (nodes, links)\n* **receive topology** from multiple nodes\n* **topology history**: allows saving daily snapshots of each topology that can be viewed in the frontend\n\nProject goals\n-------------\n\n* make it easy to visualize network topology data for the formats supported by `netdiff `_\n* expose topology data via RESTful resources in *NetJSON NetworkGraph* format\n* make it easy to integrate in larger django projects to improve reusability\n* make it easy to extend its models by providing abstract models (**needs improvement in this point**)\n* provide ways to customize or replace the visualizer (**needs improvement in this point**)\n* keep the core very simple\n* provide ways to extend the default behaviour\n* encourage new features to be published as extensions\n\nDeploy it in production\n-----------------------\n\nAn automated installer is provided by the `OpenWISP `_ project:\n`ansible-openwisp2 `_.\n\nEnsure to follow the instructions explained in the following section: `Enabling the network topology\nmodule `_.\n\nInstall stable version from pypi\n--------------------------------\n\nInstall from pypi:\n\n.. code-block:: shell\n\n pip install django-netjsongraph\n\nInstall development version\n---------------------------\n\nInstall tarball:\n\n.. code-block:: shell\n\n pip install https://github.com/netjson/django-netjsongraph/tarball/master\n\nAlternatively you can install via pip using git:\n\n.. code-block:: shell\n\n pip install -e git+git://github.com/netjson/django-netjsongraph#egg=django-netjsongraph\n\nIf you want to contribute, install your cloned fork:\n\n.. code-block:: shell\n\n git clone git@github.com:/django-netjsongraph.git\n cd django-netjsongraph\n python setup.py develop\n\nSetup (integrate in an existing django project)\n-----------------------------------------------\n\nAdd ``rest_framework`` and ``django_netjsongraph`` to ``INSTALLED_APPS``:\n\n.. code-block:: python\n\n INSTALLED_APPS = [\n # other apps\n 'rest_framework',\n 'openwisp_utils.admin_theme',\n 'django_netjsongraph'\n # ...\n ]\n\nInclude urls in your urlconf (you can change the prefixes\naccording to your needs):\n\n.. code-block:: python\n\n from django.conf.urls import include, url\n\n from django_netjsongraph.api import urls as netjsongraph_api\n from django_netjsongraph.visualizer import urls as netjsongraph_visualizer\n\n urlpatterns = [\n # your URLs ...\n url(r'^api/', include(netjsongraph_api)),\n url(r'', include(netjsongraph_visualizer)),\n ]\n\nCreate database tables::\n\n ./manage.py migrate\n\nManagement Commands\n-------------------\n\n``update_topology``\n^^^^^^^^^^^^^^^^^^^\n\nAfter topology URLs (URLs exposing the files that the topology of the network) have been\nadded in the admin, the ``update_topology`` management command can be used to collect data\nand start playing with the network graph::\n\n ./manage.py update_topology\n\nThe management command accepts a ``--label`` argument that will be used to search in\ntopology labels, eg::\n\n ./manage.py update_topology --label mytopology\n\n``save_snapshot``\n^^^^^^^^^^^^^^^^^\n\nThe ``save_snapshot`` management command can be used to save the topology graph data which\ncould be used to view the network topology graph sometime in future::\n\n ./manage.py save_snapshot\n\nThe management command accepts a ``--label`` argument that will be used to search in\ntopology labels, eg::\n\n ./manage.py save_snapshot --label mytopology\n\nLogging\n-------\n\nThe ``update_topology`` management command will automatically try to log errors.\n\nFor a good default ``LOGGING`` configuration refer to the `test settings\n`_.\n\nStrategies\n----------\n\nThere are mainly two ways of collecting topology information:\n\n* **FETCH** strategy\n* **RECEIVE** strategy\n\nEach ``Topology`` instance has a ``strategy`` field which can be set to the desired setting.\n\nFETCH strategy\n^^^^^^^^^^^^^^\n\nTopology data will be fetched from a URL.\n\nWhen some links are not detected anymore they will be flagged as \"down\" straightaway.\n\nRECEIVE strategy\n^^^^^^^^^^^^^^^^\n\nTopology data is sent directly from one or more nodes of the network.\n\nThe collector waits to receive data in the payload of a POST HTTP request;\nwhen such a request is received, a ``key`` parameter it's first checked against\nthe ``Topology`` key.\n\nIf the request is authorized the collector proceeds to update the topology.\n\nIf the data is sent from one node only, it's highly advised to set the\n``expiration_time`` of the ``Topology`` instance to ``0`` (seconds), this way the\nsystem works just like in the **FETCH strategy**, with the only difference that\nthe data is sent by one node instead of fetched by the collector.\n\nIf the data is sent from multiple nodes, you **SHOULD** set the ``expiration_time``\nof the ``Topology`` instance to a value slightly higher than the interval used\nby nodes to send the topology, this way links will be flagged as \"down\" only if\nthey haven't been detected for a while. This mechanism allows to visualize the\ntopology even if the network has been split in several parts, the disadvantage\nis that it will take a bit more time to detect links that go offline.\n\nSettings\n--------\n\n``NETJSONGRAPH_PARSERS``\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n+--------------+-------------+\n| **type**: | ``list`` |\n+--------------+-------------+\n| **default**: | ``[]`` |\n+--------------+-------------+\n\nAdditional custom `netdiff parsers `_.\n\n``NETJSONGRAPH_SIGNALS``\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n+--------------+-------------+\n| **type**: | ``str`` |\n+--------------+-------------+\n| **default**: | ``None`` |\n+--------------+-------------+\n\nString representing python module to import on initialization.\n\nUseful for loading django signals or to define custom behaviour.\n\n``NETJSONGRAPH_TIMEOUT``\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n+--------------+-------------+\n| **type**: | ``int`` |\n+--------------+-------------+\n| **default**: | ``8`` |\n+--------------+-------------+\n\nTimeout when fetching topology URLs.\n\n``NETJSONGRAPH_LINK_EXPIRATION``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n+--------------+-------------+\n| **type**: | ``int`` |\n+--------------+-------------+\n| **default**: | ``60`` |\n+--------------+-------------+\n\nIf a link is down for more days than this number, it will be deleted by the\n``update_topology`` management command.\n\nSetting this to ``False`` will disable this feature.\n\n``NETJSONGRAPH_VISUALIZER_CSS``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n+--------------+--------------------------------+\n| **type**: | ``str`` |\n+--------------+--------------------------------+\n| **default**: | ``netjsongraph/css/style.css`` |\n+--------------+--------------------------------+\n\nPath of the visualizer css file. Allows customization of css according to user's\npreferences.\n\n``NETJSONGRAPH_NODE_EXPIRATION``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n+--------------+--------------------------------+\n| **type**: | ``int`` |\n+--------------+--------------------------------+\n| **default**: | ``False`` |\n+--------------+--------------------------------+\n\nIf a node has not been modified since the days specified and if it has no links,\nit will be deleted by the ``update_topology`` management command. This depends on\n``NETJSONGRAPH_LINK_EXPIRATION`` being enabled.\nReplace ``False`` with an integer to enable the feature.\n\nOverriding visualizer templates\n-------------------------------\n\nFollow these steps to override and customise the visualizer's default templates:\n\n* create a directory in your django project and put its full path in ``TEMPLATES['DIRS']``,\n which can be found in the django ``settings.py`` file\n* create a sub directory named ``netjsongraph`` and add all the templates which shall override\n the default ``netjsongraph/*`` templates\n* create a template file with the same name of the template file you want to override\n\nMore information about the syntax used in django templates can be found in the `django templates\ndocumentation `_.\n\nExample: overriding the ``\n\nExtending django-netjsongraph\n-----------------------------\n\n*django-netjsongraph* provides a set of models, admin classes and generic views which can be imported, extended and reused by third party apps.\n\nTo extend *django-netjsongraph*, **you MUST NOT** add it to ``settings.INSTALLED_APPS``, but you must create your own app (which goes into ``settings.INSTALLED_APPS``), import the base classes from django-netjsongraph and add your customizations.\n\nExtending models\n^^^^^^^^^^^^^^^^\n\nThis example provides an example of how to extend the base models of\n*django-netjsongraph*.\n\n.. code-block:: python\n\n # models.py of your custom ``network`` app\n from django.db import models\n\n from django_netjsongraph.base.link import AbstractLink\n from django_netjsongraph.base.node import AbstractNode\n from django_netjsongraph.base.snapshot import AbstractSnapshot\n from django_netjsongraph.base.topology import AbstractTopology\n # the model ``organizations.Organization`` is omitted for brevity\n # if you are curious to see a real implementation, check out django-organizations\n # https://github.com/bennylope/django-organizations\n\n class OrganizationMixin(models.Model):\n organization = models.ForeignKey('organization.Organization')\n\n class Meta:\n abstract = True\n\n\n class Topology(OrganizationMixin, AbstractTopology):\n def clean(self):\n # your own validation logic here\n pass\n\n class Meta(AbstractTopology.Meta):\n abstract = False\n\n\n class Node(AbstractNode):\n topology = models.ForeignKey('Topology')\n\n class Meta:\n abstract = False\n\n\n class Link(AbstractLink):\n topology = models.ForeignKey('Topology')\n source = models.ForeignKey('Node',\n related_name='source_link_set')\n target = models.ForeignKey('Node',\n related_name='source_target_set')\n\n class Meta:\n abstract = False\n\n class Snapshot(OrgMixin, AbstractSnapshot):\n topology = models.ForeignKey('topology.Topology', on_delete=models.CASCADE)\n\n class Meta(AbstractSnapshot.Meta):\n abstract = False\n\nExtending the admin\n^^^^^^^^^^^^^^^^^^^\n\nFollowing the above example, you can avoid duplicating the admin code by importing the base admin classes and registering your models with.\n\n.. code-block:: python\n\n # admin.py of your app\n from django.contrib import admin\n from django_netjsongraph.base.admin import (AbstractLinkAdmin,\n AbstractNodeAdmin,\n AbstractTopologyAdmin)\n # these are you custom models\n from .models import Link, Node, Topology\n\n\n class TopologyAdmin(AbstractTopologyAdmin):\n model = Topology\n\n\n class NodeAdmin(AbstractNodeAdmin):\n model = Node\n\n\n class LinkAdmin(AbstractLinkAdmin):\n model = Link\n\n\n admin.site.register(Link, LinkAdmin)\n admin.site.register(Node, NodeAdmin)\n admin.site.register(Topology, TopologyAdmin)\n\nExtending API views\n^^^^^^^^^^^^^^^^^^^\n\nIf your use case doesn't vary much from the base, you may also want to try to reuse the API views:\n\n.. code-block:: python\n\n # your app.api.views\n from ..models import Snapshot, Topology\n from django_netjsongraph.api.generics import (BaseNetworkCollectionView, BaseNetworkGraphHistoryView,\n BaseNetworkGraphView, BaseReceiveTopologyView)\n\n\n class NetworkCollectionView(BaseNetworkCollectionView):\n queryset = Topology.objects.filter(published=True)\n\n\n class NetworkGraphView(BaseNetworkGraphView):\n queryset = Topology.objects.filter(published=True)\n\n\n class ReceiveTopologyView(BaseReceiveTopologyView):\n model = Topology\n\n\n class NetworkGraphHistoryView(BaseNetworkGraphHistoryView):\n topology_model = Topology\n snapshot_model = Snapshot\n\n network_collection = NetworkCollectionView.as_view()\n network_graph = NetworkGraphView.as_view()\n network_graph_history = NetworkGraphHistoryView.as_view()\n receive_topology = ReceiveTopologyView.as_view()\n\nAPI URLs\n^^^^^^^^\n\nIf you are not making drastic changes to the api views, you can avoid duplicating the URL logic by using the ``get_api_urls`` function. Put this in your api ``urls.py``:\n\n.. code-block:: python\n\n # your app.api.urls\n from django_netjsongraph.utils import get_api_urls\n from . import views\n\n urlpatterns = get_api_urls(views)\n\nExtending Visualizer Views\n^^^^^^^^^^^^^^^^^^^^^^^^^^\nIf your use case doesn't vary much from the base, you may also want to try to reuse the Visualizer views:\n\n.. code-block:: python\n\n # your app.visualizer.views\n from ..models import Topology\n from .generics import BaseTopologyDetailView, BaseTopologyListView\n\n\n class TopologyListView(BaseTopologyListView):\n topology_model = Topology\n\n\n class TopologyDetailView(BaseTopologyDetailView):\n topology_model = Topology\n\n\n topology_list = TopologyListView.as_view()\n topology_detail = TopologyDetailView.as_view()\n\n\nVisualizer URLs\n^^^^^^^^^^^^^^^\nIf you are not making any drastic changes to visualizer views, you can avoid duplicating the URL logic by using ``get_visualizer_urls`` function. Put this in your visualizer ``urls.py``\n\n.. code-block:: python\n\n # your app.visualizer.urls\n from django_netjsongraph.utils import get_visualizer_urls\n from . import views\n\n urlpatterns = get_visualizer_urls(views)\n\nExtending AppConfig\n^^^^^^^^^^^^^^^^^^^\n\nYou may want to reuse the ``AppConfig`` class of *django-netjsongraph* too:\n\n.. code-block:: python\n\n from django_netjsongraph.apps import DjangoNetjsongraphConfig\n\n class MyOwnConfig(DjangoNetjsongraphConfig):\n name = 'yourapp'\n label = 'yourapp'\n\nInstalling for development\n--------------------------\n\nInstall sqlite:\n\n.. code-block:: shell\n\n sudo apt-get install sqlite3 libsqlite3-dev\n\nInstall your forked repo:\n\n.. code-block:: shell\n\n git clone git://github.com//django-netjsongraph\n cd django-netjsongraph/\n python setup.py develop\n\nInstall test requirements:\n\n.. code-block:: shell\n\n pip install -r requirements-test.txt\n\nCreate database:\n\n.. code-block:: shell\n\n cd tests/\n ./manage.py migrate\n ./manage.py createsuperuser\n\nLaunch development server:\n\n.. code-block:: shell\n\n ./manage.py runserver\n\nYou can access the visualizer at http://127.0.0.1:8000/\nand the admin interface at http://127.0.0.1:8000/admin/.\n\nRun tests with:\n\n.. code-block:: shell\n\n ./runtests.py\n\nContributing\n------------\n\nFirst off, thanks for taking the time to read these guidelines.\n\nTrying to follow these guidelines is important in order to minimize waste and\navoid misunderstandings.\n\n1. Ensure your changes meet the `Project Goals`_\n2. If you found a bug please send a failing test with a patch\n3. If you want to add a new feature, announce your intentions in the\n `issue tracker `_\n4. Fork this repo and install it by following the instructions in\n `Installing for development`_\n5. Follow `PEP8, Style Guide for Python Code`_\n6. Write code\n7. Write tests for your code\n8. Ensure all tests pass\n9. Ensure test coverage is not under 90%\n10. Document your changes\n11. Send pull request\n\n.. _PEP8, Style Guide for Python Code: http://www.python.org/dev/peps/pep-0008/\n.. _ninux-dev mailing list: http://ml.ninux.org/mailman/listinfo/ninux-dev\n\nChangelog\n---------\n\nSee `CHANGES `_.\n\nLicense\n-------\n\nSee `LICENSE `_.\n\nThis projects bundles third-party javascript libraries in its source code:\n\n- `D3.js (BSD-3-Clause) `_\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/interop-dev/django-netjsongraph/releases", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://netjson.org", "keywords": "django,netjson,mesh,networking", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-netjsongraph", "package_url": "https://pypi.org/project/django-netjsongraph/", "platform": "Platform Indipendent", "project_url": "https://pypi.org/project/django-netjsongraph/", "project_urls": { "Download": "https://github.com/interop-dev/django-netjsongraph/releases", "Homepage": "http://netjson.org" }, "release_url": "https://pypi.org/project/django-netjsongraph/0.4.3/", "requires_dist": [ "django (<2.1,>=1.11)", "djangorestframework (<3.8,>=3.3)", "django-model-utils", "netdiff (<0.7,>=0.6.0)", "openwisp-utils (<0.3,>=0.2)", "jsonfield", "six" ], "requires_python": "", "summary": "Reusable django app for collecting and visualizing network topology", "version": "0.4.3" }, "last_serial": 3612837, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "435964d9f131aa9833f887a3a4be4f80", "sha256": "ea68e086ac6383e288f74aa186ee2a40bd53dd0521b7b2ea8dac0925689a20b5" }, "downloads": -1, "filename": "django_netjsongraph-0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "435964d9f131aa9833f887a3a4be4f80", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 84545, "upload_time": "2015-12-23T17:33:22", "url": "https://files.pythonhosted.org/packages/44/01/2b454e856cdd9e6bf582cdcde72ca5e97e4be6631e01a07c2ccbd94188e9/django_netjsongraph-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "94db8f298fcedbb13c467c8767fc732e", "sha256": "ac1245ffdd4fae1d9a45d9f96558122470b651d518097daad9b383b0bcc5d6f2" }, "downloads": -1, "filename": "django-netjsongraph-0.1.tar.gz", "has_sig": true, "md5_digest": "94db8f298fcedbb13c467c8767fc732e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 76622, "upload_time": "2015-12-23T17:33:16", "url": "https://files.pythonhosted.org/packages/ea/50/0d9b7a156658449f628b5ae011f5b0805fa8d2c708ae9d14eeea2f73f9ab/django-netjsongraph-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "040b6cfd896c84f25ac8ee628624540c", "sha256": "22d9b466bb561b03774d86f8a2b25e393035f02a97404ec7003e278579846897" }, "downloads": -1, "filename": "django_netjsongraph-0.1.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "040b6cfd896c84f25ac8ee628624540c", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 87972, "upload_time": "2015-12-27T18:49:41", "url": "https://files.pythonhosted.org/packages/e2/fc/03b365fd3a21828213e86edbcdf83d876105c6c52821a202088fe9dfd62f/django_netjsongraph-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "51f2cdb876991551584f4d2bee8c454c", "sha256": "bde4d60bbb5df02ab01da78d5491847dc7a2925f17d4752f2d6ec08f91dadd19" }, "downloads": -1, "filename": "django-netjsongraph-0.1.1.tar.gz", "has_sig": true, "md5_digest": "51f2cdb876991551584f4d2bee8c454c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 78477, "upload_time": "2015-12-27T18:49:32", "url": "https://files.pythonhosted.org/packages/fa/3d/60f66f3ec4b78eb7a1b5f3a16384960527cd9a007bac0beeee4e904659a8/django-netjsongraph-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7704817996a612ad6da3d6d8c047379c", "sha256": "e3375f7cce33c1f92d52a754fbd10266820687948b32eff4d4f5bab3f7222276" }, "downloads": -1, "filename": "django_netjsongraph-0.1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "7704817996a612ad6da3d6d8c047379c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 90231, "upload_time": "2016-01-04T17:50:39", "url": "https://files.pythonhosted.org/packages/19/85/5472408d6f2eca5214af2cbd045f42815469862a640ab079c56963887b75/django_netjsongraph-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "119c9bb07eaa3dafe17a974aeeca9a13", "sha256": "c2cd46d1440c583c521fe43e2eb82fbe682440a01cdcf600649b003cd0e5d0d1" }, "downloads": -1, "filename": "django-netjsongraph-0.1.2.tar.gz", "has_sig": true, "md5_digest": "119c9bb07eaa3dafe17a974aeeca9a13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80441, "upload_time": "2016-01-04T17:50:31", "url": "https://files.pythonhosted.org/packages/b9/a0/ac52a0cf56295f4873be613c4451dc8d12b78e6829364792e1d22b4420c1/django-netjsongraph-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "46ce0b933fb8cab1ac78f7bc39f17c7c", "sha256": "2d611d69795a212dd9eebe01f75e03610042e32652f4687723c318fef1de9bf8" }, "downloads": -1, "filename": "django_netjsongraph-0.1.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "46ce0b933fb8cab1ac78f7bc39f17c7c", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 94948, "upload_time": "2016-01-09T22:29:31", "url": "https://files.pythonhosted.org/packages/2d/04/a759897273dcb2066ebcd3a815381b3ba4b9cfbf8407fb2e43c46f5203fa/django_netjsongraph-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6dc0e422617d44e17db2eb6b015a298f", "sha256": "b331278715a2a2dde748b125756f8f21f91c524293bcfc237d69fd5587895eb2" }, "downloads": -1, "filename": "django-netjsongraph-0.1.3.tar.gz", "has_sig": true, "md5_digest": "6dc0e422617d44e17db2eb6b015a298f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 81782, "upload_time": "2016-01-09T22:29:15", "url": "https://files.pythonhosted.org/packages/83/85/c5a36caad7ab05226dfe6016b0312288375fd30cbabe55fba92685c8aafb/django-netjsongraph-0.1.3.tar.gz" } ], "0.1.alpha": [], "0.2": [ { "comment_text": "", "digests": { "md5": "cf3b4b4aefce58608fa4891636ceb536", "sha256": "2b8782fb37c5c7f45b6a5f629178249c59bdc8e9b47021c85c94a609fcab6d6d" }, "downloads": -1, "filename": "django_netjsongraph-0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "cf3b4b4aefce58608fa4891636ceb536", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 224857, "upload_time": "2016-01-24T20:00:31", "url": "https://files.pythonhosted.org/packages/d9/5d/718ce59bee929ed04f778dfb269904c1e6d02213cc6af001b090aed91ab5/django_netjsongraph-0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4656b841d9beb67376886bb9afee3499", "sha256": "1dba15016ff7b5eb8b520d7ab0ea255bcf3538ab32657e6af93617a75b9d7301" }, "downloads": -1, "filename": "django-netjsongraph-0.2.tar.gz", "has_sig": true, "md5_digest": "4656b841d9beb67376886bb9afee3499", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 154939, "upload_time": "2016-01-24T20:00:04", "url": "https://files.pythonhosted.org/packages/03/30/d840ac315d6f78a7a4cf33dec77dd9794a0146c0b6ad12260503a24b4df3/django-netjsongraph-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "55eda83ae096eec77bc9ffafd4c0a5c4", "sha256": "fd90da5a7f7677704e98b5b0f7dde5f97165ddd5fc7de8e5310da6fecc124987" }, "downloads": -1, "filename": "django_netjsongraph-0.2.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "55eda83ae096eec77bc9ffafd4c0a5c4", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 101165, "upload_time": "2016-05-20T09:12:27", "url": "https://files.pythonhosted.org/packages/ae/b3/aadd27a773422e4e3a0ae767ced1fd3cb9ca3c72bc8aaf553e57fb85dab5/django_netjsongraph-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92279d8283c30b6ef87afb3bf322bec7", "sha256": "bcdf4b744a07a8f1757a3dc6124f458b492b75a6561a7d4cf8e54b91a9eacbd9" }, "downloads": -1, "filename": "django-netjsongraph-0.2.1.tar.gz", "has_sig": true, "md5_digest": "92279d8283c30b6ef87afb3bf322bec7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86555, "upload_time": "2016-05-20T09:11:58", "url": "https://files.pythonhosted.org/packages/08/09/f41b3ea770b9afdcf6708cec8e931d739bd33c229aae8349371a8dbf5798/django-netjsongraph-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "bfddee7c25fb0b3b1a26fbfdaaab1cba", "sha256": "c47fe003850ca36de9f56400190bc1a1df2a6aa2c5e8d000f878c794ff764e98" }, "downloads": -1, "filename": "django_netjsongraph-0.2.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "bfddee7c25fb0b3b1a26fbfdaaab1cba", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 101429, "upload_time": "2016-12-14T17:09:17", "url": "https://files.pythonhosted.org/packages/72/9e/6cc87c0fee29dc7dcd497b22f0c25f949137f934568ae1aa744c6a0760e7/django_netjsongraph-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d4f1aa894a436df6514d6b7ccd5fe9a", "sha256": "88772f6ea5da86fec4d3ba9584f5bbb728b9a3ce671df2ac93804b8bd98e96e5" }, "downloads": -1, "filename": "django-netjsongraph-0.2.2.tar.gz", "has_sig": true, "md5_digest": "2d4f1aa894a436df6514d6b7ccd5fe9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86909, "upload_time": "2016-12-14T17:09:14", "url": "https://files.pythonhosted.org/packages/05/82/43591c2ec156fc8f57d8278edb116ed4b90d9ee9e1c942b7b5856747ca1e/django-netjsongraph-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "40ac81c748c963526e1d6ba1a15812fb", "sha256": "505525bb7383d27daf680e0d4834b394548c56205339aa781be50aff5340f46f" }, "downloads": -1, "filename": "django_netjsongraph-0.2.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "40ac81c748c963526e1d6ba1a15812fb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 102500, "upload_time": "2017-05-18T10:10:33", "url": "https://files.pythonhosted.org/packages/90/4c/09acefd5caf57e794a1bb6e7a7391f1896160df4e80d4c6200cd32fc3457/django_netjsongraph-0.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a69565be4d821c971cb7a8b88243b17", "sha256": "40f6b9079ed09a1ea369adf513161553f75d3a6d1ca17b3ac62411e7be94078a" }, "downloads": -1, "filename": "django-netjsongraph-0.2.3.tar.gz", "has_sig": true, "md5_digest": "3a69565be4d821c971cb7a8b88243b17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87479, "upload_time": "2017-05-18T10:10:36", "url": "https://files.pythonhosted.org/packages/17/f4/a8f52b9ce5a94b5c36e777cceb3a81be39cef0887943e6cf89a16bdb9ac4/django-netjsongraph-0.2.3.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "34d76ee77cb8f624070f8324c70acd5b", "sha256": "22528ea535b639f8875b1de3a1b973730f2de8840abf25ac74eb480dada34e7d" }, "downloads": -1, "filename": "django_netjsongraph-0.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "34d76ee77cb8f624070f8324c70acd5b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 108707, "upload_time": "2017-05-31T10:33:48", "url": "https://files.pythonhosted.org/packages/e9/96/fe348a22429101044796b927924216cb97f3f4b0e6a61ac0cecb1a1827e3/django_netjsongraph-0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1d241601450cc13b414e6a54b4a96e0b", "sha256": "642a9bb7c6cf5e799b50bc70b5b0815de9141f181a69ffcda94f89aa24ea6210" }, "downloads": -1, "filename": "django-netjsongraph-0.3.tar.gz", "has_sig": true, "md5_digest": "1d241601450cc13b414e6a54b4a96e0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93377, "upload_time": "2017-05-31T10:33:52", "url": "https://files.pythonhosted.org/packages/7a/cc/10cff80aedad605505af4f17fcc067063fc713fc48fe65aad96787d477e9/django-netjsongraph-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "335c3e69837d7057a040193c713c7264", "sha256": "315236c43115902ab71d16d8dcc750a39c69bab619763bd6239b3b9fac1a6403" }, "downloads": -1, "filename": "django_netjsongraph-0.3.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "335c3e69837d7057a040193c713c7264", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 114688, "upload_time": "2017-06-22T11:18:31", "url": "https://files.pythonhosted.org/packages/dc/fb/aeee671cc023146ca86251b4b24ececec3bbb76879740e5622ab0a666154/django_netjsongraph-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87c928315b56b00243ba9b154ab6c538", "sha256": "3ff77858bb450ced37c4b6b70e579b81523b59f212eff75a34f312371a02bc35" }, "downloads": -1, "filename": "django-netjsongraph-0.3.1.tar.gz", "has_sig": true, "md5_digest": "87c928315b56b00243ba9b154ab6c538", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 97091, "upload_time": "2017-06-22T11:18:34", "url": "https://files.pythonhosted.org/packages/f9/39/002e866f1bc66414018b3c51fecfde6fbef505832e875bb071ed601ca2a0/django-netjsongraph-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "1233566fa2d2f0db30e4ed5c82d2fb7f", "sha256": "0e6bc8ebeeaf7b58e6bb36d6577623d9bfb0d3f96027008aab5d0f50b29c3481" }, "downloads": -1, "filename": "django_netjsongraph-0.3.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "1233566fa2d2f0db30e4ed5c82d2fb7f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 113868, "upload_time": "2017-07-10T16:11:19", "url": "https://files.pythonhosted.org/packages/37/5a/c01e8b76743c7e71047c76534f8417af314e6ca4cf9589cf0cf633749f95/django_netjsongraph-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1e1c857e7554a2eee146114352d9e2d", "sha256": "b56fffec3ab8cd2e4864935630a0c86eebb352ac210ab9ede73e26814737e24a" }, "downloads": -1, "filename": "django-netjsongraph-0.3.2.tar.gz", "has_sig": true, "md5_digest": "e1e1c857e7554a2eee146114352d9e2d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 96947, "upload_time": "2017-07-10T16:11:22", "url": "https://files.pythonhosted.org/packages/27/4a/e9595433a1bd89a450bb0f41322d2e0da77b4f7c3f8f53283be851c88c39/django-netjsongraph-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "8e3d943b03fda4d953700d2fa3b8a771", "sha256": "102397cbde540033ea39c9739c3ed4393e28ebab7ea2eb8d2d1edaa1361f1239" }, "downloads": -1, "filename": "django_netjsongraph-0.3.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "8e3d943b03fda4d953700d2fa3b8a771", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 117195, "upload_time": "2017-07-22T14:53:53", "url": "https://files.pythonhosted.org/packages/81/3a/5072873500541c77cf19f3b3ce4c838dd579f936e9807ad7d23abd778934/django_netjsongraph-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "100c3df2a72cb47b271191b18415eee9", "sha256": "c5089d560d4def6feac7c6e16c3f717c08e2b238be1412d8b167f3e1c0e28183" }, "downloads": -1, "filename": "django-netjsongraph-0.3.3.tar.gz", "has_sig": true, "md5_digest": "100c3df2a72cb47b271191b18415eee9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98289, "upload_time": "2017-07-22T14:53:55", "url": "https://files.pythonhosted.org/packages/37/25/ae8f3d9f51996f7fee2687b94cc0cd06a227f0fb3b96b60f2d933a1717c2/django-netjsongraph-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "708d3a8d44b7a01c126e731d2edd6b53", "sha256": "21de47c30ac467d2ae344f388165d0480355c444658ec4edd69cc178cbbb2e32" }, "downloads": -1, "filename": "django_netjsongraph-0.3.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "708d3a8d44b7a01c126e731d2edd6b53", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 117191, "upload_time": "2017-08-18T22:49:42", "url": "https://files.pythonhosted.org/packages/e7/dc/1a6727e6b88acdd4611c1db6f7ba1e35877b7758ac0d463cb1fc79191e9c/django_netjsongraph-0.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "364b419b1ba128208f65eac906ba5cbf", "sha256": "07b25972667e7b52fb9c62b9ef022f1b51b0ddf9521e75ed18e9eded1469e276" }, "downloads": -1, "filename": "django-netjsongraph-0.3.4.tar.gz", "has_sig": true, "md5_digest": "364b419b1ba128208f65eac906ba5cbf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98345, "upload_time": "2017-08-18T22:49:45", "url": "https://files.pythonhosted.org/packages/48/af/0116b248dd0742d861931ca29a7c67fff97a17a2d7b3dc30e5b3b3c31329/django-netjsongraph-0.3.4.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "8dbef2d33694d741973212f4c9bff0a1", "sha256": "a863c8c155dc353ca4c4b23e02d4e798735d8b9ff0bdd38cdd778fe1ee1e6811" }, "downloads": -1, "filename": "django_netjsongraph-0.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "8dbef2d33694d741973212f4c9bff0a1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 207597, "upload_time": "2017-12-27T20:43:14", "url": "https://files.pythonhosted.org/packages/3c/2c/5c08dda3bc7ce3f51f2a5979c1fa5ad527404b83c8d765070f15a84de44c/django_netjsongraph-0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6ecc4261c0c3642e9ff0c9cb08a1b8e3", "sha256": "2c520d430cdba04a63f55eca115038879b8ef01233b66b72bb09bdd15365b5c5" }, "downloads": -1, "filename": "django-netjsongraph-0.4.tar.gz", "has_sig": true, "md5_digest": "6ecc4261c0c3642e9ff0c9cb08a1b8e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 187537, "upload_time": "2017-12-27T20:43:20", "url": "https://files.pythonhosted.org/packages/ad/e8/7e3ae25e5c5d026afdde79914bacb0c9a1025a2282c14216583a19b86413/django-netjsongraph-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "af57598736d16913e1c98755889ccddc", "sha256": "df7a6c8e22afbbe5d2fff668e93c1bb7fa34e5323f47fd23dda307151f8378de" }, "downloads": -1, "filename": "django_netjsongraph-0.4.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "af57598736d16913e1c98755889ccddc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 209087, "upload_time": "2018-02-19T16:34:37", "url": "https://files.pythonhosted.org/packages/c1/0e/bfba84dc3e365c65b858f2df9592b0889511c6ebf7b484fd6e2b475e95cb/django_netjsongraph-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa30165b878e50b86ff14e6aa1b4391e", "sha256": "b2050aebad43b618715c9c4c7903716150c4f03c2f19a79159e31c8ab8093b2d" }, "downloads": -1, "filename": "django-netjsongraph-0.4.1.tar.gz", "has_sig": true, "md5_digest": "aa30165b878e50b86ff14e6aa1b4391e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 188125, "upload_time": "2018-02-19T16:34:44", "url": "https://files.pythonhosted.org/packages/89/87/4bc8ed6f81cc89d4c697758e4861be4205c5d7e9a8ec54ddee423b32f802/django-netjsongraph-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "e9f32db863bee0fb3b03cd7677e9c085", "sha256": "6ab8b9bdd4e81890f9455b816ed78f35e3d09cedc36ee706a3e3e6c84c1f93b4" }, "downloads": -1, "filename": "django_netjsongraph-0.4.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "e9f32db863bee0fb3b03cd7677e9c085", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 209087, "upload_time": "2018-02-19T17:04:28", "url": "https://files.pythonhosted.org/packages/91/27/0db4117a3fd442fd8ca652a324bb655cf9e88e49f8c533908ff8676cbda2/django_netjsongraph-0.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "797c8f938a1c436ad3bc0253b7de5fdb", "sha256": "396857eeeddeb6a36d0aa3f2e2824e5b8ad3f569d1c665b4875e7d16f4d3519d" }, "downloads": -1, "filename": "django-netjsongraph-0.4.2.tar.gz", "has_sig": true, "md5_digest": "797c8f938a1c436ad3bc0253b7de5fdb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 188132, "upload_time": "2018-02-19T17:04:33", "url": "https://files.pythonhosted.org/packages/00/e9/c0ad98558761fe06a63459d6bb3c235977936a3349c2a39e79d5bfbb337e/django-netjsongraph-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "da292747950066e40ad623a5531795cd", "sha256": "c4617365298f372c9df02ad233092cbb0e692ccc97bd6ac9ba56fd3700920c29" }, "downloads": -1, "filename": "django_netjsongraph-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "da292747950066e40ad623a5531795cd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 210900, "upload_time": "2018-02-24T20:36:16", "url": "https://files.pythonhosted.org/packages/8e/10/3c18121fb91ae3e1fd17d67d9f5a82a7d64a01dbb5182171952319cb5e83/django_netjsongraph-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d617a8185628f2080388b8167fee073", "sha256": "defd5afd5dfdf85790b4c9c5fe0194d566af59a3599731e73580dd499325aacc" }, "downloads": -1, "filename": "django-netjsongraph-0.4.3.tar.gz", "has_sig": false, "md5_digest": "8d617a8185628f2080388b8167fee073", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184927, "upload_time": "2018-02-24T20:36:18", "url": "https://files.pythonhosted.org/packages/d6/77/3a3a08afe157c78ff79106e872c37049edc3a82642476e315688970f40fc/django-netjsongraph-0.4.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "da292747950066e40ad623a5531795cd", "sha256": "c4617365298f372c9df02ad233092cbb0e692ccc97bd6ac9ba56fd3700920c29" }, "downloads": -1, "filename": "django_netjsongraph-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "da292747950066e40ad623a5531795cd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 210900, "upload_time": "2018-02-24T20:36:16", "url": "https://files.pythonhosted.org/packages/8e/10/3c18121fb91ae3e1fd17d67d9f5a82a7d64a01dbb5182171952319cb5e83/django_netjsongraph-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d617a8185628f2080388b8167fee073", "sha256": "defd5afd5dfdf85790b4c9c5fe0194d566af59a3599731e73580dd499325aacc" }, "downloads": -1, "filename": "django-netjsongraph-0.4.3.tar.gz", "has_sig": false, "md5_digest": "8d617a8185628f2080388b8167fee073", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184927, "upload_time": "2018-02-24T20:36:18", "url": "https://files.pythonhosted.org/packages/d6/77/3a3a08afe157c78ff79106e872c37049edc3a82642476e315688970f40fc/django-netjsongraph-0.4.3.tar.gz" } ] }