{ "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 :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Topic :: Internet :: WWW/HTTP", "Topic :: Scientific/Engineering :: GIS" ], "description": "django-loci\n===========\n\n.. image:: https://travis-ci.org/openwisp/django-loci.svg\n :target: https://travis-ci.org/openwisp/django-loci\n\n.. image:: https://coveralls.io/repos/openwisp/django-loci/badge.svg\n :target: https://coveralls.io/r/openwisp/django-loci\n\n.. image:: https://requires.io/github/openwisp/django-loci/requirements.svg?branch=master\n :target: https://requires.io/github/openwisp/django-loci/requirements/?branch=master\n :alt: Requirements Status\n\n.. image:: https://badge.fury.io/py/django-loci.svg\n :target: http://badge.fury.io/py/django-loci\n\n------------\n\nReusable django-app for storing GIS and indoor coordinates of objects.\n\n------------\n\n.. contents:: **Table of Contents**:\n :backlinks: none\n :depth: 3\n\n------------\n\nDependencies\n------------\n\n* Python 2.7 or Python >= 3.4\n* `GeoDjango `_\n* One of the databases supported by GeoDjango\n\nInstall stable version from pypi\n--------------------------------\n\nInstall from pypi:\n\n.. code-block:: shell\n\n pip install django-loci\n\nInstall development version\n---------------------------\n\nFirst of all, install the dependencies of `GeoDjango `_:\n\n- `Geospatial libraries `_\n- `Spatial database `_,\n for development we use Spatialite, a spatial extension of `sqlite `_\n\nInstall tarball:\n\n.. code-block:: shell\n\n pip install https://github.com/openwisp/django-loci/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/openwisp/django-loci#egg=django_loci\n\nIf you want to contribute, install your cloned fork:\n\n.. code-block:: shell\n\n git clone git@github.com:/django-loci.git\n cd django_loci\n python setup.py develop\n\nSetup (integrate in an existing django project)\n-----------------------------------------------\n\nFirst of all, set up your database engine to `one of the spatial databases suppported\nby GeoDjango `_.\n\nAdd ``django_loci`` and its dependencies to ``INSTALLED_APPS`` in the following order:\n\n.. code-block:: python\n\n INSTALLED_APPS = [\n # ...\n 'django.contrib.gis',\n 'django_loci',\n 'django.contrib.admin',\n 'leaflet',\n 'channels'\n # ...\n ]\n\nConfigure ``CHANNEL_LAYERS`` according to your needs, a sample configuration can be:\n\n.. code-block:: python\n\n CHANNEL_LAYERS = {\n \"default\": {\n \"BACKEND\": \"asgiref.inmemory.ChannelLayer\",\n \"ROUTING\": \"django_loci.channels.routing.channel_routing\",\n },\n }\n\nNow run migrations:\n\n.. code-block:: shell\n\n ./manage.py migrate\n\nTroubleshooting\n---------------\n\nCommon issues and solutions when installing GeoDjango.\n\nUnable to load the SpatiaLite library extension\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf you get the following exception::\n\n django.core.exceptions.ImproperlyConfigured: Unable to load the SpatiaLite library extension\n\nYou need to specify the ``SPATIALITE_LIBRARY_PATH`` in your ``settings.py`` as explained\nin the `django documentation regarding how to install and configure spatialte\n`_.\n\nIssues with other geospatial libraries\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPlease refer to the `geodjango documentation on troubleshooting issues related to\ngeospatial libraries `_.\n\nSettings\n--------\n\n``LOCI_FLOORPLAN_STORAGE``\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n+--------------+-------------------------------------------+\n| **type**: | ``str`` |\n+--------------+-------------------------------------------+\n| **default**: | ``django_loci.storage.OverwriteStorage`` |\n+--------------+-------------------------------------------+\n\nThe django file storage class used for uploading floorplan images.\n\nThe filestorage can be changed to a different one as long as it has an\n``upload_to`` class method which will be passed to ``FloorPlan.image.upload_to``.\n\nTo understand the details of this statement, take a look at the code of\n`django_loci.storage.OverwriteStorage\n`_.\n\nExtending django-loci\n---------------------\n\n*django-loci* provides a set of models and admin classes which can be imported,\nextended and reused by third party apps.\n\nTo extend *django-loci*, **you MUST NOT** add it to ``settings.INSTALLED_APPS``,\nbut you must create your own app (which goes into ``settings.INSTALLED_APPS``),\nimport the base classes of django-loci and add your customizations.\n\nExtending models\n~~~~~~~~~~~~~~~~\n\nThis example provides an example of how to extend the base models of\n*django-loci* by adding a relation to another django model named `Organization`.\n\n.. code-block:: python\n\n # models.py of your app\n from django.db import models\n from django_loci.base.models import (AbstractFloorPlan,\n AbstractLocation,\n AbstractObjectLocation)\n\n # the model ``organizations.Organization`` is omitted for brevity\n # if you are curious to see a real implementation, check out django-organizations\n\n\n class OrganizationMixin(models.Model):\n organization = models.ForeignKey('organizations.Organization')\n\n class Meta:\n abstract = True\n\n\n class Location(OrganizationMixin, AbstractLocation):\n class Meta(AbstractLocation.Meta):\n abstract = False\n\n def clean(self):\n # your own validation logic here...\n pass\n\n\n class FloorPlan(OrganizationMixin, AbstractFloorPlan):\n location = models.ForeignKey(Location)\n\n class Meta(AbstractFloorPlan.Meta):\n abstract = False\n\n def clean(self):\n # your own validation logic here...\n pass\n\n\n class ObjectLocation(OrganizationMixin, AbstractObjectLocation):\n location = models.ForeignKey(Location, models.PROTECT,\n blank=True, null=True)\n floorplan = models.ForeignKey(FloorPlan, models.PROTECT,\n blank=True, null=True)\n\n class Meta(AbstractObjectLocation.Meta):\n abstract = False\n\n def clean(self):\n # your own validation logic here...\n pass\n\nExtending the admin\n~~~~~~~~~~~~~~~~~~~\n\nFollowing the previous `Organization` example, you can avoid duplicating the admin\ncode by importing the base admin classes and registering your models with them.\n\nBut first you have to change a few settings in your ``settings.py``, these are needed in\norder to load the admin templates and static files of *django-loci* even if it's not\nlisted in ``settings.INSTALLED_APPS``.\n\nAdd ``django.forms`` to ``INSTALLED_APPS``, now it should look like the following:\n\n.. code-block:: python\n\n INSTALLED_APPS = [\n # ...\n 'django.contrib.gis',\n 'django_loci',\n 'django.contrib.admin',\n # \u2193\n 'django.forms', # <-- add this\n # \u2191\n 'leaflet',\n 'channels'\n # ...\n ]\n\nNow add ``EXTENDED_APPS`` after ``INSTALLED_APPS``:\n\n.. code-block:: python\n\n INSTALLED_APPS = [\n # ...\n ]\n\n EXTENDED_APPS = ('django_loci',)\n\nAdd ``openwisp_utils.staticfiles.DependencyFinder`` to ``STATICFILES_FINDERS``:\n\n.. code-block:: python\n\n STATICFILES_FINDERS = [\n 'django.contrib.staticfiles.finders.FileSystemFinder',\n 'django.contrib.staticfiles.finders.AppDirectoriesFinder',\n 'openwisp_utils.staticfiles.DependencyFinder',\n ]\n\nAdd ``openwisp_utils.loaders.DependencyLoader`` to ``TEMPLATES``:\n\n.. code-block:: python\n\n TEMPLATES = [\n {\n 'BACKEND': 'django.template.backends.django.DjangoTemplates',\n 'DIRS': [],\n 'OPTIONS': {\n 'loaders': [\n 'django.template.loaders.filesystem.Loader',\n 'django.template.loaders.app_directories.Loader',\n # add the following line\n 'openwisp_utils.loaders.DependencyLoader'\n ],\n 'context_processors': [\n 'django.template.context_processors.debug',\n 'django.template.context_processors.request',\n 'django.contrib.auth.context_processors.auth',\n 'django.contrib.messages.context_processors.messages',\n ],\n },\n }\n ]\n\nLast step, add ``FORM_RENDERER``:\n\n.. code-block:: python\n\n FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'\n\nThen you can go ahead and create your ``admin.py`` file following the example below:\n\n.. code-block:: python\n\n # admin.py of your app\n from django.contrib import admin\n\n from django_loci.base.admin import (AbstractFloorPlanAdmin, AbstractFloorPlanForm,\n AbstractFloorPlanInline, AbstractLocationAdmin,\n AbstractLocationForm, AbstractObjectLocationForm,\n AbstractObjectLocationInline)\n from django_loci.models import FloorPlan, Location, ObjectLocation\n\n\n class FloorPlanForm(AbstractFloorPlanForm):\n class Meta(AbstractFloorPlanForm.Meta):\n model = FloorPlan\n\n\n class FloorPlanAdmin(AbstractFloorPlanAdmin):\n form = FloorPlanForm\n\n\n class LocationForm(AbstractLocationForm):\n class Meta(AbstractLocationForm.Meta):\n model = Location\n\n\n class FloorPlanInline(AbstractFloorPlanInline):\n form = FloorPlanForm\n model = FloorPlan\n\n\n class LocationAdmin(AbstractLocationAdmin):\n form = LocationForm\n inlines = [FloorPlanInline]\n\n\n class ObjectLocationForm(AbstractObjectLocationForm):\n class Meta(AbstractObjectLocationForm.Meta):\n model = ObjectLocation\n\n\n class ObjectLocationInline(AbstractObjectLocationInline):\n model = ObjectLocation\n form = ObjectLocationForm\n\n\n admin.site.register(FloorPlan, FloorPlanAdmin)\n admin.site.register(Location, LocationAdmin)\n\nExtending channel consumers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nExtend the channel consumer of django-loci in this way:\n\n.. code-block:: python\n\n from django_loci.channels.base import BaseLocationBroadcast\n from ..models import Location # your own location model\n\n\n class LocationBroadcast(BaseLocationBroadcast):\n model = Location\n\nExtending AppConfig\n~~~~~~~~~~~~~~~~~~~\n\nYou may want to reuse the ``AppConfig`` class of *django-loci* too:\n\n.. code-block:: python\n\n from django_loci.apps import LociConfig\n\n\n class MyConfig(LociConfig):\n name = 'myapp'\n verbose_name = _('My custom app')\n\n def __setmodels__(self):\n from .models import Location\n self.location_model = Location\n\nInstalling for development\n--------------------------\n\nInstall sqlite:\n\n.. code-block:: shell\n\n sudo apt-get install sqlite3 libsqlite3-dev libsqlite3-mod-spatialite\n\nInstall your forked repo:\n\n.. code-block:: shell\n\n git clone git://github.com//django-loci\n cd django-loci/\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 and SMTP debugging server:\n\n.. code-block:: shell\n\n ./manage.py runserver\n\nYou can access 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\n1. Announce your intentions in the `OpenWISP Mailing List `_\n2. Fork this repo and install it\n3. Follow `PEP8, Style Guide for Python Code`_\n4. Write code\n5. Write tests for your code\n6. Ensure all tests pass\n7. Ensure test coverage does not decrease\n8. Document your changes\n9. Send pull request\n\n.. _PEP8, Style Guide for Python Code: http://www.python.org/dev/peps/pep-0008/\n\nChangelog\n---------\n\nSee `CHANGES `_.\n\nLicense\n-------\n\nSee `LICENSE `_.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/openwisp/django-loci/releases", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://openwisp.org", "keywords": "django,gis", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-loci", "package_url": "https://pypi.org/project/django-loci/", "platform": "Platform Indipendent", "project_url": "https://pypi.org/project/django-loci/", "project_urls": { "Download": "https://github.com/openwisp/django-loci/releases", "Homepage": "http://openwisp.org" }, "release_url": "https://pypi.org/project/django-loci/0.2.1/", "requires_dist": [ "django (<2.1,>=1.11)", "django-leaflet (<0.24,>=0.23)", "channels (<1.2,>=1.1.8)", "openwisp-utils (<0.3.0,>=0.2)", "Pillow (<6.0,>=4.3.0)" ], "requires_python": "", "summary": "Reusable django-app for outdoor and indoor mapping", "version": "0.2.1" }, "last_serial": 4313284, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "0a8209ee188c4bc3796ad751a9537d07", "sha256": "9a37cd95c754ceb7a993160407f55358d0bce1fcae65c7b2d3d22e956fcda995" }, "downloads": -1, "filename": "django_loci-0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0a8209ee188c4bc3796ad751a9537d07", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 39482, "upload_time": "2017-12-02T20:09:11", "url": "https://files.pythonhosted.org/packages/61/81/0cbfe419f73b45078cbd9fefdb02db47812f33598865baf22e28b7488160/django_loci-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23469f8390a10ef43b6a464f1b136c87", "sha256": "3b2ef6c6745beb6e109cbb88253cf0fc307117c8dbbd3c3c94bc9091629203d6" }, "downloads": -1, "filename": "django-loci-0.1.tar.gz", "has_sig": true, "md5_digest": "23469f8390a10ef43b6a464f1b136c87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28551, "upload_time": "2017-12-02T20:09:09", "url": "https://files.pythonhosted.org/packages/2c/5a/5f4df57ddff79a0926bb681c8c3ae8f4e10b2e2e62117a59c63d06bf9d0c/django-loci-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "b2451c915d7b8448899009d10ca0e54d", "sha256": "e91dc92b55aade343c439357bbadb36450fdedf25e6c0bc3de80ec0e565e4848" }, "downloads": -1, "filename": "django_loci-0.1.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b2451c915d7b8448899009d10ca0e54d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 40052, "upload_time": "2017-12-06T17:01:13", "url": "https://files.pythonhosted.org/packages/f2/4d/850d73742375888cb699229a25844e1b821ec73cc886542c5380fb9280c3/django_loci-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cfd3b0f8c7e5e2ecd2514e18997e50e0", "sha256": "dbbb5775a5aa54027ed233d30971c91e0acc54781b765c24fb56f2f36f4a013a" }, "downloads": -1, "filename": "django-loci-0.1.1.tar.gz", "has_sig": true, "md5_digest": "cfd3b0f8c7e5e2ecd2514e18997e50e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29008, "upload_time": "2017-12-06T17:01:11", "url": "https://files.pythonhosted.org/packages/42/f8/072df0fcfbe26fa9b28d30378039041b5b5f5f8af0b52f06b67db90b39cf/django-loci-0.1.1.tar.gz" } ], "0.1a0": [ { "comment_text": "", "digests": { "md5": "08a9e69f99d30e019f1aad397d740e03", "sha256": "f6cf04536647ab5486634cb1eb6abbfb75af2e97ff98c856e45d061ba83ac327" }, "downloads": -1, "filename": "django_loci-0.1a0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "08a9e69f99d30e019f1aad397d740e03", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37830, "upload_time": "2017-11-26T18:13:17", "url": "https://files.pythonhosted.org/packages/2d/c9/ea295303278c1358fb3644eb04f54d43ef6d4daa774fc68d104ea066f77c/django_loci-0.1a0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a443f63407bb3a062026ece847e4c1f9", "sha256": "5b53e2bf8433f74309671ed7bc595947e2ed525710ab023111134269786c6e91" }, "downloads": -1, "filename": "django-loci-0.1a0.tar.gz", "has_sig": true, "md5_digest": "a443f63407bb3a062026ece847e4c1f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26892, "upload_time": "2017-11-26T18:13:14", "url": "https://files.pythonhosted.org/packages/0e/70/6870de9567762e6083b5e8712214a16fa708704446b15cacac26218f9238/django-loci-0.1a0.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "a4112a52e657a1b36c23541e79ea9dec", "sha256": "10fdc02dd932f28f2f2c3bbc811904753510d52d5d53a434bbacc62a75461c31" }, "downloads": -1, "filename": "django_loci-0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "a4112a52e657a1b36c23541e79ea9dec", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 40045, "upload_time": "2018-02-19T12:30:25", "url": "https://files.pythonhosted.org/packages/a5/81/fcfb58745a7b58401a0419672d56cb5cfd6cb84ab3a7374d071cb6b80833/django_loci-0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c5a66d04d42896fa12ae65733d69f201", "sha256": "7db3576480475b703e5cd1bd28faae09a7945d35ebd250115e015090bcf019ca" }, "downloads": -1, "filename": "django-loci-0.2.tar.gz", "has_sig": true, "md5_digest": "c5a66d04d42896fa12ae65733d69f201", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27059, "upload_time": "2018-02-19T12:30:28", "url": "https://files.pythonhosted.org/packages/34/2e/ae5172b4c9699a5b9d758a9eea1157395645da0994787bdb2c4df7cbca35/django-loci-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "4be61650fe4b3f4cc990c8316b1ebc68", "sha256": "39c19ec883cf72416e949400963061d848a9a2877f2588200dcf90eedf6873b7" }, "downloads": -1, "filename": "django_loci-0.2.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4be61650fe4b3f4cc990c8316b1ebc68", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 36396, "upload_time": "2018-09-26T16:41:06", "url": "https://files.pythonhosted.org/packages/51/69/d17944618397d46405f45faf1e052b4cd475a9003b4d529560b6ad7b095e/django_loci-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d7658a5ac9412a25849d4892d9f0121", "sha256": "123cb9b9fa5691c8d6ec73abf3f5d58514430cb69f8169378afa208bbd9e7336" }, "downloads": -1, "filename": "django-loci-0.2.1.tar.gz", "has_sig": true, "md5_digest": "7d7658a5ac9412a25849d4892d9f0121", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27664, "upload_time": "2018-09-26T16:41:08", "url": "https://files.pythonhosted.org/packages/6a/2c/f8b74c1defb063a5b5ed3ae4acebed612a87f025f559abf6069798fcf382/django-loci-0.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4be61650fe4b3f4cc990c8316b1ebc68", "sha256": "39c19ec883cf72416e949400963061d848a9a2877f2588200dcf90eedf6873b7" }, "downloads": -1, "filename": "django_loci-0.2.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4be61650fe4b3f4cc990c8316b1ebc68", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 36396, "upload_time": "2018-09-26T16:41:06", "url": "https://files.pythonhosted.org/packages/51/69/d17944618397d46405f45faf1e052b4cd475a9003b4d529560b6ad7b095e/django_loci-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d7658a5ac9412a25849d4892d9f0121", "sha256": "123cb9b9fa5691c8d6ec73abf3f5d58514430cb69f8169378afa208bbd9e7336" }, "downloads": -1, "filename": "django-loci-0.2.1.tar.gz", "has_sig": true, "md5_digest": "7d7658a5ac9412a25849d4892d9f0121", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27664, "upload_time": "2018-09-26T16:41:08", "url": "https://files.pythonhosted.org/packages/6a/2c/f8b74c1defb063a5b5ed3ae4acebed612a87f025f559abf6069798fcf382/django-loci-0.2.1.tar.gz" } ] }